← What's new

Import and export4 min read

CSV import

Import patients, sessions or notes from a CSV, with every row reviewed before anything is saved.

Tactile editorial artwork for Csv Import

You have a spreadsheet of patients from the last system, or a file you exported here and tidied up, and one question: what will it do to my records? The import wizard shows you before it does anything. Every row is laid out in a table, flagged if something is wrong, and nothing is saved until you press Import.

Every row is shown, and checked, before it is saved.

Where it lives

Go to Settings, find Import data and choose Import your data. You pick what you are importing (Patients, Sessions or Notes) and drop in a .csv file. If you are starting from a blank spreadsheet, the upload step has a link to download an example file for that type, with working rows to copy the column names from. Past visits, last seen dates and appointments are in the same list; they are covered in Import past visits and Import appointments.

Step by step

  • Drop in a file. If rows above the column names are titles or notes, say which row holds the headers, picking from the first ten rows of your file.
  • Match each column to a field. Required fields are marked, and Continue stays off until each one has a column.
  • Review every row. A Check column reads OK, Warning or Error for each, and you can edit any cell right in the table; the row is checked again as you type.
  • Press Import. Rows go in small batches of 100, with a progress bar.
  • Download the rows that did not go in.

Matching columns to fields

If a header is the same as a field name, ignoring capitals, it is matched for you. That is why a file you exported with Export your data needs no matching at all. For anything else, each field has a menu of your file's columns, or Not mapped to leave it empty.

The fields follow your own settings. Patients get one column per patient field you have defined, and sessions get one per custom chart field, so a plain Pain Level column maps straight to your Pain Level field. There is also a single Custom fields column for the label-keyed JSON a Goji export produces. A label that no longer matches one of your fields is skipped with a warning on that row; it does not block the row.

Sessions and notes need to know whose they are. Map a patient id if you have one, or first and last name columns, which are matched exactly, ignoring capitals. If two patients share a name, that row is flagged rather than guessed at. Import patients first if you are bringing in both, since a session can only attach to someone who already exists. Sessions also need a provider column, because a past provider cannot be guessed; service and location can stay unmapped when you only have one of each.

A messy spreadsheet is fine

Hand-typed values are read the way a person meant them, not only in the exact form Goji exports.

  • Dates can be 2026-04-12, 04/12/2026, April 12, 2026 or 12 April 2026. A date like 25/12/2026, which cannot be month first, is read day first.
  • Cadence and preferred contact method ignore capitals, spaces and hyphens, so Bi-weekly and As Needed match their options.
  • Yes, y, true, on and checked all count as yes for a pinned note.
  • A patient email that does not look like an email is flagged before anything is saved. A note with no date is dated today.

If a patient on a row is not in your records, the review step offers to add those patients as new ones, using the names on the rows.

When a row has a problem

Only the rows that pass are imported; one bad cell never holds back the rest of the file. The review step counts rows, ready rows and rows with errors, lists the first few errors, and has Only show rows with errors if you want to fix them in place. When the import finishes, Download error rows (CSV) gives you your original columns plus an error column saying what went wrong, ready to correct and upload again.

Try it in your own practice.