Skip to content

Composition

A BOM is composed of components. Components come in three kinds — four if you count nesting via a sub-assembly. Each kind has slightly different mechanics at executionBOM executionThe pipeline that runs when a Shopify order containing a BOM-bound variant is created, edited, cancelled, or refunded. Webhook → queue → DO handler → Shopify inventory adjustment, plus pre-assembled drawdown, sub-assembly recursion, and dynamic adjustment cascade. Every run writes one execution log row. Read more → time. This page explains each one.

  • Shopify-linked raw materials
  • Virtual materials
  • Sub-assemblies
  • The “BOM as raw” pattern
  • Quantity, waste percentage, and alternatives
  • Per-component locations

The default. A real Shopify variant — wax, wick, jar, label, whatever — that you also stock in Shopify and want to deduct as it’s consumed.

When the BOM fires, Assemblified writes an inventory adjustment to Shopify via the Admin API. The component’s stock drops; the BOM’s finished-good stock is what was sold.

Use it for:

  • Components you also sell standalone.
  • Inventory you want visible in Shopify and on your storefront.
  • Multi-location inventory you manage in Shopify.

A virtual materialVirtual MaterialA material tracked entirely inside Assemblified — not a Shopify variant. Useful for shop-floor consumables (glue, packaging, labour units) where you need quantity tracking but don't want a Shopify product on your storefront. Read more → is internal to Assemblified — no Shopify variant. Inventory is tracked entirely in Assemblified. There’s no Shopify-side decrement.

Use it for:

  • Consumables you don’t want in your Shopify catalog (tape, glue, screws, packaging).
  • Materials you source from a non-Shopify supplier.
  • Ingredients tracked in tiny per-assembly quantities (one screw per unit) where setting up a Shopify product is overkill.

You create virtual materials from the Raw Materials page (Virtual tab) — see Raw Materials → Virtual materials. Once created, they show up in the component picker on the BOM detail page just like Shopify-linked materials.

A sub-assemblySub-AssemblyA reusable assembly block that composes into bigger BOMs. Define it once, include it in any BOM. At execution time, Assemblified expands the sub-assembly into its own components recursively. Read more → is a reusable bundle of components — itself made of raw materials and (optionally) other sub-assemblies. Define once, drop into any BOM.

When the BOM fires, the sub-assembly is expanded recursively into its components. The sub-assembly itself doesn’t have a Shopify variant; it’s pure recipe.

Use it for:

  • Components shared across many BOMs (e.g., a “wick assembly” used in every candle).
  • Reducing duplication when 20 BOMs share the same 10 underlying raws.
  • Modeling a step in your assembly process you also build ahead of time.

Sub-assemblies can carry their own pre-assembled stockPre-Assembled InventoryStock of finished sub-assemblies and BOM items that have already been built and are sitting on the shelf. When a work order needs a sub-assembly, it draws from pre-assembled inventory first and only builds fresh ones if the shelf comes up short. Read more → . When a parent BOM expands the sub-assembly during execution, the sub-assembly’s shelf is consumed first — only the remainder pulls the sub-assembly’s components.

See Sub-Assemblies → Nesting & execution for the recursive expansion details.

A BOM’s finished-good variant can itself be referenced as a raw material in another BOM. This is the “BOM-as-raw” pattern.

Example: you sell a “Wax Block” as its own product (BOM A). Then you also sell a “Candle Kit” (BOM B) that contains one Wax Block plus other components. The Wax Block’s variant appears as a raw material in Candle Kit’s component list.

When Candle Kit’s BOM fires:

  1. Assemblified looks up the Wax Block component.
  2. Recognizes it’s a BOM (isBOMVariant=1 flag on the underlying raw-material row).
  3. Treats Wax Block’s pre-assembled inventory as the source — drawing from the shelf first.
  4. If Wax Block’s shelf is short, Assemblified does NOT recursively descend into Wax Block’s recipe. The expectation is that the Wax Block was either pre-built or its inventory is otherwise managed.

Quantity, waste percentage, and alternatives

Section titled “Quantity, waste percentage, and alternatives”

Every component reference carries:

  • Quantity per BOM unit. How many of this component are consumed when the BOM produces one finished good. Decimals are supported (e.g., 0.5 meters of cable per unit).
  • Waste percentage. A margin applied during execution: effective_consumed = quantity × (1 + wastePercentage / 100). Useful for materials with predictable loss (cuts, trimmings, evaporation). 5% is a typical default; some processes have 10–20%.
  • Alternative items. A list of alternative variant IDs that could substitute for this component. Today this is metadata — operators see it during work-order picking but the BOM execution path doesn’t auto-substitute.

For sub-assemblies, only the quantity field exists. Sub-assemblies don’t carry waste% at the parent level — waste lives on the sub-assembly’s own raw-material references.

To include human labour in the rollup as a per-unit line, see Track building cost — the standard pattern uses a virtual material with unit cost = hourly rate.

By default, components are consumed from the default Shopify location (configured in your shop settings). You can override this per-component reference:

  • Set a location on a Shopify-linked raw material’s row to always pull that component from a specific location, regardless of where the order ships from.
  • Leave it blank for “use default location, or use the order’s fulfillment location if the shop has location-sensitive dynamic adjustment enabled”.

This is useful for multi-warehouse setups where components are stocked separately. See Raw Materials → Inventory tracking for the full picture.

  • Settings reference — once your composition is set, configure how the BOM behaves.
  • Execution model — see how composition translates to inventory adjustments at order time.