# MBOM Imports

### Overview

MBOM imports let you define multi-level part structures in a single CSV -- from top-level assemblies down to individual components. ION supports two ways to describe how parts are nested: **Depth** notation and **Level** notation. ION automatically detects which one you are using based on the first column header in your CSV.

### Import Options

| Option                    | Description                                                                                                                                                                          |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Create Non-Existent Parts | Automatically create part records for any part numbers in the CSV that do not already exist in ION. When disabled, referencing a part that does not exist causes a validation error. |
| Always Create New Version | Force-create a new MBOM version even if one already exists for the top-level part.                                                                                                   |
| Validate Only             | Run validation without committing changes. Useful for checking a file before a real import.                                                                                          |

### Columns

| Column                  | Required | Description                                                                                                                                                                                  |
| ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `depth` or `level`      | Yes      | The first column in your CSV. Determines how the part hierarchy is structured. See sections below.                                                                                           |
| `part_number`           | Yes      | The part number for this row.                                                                                                                                                                |
| `revision`              | Yes      | The part revision.                                                                                                                                                                           |
| `quantity`              | Yes      | How many of this part are needed in the parent assembly.                                                                                                                                     |
| `substitutes`           | No       | Alternative parts, formatted as `part_number[revision];part_number[revision]`.                                                                                                               |
| `made_on_assembly`      | No       | Whether this part is fabricated as part of the parent assembly. Accepts boolean values (see [Importers](https://manual-v2.firstresonance.io/platform/importers/..#accepted-boolean-values)). |
| `reference_designators` | No       | Reference designator strings for the component.                                                                                                                                              |

{% hint style="info" %}
Ensure part numbers and revisions match existing records exactly. Part matching is case-insensitive.
{% endhint %}

***

## Depth Notation

Depth notation describes your BOM structure by indenting parts one level at a time, similar to how you might indent items in an outline. The top-level assembly is depth **1**, its direct components are depth **2**, their sub-components are depth **3**, and so on.

To move back up the tree and start a new branch, simply return to a lower depth number. Rows must be listed in the order they appear in the assembly -- each component must come after the assembly it belongs to.

**Example:** An assembly (`ASSEMBLY-100`) contains a bracket and a panel. The bracket itself requires four bolts.

| depth | part\_number | revision | quantity |
| ----- | ------------ | -------- | -------- |
| 1     | ASSEMBLY-100 | A        | 1        |
| 2     | BRACKET-200  | B        | 2        |
| 3     | BOLT-300     | A        | 4        |
| 2     | PANEL-400    | A        | 1        |

{% hint style="warning" %}
You cannot skip depth levels -- for example, jumping from depth 1 directly to depth 3 is not allowed. Each component must be listed directly under its parent assembly.
{% endhint %}

***

## Level Notation

Level notation uses a numbering scheme (e.g., `1`, `1.1`, `1.1.1`) to explicitly identify where each part sits in the assembly tree. This is similar to how work breakdown structures or section numbering works -- the number itself tells you the full path from the top-level assembly down to the component.

Unlike Depth notation, **rows can appear in any order** because the level value fully defines each part's position in the hierarchy. ION sorts and organizes the structure for you.

**Example:** The same assembly as above, with rows intentionally listed out of order to show that ordering does not matter.

| level | part\_number | revision | quantity |
| ----- | ------------ | -------- | -------- |
| 1     | ASSEMBLY-100 | A        | 1        |
| 1.2   | PANEL-400    | A        | 1        |
| 1.1   | BRACKET-200  | B        | 2        |
| 1.1.1 | BOLT-300     | A        | 4        |

Here, `1.1` (BRACKET-200) and `1.2` (PANEL-400) are both direct components of `1` (ASSEMBLY-100), and `1.1.1` (BOLT-300) is a sub-component of the bracket -- regardless of the row order in the CSV.

{% hint style="warning" %}
Every parent level must exist somewhere in the file. For example, you cannot define `1.1.1` without also having a `1.1` row. However, the rows do not need to be in any particular order.
{% endhint %}

***

## Cycle Detection

ION automatically detects circular references in your MBOM. If assembly A contains part B and part B also contains assembly A (directly or through any chain of intermediate parts), the import will fail with a validation error identifying the cycle. This check also applies to substitute parts.

***

### Video Walkthrough

{% embed url="<https://loom.com/share/34129c65cde941189007b971c80382d0>" %}

### Related Pages

For general import behavior, empty cell handling, and error reporting, see [Importers](https://manual-v2.firstresonance.io/platform/importers).
