---
title: How to import records from a spreadsheet
url: https://tideswell.xyz/docs/records/import-from-a-spreadsheet
description: Bring rows from a .csv or .xlsx file into one of your Objects, check them first, and undo an import if needed.
---

> Documentation index: fetch https://tideswell.xyz/llms.txt to discover every page before exploring further.

# How to import records from a spreadsheet



Every Object your team defines, such as Sample requests or Fabric trials, can be filled from a
spreadsheet rather than typed in one record at a time. You start from the Object's own list in
the **Objects** area of the left menu, with the **Import** button in the toolbar. If Objects are
new to you, start with <Ref to="objects" />.

Importing is the usual way to fill a brand new Object. Fairgreen Golf Co. kept two years of fabric
trials in a shared sheet, and brought them all into **Fabric trials** in one sitting.

## Before you start [#before-you-start]

You need both Create and Update on the Object, the rows such as **Fabric trials · Create** and
**Fabric trials · Update** in **Settings › Permissions**. Holding both is what shows the
**Import** and **History** buttons. <Ref to="objects/permissions" /> explains how an admin sets
them.

On a phone-sized screen the two buttons show as icons only: an upload arrow for Import and a clock
for History.

## Get the file ready [#get-the-file-ready]

Save the sheet as a .csv or .xlsx file, with one row per record and a row of column names above
them. Keep each file under 5,000 rows and 5 MB, and split a bigger sheet into several files.

Give every column a different name. Two columns called "Notes" stop the import at the column-names step
until you rename one.

Fill in **Linked record**, **Person** and **File** fields on the record page after the import.
Each new record gets its **Reference number** automatically, and calculated fields work
themselves out. Leave columns for any of these in the sheet if you like, since a column you do
not match is ignored.

## Import the file [#import-the-file]

The whole import happens in one window, and nothing is written until you press **Apply**. The file
is read in your browser first.

1. Open the Object's list and press **Import**.
2. Choose your .csv or .xlsx file. If it has several sheets, pick the one to import.
3. Click the row that has your column names, then press **Next**. Rows above it are ignored, which
   helps with a sheet that has a title or notes on top.
4. Match each field to a column. Fields marked with a star (\*) must be matched; anything else can
   stay on **Do not import**. Press **Next**.
5. Choose how to treat records that already exist, covered below, and press **Preview**.
6. Read the preview, then press **Apply**. Bigger files go in batches, and the window shows
   "Applying batch 2 of 6" as it works.
7. Press **Done**.

If any field you matched holds dates, the matching step also asks &#x2A;*How are the dates in this
file written?** Choose **Month first**, **Day first** or **Year first**. Check this one carefully,
because 3/4/2026 is a different day each way round.

## What happens to records that already exist? [#what-happens-to-records-that-already-exist]

At **Match existing records on**, pick the field that identifies a record, such as a trial's
reference from the mill. Then choose what **When a row matches** should do: **Skip it**,
**Update it** or **Create a new one anyway**.

Matching is exact, so "Kaimen" and "KAIMEN" count as different values. Leave it on **Do not match,
create everything** when every row is new, such as the first import into an empty Object.

Use **Update it** to refresh records you imported before. Fairgreen re-imports the mill's latest
test sheet each month, matched on reference, and only the trials whose results changed are
touched. With **Skip it**, the rows that match are counted under **Refused**, and the sentence
above the counts says how many of those were skipped.

## Read the preview [#read-the-preview]

The preview counts what the import will do in four boxes: **Create**, **Update**, **Unchanged**
and **Refused**. A sentence above them spells out how matching rows are handled, with real
numbers.

Refused rows are listed under **Why rows were refused**, one line each, such as a required field
left empty or a value in the wrong shape. Fix those in your sheet and start again if there are many.

On a big file the preview checks the first 200 rows and says so. The rest are checked as they are
applied.

## What if some rows did not import? [#what-if-some-rows-did-not-import]

The finished window shows the same four counts. If anything was refused, press
**Download the rows that didn't import** for a file of just those rows, with a
**Reason it did not import** column added at the end.

Use that file as a checklist. Fix the rows in your original sheet, then import it again matched on
the same field with **Skip it**, so the rows that already went in are left alone.

## Reuse your column matching next time [#reuse-your-column-matching-next-time]

Type a **Source label** on the matching step, such as "Portside Mills test sheet". When the import
finishes, tick **Remember this mapping** before you press **Done**.

Next time, type the same source label and click out of the box. Tideswell fills in the column
matching, the match settings and the date order you used last time.

## See past imports, and undo one [#see-past-imports-and-undo-one]

Press **History** on the Object's list to open **Import history**. Each row shows **When**,
**Who**, **Source**, the four counts and a **Status**, such as applied or reversed.

An applied import carries an **Undo** button. Undo archives the records that import created and
puts the records it updated back to their previous values. Any record somebody has edited since
the import is left as it is.

Make sure before you press **Undo**: each import can be undone once, and there is no redo.
Undoing an import that created records also needs Archive on the Object, such as
**Fabric trials · Archive**.

Imported records show in each record's history with "An import" as the writer, which
<Ref to="records/comments-and-history" /> explains.
