Skip to content

Refunds & cancellations

When an order is cancelled or refunded, Assemblified can either break the assembled units back into raws (return components to inventory) or keep them assembled (return them to the pre-assembled shelf). The choice is controlled by the Keep Assembled on ReturnKeep Assembled on ReturnA toggle on BOMs and sub-assemblies that controls cancel/refund behavior. When on, returned units restore the entity's pre-assembled shelf instead of breaking back into raws. Cascades through nested sub-assemblies — traversal halts at any node with the flag set. Read more → setting — and it cascades through nested assembly bills in a non-obvious way.

This page explains the cascade rule with worked examples.

  • The Keep Assembled on Return setting
  • The three-branch behavior table
  • Partial refunds and the netting rule
  • Full cancellations
  • “Don’t restock” — refunding without putting units back
  • The two sync switches (when to stop cancel/refund processing shop-wide)

On a finished good, open the Settings tab and find Keep Assembled on Return in the Preferences section. Preferences are saved together, so change it and then save.

  • On. Cancelled or refunded units go back into this BOM’s pre-assembled stock instead of being broken back down into raw materials.
  • Off. Cancelled or refunded units are broken back down into raw materials, while nested assembly bills can still keep their own assembled stock if flagged.
  • Default: Off.

An assembly bill (also called a sub-assembly) has an independent switch of the same name, in the same place on its own detail page. The interaction between them is what makes this surface tricky.

For a BOM B containing an assembly bill SA, where each entity has its own flag:

Parent BOM flagSA flagWhat happens on cancel/refund of N units
On(any)Nothing decomposes. BOM B’s pre-assembled shelf gets +N. Raws stay inside the assembled units. SA’s stock unchanged.
OffOnSA stays assembled, parent’s direct raws return. SA’s pre-assembled shelf gets +N×qty (where qty is the SA’s quantity multiplier in the parent). The parent BOM’s direct raw materials (not those inside the SA) return to inventory.
OffOffAll raws return. Both the parent’s direct raws and the SA’s nested raws come back to inventory. The recursion continues into nested assembly bills unless one of them has the flag.

The rule, in plain English: traversal halts at any node with the flag set. A BOM with the flag on stops everything. A BOM without the flag traverses; if it hits an assembly bill with the flag, it stops there.

Set up:

  • BOM B contains 3 × Raw R1 directly + 1 × Assembly bill SA.
  • SA contains 5 × Raw R2 + 2 × Raw R3.

Customer orders 4 units of B. Then cancels.

ConfigurationWhat restores
B flag on, SA flag (any)B’s pre-assembled +4. R1, R2, R3 unchanged. SA’s pre-assembled unchanged.
B flag off, SA flag onR1 +12 (4 × 3). SA’s pre-assembled +4 (4 × 1). R2, R3 unchanged.
B flag off, SA flag offR1 +12. R2 +20 (4 × 1 × 5). R3 +8 (4 × 1 × 2). Pre-assembled unchanged.

Refunds and cancellations are processed independently. Each refund:

  • Walks the cascade rule for the refunded quantity.
  • Records the refund against that order, so a later cancellation knows about it.
  • Restores raws or pre-assembled per the cascade.

If you refund 3 units of a 10-unit order, then refund 2 more, you’ve now refunded 5 units total. Each was processed when it happened.

When a customer fully cancels an order after one or more partial refunds, Assemblified nets the prior refunds against the original order quantity:

  • Original order: 10 units.
  • Refund 1: 3 units (already restored at refund time).
  • Cancel: line item shows 10 units.
  • Net to restore on cancel: 10 − 3 = 7.

Without this netting, the 3 already-refunded units would be double-counted. With it, the math is clean: the customer’s order goes from 10 → 0 in inventory effects.

Worked into the cascade: if Keep Assembled is on, the BOM gets +7 to its shelf (not +10). If off, raws restore for 7 units (not 10).

When you refund or cancel in Shopify, each line asks whether to restock the items. Assemblified follows that choice for the components too, in every setup — single location, multiple locations, with or without order reservations:

  • Restock returns exactly what the sale took: the components (or the pre-assembled units) come back, following the Keep Assembled cascade above. Nothing more, nothing less.
  • Don’t restock means the units are gone, and the components stay used:
    • Before the order ships, the refunded units’ components are consumed at refund time (if your setup had not already taken them when the order came in). They are not handed back to available, and the later shipment only uses components for the units that actually ship.
    • After the order ships, nothing is restored — the components were used to make what was sent.

A later cancellation never brings back units you refunded with “Don’t restock”. Example: an order of 10, you refund 3 with “Don’t restock”, then cancel the rest with restock — 7 units’ worth of components come back, the 3 stay used. Cancel the rest with “Don’t restock” too, and nothing comes back.

This keeps a finished good’s pre-assembled shelf in step with Shopify: Shopify does not put a “Don’t restock” unit back on sale, so Assemblified does not put it back on the shelf either.

If you use Logistified, a “Don’t restock” refund does not lower the order’s material demand either — the components were used, so they still count, the same as units that shipped. Only restocked units reduce demand.

Two shop-level switches stop cancel and refund processing from touching inventory. Both live under Settings → General, in the Inventory sync section:

  • Disable cancelled orders sync to inventory. Cancelled orders no longer reverse the original raw-material inventory changes in Shopify. With it off (the default), they do.
  • Disable refunds sync to inventory. The same, for refunds.

They are ordinary merchant switches — anyone who can open Settings can change them. What they are for is narrower than what they can do. Reach for them during an incident:

  • A flood of refunds in an unexpected pattern.
  • A data migration where you want incoming events to stop affecting stock.

While either is on, cancellations and refunds still arrive and are still recorded on the Logs page; they just produce no inventory movement. After switching back, reconcile any orders that came through during the window yourself.

A third switch sits in the same section — Allow negative inventory in Assemblified calculations — which decides whether Assemblified-managed quantities may stay below 0 or are clamped at 0. It is not a cancel/refund switch, but it shapes what a restore can leave behind.

If you have the Logistified integration (Enhanced subscription), the demand side always sees the full raw-material requirement on cancel/refund, regardless of the Keep Assembled flags. The reasoning: demand tracking is in absolute terms — the customer’s order isn’t going to be fulfilled, so the demand should drop. Whether the physical inventory comes back is a separate decision (the cascade rule).

So a cancel with Keep Assembled on:

  • Physical inventory: unchanged (units stay assembled).
  • BOM pre-assembled shelf: +N.
  • Logistified demand: -full raw requirement (as if the units would have been built from scratch).

This usually behaves correctly. The asymmetry only matters when reconciling cross-system reports.

  • Cancel without a prior run. If the original execution never produced a run (old order, duplicate delivery, bill inactive at the time), cancellation can produce a +N to pre-assembled with no offsetting −N. You’ll see “free” inventory appear. Use Check missing orders on the Logs page to find orders that never executed.
  • Setting the parent flag on after a cancel happened with it off. The flag is read at execution time. A cancel processed with the flag off applies that branch of the cascade; flipping the flag later doesn’t retroactively change anything.
  • Per-component locations matter on restore too. Raw materials that were consumed from a specific location restore to that location.
  • There is no separate refund event. Shopify reports both a refund and a cancellation as the same kind of order update; Assemblified tells them apart from what the update itself says. So both are handled the same way, and one run on the Logs page covers whichever it was.