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 asideCampaigns (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:

StateButton
Not in Shopify yetPush to Shopify (unlisted) — disabled until there's a name and a price, and until inventory access is granted.
In Shopify, not yet ActivePublish & activate — disabled until a sales channel is selected and publishing access is granted.
Active or archived in ShopifyA 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:

ActionModal headingConfirm button
Push to Shopify (unlisted)Push this product to Shopify?Push to Shopify
Publish & activatePublish 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 descriptionSave 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

RowShows
StageA 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.
ShopifyA 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 typeShopify'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.
OwnerThe assigned person, with their team, or "Unassigned".
Product lineThe assigned line, or "Not set".
Launch, Forecast total, Launch dateThe current values.
DueThe 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.

PlanStacking ring · Ring · Due Oct 15, 2026
DesignCurrent

Variants, bill of materials, costs…

ReviewLock the official name, final prices and forecast.
Ready for launchStage in Shopify & list it live.
Progressive view — past stages collapse, future stages dim

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.

Stacking Band
OptionsSize56789

↓ Saving builds one variant per combination.

Size 5R-STACK-SS-5$48.00 · 64% margin · 20 forecast
Size 6R-STACK-SS-6$48.00 · 64% margin · 20 forecast
Size 7R-STACK-SS-7$48.00 · 64% margin · 20 forecast
Size 8R-STACK-SS-8$48.00 · 64% margin · 20 forecast
Size 9R-STACK-SS-9$48.00 · 64% margin · 20 forecast
Options become variants — one 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.

Bill of materialsStacking Band — Size 7
SupplyQtyUnit 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.

Material cost$3.71
Bill of materials — pick a material, enter the quantity

Costs & pricing

Inside each variant panel, the costs are read-only stats — you only type the Price:

FieldEditable?What it is
Material costNoSum of the bill of materials (quantity × unit cost), packaging included
Labor costNoCarried on the variant. Fulfil routing/labor sync is not shipped
Total cost (COGS)NoMaterial + Labor
PriceYesThe retail price — the only input
MarginNo(Price − COGS) ÷ Price, with your target margin shown
SuggestedNoThe price that would hit your target margin at the current cost
Material cost$3.71read-only, from BOM
Labor cost$8.00from Fulfil
Total (COGS)$11.71material + labor
Margin75.6%target 65%
Suggested$33.46to hit target margin
Costs roll up; you enter only the price

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.

  1. 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.
  2. Product synced to FulfilCheck Fulfil looks up the SKU and ticks when found (or mark it synced manually). Needs the Fulfil connection.
  3. BOM synced from FulfilSync 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.
  4. 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.

Push to Shopify (unlisted)Pushed
Created as an unlisted product on Jun 24, 2026.
Product synced to FulfilPending
Check Fulfil
BOM in FulfilBlocked
Fulfil BOM API not connected yet.
List it live in ShopifyPending
List it live
Ready for launch — the hand-off checklist

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