---
title: "Import patients from a spreadsheet"
summary: "Bring an existing patient list into Practor from a CSV, map the columns, and fix the rows that don't go through."
source: https://practor.app/en-za/help/patients-and-records/import-patients-from-a-spreadsheet
published: 2026-09-14T06:45:13.769Z
updated: 2026-09-29T07:14:52.511Z
category: "Patients and records"
---

If you're moving from other software, export your patient list as a CSV and import it here. Practor uses four columns and ignores every other column in the file.

Open **Patients**, press the **⋯** beside **Add patient**, choose **Imports**, then press **New import**.

## What your file needs

Four fields, all required:

| Field | Notes |
| --- | --- |
| First name | |
| Last name | |
| Date of birth | Most date formats are read correctly, so you rarely need to reformat the column |
| Email | Used to spot people already in your list |

CSV only, up to 5MB. Anything else is refused at the upload step rather than part way through.

Your file can have as many other columns as you like. You map the four Practor needs and the rest are left alone.

> [!NOTE]
> A patient with no email address can't come in this way, because email is how the import tells one person from another. Add those few [by hand](/help/patients-and-records/add-a-patient).

## Upload the file

Drag the CSV onto the drop zone, or click to browse.

![The upload step with its drop zone](https://res.cloudinary.com/drmnydbcs/image/upload/c_limit,w_1600/f_auto,q_auto:good/v1/help/import/upload.png?_a=BAMAOGDh0#1440x900 "CSV only, up to 5MB.")

Practor reads the header row and takes you straight to mapping.

## Map the columns

Practor matches column names it recognises on its own. The header shows how far it got, like **3 of 4 mapped**, and each of the four fields has a dropdown listing your file's columns.

Fix anything it guessed wrong or left blank, then press **Continue to preview**. The button stays disabled until all four are mapped.

![The mapping step, showing how many of the four fields are matched](https://res.cloudinary.com/drmnydbcs/image/upload/c_limit,w_1600/f_auto,q_auto:good/v1/help/import/map-columns.png?_a=BAMAOGDh0#1440x900 "The header counts how far Practor got on its own.")

## Check the preview

The preview shows your rows as Practor has read them, with a total at the top. A column mapped to the wrong field shows up here as values in the wrong column.

![The preview step with the rows as Practor read them](https://res.cloudinary.com/drmnydbcs/image/upload/c_limit,w_1600/f_auto,q_auto:good/v1/help/import/preview.png?_a=BAMAOGDh0#1440x900 "The count on the button is the number of rows in your file.")

Press **Import N patients** to start. The count is the number of rows Practor found in your file.

## Wait for the import to finish

Larger files take a few minutes. The page shows progress while it works.

Every row ends up in one of three states:

| Outcome | What it means |
| --- | --- |
| Successful | The patient is in your list |
| Duplicates | Someone in this practice already has that email address, so the row was left alone |
| Failed | Something in the row couldn't be read, most often the date of birth |

A duplicate isn't an error. It's how a second import of an overlapping export avoids creating everyone twice.

## Fix the rows that failed

Failed rows appear under **Failed rows** on the results page, with the reason against each one.

Edit them in place. Each row gives you the four fields, and saving one retries just that row. **Retry all failed** runs every corrected row again in one go.

The patients that came through are already in your list, and the failures wait for you under **Imports** for as long as you need.

When you're done, **View patients** takes you to the list and **Start new import** begins another.

## Related

- [Add a patient](/help/patients-and-records/add-a-patient)
- [Set up your practice](/help/getting-started/set-up-your-practice)
