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

# Import

> Loading a spreadsheet into the product, seeing what it will do before it does it, and undoing the whole run if it's wrong.

Importing is held separately from creating records by hand, because preparing a fifty-thousand-row
load and pressing go are different acts, and different permissions. This is where both happen.

## Two ways to start

| Way | Use it for |
| - | - |
| **Upload a whole workbook** | A file with one tab per list — Sites, Assets, Parts. Every tab is matched to what it holds, the tabs are written in dependency order (sites before the assets that refer to them), and the whole workbook commits — or undoes — as one thing |
| **Pick one list** | Everything the product can import, grouped the same way Administration groups its configuration screens — more than thirty record types |

A workbook tab named after nothing the product recognises is left out of the run and said so, rather
than guessed at.

## Getting your data in

Once you've picked a list, there are three ways to hand over the rows:

| Way | For |
| - | - |
| **A file** | A CSV or Excel workbook, exactly as it came out of whatever system holds it now — nothing is trimmed or reformatted on the way in |
| **Paste a spreadsheet** | Copy a range straight out of Excel or Sheets and paste it in; no file to save first |
| **Fill in our columns** | A blank grid headed with this record type's own field labels, for typing a short list in by hand |

<Tip>
  No file yet? A **template** button on this step downloads the columns this import accepts, what
  each one wants, and what already exists for the ones that name something else — a category, a
  site, a vendor.
</Tip>

## Mapping columns

Nothing is auto-mapped and forced through. Each column in your file is profiled — what it looks like,
a few real examples — and you choose what it means:

* **Your suggestion isn't a guess applied for you.** An unplaced column can be read by AI on request,
  which offers a suggestion and its reasoning; nothing is mapped until you accept it.
* **Reference columns get matched, not just typed.** A column that names a site, a vendor or another
  record shows what it matched against what already exists in that list.
* **Your own fields show up too**, grouped separately from the product's own columns — including
  ones a plain spreadsheet column can't carry, which are listed and disabled with the reason rather
  than left out.
* **Some things aren't columns of the record at all** — a role a staff import grants, a status an
  asset export states, a schedule's interval — and are grouped as such, because they behave
  differently from a field on the way in.

<Note>
  Map a file like this before and the studio offers your saved mapping the next time a matching file
  shows up — applying it maps every column it recognises and carries forward its saved matches.
</Note>

## Fixing rows before committing

The dry run tells you which rows have a problem and why, without touching the ones that don't — a
file with fifty bad rows is not fifty rows you have to fix before anything else imports. Correct a
rejected cell directly in the grid on this screen, the same one the "fill in our columns" step uses,
with the file's original value kept alongside so you can see what changed. A corrected row is
re-checked the next time you ask for the verdict, not the moment you type.

## Committing and undoing

**Commit** writes what's valid and leaves what still has problems out. If a row's number matches an
existing record, that record is updated — only the columns your file actually carries; anything it
doesn't mention is left exactly as it was.

The whole run can be undone, for a limited time shown on screen. Undoing removes what was created
and puts back what was changed, so long as nobody has touched it since — a workbook undoes tab by
tab, deepest dependency first.

<Card title="File exchange" icon="server" href="/config/file-exchange">
  Doing this automatically, on a schedule, from a server this organisation controls — rather than a
  file somebody uploads by hand.
</Card>
