Skip to content

Creating an assembly bill

Creating an assembly bill (also called a sub-assemblySub-assemblyA 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. The app now calls it an assembly bill. Read more → ) is a two-step job: create the bill, then give it components.

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

  2. Click Create. The dialog is titled Create an assembly bill 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 recipe lives: raw materials, nested assembly bills and additional costs, in the order they are costed.

  4. Add raw materials. In the Raw materials 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 bills. Assembly bills can contain assembly bills. In the Sub-assemblies card, use Add sub-assembly 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 factors (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 bill is now ready. Reference it from any finished good’s Sub-assemblies card, or from another assembly bill.

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 recipe can be read and edited as a graph. See Structure panel.

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

What you can’t do is close a circle. An assembly bill 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 shop 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 bill 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 recipe (raw materials with their quantities, waste and location overrides; nested assembly bills; additional costs) and it keeps the per-location rules and both behaviour settings, because those describe the recipe 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 recipe 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 bills list. The same import also updates assembly bills 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 bills at once, use Importing pre-assembled quantities.

The dialog is titled Import assembly bills from a spreadsheet, and it wants one row per component: it groups the rows by assembly and creates (or updates) one assembly bill 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 bill, with badges for anything wrong. You can remove an assembly from the run, or use Exclude the blocked ones to drop every blocked assembly bill 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 bill that was created and every one that failed, with its reason.

Every row is one component of one assembly bill. 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 bill 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 raw material. The other value is Sub-assembly, for nesting an assembly bill.
QuantityYes—
Waste %NoNo waste.
LocationNoNo location override. An unknown location is cleared, and the component is imported without one.
NotesNoNo notes.
Unit 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 bill, 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 bills in the file you already have, matched on the column the file uses (SKU, ID or name), and badges them Already exists. Assembly bills that already exist is the decision:

OptionWhat happens
Create new only (skip existing)Rows that match an assembly bill you have are left alone.
Update existing onlyOnly the matching assembly bills 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 bill 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 recipes. If a finished good or another assembly bill 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 bills 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 bill affects every bill that references it, immediately. There is no version pinning. Add a raw material to an assembly bill and the next order that fires any referencing finished good consumes it too. If you want a record of what the recipe was, save a version first.
  • Waste is per line, not per layer. See Nesting & execution.