---
title: "Import and export documentation"
description: "Bring documentation in from IT Glue, Hudu, or CSV files with a dry run you review first, and export everything to an archive you can take anywhere."
url: "https://support.outpostplatform.com/documentation/import-and-export/"
product: "depot"
type: "how-to"
status: "draft"
ai_summary: "Import documentation from IT Glue, Hudu, or CSV in four steps (Source, Upload, Check, Import) with a dry run that writes nothing until you confirm. Export everything or one client to an archive of JSON files with attachments, permissions, and relations, kept 48 hours. Uploads up to 256 MB. Needs docs:manage; export asks for a second factor."
availability:
  plans: ["home-lab", "essentials", "enterprise", "msp"]
  permission: "docs:manage"
  preview: false
source: "https://gitlab.com/outpostplatform/docs/-/edit/main/src/content/docs/documentation/import-and-export.md"
license: "CC BY 4.0"
---

# Import and export documentation

You can move documentation into Outpost from IT Glue, Hudu, or any system that
exports CSV, and you can take all of it out again. An import reads your file
and shows you where every row will land before it writes anything. An export
produces a complete archive, including permissions and relations, in a
documented format. This page shows both.

## Before you begin

- Import and export need `docs:manage`. Including passwords in an export also
  needs `vault:reveal`.
- Making and downloading an export always ask for your authenticator code,
  so your account needs two-factor authentication. See
  [Secure your console account](/depot/account-security/#turn-on-two-factor-authentication).
- The pages are **Documentation** > **Import** and **Documentation** >
  **Export**. On the MSP plan they are at practice level, with no client
  selected.
- An import file can be up to 256 MB.

:::caution
Committing an import writes into every client the file names, and it cannot
be undone. Review the match report before you commit.
:::

## Import documentation

The import has four steps: **Source**, **Upload**, **Check**, and **Import**.
Nothing is written until the last one.

### Choose the source

Under **Source**, select **Use this** on one of:

| Source | What to upload |
| --- | --- |
| **IT Glue** | The account export .zip, as downloaded. |
| **Hudu** | A .zip of the CSV templates, or the JSON the API pull produced. |
| **Anything else, as CSV** | One .csv, or a .zip of several. |

### Upload the file

1. Under **Upload the bundle**, choose **The file**.
2. For a CSV, choose **What is in this file**: **Passwords**, **Assets**,
   **Articles**, **Domains**, **Licenses**, or **Vendors**. One kind per file.
   Then map each **Column in your file** to the field it **Becomes**, or to
   **Do not import this column**. Dates must be `YYYY-MM-DD` and the file
   UTF-8.
3. Optionally, in **Where rows with no organization go**, choose a client for
   rows that do not name one.
4. For IT Glue passwords, IT Glue exports vaulted passwords in a separate
   file. Import the account export first, then upload the vault password
   export and select **This is the IT Glue vault password export**. Its values
   merge onto the credentials already imported instead of creating a second
   copy.
5. Select **Check this bundle**. This is the dry run. It reads the file and
   writes nothing.

### Check the match report

**What the bundle says** summarizes the file. **Every row, and where it lands**
lists each row with a verdict:

| Verdict | Means | What to do |
| --- | --- | --- |
| **Will be created** | A new record will be made. | Nothing, unless you want to skip it. |
| **Matches a record** | The row matches a record already in Outpost. | Nothing. |
| **Matches more than one** | The row matches several records, such as two clients with the same name. | Choose the right one in **Which client is this?**. The import cannot start while one remains. |
| **Nothing to match** | Outpost has nothing this row refers to. | Choose where it goes, or skip it. |
| **Skipped** | The row will not be imported. | Nothing. |

Select **Skip this row** for anything you do not want. A row you skip stays
skipped if you check the file again. Select **Import these** when you are
ready, or **Check again** after a change.

### Commit the import

1. Under **Import**, enter your practice name in **Your practice name**, and
   again in **Type the practice name to import**.
2. Select **Import**.

Progress shows as the rows land. If the import stops, run it again. Rows that
already landed are recognized by where they came from, so a re-run resumes
rather than duplicating.

### What the importer does with awkward data

| Data | What happens |
| --- | --- |
| A password field inside an asset | Becomes a real credential, and the asset field points at it. A password with no value in the export becomes a credential with no secret, flagged **Not linked to anything**, and counted as needing a value. |
| HTML documents | Imported as HTML, readable in the console. Links between imported documents are rewritten to the new articles, and images become attachments. |
| Nested password folders | Flattened, because collections are flat, with the full path as the name, such as `Acme / Firewalls / Edge`. The report says how many levels were flattened. |
| Duplicate field names | Suffixed, such as `notes` and `notes_2`, and reported. |
| One-time code seeds | Kept only when they are valid. One that does not parse is dropped with a report line. |
| Tags | Become labels. |
| Share links | Not migrated. A live link to a secret is never recreated automatically. |

## Export documentation

1. Go to **Documentation** > **Export**. The page is titled **Export
   everything**.
2. In **What to include**, choose **Everything** or **One client**. For one
   client, choose it in **Which client**.
3. To include secrets, select **Include stored passwords in plain text**. The
   archive then becomes as sensitive as the vault. Outpost writes an audit
   entry for each included secret before reading it, and the export fails if
   an entry cannot be written. Without this option, each secret is
   left out and the manifest says how many and why.
4. Select or clear **Include attachments and photos**. Clearing it makes a
   much smaller archive of the records alone.
5. Select **Make the archive**, and confirm your authenticator code when asked.
6. Under **Archives**, select **Download** when the archive shows **Ready**.
   Downloading asks for your authenticator code again.

An archive can be downloaded for 48 hours. After that it shows **No longer
available** and its file is deleted.

### What the archive contains

The archive has a folder for each kind of record with one JSON file per
record, an `attachments/` folder, `grants.json` for permissions, `links.json`
for relations, and `manifest.json` with the schema version, the counts, and
anything left out and why.

## Verify

After an import, open a client's **Documentation** and check a few records
against the source. Imported records say where they came from, such as
**Imported from IT Glue**. After an export, open `manifest.json` in the archive
and confirm the counts.

## If something goes wrong

| Symptom | Cause | Fix |
| --- | --- | --- |
| **No column names could be read from the first line of this file.** | The CSV has no header row. | Add a header row naming each column. |
| The import does not start. | A row still reads **Matches more than one**. | Choose the right record for it. |
| **An import file may be at most 256 MB.** | The file is too large. | Split it, such as by client or by kind. |

## Next steps

- [Documentation and credentials](/documentation/)
- [Cancel and export your account](/account/cancel-and-export/)
