Import BOMs from a spreadsheet
If your recipes already live in a spreadsheet — exported from an ERP, kept by hand, sent over by a supplier — you do not have to retype them. Import from CSV/XLSX reads one file with one row per component and turns it into as many bills of materialsBill of MaterialsA bill of materials tells Assemblified how to build one unit of a finished good. When a customer orders the finished-good variant, Assemblified deducts the right component quantities from inventory automatically. Read more → as the file describes.
Open it from the Finished goods page: More actions → Import from CSV/XLSX.
On this page
Section titled “On this page”- What the file has to look like
- Step by step
- What the review tells you
- Creation settings
- Long runs: stopping, resuming and what is already saved
- Common gotchas
What the file has to look like
Section titled “What the file has to look like”One row per component. A bill with six components is six rows, and every one of those rows repeats the finished good it belongs to. That is how the importer knows which rows belong together.
Three things are always required:
- An identifier for the finished good on every row — its variant SKU, or its product and variant IDs, or its product name together with its variant name.
- An identifier for the component on the same row — its SKU, its variant ID, or its product title together with its variant title.
- A quantity.
Everything else is optional: a name for the bill, a name for the material, the material type (raw material or sub-assembly), a waste percentage, a location, a component weight and its unit.
Column headings do not have to match exactly. The importer recognises a wide list of alternatives (including trailing asterisks, “Raw” prefixes and German headings), and anything it cannot place automatically you map by hand in the next step. If you would rather start from a known-good file, the upload step offers a CSV template and an XLSX template with the expected headers.
The file limit is 20 MB, in .csv, .xls or .xlsx.
Step by step
Section titled “Step by step”-
Upload the file. Drag it in or browse for it. If you have imported this shape of file before, you can pre-load a saved mapping here and skip most of the next step.
-
Map the columns. Each target field gets a source column from your file. The importer pre-fills everything it recognised; you fill in the rest, or set a field to Skip. This is also where you tell it how your numbers and dates are written — US (1,234.56) or EU (1.234,56), and a date format if the file has dates.
Tick Save mapping as template to reuse this mapping next time.
-
Preview and validate. You see how many rows the file has, how many are valid and how many are not, with a table naming each rejected row and why. You can go on with only the valid rows — the button says exactly how many will be skipped.
-
Wait for the lookup. Assemblified looks your products and components up in Shopify so it can tell you what will actually be created, rather than finding out halfway through the run. Large files are processed in batches with a progress bar.
-
Review what the file describes. One row per bill of materials, not per spreadsheet row — see What the review tells you below.
-
Choose the creation settings and create. The button names what it is about to do: Create 12 BOMs, Update 12 BOMs or Create or update 12 BOMs, depending on the mode you picked.
-
Read the result. A clean run tells you how many bills were created. A partial one names every bill that failed and why, so you can fix the file and run those again.
What the review tells you
Section titled “What the review tells you”The review is the last stop before anything is written, and it is grouped by bill of materials: one row per finished good, with how many spreadsheet rows fed it. A line above the table sums it up — “12 bills of materials from 74 rows” — followed by badges counting what is ready, blocked, already existing, and how many rows could not be identified at all.
Each row carries its own state:
| Badge | What it means |
|---|---|
| Ready | Nothing in the way. It will be created. |
| Blocked | Something is missing and it will not be created. The badges beside it say what. |
| Finished good not found | The identifier on those rows matches no product in your Shopify catalog. |
| N components not found | Some of the components could not be matched in Shopify. |
| Already has a BOM | That finished good already has a bill of materials. What happens to it is your choice — see the creation settings below. |
| N rows unreadable | Some of the spreadsheet rows feeding this bill could not be read — the preview step names each one and why. |
| N locations cleared | The file named a location your store does not have. That location is dropped, and those components are created without it. |
Rows that named no finished good at all are collected in their own group at the top of the table, Rows that could not be identified — they belong to no bill, so they are reported rather than guessed at.
Three things you can do from here:
- Change mapping — reopen the mapping step. The file is still loaded, so a remap costs no second upload.
- Exclude the blocked ones — take every blocked bill out in one click.
- Remove — drop one bill from the run.
Creation settings
Section titled “Creation settings”Underneath the review sit three choices that apply to the whole run:
- Finished goods that already have a BOM. Create new only (skip existing), Update existing only, or Create new and update existing. The primary button’s verb follows this choice, so you can always see whether you are about to write new bills, rewrite old ones, or both.
- Status of the new bills of materials. Inactive (the default) or Active. An inactive bill is not applied to orders until you activate it, which is usually what you want straight after a bulk import.
- Run dynamic adjustment after the import. Optional. Recalculates what Shopify shows as available for every bill the run created, once the run finishes. See Dynamic adjustment.
Long runs: stopping, resuming and what is already saved
Section titled “Long runs: stopping, resuming and what is already saved”A large file is worked through in batches, and the dialog shows you which batch it is on and how many rows have been processed.
- Stop halts the run between batches. A batch already on its way finishes.
- Resume starts again from the batch that failed or was stopped — never from zero.
- Batches that already finished are not undone. If you stop halfway, the bills created so far exist. Re-running the same file afterwards will find them as Already has a BOM, and the existing-BOM setting decides what happens to them.
Leave the dialog open until a run finishes.
Common gotchas
Section titled “Common gotchas”- One row per component, not one row per bill. A file with one row per finished good and its components crammed into one cell cannot be read.
- Quantity is required. A row without one is rejected at the preview step and named there.
- Mixed identifier kinds are refused. SKUs on one side and IDs on the other blocks the mapping step; the message names the columns that count as identifiers on each side.
- A blocked bill is not partially created. If a bill’s finished good cannot be found, no part of it is written.
- New bills are inactive by default, so nothing changes in your store until you activate them. See Creating a BOM → What happens after you click Create.
- Waste percentages, locations and weights are optional but honoured. If the columns are there and mapped, they land on the components.
Where to next
Section titled “Where to next”- Creating a BOM — the one-at-a-time dialog, and the bundles.app import.
- Create BOMs in bulk — build a product line in a grid instead of a file.
- Composition — what each component type does when an order arrives.
- Migrate a catalog to BOMs — the end-to-end migration plan.