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

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.

  1. 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.

  2. Confirm what you're importing
    Session picks Bookings, Vouchers or Bundles based on your columns. Override it if the guess is wrong.

  3. 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, US MM/DD/YYYY, UK DD/MM/YYYY, or "Month DD, YYYY"). Set a fallback timezone if your file doesn't include one.

  4. 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.

  5. 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.

  6. 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.

  1. 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 € or 1,234.56 - Session figures it out.

  • Variant suffixes like Sauna (Concession) or Session (Member) are normalised back to the base type, so they line up with your existing sessions.

  1. 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 Sessions becomes 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 paid are imported.

  • Code - the existing voucher code. If you don't have one, Session generates a new GV-XXXXX code automatically.

  • Notes.

Vouchers with codes that already exist on your account are skipped, so it's safe to re-run the import.

  1. 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 Sauna or 5 Sessions both 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.