Skip to content

Pre-assembled inventory

Pre-assembled inventoryPre-Assembled InventoryStock of finished goods and assembly bills already built and on the shelf, counted per location. A work order draws assembly bills from the shelf first, building fresh only if it runs short; an order consumes a finished good's shelf before its components. Read more → is your shelf of already-built finished goods. When a customer orders the BOM’s variant, Assemblified consumes from this shelf first — only the remainder pulls from raw materials. This decouples your inventory display from your build cadence: build ahead in batches, ship instantly when an order arrives.

This is one of the most powerful BOM features. It also has a few non-obvious mechanics. This page explains them all.

  • What pre-assembled stock is, conceptually
  • How it’s consumed at order time (with worked examples)
  • Manual adjustment — when and how
  • Inside the Pre-manufacture dialog
  • Per-location pre-assembled
  • Interaction with the Only sell pre-assembled mode
  • What to do when Shopify and the shelf disagree, including the Inventory Health drift scan
  • Restoration on cancel/refund (briefly — full coverage in the refunds page)

Pre-assembled stock is finished-good inventory you’ve already built. You can have any quantity of it at any number of locations.

It’s stored as:

  • A count per location — where the stock actually is.
  • One number per BOM — the sum of those locations, which is what the Finished goods list shows.

Every BOM starts with an empty shelf. You populate it manually when you build batches ahead of orders, and you can also set it from Shopify’s numbers at the moment you switch on Only sell pre-assembled quantities (see below).

Assembly bills (also called sub-assemblies) have their own pre-assembled shelves with the same mechanics — see Assembly bills → Pre-assembled stock.

When an order for N units arrives:

  1. Pre-assembled is consumed first. Up to min(available, N) come off the shelf.
  2. The remainder pulls from raws. If N > available, the extra is sourced from assembly bills and raw materials normally.
  3. The drawdown is recorded on the order’s execution log, so you can see afterwards how much came off the shelf.

Here’s how it plays out for different combinations:

Order qtyPre-assembled beforeConsumed from shelfRemainder from rawsPre-assembled after
310307
55500
15101050
40040

The key behavior: raws are only touched for the remainder. If your shelf can fully cover the order, no raw-material inventory is decremented at all.

If a customer’s order has two line items of the same BOM (e.g., 3 of variant A and 4 of variant A), they share the shelf. Internal bookkeeping prevents double-spending: the first line item decrements; the second sees the new balance.

You’ll adjust pre-assembled stock manually when:

  • You finished a build batch and want to record it.
  • You scrapped or audited inventory and need to reconcile.
  • You’re switching on Only sell pre-assembled quantities and want the shelf to match what Shopify sells today.

Three surfaces:

  • From the Finished goods list, one BOM at a time — click the pre-assembled number on any row. A card opens showing the stock broken down by location, with Adjust pre-assembled… to set a new figure for one location. If Shopify disagrees with what should be on sale, the number is highlighted in orange with an alert icon (the built-in Inventory view shows this column by default) and the card names the locations and offers Reconcile… — see When Shopify and the shelf disagree. The same Adjust pre-assembled action is in the row’s More actions (⋯) menu.
  • From the finished-good detail page, Overview tab — Stock by location lists every location with its pre-assembled count, what Shopify shows as available, the maximum you could build from components on hand, and the bottleneck component. Click the pencil on a row and set that location’s new figure. This is a correction: it records what is actually on the shelf and pushes the number to Shopify, without consuming any components. If the BOM is linked to Shopify, Assemblified checks first that the variant is stocked at that location and tells you if Shopify would reject the write. When Shopify already shows the right figure — for example after you adjusted it there earlier — tick Skip Shopify adjustment in the dialog: only Assemblified’s pre-assembled count changes, and Shopify’s available quantity at that location stays exactly as it is. The box is unticked every time you open the dialog, and it appears only for the Correction (count) reason on a finished good — not for assembly bills, whose shelf never syncs to Shopify.
  • Pre-manufacture, from the detail page’s title bar — the other half of the pair, and the one that does consume components: it builds units from the recipe, deducts the raws and assembly bills, and adds the finished units to the shelf. It can also run in reverse, breaking finished units back down into components. Use Pre-manufacture when you actually built something; use Adjust when you’re correcting the count. It can also save the run as a draft work order instead of building it now — see below.
  • In bulk — tick the rows you want on the Finished goods list, then open the Inventory dropdown in the bar along the bottom and choose Reconcile pre-assembled stock. The same dialog the card opens, over as many finished goods as you ticked — see When Shopify and the shelf disagree.

