The Product Workspace (detail page)
The product detail page is where you do all the real work: build variants and SKUs, enter the bill of materials, set prices and forecast, run the progress gate, record tests, and finally push to Shopify. This is the most important page in setlist.
Where: setlist → Products → (click any product)
How the page is laid out
The page has two parts:
- Main column — the Product description card, then four stage cards (Plan, Design, Review, Ready for launch), then Shared materials (only when a material is shared), Design notes, and Tests.
- Right-hand aside — Campaigns (only when the product belongs to one), Status, Price history (only when there is any), Progress gate, Readiness, Channels, and Thumbnail.
The title shows the official name if set, otherwise the working name. The top-right button is context-aware, in three states:
| State | Button |
|---|---|
| Not in Shopify yet | Push to Shopify (unlisted) — disabled until there's a name and a price, and until inventory access is granted. |
| In Shopify, not yet Active | Publish & activate — disabled until a sales channel is selected and publishing access is granted. |
| Active or archived in Shopify | A badge instead of a button — Active in Shopify or Archived in Shopify. Nothing is left to do here. |
Both buttons open a confirmation modal rather than writing to Shopify on the click.
Launched products: current operations first
Once a product reaches the Launched lifecycle stage — which setlist derives from Shopify, not from the stage you set — a Current operations summary appears before the lifecycle cards. It leads with an Active in Shopify badge and a View in Shopify link, then the numbers needed to run the live product now, as labeled tiles:
Owner · Launch · Campaigns · Recent sales · Inventory on hand · Forecast · Production needed · Fulfil finished good · BOM authority
Below the tiles, either a Needs attention list of warnings (each with a Review link) for unresolved catalog links, descriptions, sales, inventory, or BOM state — or, when there's nothing to flag, "Operational data is current."
Missing Shopify order access reads Unavailable, never zero sales. Inventory older than 24 hours is labeled stale, and Production needed then reads Unavailable rather than being calculated from it. Sales older than seven days are flagged for review. BOM authority always reads setlist; when Fulfil isn't connected it adds "Local BOM · Fulfil sync unavailable", so the summary never implies a remote finished good or BOM was synchronized.
A launched product also gains a Lifecycle history heading above the four stage cards — "Planning, design, review, and launch details are preserved below. Expand a card when you need the original workflow record." The cards themselves switch to a History badge and start collapsed. They remain accessible and editable. Products that aren't launched keep the progressive, stage-first layout described below.
The page is live — changes made elsewhere (or by a teammate) appear without a reload.
How saving works
Two patterns, used consistently across setlist:
- Autosave — most inline fields (names, prices, SKUs, BOM quantities, forecast, classifications, test results) save themselves shortly after you stop typing, and immediately when you click away. A small line reads Saving… → Saved. No save button.
- Explicit actions — multi-part builders and one-shot operations use buttons: Save options, Add supply, Add test, Add note, stage changes, and the Shopify/Fulfil steps.
If a teammate changed the product while you were editing, a save can be rejected with "This product changed in another session. Review the latest values and save again." — just reload and re-enter.
Every Shopify write is confirmed first
No single click in setlist can change your Shopify store. Every button whose action writes to Shopify opens a confirmation modal first, and they all read the same way:
- A lead line — "Here's exactly what this changes in your Shopify store:" (or "Here's the one change this makes in your Shopify store:" when there's only one).
- A bulleted list of the exact changes, named specifically — the product, the variant count, the channels, the price.
- A standing footer: "Nothing outside this list is touched. setlist never changes your orders or sales history."
- The confirm button, plus Cancel.
On this page, the confirmed actions are:
| Action | Modal heading | Confirm button |
|---|---|---|
| Push to Shopify (unlisted) | Push this product to Shopify? | Push to Shopify |
| Publish & activate | Publish this product to your live store? | Publish & activate |
| List it live (launch checklist) | List this product live in Shopify? | List it live |
| Push planned prices / Push {price} | Push planned prices to Shopify? | Push planned prices |
| Saving the Product description | Save this description to Shopify? | Save to Shopify |
Two things deliberately stay outside the modal because they don't touch Shopify: Adopt live prices (it writes the setlist plan only) and the manual gate ticks like "or mark synced manually." Saving a description on a product that isn't linked to Shopify yet is also a plain one-click Save.
The right-hand aside
The panels appear in this order, top to bottom. Campaigns, Price history, and Thumbnail only appear when they have something to show.
Campaigns
If the product belongs to any campaigns, they're listed here as links. Read-only — manage membership from the campaign side.
Status
| Row | Shows |
|---|---|
| Stage | A dropdown to jump directly to any stage. (This bypasses the gate — use the Advance button for the normal path.) On a launched product there's no dropdown: a Launched badge and an Archive button instead. |
| Shopify | A read-only badge — Not in Shopify / Draft / Unlisted / Active / Archived. Kept in sync automatically, so launch evidence always comes from Shopify. A View in Shopify link sits in the panel header once the product is linked. |
| Product type | Shopify's own product type, read-only. Only shown once the product is linked to Shopify; reads "—" when Shopify has no type. This is not the Category field on the Plan card — see below. |
| Owner | The assigned person, with their team, or "Unassigned". |
| Product line | The assigned line, or "Not set". |
| Launch, Forecast total, Launch date | The current values. |
| Due | The target due date, with an Overdue / Due soon / On track badge. |
Category vs. Product type. Category (on the Plan card) is setlist's own planning field — it drives the SKU, the subcategory list, forecast targets, and the Products list grouping, and setlist never writes it to Shopify. Product type in this panel is a read-only mirror of Shopify's product type, filled in by the catalog and webhook sync. You change it in Shopify; there is no way to edit it here, and nothing you do to Category will alter it.
Above the rows, the Status panel can also show a banner: Draft created in Shopify, Pushed to Shopify (unlisted), or Not linked to Shopify.
Price history
Appears once there's a record of pushed or adopted prices for the product.
Progress gate
The checklist for advancing to the next stage — "What's left before {next stage}." Auto items tick themselves; manual items are clickable. The Advance to {next stage} button activates only when every item is done, and reads End of pipeline when there's nowhere left to go. Full details: Stages & progress gates.
Readiness
A stage-agnostic 6-point checklist, the same number shown on the Products list:
Product named · SKU assigned · Final price set · Supplies added to setlist BOM · Sales channels selected · and a tests item that reads Tests not required, setlist tests prescribed & passed, or All setlist tests passed depending on the product.
A footnote spells out the division of labor: "Shopify can supply linked product, variant, SKU, price, and description data. BOM supplies and tests are managed in setlist; listing photos remain a manual Shopify check."
Channels
Tap a row to toggle a sales channel: Online Store · POS · Shop. (Helper: "Tap to add or remove a channel.") Once the product is listed live the panel goes read-only — "Listed live — manage channels in Shopify."
Thumbnail
The product's image as setlist has it.
The progressive (stage-aware) view
By default (Settings → Preferences, on), the page follows the product's current stage:
- The current stage card is expanded (with a "Current" badge).
- Past stages collapse to a one-line ✓ summary you can click to expand and edit.
- Future stages collapse to a dimmed row explaining what they unlock; you can peek inside, but the fields are disabled until you get there.
Turn the preference off to see the whole page expanded at once.
Variants, bill of materials, costs…
Stage 1 — Plan
The product's identity and schedule.
- Identity: Working name, Category + Sub-category (cascading), Owner, Description. The container SKU shows read-only as a chip. This is Category, setlist's own planning field — not the read-only Product type mirror in the Status panel.
- Timing: Launch group, Launch date (locked to the launch's start when a launch is assigned), and Target due date (defaults to launch date minus your design lead time).
- Availability: Product line, its read-only Behavior, and the conditional field it drives — Quantity (units cap) for limited-quantity lines, or End date for limited-date lines.
- Classifications: any classification fields set to show at Plan.
The official name is not set here — it first appears in Review. Plan carries it through untouched.
Stage 2 — Design
The heart of the page: variants, the bill of materials, costing, and the design sign-off.
Variants & options
You never see the word "variant" until there's more than one. A simple product quietly has a single default variant carrying its SKU, cost, and price. Variant grouping UI only appears once you add options.
Base product sits at the top: the master bill of materials and the product's Forecast total. For a single-SKU product, build the base first, then add options to split it into variants.
To create variants, click Create variants (or Edit options if you already have some) to open the options editor:
- Define up to 3 options (Shopify's limit), each with a name (e.g. Size, Metal) and a list of values.
- New products pre-fill the option types defined on their category (e.g. Rings → Size: 5,6,7,8,9) — edit or remove them freely. An Add from your option types shortcut offers presets you haven't added.
- Each value can carry its own SKU code (otherwise it's auto-derived), and each option has a Tests required for this option toggle.
- Click Save options. setlist builds one variant per combination. Existing combinations keep their SKU, price, and costs; new variants are created and inherit a fresh copy of the base bill of materials.
Once there's more than one variant, a Variants (n) section appears with a collapsible panel per combination.
↓ Saving builds one variant per combination.
SKUs
SKUs are auto-generated, never hand-built — assembled from the category's template and your global prefix. The product-level "container SKU" is read-only; each variant's SKU is editable as a quiet override. See Categories & SKUs for how the template works.
Bill of materials (BOM / supplies)
Each variant has its own bill of materials — the supply/material lines and quantities that make one unit. (Packaging like boxes and cards goes here too — it's just supply lines.)
- Add supply: click Add supply, pick a material from the materials catalog (synced from Fulfil or added by hand), and enter the quantity per unit. "Unit cost is pulled from the material — you only enter the quantity used per unit."
- Can't find a material? Use Add new material to stub one (name + estimated cost + note). It lets you keep designing, but it blocks Ready for launch until it's added to Fulfil and reconciled.
- Copy between variants: Copy base BOM to all variants (overwrites each variant from the base), or Copy BOM from another variant (appends its lines).
When the BOM comes from Fulfil, it is read-only. Lines pulled by the Fulfil sync are badged Synced from Fulfil and have no edit or remove controls. If a variant's BOM is Fulfil-managed, the whole section says "This BOM is synced from Fulfil and is read-only in setlist," Add supply disappears, and that variant is not offered as a Copy BOM from source. One consequence worth knowing: when Fulfil has a BOM for a variant's SKU, each sync replaces that variant's whole supply list — including any lines you added by hand. Hand-added lines only persist on variants Fulfil has no BOM for (and if a SKU later loses its Fulfil BOM, only the Fulfil lines are removed). Edits belong in Fulfil; setlist never pushes a BOM back.
| Supply | Qty | Unit cost |
|---|---|---|
Sterling silver wire 18ga SS-WIRE-18 | 8 cm | $0.42 |
Jump ring 4mm SS-JUMP-4 | 2 pc | $0.05 |
Kraft gift box PKG-BOX-S | 1 pc | $0.30 |
Packaging lives in the BOM too.
Costs & pricing
Inside each variant panel, the costs are read-only stats — you only type the Price:
| Field | Editable? | What it is |
|---|---|---|
| Material cost | No | Sum of the bill of materials (quantity × unit cost), packaging included |
| Labor cost | No | Carried on the variant. Fulfil routing/labor sync is not shipped |
| Total cost (COGS) | No | Material + Labor |
| Price | ✅ Yes | The retail price — the only input |
| Margin | No | (Price − COGS) ÷ Price, with your target margin shown |
| Suggested | No | The price that would hit your target margin at the current cost |
Price drift (planned vs. live)
Once a product is linked to Shopify, someone can change its price in Shopify admin. setlist notices — webhooks are the primary feed, with a backstop refresh — and shows a price drift banner at the top of the page: "1 price drifted from the plan" (or "N variants drifted from the plan"), with "Shopify is charging more/less than Setlist planned. Nothing changes until you choose." Drift is resolved explicitly, never silently.
Drifted variants pool into groups that share the same leading option value(s). Each group shows the planned and live prices (ranges when mixed), a ±% badge (or Mixed), the per-unit change on hover, and the first few SKUs with an expandable per-SKU breakdown. Two actions per group:
- Adopt live (or Adopt $X) — accept Shopify's price as the new plan. Writes setlist only, so no confirmation modal.
- Push — the plan was right; overwrite the live Shopify price. This is a Shopify write, so it goes through the confirmation modal.
Either way the original numbers survive in Price history (the aside panel), tagged Adopted from Shopify or pushed.
Forecast
How many units you expect to make/sell, per variant:
- Total forecast (on the Base product) distributes across variants by the category's forecast weights (even split if none).
- Each variant also has its own Forecast units field you can override directly.
Design approved
A Mark design approved stamp sits at the bottom of the Design card. Tick it once the design, variants, BOM, and SKUs are locked — it satisfies the Design gate so the product can advance to Review. (Undo any time.)
If an imported or merchant-reconciled Shopify product already meets the derived Launched conditions, this reads Design recognized instead. setlist does not invent a manual approval. A Shopify Draft with no sales keeps the normal editable Design gate.
Stage 3 — Review
Finalize for launch.
- Official name — set the Shopify-ready name here (it first appears at this stage). This is what syncs to Shopify.
- Finalize pricing & forecast — a table with one row per variant: set each final price (prefilled from the suggested price) and forecast (prefilled from the type target). Margin and forecasted gross profit update live.
- Raw materials needed — the procurement hand-off: total materials to build the whole forecast (quantity per unit × forecast, summed across variants), with on-hand and reorder data from the catalog, plus an estimated total spend. A Short badge flags runs that exceed stock on hand.
- Classifications set to show at Review.
Stage 4 — Ready for launch
The Launch checklist — hand-off steps to get the product live. Pushing to Shopify creates an unlisted product (active, not published) so Fulfil can sync it. Customers can't see it until you list it live.
First time? Pushing to Shopify and listing live each need an extra Shopify permission the first time you use them — setlist shows a Request access card in place of the step. Grant it once and the action appears. See Shopify access & permissions.
- Push to Shopify (unlisted) — creates the product in Shopify (active but unpublished) with the full options/variants/SKU/inventory matrix, and links it back. (Disabled until there's a name and a price, and until inventory access is granted.) Fulfil ingests it within ~2 hours.
- Product synced to Fulfil — Check Fulfil looks up the SKU and ticks when found (or mark it synced manually). Needs the Fulfil connection.
- BOM synced from Fulfil — Sync from Fulfil matches each exact setlist SKU, compiles its Fulfil BOM, and keeps the result read-only. Fulfil stays authoritative and the synced lines refresh through the materials sync. If a material is still pending in Fulfil the step names it. Needs the Fulfil connection — without it the step is blocked rather than pending. setlist never pushes a BOM back to Fulfil.
- List it live in Shopify — publishes the product to your channels (needs publishing access). Add the listing content (description + photos) in Shopify, then go live. Once it's live, setlist's job is done.
Pushing to Shopify creates an unlisted product so Fulfil can sync it.
Tests
The Tests section (always visible at the bottom) records internal QA tests against the product. A Tests required switch turns testing on/off for the product. When on, tests are organized by option value (a test on "Size: 7" covers every variant with that value). Add test pulls names from Settings → Testing presets, which prefill the prescription and owner. Update each test's status and result inline. The cross-product view of all tests lives on the Tests page.
This is internal QA testing, not the sample-to-people User testing feature.
Product description
The Product description card sits at the top of the main column — the one place a "listing" field lives in setlist:
- Not linked to Shopify yet? Saving is a plain one-click Save — the description stays in setlist.
- Linked to Shopify? The description is shared with Shopify — saving opens the confirmation modal ("Save this description to Shopify?"), and the edit saves to Shopify first.
- Both sides changed since the last sync? setlist raises a description conflict for you to resolve. Nothing is overwritten automatically.
See Shopify catalog & reconciliation for the full ownership model.
Design notes
A running thread for design decisions, test outcomes, and questions. Type a note (Enter sends, Shift+Enter for a newline), and attach images (under 10 MB each). Notes are attributed to you automatically — there's no author field.
There's no separate reference-image gallery on the product page today. The only image attachments here are images on design notes.
Shared materials
If this product uses a raw material that other products also use, a Shared materials section appears, showing the shared stock and which products draw on it — handy for spotting contention before a run.
See also
- Products · Stages & progress gates
- Shopify catalog & reconciliation — linking, the shared description, live sync
- Forecasts · Shopify access
- Categories & SKUs · Materials
- Tests · Preferences