Model machines, BOMs and options

Model a bill of material

Assemblies, positions, quantities.

Building a parts list in the catalogue means three things: an association type that carries quantities, assemblies that exist as products, and one association row per BOM position.

Before you start: read Bills of material and assemblies, and have one export in front of you — a single assembly, not the whole installed base. Model BG-4400 completely, prove the shop renders it, then industrialise. Starting with 3,000 positions means finding out about your modelling mistakes 3,000 times.

1. Create the association types

Go to PIM › Data model › Association types. You need at least these:

CodeQuantifiedTwo-wayUsed for
bom_partyesnoA position in a parts list: this assembly contains 4 × DR-88-042
spare_partyesnoRecommended spares for a product, without implying containment
replaced_bynonoSupersession, forward in time
replacesnonoThe mirror of replaced_by
alternativenoyesInterchangeable articles
accessorynonoOptional extras

For each one, select New association type, give it a code and labels, then set the two flags:

  • Quantified — the relationship carries a number. Set it on bom_part and spare_part. Without it you can say a seal belongs to an assembly but not that four of them do.
  • Two-way — the reverse is maintained for you. Correct for alternative. Wrong for everything hierarchical: if bom_part were two-way, the seal would contain the assembly.
replaced_by must never be two-way. Supersession has a direction — 4711-A is replaced by 4711-B, not the reverse. A two-way flag here turns a chain into a loop, and resolving "which part do I ship now" becomes impossible. If you want the reverse visible on the successor's page, use a separate replaces type.

2. Create the assemblies as products

An assembly is an ordinary product. Give BG-4400 a SKU, a family, a name in customer language, and its exploded drawing. It sits in PIM › Products with everything else.

Two decisions to make once, for all assemblies:

  • A family for assemblies. They need different attributes from parts — drawing_number, revision, assembly_level, and rarely a weight or a thread size. Create an assembly family rather than forcing them into the parts family with half the fields empty.
  • Whether the assembly is orderable. Some are sold complete, some exist only to be navigated. Record it explicitly with an attribute such as orderable_as_spare_part and let the storefront say "supplied only as part of BG-4400" rather than returning nothing. Use enabled for products that should not appear at all.

3. Add the positions

For each position in the parts list, add one association on the assembly:

  1. Open the assembly in PIM › Products.
  2. Go to its Associations.
  3. Add an association of type bom_part pointing at the child product.
  4. Set the quantity — 4 for four seals, 1.8 for 1.8 metres of hose. The quantity is a decimal, so units other than pieces are fine.
  5. Set the position so the list sorts the way the drawing numbers it. Use the drawing's own position number here — it is what the buyer reads out.

Repeat for the whole assembly. One row per position, in drawing order.

4. Build the levels

Multi-level is what you get by pointing assemblies at assemblies. BG-4400 has a bom_part association to the valve block BG-4420, which has its own bom_part associations to seals and springs. Nothing special is required — the depth emerges from the data.

Two things to watch as the depth grows:

  • No cycles. An assembly that contains itself, directly or through three hops, will hang whatever walks the tree. If your ERP export contains one, it is a data error there; fix it there.
  • Depth discipline. Four to six levels is normal; twelve usually means the E-BOM was imported without the editorial pass. See Bills of material and assemblies.

5. Import in bulk

Nobody types 3,000 positions. The BOM export from your ERP becomes an import file with one row per position.

  1. Export from the ERP as one row per BOM item: parent SKU, position number, child SKU, quantity, unit.
  2. Map it to the association import format — see Prepare your import file.
  3. Import the parts and assemblies first, then the associations. An association pointing at a SKU that does not exist yet fails, and a failed position is a hole in a parts list nobody notices until a buyer does.
  4. Run it into a staging import first and check the counts before you apply.
  5. Re-run on a schedule if the ERP owns the structure. Decide whether a re-import replaces an assembly's positions or merges into them — with merge, positions deleted in the ERP live on in the shop forever.

See Import products in bulk and, for the recurring case, Connect a system.

What to check

  • Position count matches the source. If the drawing has 47 positions, the assembly has 47 associations. Off by three means three failed rows.
  • Quantities are not all 1. A BOM where every quantity is 1 usually means the quantity column was not mapped.
  • Every child SKU resolves. No associations pointing at nothing.
  • The tree renders. Walk machine → assembly → sub-assembly → part in the storefront and confirm each level has a name a technician would recognise, not an internal designation.
  • Spot-check against the drawing. Print the exploded drawing, pick five positions at random, and check them against the catalogue. Do this on every assembly for the first month.

Next