BoM Builder
Introduction
The BoM Builder (Bill of Materials Builder) controls how a finished configuration is presented on the PDF quote, Excel export, Checkout page, and Quotation email. Where the Form Builder defines what the user fills in, the BoM Builder defines what the customer sees in the output.
Each configurator has exactly one BoM. You decide which channels it appears in, which columns are shown, how rows are grouped, and how subtotals and summary totals are calculated.
You’ll find the BoM Builder by opening any configurator in the dashboard and clicking the BoM Builder tab next to Form Builder.
Overview of components
The BoM is built from a small set of nested components. Once you understand these, the editor is straightforward.
| Component | Role |
|---|---|
| BoM | The container for the whole configurator. Controls which channels (PDF/Excel/Checkout/Email) the BoM is visible in. |
| Tables | Top-level sections within the BoM. Each table has its own columns, groups, and visibility settings. |
| Columns | The vertical columns of a table (e.g. SKU, Name, Quantity, Price). You choose which data each column shows. |
| Groups | Sub-sections inside a table — e.g. “Components”, “Accessories”. Useful for organising long BoMs into readable chunks. |
| Rows | The individual lines inside a group. Three row types: Form element, Subtotal, and Text Block. |
| Summary | A final section at the bottom of the BoM with aggregated totals (e.g. Total Sales Price, Total Margin). |
The hierarchy is: BoM → Tables → (Columns + Groups) → Rows, plus a single Summary with its own rows.
Channel visibility (“Hide in output”)
Every component has four Hide in output toggles — one for each channel:
| Channel | What it controls |
|---|---|
| The downloadable PDF quote | |
| Excel | The Excel export |
| Checkout | The Quotation overview shown on the checkout page |
| The quotation email sent to customers |
You can hide the entire BoM from a channel (BoM-level toggle in the top right of the BoM Builder page), hide a single table, hide a column, hide a group, or hide an individual row. The effect is cumulative — if any parent hides a channel, every child is hidden in that channel too.
Tables
A Table is the top-level section in your BoM. Most configurators only need one table, but you can add more when you want clearly separated sections (e.g. a “Hardware” table and a separate “Software licences” table).
Fields within Tables
| Field | Description | Details |
|---|---|---|
| Label | The heading shown above the table in output. | Fully localized. |
| Hide in output | Per-channel visibility toggles (PDF / Excel / Checkout / Email). | Inherited downwards to groups, columns, and rows. |
| Order | The order this table appears among other tables in the BoM. | Set via drag-and-drop in the editor. |
Columns
Columns define the vertical layout of a table. You pick what each column should show, how wide it is, and how it’s formatted. Common patterns: SKU + Name + Quantity + Price for a products list, or just Label + Value for a vertical spec sheet.
Fields within Columns
| Field | Description | Details |
|---|---|---|
| Label | The column header displayed in output. | Localized. |
| Field | What data this column pulls from each row. | See breakdown of available fields below. |
| Width | How wide the column is, as a percentage of the table. | Widths across the columns of a table should add up to around 100%. |
| Alignment | How the cell content is aligned. | Left / Center / Right. |
| Format | How the value is rendered. | Text / Currency / Percentage / Number / Markdown. Use Currency on price columns so the tenant’s currency symbol is applied. |
| Include in subtotal | When ticked, this column is included in per-group Subtotal rows. | Enable on price/quantity columns; leave off on text columns like SKU or Name. |
| Hide in output | Per-channel visibility toggles. | Hides this column on its own — useful if e.g. cost prices should only appear in Excel, not on the customer PDF. |
Breakdown of available Field types
| Field type | What it shows |
|---|---|
| SKU | The SKU of the option/product the row represents. |
| Name | The name of the option/product. |
| Description | The description of the option/product. |
| Label | The label of the row (typically used for the form element’s label). |
| Quantity | How many of the option/product the customer selected. |
| Unit price | The per-unit price. |
| Cost price | The internal cost price (typically hidden from customer-facing channels). |
| Sales price | The line’s sales price (quantity × unit price). |
| Discount | Any discount applied to the row. |
| Margin | Sales price minus cost price. |
| Property | A product property value (e.g. Wattage, CRI). Choose which property in the column setup. |
Groups
Groups are sub-sections inside a table. They organise rows into themed blocks like “Main components”, “Accessories”, or — common in spec-sheet style BoMs — “Product selection”, “Base conditions”, “Prices”.
Fields within Groups
| Field | Description | Details |
|---|---|---|
| Label | The heading shown above this group’s rows in output. | Localized. |
| Hide in output | Per-channel visibility toggles. | Inherited downwards to all rows in this group. |
| Order | The order this group appears within its table. | Drag-and-drop in the editor. |
Rows
Rows are the actual lines that appear in the output. There are three row types:
| Row type | Purpose | What you configure |
|---|---|---|
| Form element | Pulls a value from a form element the customer filled in. | Pick which form element. The row renders once per value (e.g. once per product). |
| Subtotal | A computed subtotal line aggregating columns that have Include in subtotal enabled. | Just a label (e.g. “Subtotal”, “Group total”). |
| Text Block | Static text — used for headers, separators, or explanatory paragraphs between other rows. | Markdown content. |
A typical layout
A common pattern is to interleave Text Block rows as section headers with Form element rows pulling values out of the configuration. For example:
Text Block: “Product selection” Form element: Paper product type → renders as “Paper product type: Antim” Form element: Width of roll → renders as “Width of roll: 1150” Text Block: “Prices” Form element: Sales price per unit → renders as “Sales price per unit: 0.233” Subtotal: “Group total” → automatically sums any columns marked “Include in subtotal”
Fields within Rows
| Field | Description | Applies to |
|---|---|---|
| Type | Form element / Subtotal / Text Block. | All |
| Form element | Which form element this row pulls its value from. | Form element |
| Label | The displayed label on the row. | Subtotal |
| Content | Markdown content (headers, paragraphs, separators). | Text Block |
| Hide in output | Per-channel visibility toggles for this single row. | All |
| Order | Position of the row within its group. | All — drag-and-drop. |
Summary
The Summary is a special section at the bottom of the BoM, separate from the tables. It’s used for whole-BoM aggregations: “Total sales price”, “Total margin”, “Total quantity”.
It has its own label (e.g. “Order Summary”) and a list of Summary rows.
Fields within Summary rows
| Field | Description | Details |
|---|---|---|
| Label | The row label shown in output (e.g. “Total sales price”). | Localized. |
| Column | Which column to aggregate across the whole BoM. | Quantity / Cost price / Sales price / Margin / a specific Property. |
| Hide in output | Per-channel visibility for this summary row. | E.g. hide cost-price totals from the customer-facing PDF but show them in Excel. |
| Order | Position of the row within the summary. | Drag-and-drop in the editor. |
To open the summary editor, click Edit summary in the top-left of the BoM Builder.
Localization
All labels (table labels, group labels, column headers, summary labels, subtotal labels, Text Block content) support per-language overrides. Use the language switcher in each editor panel (e.g. EN / DA) to set the localized version, just like in the Form Builder.
If you leave a translation blank, the default (English) value is used as a fallback.
Preview tab
Inside the BoM Builder there’s a Preview tab next to the Builder tab. Switch to it to see how the BoM will render in each channel using the current default configuration.
You can also filter the preview by channel — All / PDF / Excel / Checkout / Email — to verify exactly what each channel will look like with the current visibility settings.
A worked example: vertical spec sheet
Here’s a real-world setup for a “Paper rolls” configurator:
- One table, labelled “New Table”.
- Two columns:
SKU(15% width, Text) andName(15% width, Text). The form element rows fill the value side; the columns are mostly decorative for this layout. - One group containing 26 rows:
- Text Block “Product selection”
- 10× Form element rows: Paper product type, Double side coated, Paper type in grams, Width of roll, etc.
- Text Block “Base conditions”
- 3× Form element rows: EUWID index type, EUWID Index, Price based on annual paper volumes of
- Text Block “Prices”
- 7× Form element rows: Cost price per unit, Sales price per unit, Margin, Currency, etc.
- Text Block “Hidden variables”
- 2× Form element rows: Monthly EUWID index, Quarterly EUWID index
- BoM-level visibility: visible in PDF and Checkout, hidden in Excel and Email.
- Summary: empty (this configurator’s totals are handled per-form, not as a BoM-wide summary).
On checkout this renders as a clean, sectioned spec sheet that mirrors how the customer worked through the form.
A worked example: products list with summary
For a more traditional Bill of Materials with multiple line items:
- One table, labelled “Components”.
- Four columns:
SKU(20% width, Text)Name(40% width, Markdown)Quantity(10% width, Right-aligned, Number)Sales price(30% width, Right-aligned, Currency, Include in subtotal ✓)
- One group “Items” with two rows:
- A Form element row pointing at the product-picker — this renders one BoM line per selected product
- A Subtotal row labelled “Subtotal”
- Summary with one row: “Total” aggregating the Sales price column.
- BoM-level visibility: visible everywhere.
Tips
- Set BoM visibility last. Build out the tables, groups, columns, and rows first; then untick the Hide in output toggles at the BoM level. Brand new BoMs are hidden everywhere by default.
- Subtotals are column-driven. A Subtotal row aggregates only the columns where you’ve enabled Include in subtotal. If your subtotal shows 0, check the column settings.
- Form element rows render per value. A row pointing at a single-value element (like a text field) renders one line; a row pointing at a product picker renders one line per selected product.
- Hide cost prices from customers. Add a
Cost pricecolumn to your table so it appears in your internal Excel export, then tick Hide in output → PDF, Checkout, Email on that column. The column stays in the Excel but is invisible to the customer. - Use Text Blocks as separators. Long BoMs become hard to scan; a Text Block with a markdown heading (
## Section name) gives the customer’s eye an anchor every few rows.