Every one of them records the change at a location. The single number on the Finished goods row is the sum of those locations, so it always follows what the locations say.

The same dialog covers all of it — building units onto the shelf, disassembling them back into components, correcting a count and writing units off. Two things shape what it shows you.

Each item gets one row: its name, its SKU, the current pre-assembled count, the quantity you type and the resulting count. A long name wraps onto a second line; if it is longer still, point at it (or tab to it) to read the whole name in a tooltip, and the same goes for a long SKU. On a phone the SKU column is left out to keep room for the quantity field.

Pick the production location first. The shelf figure, what Shopify has available and the recipe the run will use are all read for that one location, and they are read again when you change it. On the BOM detail page the dialog waits for that location’s numbers before it lets you build, so you are never looking at one location’s recipe while building at another.

If a location rule switches the bill off at the location you picked, a warning at the top of the dialog names the item and says it cannot be built there — before you type a quantity, and whichever reason is selected. You can still correct or write off the pre-assembled count there, and the warning tells you so. If the rule changed the recipe instead, the row says Recipe adjusted for this location with the number of changes.

The preview is what the run will actually do

Section titled “The preview is what the run will actually do”

For a build or a disassembly, the preview lists the components the run consumes or returns, how much pre-assembled stock is used first, and a Resulting pre-assembled table — item, change, before and after. It is worked out with the same recipe the build will use at that location, so a location with an adjusted recipe previews the adjusted quantities.

If a component would go negative at that location, the preview says so and the button becomes Build anyway — your call. If something the run needs isn’t stocked at that location at all, the run is blocked instead, the lines are named, and you can activate them in Shopify without leaving the dialog.

A correction or a write-off asks no such question — nothing is consumed — but it still states its outcome in the same Resulting pre-assembled table, so what a run leaves on the shelf is always presented the same way.

If a build consumes a component whose Shopify stock at that location is already below zero, the dialog offers Also refill oversold components: any such material is topped back up to zero in the same inventory update as the build’s own decrements. It is about what the run consumes and never about the thing being assembled — building 10 units always adds 10 to the finished good’s Shopify stock, whatever that number was beforehand. The option appears on a build only, it is only offered when there is really something oversold to repair, and if live Shopify stock could not be read the dialog says so in its place rather than hiding the question.

By default a build consumes exactly what the recipe says for the quantity you build. When the real amounts differ — a cut came out longer, a batch used a little more glue — tick Enter consumed quantities manually, directly above the Components consumed table. Every component the build consumes, including the ones inside nested assemblies, becomes a field filled in with the recipe’s amount, and a Planned column beside it keeps the recipe’s figure in view. Type what was actually used: each number is the total for this build, not an amount per unit, and it must be greater than zero.

Once you have ticked it, the numbers you type stay put: changing the quantity, the location or the options no longer recalculates them. A component the new preview adds comes in at its recipe amount, and one it no longer needs drops out. The preview’s shortage warnings follow the numbers you typed. Pre-assembled components used from the shelf and the finished goods themselves are not editable. Untick the box and the build goes back to the recipe’s quantities.

The build is recorded as a work order like any other, and the components you changed show up there as adjustments — Planned is still the recipe, Adjusted is what you entered — so the difference is easy to find later.

A few limits:

  • It is offered for a build only — not for a disassembly, a correction or a write-off — and not while the build is blocked or when it consumes more than 250 different components.
  • Save as draft work order is not available while the box is ticked. Create a work order and change its materials there instead.
  • On a partner store in a multi-store group, a build with your own quantities is refused if any of its items cannot be built on that store, because the numbers you typed were for all of them. Nothing is changed; remove those items or untick the box and try again.

