> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firstresonance.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Use CSV imports to bulk-create or update records in ION.

ION's import feature lets you upload a CSV file to create or update records in bulk. Instead of entering data one row at a time through the UI, you can prepare a spreadsheet offline and import it all at once.

## How imports work

To start an import, navigate to **Imports** in the sidebar, then pick an import type from the **New Import** tab. The importer cards are grouped by category — **Production**, **Supply Chain**, **Quality**, and **OS** — to match where each record type lives in ION. Imports are processed **asynchronously** — you can navigate away and continue working while the import runs. You will receive a notification when the import completes or fails.

<Frame>
  <img src="https://mintcdn.com/firstresonance/tp5pePx_0WF--MwW/images/ion-importers/imports-new-import.png?fit=max&auto=format&n=tp5pePx_0WF--MwW&q=85&s=7e0d4addd7dc6f3379820d5d92dbc654" alt="New Import tab showing importer type cards for MBOMs, Parts, Inventory, Purchase Orders, Locations, and more" width="1905" height="812" data-path="images/ion-importers/imports-new-import.png" />
</Frame>

Clicking **Start Import** on any card opens an upload modal where you can download the CSV template, toggle the importer's options, and choose **Validation only** for a dry run. The option set varies by importer — the MBOM modal is shown below as an example.

<Frame>
  <img src="https://mintcdn.com/firstresonance/tp5pePx_0WF--MwW/images/ion-importers/imports-modal-example.png?fit=max&auto=format&n=tp5pePx_0WF--MwW&q=85&s=fb9e29ba9fbc8e0419feafa9e1122a3f" alt="Import MBOMs modal with CSV upload area, template download link, and per-importer options including Validation only" width="804" height="619" data-path="images/ion-importers/imports-modal-example.png" />
</Frame>

Imports are **all-or-nothing**. If any row fails validation, no rows are written and you receive an error report. You never end up with a partially imported file.

You can track the status of all imports from the **Import History** tab. Expand any failed job to see its per-row error messages, or click **Download** to pull the full error CSV.

<Frame>
  <img src="https://mintcdn.com/firstresonance/tp5pePx_0WF--MwW/images/ion-importers/imports-history.png?fit=max&auto=format&n=tp5pePx_0WF--MwW&q=85&s=2671e1ca5a19dda44dedea5f9195f331" alt="Import History tab listing completed and failed jobs with expandable error details" width="1859" height="856" data-path="images/ion-importers/imports-history.png" />
</Frame>

## Video walkthrough

The end-to-end import flow is the same for every importer — pick a type, download the template, upload your CSV, run validation, then commit. The walkthrough below uses the MBOM importer as an example.

<iframe src="https://www.loom.com/embed/34129c65cde941189007b971c80382d0" frameBorder="0" allowFullScreen style={{ width: "100%", aspectRatio: "16 / 9", borderRadius: "8px" }} />

## Required and optional columns

Each import type has its own set of columns. Some columns are required and must be present in every row, while others are optional. Optional columns that you omit from your CSV are skipped entirely — ION does not touch those fields on the imported records. Only when an optional column is included in the CSV but left blank for a given row does ION apply a default value based on the field type (see below). If a required column is missing or empty, the import will fail with a validation error.

## How empty CSV cells are handled

When an optional column is present in your CSV but a row leaves it blank, the cell defaults to a falsy or zero-equivalent value (not null). This only applies to columns that are actually in the file — omitting the column entirely leaves the field untouched.

### Lookup and control columns are exempt

A handful of columns are exempt from the falsy-default rule — either because they're used to look up an existing record or control importer behavior, or because `0` isn't a falsy value for that field's type. For these, an empty cell means "not provided":

| Column                                | Importer                                                                                                                                                                       | Empty cell means                                      |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
| `id`                                  | [Part Inventory](/administration/ion-importers/part-inventory), [Tool Inventory](/administration/ion-importers/tool-inventory), [Issues](/administration/ion-importers/issues) | Create a new record (no update lookup)                |
| `original_name`                       | [Locations](/administration/ion-importers/location-imports)                                                                                                                    | No rename                                             |
| `original_po_number`                  | [Purchase Orders](/administration/ion-importers/purchase-orders)                                                                                                               | No rename                                             |
| `latitude`, `longitude`               | [Locations](/administration/ion-importers/location-imports)                                                                                                                    | Unset — `0` is not a falsy value for a coordinate     |
| `last_maintained_date`, `uri`         | [Tool Inventory](/administration/ion-importers/tool-inventory)                                                                                                                 | Unset — no date is written and no URI is stored       |
| `due_date`, `quantity`, `assigned_to` | [Runs](/administration/ion-importers/runs)                                                                                                                                     | Unset — no due date, quantity, or assignee is written |

Each importer's column table calls out which fields behave this way.

| Field Type | Empty Cell Value | Examples                                    |
| ---------- | ---------------- | ------------------------------------------- |
| Text       | `""`             | `description`, `address`                    |
| Numeric    | `0`              | `quantity`                                  |
| Boolean    | `false`          | `made_on_assembly`, `available`, `archived` |

<Info>
  If you leave a boolean column blank, ION treats it as **false** (unchecked). To set a field to true, you must explicitly write a truthy value.
</Info>

### Accepted boolean values

Boolean fields accept any of the following (case-insensitive):

| Truthy | Falsy   |
| ------ | ------- |
| `true` | `false` |
| `yes`  | `no`    |
| `1`    | `0`     |

## Errors

When validation fails, ION reports up to **100 errors** with the specific row number and a description of the problem. Row numbers correspond to the CSV file where row 1 is the header and row 2 is the first data row.

<Info>
  If your file contains more than 100 errors, fix the first batch and re-upload. ION caps error reporting at 100 to keep the output manageable.
</Info>

## Tips for successful imports

* **Check your columns** — Review column headers and values before uploading. Pay special attention to boolean columns — blank cells default to `false`, so any field you intend to be `true` must be set explicitly.
* **Start with Validation only** — Use the validation-only option on your first attempt to catch errors without modifying any data.
* **Fix all errors before re-uploading** — Since imports are all-or-nothing, partial fixes will still fail if other rows have issues.
* **Import in staging first** — Run your import in a staging environment and verify the results before importing into production.
