Skip to content

Creating an assembly BOM

Creating an assembly BOM (defines a subassemblySubassemblyA reusable assembly block that composes into bigger bills: define it once, include it in any bill of materials, and Assemblified expands it into its own components at execution time. Its definition is an assembly BOM. Read more → ) is a two-step job: create the bill, then give it components.

  • Creating one by hand
  • Adding materials
  • Nesting other assembly BOMs
  • Recording what is already on the shelf
  • Duplicating an existing assembly BOM
  • Creating or updating many at once from a spreadsheet
  • Deleting one, and what blocks it
  1. Click Assembly BOMs in the app navigation. That opens the assembly BOMs list.

  2. Click Create. The dialog is titled Create an assembly BOM and asks for three things:

    • Name — required. Pick something descriptive (“Candle base”, “Wick assembly”).
    • SKU — optional, and yours to define. It is not bound to anything in Shopify, and it is what the importer and the exporter use to find the bill.
    • Description — optional free-form notes.

    Confirm with Create. The bill is created empty, with both behaviour settings off and no pre-assembled stock, and you land on its detail page.

  3. Open the Materials tab. This is where the BOM lives: materials, nested assembly BOMs and additional costs, in the order they are costed.

  4. Add materials. In the Components card, use Add materials. The menu offers four sources: Shopify materials, Virtual materials, New virtual material, and Import from CSV/XLSX. Each row then carries:

    • Quantity — how many of this material one unit of the assembly consumes.
    • Waste — an optional percentage, applied when the line is consumed.
    • Location — an optional override. Left empty, the line is consumed from the order’s location (or from your default location, when multi-location adjustments are off).

    The row also shows Available, Cost and Total, and its ⋯ menu offers Edit notes and Remove material.

  5. Optionally nest other assembly BOMs. Assembly BOMs can contain assembly BOMs. In the Subassemblies card, use Add subassembly and pick from the bills you already have. Set the quantity; the picker hides anything that would create a loop (see below).

  6. Optionally add additional costs. The Additional costs card on the same tab attaches cost rates (labour, packaging, overhead) to the bill. Additional costs are part of the Enhanced plan.

  7. Save. The page’s save bar appears as soon as anything on the Materials tab is dirty, and it blocks navigation until you save or discard.

The assembly BOM is now ready. Reference it from any finished good’s Subassemblies card, or from another assembly BOM.

The Overview tab carries a Structure card: a preview of this bill’s own component graph with nested assemblies opened out. Its Open action takes you to the full canvas, where the same BOM can be read and edited as a graph. See Structure panel.

Assembly BOMs can contain assembly BOMs, to any depth. Add them from the Subassemblies card on the Materials tab, with a quantity per nested bill, exactly as you would a material.

What you can’t do is close a circle. An assembly BOM cannot contain itself, directly or through any chain of nested bills, and a save that would close such a loop is refused. The message names the two bills and the chain between them, so you can see which link to remove.

The refusal applies however you make the nesting: the Materials tab, the structure canvas, a bulk material edit or a version restore. The pickers also hide the bills that would be refused, so in normal use you never reach the message.

If you already have built units of the assembly sitting on a shelf, record them from the Overview tab. The Stock by location card has one row per location; the pencil beside a location’s pre-assembled figure opens the Quick build dialog already set to Correction (count) for that location.

A correction moves no component stock, and it doesn’t take the count below zero. The full set of reasons Quick build offers (build, correction, the two disassembly reasons, write-off) is covered on Pre-assembled stock.

Every pre-assembled change belongs to a location. If you don’t name one and your store has no default location set, the change is refused rather than applied somewhere you didn’t choose. Set a default location in Settings if you run a single location.

If an existing assembly BOM is almost what you want, duplicate it.

  1. From the list, open the row’s ⋯ menu and choose Duplicate.
  2. Give the copy a name, and optionally a SKU. The copy starts without a SKU unless you give it one.
  3. Confirm with Duplicate.

The copy keeps the whole BOM (materials with their quantities, waste and location overrides; nested assembly BOMs; additional costs) and it keeps the per-location rules and both behaviour settings, because those describe the BOM rather than its stock. What the copy does not inherit is stock: it starts with no pre-assembled units at any location. Its cost is recalculated from the copied BOM right after it is created.