Between Cancel and Build sits Save as draft work order. It turns the items and the location on screen into a draft work order and opens it, so a batch you can’t build right now — short components, wrong day — becomes a planned job instead of a retyped one. It saves whatever the preview says, because a draft moves no stock.

It is offered on a build only (not on a disassembly, a correction or a write-off), it leaves out any item the location’s rule disables, and like building from the dialog it needs the Enhanced plan. It is switched off while you enter consumed quantities manually.

Pre-assembled stock is always per-location under the hood. The single number in the Finished goods table is the sum across every location — unless you’ve narrowed the page to specific locations with the location control, in which case it counts only those.

If you have multi-location inventory:

  • Set pre-assembled per location when batches are built and stored at specific warehouses.
  • Orders consume from the location resolved by the order’s fulfillment + your component-reference locations (see Execution model → Multi-location).
  • Switching Only sell pre-assembled quantities on shows both numbers per location before it changes anything — and every location, whatever the page’s location filter says.
  • The finished-good detail page’s Overview tab is where you see all of it at once — Stock by location, one row per location, with an Adjust action on each. The separate History tab carries Stock history: the inventory ledger for the finished good’s Shopify variant — every adjustment, what it changed the level to, why it happened, and which order or run caused it. Filter it to one location to audit a single warehouse.

When this Enhanced setting is on:

  • Shopify sells the shelf. An order takes a unit that is already built and never consumes components.
  • Buildable capacity from raw materials is hidden. The customer can only buy what’s physically built.

This is a powerful mode for sellers who don’t want to over-promise. Pair it with build-cadence batch production, and your storefront reflects what’s available right now.

An oversold shelf goes negative, and building clears it

Section titled “An oversold shelf goes negative, and building clears it”

Shopify can sell more than the shelf holds — two orders landing at once, a sale Assemblified hears about late. When that happens the whole order still comes off the shelf, even below zero, and no raw materials are touched: there is no made-to-order fallback in this mode, so nothing is quietly consumed that you did not agree to spend. A shelf at 3 that sells 5 reads −2, and the order log records the two units sold off an empty shelf.

A negative shelf is not a stuck state — it is a number waiting for production. Build 2 and it reads 0; build 5 and it reads 3. Adding to a negative count is never refused, whatever your Allow negative inventory setting says; that setting only guards stock you take out of a shelf yourself — a build, a manual adjustment, a reservation. And because Shopify sold the same two units natively, the two numbers stayed exactly as far apart as they were before the oversell, and come back together by the same arithmetic.

A return puts the units back on the shelf, whatever Keep assembled on return says for this finished good: the sale drew no materials, so the shelf is the only place they can come back to.

Your shelf and Shopify rarely agree to the unit, so turning this on is a short flow rather than a flip. The same dialog runs on the finished-good detail page (Settings tab → Inventory behaviour, for that one bill) and on the Finished goods list over a selection — BOM settings → Only sell pre-assembled → Enable.

  1. Choose a direction.

    • Use Shopify’s numbers — what Shopify sells right now becomes the pre-assembled stock, so the storefront keeps showing what it shows today.
    • Keep the pre-assembled numbers — the shelf overwrites what Shopify sells; that update to Shopify is queued rather than instant.

    Either way, Dynamic adjustment and Maintain inventory level are switched off wherever one of them is on, and the dialog says so first.

  2. Read the two numbers per location. A table gives Combined Shopify and Combined pre-assembled for what you selected — for a single BOM, plain Shopify and Pre-assembled — with a Differences column. Open that cell and Where the numbers differ names the BOMs that disagree at that location, with both figures. Every location is shown, even when the page is narrowed to one, because the setting applies everywhere. Large selections are previewed on the first 50 finished goods and say so.

  3. Press Check. Nothing is applied before this. The check runs every rule the change would hit across the whole selection and reports each finished good as Will apply, Applies with changes (dynamic adjustment or maintain inventory goes off), Blocked (nothing to anchor in Shopify, no inventory level anywhere, or the item couldn’t be found) or Already on (left alone — use Reconcile if its numbers need lining up). A location rule that keeps a BOM made to order or disabled at a location means no pre-assembled stock is set there, and the check names the location and the reason. One check answers for both directions, so switching direction just re-filters the list; Check again re-runs it.

  4. Apply. The button carries the count the check gave — Apply to 12 — and only comes alive once you’ve picked a direction and there’s something to apply. Blocked finished goods are refused and already-on ones skipped, exactly as the check said; if anything was refused or skipped the dialog stays open with the list. Updating Shopify runs in the background, so rows keep a Sync queued marker until it lands.

