> For the complete documentation index, see [llms.txt](https://docs.tiny.plus/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tiny.plus/guides/getting-started/importing-your-content.md).

# Importing your content

Bring your contacts, companies and projects into tiny+ from a spreadsheet.

{% hint style="success" %}
Before you begin, take the time to review your data carefully. A few minutes in Excel cleaning up before you import can save you some headaches down the track.
{% endhint %}

All your data in spreadsheets? tiny+ imports your contacts, companies, projects and other records from an Excel file.

{% hint style="info" %}
You need the Records Admin [role](/guides/getting-started/user-permissions-and-roles.md) to import records.
{% endhint %}

## Starting an import

Open the page for the kind of record, such as **Projects**, **Companies** or **Contacts**, and click **import …** in the right-hand panel. Or choose **Import your data** from the help menu at the top right and pick the kind of record there.

The import has three steps.

1. **Upload** an `.xlsx` file. The first row holds the column headings, and the file has one sheet. Formatting and styles are ignored. The page says how many rows one import can take.
2. **Match** each of your columns to a tiny+ field, and check any values tiny+ doesn't recognise. See below. Columns you don't match are left out.
3. Choose your **import options**, below, and click **Import**. The import runs in the background. The **Imports** page shows it running, and you're told when it's done.

<figure><img src="https://1957838173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnoXYnzHXoSKmkXmIHw%2Fuploads%2Fgit-blob-3b2151f9e65746ecbad08dcd7d7aeae35fd12c1a%2Fimport-upload.png?alt=media" alt="The first step of an import: the upload instructions, and Choose file and Continue" width="979"><figcaption></figcaption></figure>

<figure><img src="https://1957838173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnoXYnzHXoSKmkXmIHw%2Fuploads%2Fgit-blob-578b61a5e291cd21452ff083d11b94e9670e3855%2Fimport-match.png?alt=media" alt="Matching the spreadsheet&#x27;s columns to tiny+ fields, with the fields found so far" width="979"><figcaption></figcaption></figure>

## Matching your columns

A column whose heading is the name of a tiny+ field, such as *Project Name*, *Status* or *E-mail*, is matched for you and marked **matched by name**. If your account has [Ask](/guides/everyday/ask-and-ai-assistants.md) switched on, tiny+ also suggests a field for the other columns from their headings. One it's sure of is matched and marked **suggested**. One it's less sure of is offered on its column, with the reason, for you to take or leave. tiny+ reads only the headings for this, never the rows.

Check the matches before you import. Click the cross beside one to undo it and choose another field, or *Ignore this column*.

## Checking values

When you match a column to a status, a dropdown, a tag category, a team member or **Team Members**, tiny+ looks at every value in it. Values that match nothing in your account are listed under the matches, with a choice for each, so nothing goes missing without you knowing.

* A status or dropdown value can be the option's name as tiny+ shows it, such as *Proposed* or *Current Client*, or the name of a phase.
* Tags and team members are matched by name, whatever the capitals.
* A name two options share, such as two statuses both called *On Hold*, is listed too, so you can say which one you mean.

Each value starts on what the import would do with it anyway: the default status or team member chosen under **Default Values**, a blank dropdown, a new tag if **Create tags if they don't exist?** is ticked, and otherwise nothing. When updating, a value that matches nothing leaves the field as it is. Change any choice you like: it applies to that value in every row.

## Add or update

Under **Import Type**, choose what the import does.

* **Add new records**: each row becomes a new record. This is the usual choice.
* **Update existing records only**: each row is matched to a record already in tiny+, and the columns you matched are written to it. Rows with no match are skipped, and nothing new is created. Include a column that identifies each record, such as its tiny+ id, a Remote ID from another system, a project number or a contact's email address, and choose it as the match field. Then choose whether to **overwrite all matched fields** or **only fill in fields that are blank** in tiny+. A blank cell never clears a field, and team members and related records are always added, never removed.

<figure><img src="https://1957838173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnoXYnzHXoSKmkXmIHw%2Fuploads%2Fgit-blob-59013afed38c2099582600bd5559db4d9ac28afd%2Fimport-options.png?alt=media" alt="Import Options: Import Type, Default Values, Other Options and Advanced Options" width="979"><figcaption></figcaption></figure>

## Options

**Default values.** A status and an assigned team member for every record that doesn't have one in the spreadsheet, or whose status or team member matched nothing.

**Other options.**

| Option                                        | What it does                                                                                                                             |
| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Reduce duplicates?                            | Rows that match a record already in tiny+ are not added; the Assigned To team member is added to the existing record instead. See below. |
| Create related companies if they don't exist? | A contact's or project's company that isn't in tiny+ yet is created.                                                                     |
| Create tags if they don't exist?              | A tag in a category column that isn't in the category yet is added to it.                                                                |

**Advanced options.**

| Option                                                 | What it does                                                                                                                                         |
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Dry run only?                                          | Goes through every row and reports what would happen to it, without adding or changing anything. The report has a button to run the import for real. |
| Run triggers on import?                                | Your [automated actions](/guides/reports/automated-actions.md) run for each record as if it had been added by hand.                                  |
| Match related records using the 'Remote ID' field?     | Related records are matched by a Remote ID from another system instead of by name. Import the related records with their Remote ID first.            |
| Ignore rows if a matching related record is not found? | A row whose company can't be found is skipped.                                                                                                       |
| Match already imported contacts to make a list?        | Rows that match existing contacts are added to the import's list, so one spreadsheet makes one complete list.                                        |

## Every import makes a list

Every record an import adds or updates is put on a [list](/guides/everyday/building-lists.md), so you can review them together, tag them, or undo a mistake. Name the list before you import, or leave the name blank for one based on the date. The lists are under **Imported lists** on the Lists page.

## Categories and tags

Have a column that says whether a contact is a Client, Supplier or Consultant? [Set the category up](/guides/getting-started/setting-up-categories.md) in tiny+ first, with one column per category in your spreadsheet and several tags in a cell separated by semicolons (`;`). Then match the column to the category during the import.

## Team lists

A column of team members' names, separated by semicolons, adds each of them to the record's team.

## Duplicates

Planning several imports, or importing a spreadsheet that overlaps what's already in tiny+? With **Reduce duplicates?** ticked, tiny+ checks each row against your records. For contacts it matches on:

* email address and full name
* company name and full name
* mobile phone number

There are similar checks for projects and companies. When a row matches, no second record is added. Instead the Assigned To team member joins the existing record's team, and the row's tags are added to it.

## One spreadsheet with companies and contacts

Do two imports from the same file.

1. Import the companies first, matching only the company columns.
2. Then import the contacts, matching the contact columns and matching the company name column to the contact's **Related Company**.