For catalogue migration, use the spreadsheet importer instead of the create dialog. Open More actions → Import from CSV/XLSX on the assembly BOMs list. The same import also updates assembly BOMs you already have: their components, their price and both behaviour settings. Pre-assembled stock is not part of this import: to set it for many assembly BOMs at once, use Importing pre-assembled quantities.

The dialog is titled Import assembly BOMs from a spreadsheet, and it wants one row per component: it groups the rows by assembly and creates (or updates) one assembly BOM per group.

  1. Upload. Pick a CSV or XLSX file. The dialog reads it in the browser and shows you the headers it found.

  2. Map the columns. Tell it which column is the assembly name, which is the SKU, which is the material, the quantity, and so on. You can come back to this later with Change mapping without uploading the file again.

  3. Review. One row per assembly BOM, with badges for anything wrong. You can remove an assembly from the run, or use Exclude the blocked ones to drop every blocked assembly BOM in one go. There is no per-cell editing here on purpose: fix the data in the file or fix the mapping, then re-review.

  4. Set the creation settings and create. The import runs in batches, with a progress bar and a Stop button. If a batch fails the run stops rather than carrying on, and Resume picks up from where it stopped rather than from the beginning.

  5. Read the result. The final screen names every assembly BOM that was created and every one that failed, with its reason.

Every row is one component of one assembly BOM. Use one way of naming things throughout the file: assembly and material by SKU, by ID, or by name.

ColumnRequiredBlank means
Sub-Assembly SKU, Sub-Assembly ID or Sub-Assembly NameOne of themWhich assembly BOM the row belongs to. Rows that share it become one bill.
Sub-Assembly DescriptionNoNo description. On an update, a blank description clears the stored one.
Material SKU, Material ID or Material NameOne of them, the same kind as the assembly columnThe component.
Material TypeNoA material. The other value is Subassembly, for nesting an assembly BOM.
QuantityYes—
Waste %NoNo waste.
LocationNoNo location override. An unknown location is cleared, and the component is imported without one.
NotesNoNo notes.
Selling priceNoNew bill: 0. Existing bill: the price is left as it is. A number, 0 or more.
Keep assembled on returnNoNew bill: off. Existing bill: left as it is. Yes or no.
Only consume pre-assembledNoNew bill: off. Existing bill: left as it is. Yes or no.

The last three columns describe the assembly BOM, not the component, so a bill’s value is simply repeated on each of its rows. It is enough to fill it in on one row and leave the others blank. The unit cost is not a column: it is always calculated from the components.

The importer looks up which assembly BOMs in the file you already have, matched on the column the file uses (SKU, ID or name), and badges them Already exists. Assembly BOMs that already exist is the decision:

OptionWhat happens
Create new only (skip existing)Rows that match an assembly BOM you have are left alone.
Update existing onlyOnly the matching assembly BOMs are written; new ones are ignored.
Create new and update existingBoth.

Updating replaces that bill’s components with the ones in the file. Its price and its two behaviour settings change only where the file has a value for them.

If nothing in the file matches an assembly BOM you already have, the choice isn’t offered: every bill is created new.

Delete from the row’s ⋯ menu, from the bulk bar, or from More actions → Delete on the detail page. Every route opens the same dialog, and the dialog previews what would be deleted before you confirm: the component references, the nested assembly references, the additional-cost links, the pre-assembled units on the shelf and the group memberships.

Two things block a delete:

  • Used by other BOMs. If a finished good or another assembly BOM references the bill, the delete is refused outright and the dialog names what references it. There is no override. Remove the references first.
  • An active reservation holds stock. This one can be overridden: tick Release the reservations and delete, and the reservations are released before the delete. If any release fails, nothing is deleted.

Pre-assembled stock on the shelf is a warning, not a blocker. The dialog says Pre-assembled stock is on the shelf and will be removed and lets you go ahead.

  • Assembly BOMs have no Shopify product. They are never sold on their own. If you need to sell something, create a finished good, which links to a Shopify variant.
  • Editing an assembly BOM affects every bill that references it, immediately. There is no version pinning. Add a material to an assembly BOM and the next order that fires any referencing finished good consumes it too. If you want a record of what the BOM was, save a version first.
  • Waste is per line, not per layer. See Nesting & execution.