Skip to content

Set up multi-location inventory

If your shop fulfills from more than one inventory location — multiple warehouses, a warehouse plus a retail store, distributed fulfillment partners — Assemblified can track raw materialsRaw materialThe atomic component of a bill of materials or an assembly bill. Two flavours: a Shopify-linked variant, whose inventory Shopify tracks, or a virtual material, which Assemblified tracks on its own and Shopify never sees. Both sit in the same component picker and are consumed the same way. Read more → and finished goods per location. This guide is the setup checklist plus the gotchas; the setting-by-setting detail lives in initial setup, and every one of these settings can be changed from Settings → General at any time.

The one decision that shapes everything: do your locations share physical stock, or not? Locations that are just labels over one physical pile need much less of what follows.

  1. Get Shopify right first.

    Multi-location tracking mirrors Shopify’s location model. Make sure your locations exist in Shopify admin, the component variants are stocked at the locations that actually hold them, and inventory tracking is on for each.

  2. Set the default location.

    The default locationDefault locationThe Shopify location Assemblified falls back to when an order or fulfillment webhook doesn't carry a more specific location. Inventory adjustments, dynamic recalculations, and per-location records all use this as their anchor. Read more → (initial setup) is the fallback anchor whenever an event doesn’t name a location. Pick your primary warehouse.

  3. Turn on multi-location mode.

    Settings → General → Multi-location sensitive adjustments → Respect order and fulfillment locations when available (Multiple locations). With it on, BOM execution applies each adjustment at the location carried by the incoming order or fulfillment event, and material availability checks become location-aware. With it off, everything targets the default location as one pool.

  4. Decide on location-sensitive dynamic adjustments.

    Location-sensitive dynamic adjustments, only relevant if you use dynamic adjustmentDynamic adjustmentA per-bill toggle that recalculates the bill's Shopify-displayed quantity after every order: the bottleneck-resource count plus pre-assembled stock. One of three mutually exclusive toggles — switching it on switches only-sell-pre-assembled and maintain inventory level off. Read more → . Turn it on when locations hold separate physical stock — “how many can we build here?” is then computed per location. Leave it off when locations share one physical pile; a single global buildable number is more accurate there.

  5. Pin component locations where it matters.

    A BOM’s component rows can carry a specific location (Creating a BOM). Use this when a component should always be consumed from one place — e.g., raw stock that only exists in the production warehouse. Components consumed from a location also restore to that same location on refund or cancellation.

  6. Consider order reservations.

    In multi-location stores there’s a window between order routing and fulfillment where a BOM’s components are still sellable to other orders. Order reservations close that over-promise window by moving resolved components to Shopify’s reserved bucket at routing time. It’s opt-in and shop-wide — read that page’s prerequisites before enabling.

    With order reservations off, components are deducted at fulfillment. When that fulfillment consumes components for a BOM with Dynamic Adjustment enabled, Assemblified recalculates its Shopify availability from the remaining preassembled stock and component capacity. This fulfillment recalculation also runs when Auto-update on inventory change is off; that switch controls recalculation triggered by separate component inventory updates. For BOMs using Maintain Inventory Level, each fulfillment restores only the units consumed from its matching reservations, including partial shipments and split fulfillment orders.

  7. Verify with a test order per location.

    Route one test order to each location (Shopify’s routing follows your fulfillment settings) and read its run in Logs: the adjustment should land at the routed location, not the default. Then cancel and confirm the restore goes back to the same location.

  • Location mapping is by Shopify location id. Renaming a location in Shopify is fine; deleting and recreating one is not — re-check the default location and any pinned component locations afterwards.
  • Historical replays have a multi-location safeguard — see Historical orders replay before replaying old orders whose location data predates your current setup.
  • Virtual materials track per-location too. Seed their opening stock at the right locations, not just a global number (Virtual materials).
  • Drift happens at the busiest location first. When a shared component’s numbers look off, Reconcile inventory per location rather than adjusting the global figure.