Switching the mode back off is a plain confirmation on both pages: availability returns to pre-assembled stock plus what your components allow, and that restore runs in the background.

See Settings → Only sell pre-assembled quantities.

Once a finished good is on Only sell pre-assembled quantities, the number Shopify shows as available is your shelf — minus anything already promised to open orders. When those two stop matching (someone edited inventory in Shopify, a sale never reached Assemblified, another app wrote a number), Assemblified tells you instead of quietly picking a side.

Shopify moves by exactly what you moved. Build 10 and Shopify goes up by 10; correct the shelf by −3 and Shopify goes down by 3; take 4 apart and Shopify goes down by 4. Never by more to cover a level that was already wrong, and never by a jump to “line the two up”. The reconcile dialog is the only place the two numbers are forced together — plus the one-off moment you switch a finished good (or one of its locations) into or out of selling pre-assembled only, which is when the meaning of Shopify’s number changes. So a difference you can see today is a difference that stays visible until you settle it, instead of turning into a surprise inventory adjustment on your next build.

On the Finished goods list the Pre-assembled number turns amber when a location that sells from the shelf is out of step. Click it and the card names each one: what Shopify shows, what it should show, and the difference, in one of two readings:

  • Sold without the shelf noticing — Shopify is lower than expected.
  • Put back on sale — Shopify is higher than expected.

A location that doesn’t sell from the shelf is never counted as a difference, and a finished good that doesn’t sell pre-assembled anywhere keeps a plain number. If Shopify’s stock can’t be read at that moment the card says so rather than showing a number it can’t vouch for. The finished-good detail page’s Overview tab carries the same reading on its Stock by location card.

The card, the detail page’s stock card and the bulk menu (Inventory → Reconcile pre-assembled stock) all open the same dialog. It asks one question — Which number wins?

  • Use Shopify’s numbers — the Pre-assembled column reads current → new, and a Change column shows what each location gains or loses.
  • Keep the pre-assembled numbers — the arrow and the Change column move to the Shopify column instead, because now it’s Shopify that gets rewritten.

Only locations that actually differ are listed; anything already in agreement is left alone. Keeping the pre-assembled numbers re-anchors Shopify in the background, so the confirmation tells you the sync is queued rather than done.

That depends on one shop setting — Use location-sensitive dynamic BOM recalculation, under Settings → General → Multi-location sensitive adjustments:

  • Off (it is off until you switch it on) — only your default location is involved. Its pre-assembled count is compared with the stock Shopify shows at that location, and only that location is changed. Stock at your other locations is neither read nor written, so nothing there moves to make up a difference somewhere else, and no difference there is reported.
  • On — every location that stocks the finished good is compared and reconciled, each against its own numbers.

So if you run more than one location and want the shelf and Shopify kept in step everywhere, switch the setting on in Settings → General. The amber number and the detail page’s stock card follow the same rule as the dialog — with the setting off they only ever speak about your default location.

Everything the run won’t touch is named in the dialog, not hidden:

  • Locations a location rule excludes — made to order there, disabled there, or only sell pre-assembled not active there. They’re listed with the reason and nothing is written to them, in either direction.
  • Finished goods that don’t sell pre-assembled anywhere, and finished goods with no Shopify inventory item, counted on a neutral line.

Units committed to open orders stay off sale

Section titled “Units committed to open orders stay off sale”

If a location has units already committed to open orders, the dialog says so under that row (“3 units are committed to open orders and stay off sale”). Keeping the pre-assembled numbers writes the shelf minus those units to Shopify — they’re already spoken for, so putting them back on sale would sell them twice. That’s why the number pushed to Shopify can be lower than the shelf.

A Shopify number below zero can be adopted

