Importing data from another system
Bring your bookings, vouchers and bundles into Session from another platform with a single CSV. It's the fastest way to migrate from Acuity, Periode or any other booking tool, and gives every customer a Session account so they can manage their own future visits.

What you can import
Bookings and customers - past and future appointments, with attendees automatically turned into customer accounts.
Gift vouchers - existing voucher codes with their remaining balance or session count.
Bundles - session packs and multi-visit credit packages with their remaining sessions.
Exporting from other systems
Acuity Scheduling - instructions can be found here
Periode - can be found in Reporting > CSV
If you're having trouble finding the export just send us a message.
Save the file as CSV, TSV or XLSX. The first row must be column headers.
Files up to 25 MB and 50,000 rows are supported. If your export is larger, split it into multiple files.
Make sure email addresses are present for every booking and voucher you want to import - that's how Session matches a row to a customer.
Running an import
You must create all your sessions before importing, so as to map to them.
Upload your file
Drop the file into the upload area or click to browse. Session reads the headers and a sample of the rows to detect the file type.Confirm what you're importing
Session picks Bookings, Vouchers or Bundles based on your columns. Override it if the guess is wrong.Map your columns
Each Session field gets a dropdown showing your CSV columns. Common header names are matched automatically - you only need to fix the ones that aren't recognised. For dates, pick the format that matches your file (ISO, USMM/DD/YYYY, UKDD/MM/YYYY, or "Month DD, YYYY"). Set a fallback timezone if your file doesn't include one.Review the objects found
Session shows a summary - unique session times, products, customers - and flags anything it can't match. For bookings, link each unique time slot to the matching session in Session. For bundles, optionally link each product to one of your bundle products.Confirm and run
The final step shows totals: how many records will be created, how many existing customers were matched, and how many rows will be skipped. For bookings you can also choose to send notification emails to customers from a chosen date forward. Click Run import.Review the results
You'll see what was imported, what was skipped and any per-row errors. From here you can jump straight to the imported sessions, customers or vouchers.

Bookings & users
Required columns:
Email - the customer's email address. Used to match or create their account.
Type - the session or appointment type name, for example "Sauna" or "Yoga 60 min".
Start time - when the session starts. ISO (
2026-04-17 16:00),MM/DD/YYYY HH:mm,DD/MM/YYYY HH:mm, "April 17, 2026 16:00" and Excel date serials are all accepted.Appointment price - the full price of the session before any discount.
Amount paid - what the customer actually paid online.
Optional columns:
First name and Last name - used to populate the customer's profile.
End time - if missing, Session uses the matched session's duration.
Timezone - IANA name like
Europe/London. If absent, the fallback you pick during mapping is used.External ID - the booking or appointment ID from your old system. Strongly recommended - this is what stops a re-upload from creating duplicates.
Voucher code - if the booking was paid with a gift voucher.
Notes - free text, kept on the booking.
Tips:
Multiple rows with the same email, type and start time are merged into one booking with the right number of spaces.
Prices can be written as
15.00,£15.00,$15.00,15,00 €or1,234.56- Session figures it out.Variant suffixes like
Sauna (Concession)orSession (Member)are normalised back to the base type, so they line up with your existing sessions.
Gift vouchers
Required columns:
Email - the original buyer or holder.
Products - the product name or names. Session uses this to extract the session count, for example
Gift Voucher - 5 Sessionsbecomes a 5-session voucher.
Optional columns:
First name and Last name.
Order date - if provided, the voucher expires 12 months from this date. If absent, the voucher has no expiry.
Total - amount paid.
Status - if mapped, only rows marked
paidare imported.Code - the existing voucher code. If you don't have one, Session generates a new
GV-XXXXXcode automatically.Notes.
Vouchers with codes that already exist on your account are skipped, so it's safe to re-run the import.
Bundles
Two shapes are supported:
Order-style - one row per order, with a Products column listing the package name. Required: Email, Products. Common optional fields: Order date, First name, Last name, Total, Status, Notes.
Package-style - one row per package. Required: Email, Package name, Sessions total. Common optional fields: Sessions remaining (defaults to total), Purchase date, Expiry date, Price paid, External ID, Notes.
Tips:
Session counts are pulled from the package name when possible, for example
10-Pack Saunaor5 Sessionsboth yield the right total.Expiry: uses Expiry date if mapped, otherwise 12 months from Purchase date, otherwise no expiry.
Mapping each unique product to one of your bundle products is optional - if you skip it, the bundle is unrestricted.
Re-uploading and duplicates
Imports are designed to be safe to re-run.
Bookings - if the same customer already has a booking on the same session slot, the row is skipped. Map an External ID column to also dedupe by your old system's IDs.
Vouchers - duplicate codes are skipped.
Bundles - rows with an External ID that's already imported are skipped. Without an external ID, Session falls back to a composite of email, date and product name.
If you re-upload the same file you'll see those rows in the Skipped count on the results screen.
Troubleshooting
"File is X.X MB - max is 25 MB" - split the export into smaller files.
"File has no recognisable header row" - make sure the first row contains column names, not data.
"Row N: no email address - skipped" - the row was missing an email and no External ID column was mapped, so Session couldn't match it to a customer.
"Row N: could not parse start time" - the date didn't match the format you picked. Re-check the date format dropdown on the column mapping step.
Required field unmapped - the Continue button stays disabled until every required field is matched. The page lists which ones are missing.
Ambiguous date format - if your file uses
01/02/2026-style dates and Session can't tell whether that's January 2 or February 1, you'll be asked to choose explicitly.
If a few rows fail but most succeed, the import still runs. The results screen lists each failed row so you can fix them in your file and re-upload that subset.