Import processing overview
What gets created
Level 0: Root products
Rows withbomLevel: 0 or no parent reference become root Products. These are your company’s own products that you manufacture or assemble.
- Type: LIVE (or UNKNOWN if incomplete)
- Owned by your company
- Ready to receive inputs from child rows
If a product with the same SKU already exists, Variable reuses it instead of creating a duplicate.
Level 1+: Supplier parts and materials
Child rows create a chain of related items. Variable uses a 3-level structure to accurately model your supply chain:| Level | What it represents | Example |
|---|---|---|
| Product | Your finished good or assembly | Mountain Bike |
| Supplier Part | Specific part from a specific supplier | ”Alloy Rim from RimSupply” |
| Material | Generic material type | Aluminum Alloy 6061 |
| Dataset | Emission factors from database | ecoinvent: Aluminum production |
The 3-level BOM structure explained
Why three levels?
Consider this scenario: you buy an “Alloy Rim” from “RimSupply”. That part is made of aluminum. To calculate its carbon footprint, you need to:- Know the part (Alloy Rim) and quantity you’re using
- Know the supplier (RimSupply) to track your supply chain
- Know the material (aluminum) to assign the correct impact data
How supplier parts work
When you import a BOM row with supplier information:-
Supplier Part - A Material node representing “RS-RIM-42 from RimSupply”
- Linked to the supplier company
- Stores the supplier’s part number
-
Material - A Material node representing “Aluminum Alloy”
- Generic material type
- Where you’ll assign the dataset
-
Input relationships
- Your Product uses the Supplier Part (quantity from BOM)
- The Supplier Part contains the Material (weight from BOM)
Weight assignment rules
How Variable assigns weights depends on the chain depth:3-level chain (Part to Supplier Part to Material)
When the supplier part has an associated material:- Supplier Part gets quantity from BOM (e.g., 1 piece)
- Material gets weight from BOM (e.g., 0.3 kg)
2-level chain (Part to Supplier Part only)
When there’s no separate material:- Supplier Part gets both the quantity and the weight unit
- The supplier part IS the material input
Variable detects the chain depth automatically by checking if any row for a given supplier part also has a
materialId or materialName.Supplier relationships
When you include supplier columns:| Column | What happens |
|---|---|
supplierName | Creates or matches a Company node |
supplierId | Uses your internal ID for matching |
supplierPartId | Stored on the supplier part for reference |
- First tries to match by
supplierId - Then by
supplierName - Creates a new supplier if no match found
Idempotency: safe re-imports
BOM imports are designed to be re-run safely:Product deduplication
- Products matched by SKU within your company
- Existing products are reused, not recreated - and not updated either. Variable leaves existing matches alone; it won’t overwrite their name, supplier, or other fields with newer values from your file.
Input deduplication
New inputs are only added when:- The product was created during this import, OR
- The product has type UNKNOWN, OR
- The product has no existing inputs
Duplicate detection
Within the same import, duplicate inputs are detected by comparing:- Source product ID
- Quantity
- Unit code
After import completes
Automatic calculations
Variable automatically triggers CO2e recalculation for all affected products. This cascades through your product hierarchy.What you need to do next
Materials are created but not yet linked to datasets. Assign a dataset to each one in the app to complete your footprint calculations.Related relationships created
After a BOM import, these relationships exist in Variable:Next steps
- Troubleshooting - Resolve common import issues