---
title: How to export and import CSV files in Salon Booking OS
description: "Export your clients and your services as CSV files, and import clients from one: the import shows what it will do before anything is saved."
url: "https://osdots.com/docs/salon-booking-os-import-and-export-csv/"
updated: "2026-11-01"
category: Product Documentation / Salon Booking OS by OsDot™
---

# How to export and import CSV files in Salon Booking OS

Export your clients and your services as CSV files, and import clients from one: the import shows what it will do before anything is saved, and leaves clients that exist as they are. Appointments are not imported or exported.

Open **Data → Import and export**. The page lists the records your account may use:

| Records | Who may use them (on a new site) |
| --- | --- |
| **Clients** | the owner: *Import clients from CSV* to import, *Download a client's data, or export the clients as a CSV file* to export |
| **Services** | the owner: *Edit services, categories, options and prices*, to export |

You can give these permissions to another role under **People → Roles and permissions**.

## Exporting

Choose **Export clients** or **Export services**. The file appears under **Your exports**; download it from there.

- The file is in UTF-8 with the mark spreadsheet programs need, so accents and other scripts show correctly.
- A cell a spreadsheet would read as a formula (one starting with `=`, `+`, `-` or `@`) starts with an apostrophe, unless it is a plain number. An import reads it back without the apostrophe, so an exported file imports unchanged.
- An export holds at most 20,000 records.
- Only you can download your export, for **24 hours**; then it is removed.

The clients' file holds personal details (names, e-mail addresses, phone numbers), and the page says so: keep the file safe and delete it when you are done.

## Importing clients

1. Choose **Import clients**. The page explains each column; **Download a blank template** gives a file with the right header line.
2. Prepare the file: CSV in UTF-8 (in a spreadsheet program, "Save as", type "CSV UTF-8"), at most 5,000 rows, with a header line naming the columns in any order. A file the import cannot use is refused with the line where the problem is, before anything changes.
3. Under **Records that exist already**, keep **Skip records that exist (leave them as they are)**.
4. Choose **Check the file**. Nothing changes yet.
5. The preview, **What the import does**, counts the **New records**, the **Changed records**, the rows **Skipped (they exist)** and the **Refused rows**, and lists the refused rows first with the reason for each cell. **Download the errors (CSV)** gives the same list as a file.
6. If a row is refused, correct the file and upload it again: nothing can be imported while a row is refused. If you change your choice for existing records, choose **Check again**.
7. Choose **Import … records**. The page then says how many records were new, changed and skipped. **Discard** throws the import away without changing anything.

An open import waits under **Imports waiting for you** for 7 days, then it is discarded. Only the person who uploaded an import sees it. The audit log notes the counts.

## The columns

| Records | Columns |
| --- | --- |
| Clients | `id`, `name`, `email`, `phone` |
| Services | `id`, `name`, `description`, `category`, `minutes`, `price`, `currency` (exports only), `price_from`, `online`, `estimate_only`, `status` |

The import page describes each column — its type, whether a new record needs it, and its limits.

## How existing clients are matched

- **By id:** a row with the `id` from an export means that client.
- **Clients** are also matched by e-mail address or phone number. With **Skip records that exist**, a row whose client exists is counted as **Skipped (they exist)**, and that client is left as it is.

## On the public demo

On a site running as a public demo, importing is turned off and the page says so; exports work.