Section titled “A Shopify number below zero can be adopted”

Your shelf has a negative state, so Use Shopify’s numbers reproduces a negative reading as it stands: a location Shopify has oversold to −2 becomes a shelf of −2, and the row shows that target rather than a 0 Shopify never reported. It is an ordinary row in the preview like any other.

Your Allow negative inventory setting does not stop it, either. That setting governs what you take off a shelf; adopting is Assemblified copying a number Shopify already shows, not a withdrawal, so it goes through whether the setting is on or off. Keep the pre-assembled numbers is the other way out, and pushes the shelf figure to Shopify instead.

Switching Only sell pre-assembled on with Use Shopify’s numbers works the same way: a negative Shopify reading is adopted as it stands, and the check before it raises nothing about it.

Every reconcile also re-checks the per-BOM number against its locations and fixes any that had fallen out of step, whichever direction you chose. When it repaired something the result says so — “2 totals repaired”. It’s worth running a reconcile for that alone if a row’s total ever looks wrong next to its locations.

The reconcile dialog settles a disagreement you can already see on one finished good. Inventory Health, under Settings → Tools, is the shop-wide version: it finds finished goods whose local quantity drifted above what Shopify holds, and closes the live gap.

It exists for one historical cause. Only sell pre-assembled quantities and Dynamic adjustment used to be combinable, and a finished good running both had its number written from two places at once. That combination is now refused outright (see Dynamic adjustment), but a shop that ran it in the past can still be carrying the difference.

  1. Scan. The page opens empty; Scan for drift starts it. The scan is read-only — it compares your local inventory with Shopify and changes nothing.
  2. Read the table. One row per variant and location: product, SKU, variant, location, the Local figure, the Shopify figure and the Gap between them, plus a Double-writes badge counting how many runs wrote that number twice, and the materials involved. A row already corrected once is marked “Previously reconciled N×”. Export CSV takes the whole report away for checking.
  3. Apply. Tick the rows to fix — only rows with a live gap are selectable — and choose Apply selected corrections. The confirmation says exactly what it does: it sets the local inventory of the selected variants to match Shopify. It is safe to re-run, and variants that already match are skipped.

If the scan finds nothing, the page says so: “No drift detected. Your local inventory matches Shopify.”

Briefly: when an order is cancelled or refunded, what happens to pre-assembled depends on the Keep Assembled on Return setting — unless the finished good sells pre-assembled only:

  • If it sells pre-assembled only at that location: the units go back on the shelf, whatever the setting says. The sale never took any materials, so there is nowhere else for them to go.
  • If on: the cancelled units restore to the BOM’s pre-assembled shelf. Raws are not touched.
  • If off: the cancelled units break back down — pre-assembled stays where it is, and raws come back to inventory. (With nuance: nested assembly bills have their own flag.)

Full coverage in Refunds & cancellations.

  • The shelf can go negative, and that is on purpose. Nothing is clamped at zero any more. Under the ordinary modes a sale takes what the shelf holds and the remainder pulls from raws, so it lands at zero; under Only sell pre-assembled quantities the whole order comes off the shelf and it can read below zero until you build. A count below zero means “sold, not yet built” — it is reported honestly rather than rounded away, and it clears by building.
  • Decimal pre-assembled is supported per-location but the aggregate per-BOM number is integer. For fractional cases, trust the per-location table.
  • Failed Shopify writes don’t roll back the shelf decrement. If a Shopify call rejects (rate limit, bad location), the shelf has already moved. Recovery is via manual reconcile or Synchronize with Raw Materials.
  • A finished good with no Shopify product linked has no shelf. Pre-assembled stock is kept per location against the linked Shopify inventory item, so until you link the finished good to a product Assemblified refuses to change its pre-assembled count — a build that outputs it completes and consumes its materials, but the finished units aren’t booked, and a work order warns you about it when you create it. Link the product first; any count the finished good already carried is moved onto your default location at that moment, not lost.
  • Assembly-bill pre-assembled is separate. A BOM has its own shelf; each assembly bill inside it has its own. They’re consumed at different layers of the recursive expansion. See Assembly bills → Nesting & execution.