Skip to content

Switching from Fresha

Export your clients and appointments from Fresha and import the files unchanged. Tuppence recognises Fresha’s columns and previews every row before importing.

  1. Exportclients, appointments
  2. Add servicesand staff
  3. Import clientsdry run, then Import
  4. Import bookingsclashes named first
In FreshaIn TuppenceComes over?
ClientClientYes
AppointmentBookingUpcoming only
ServiceServiceNo, add first
Team memberStaff memberNo, add first with hours
Cancellation policy, depositsBooking policyNo, set yours
Vouchers, membershipsGift vouchers, membershipsNo, set up again
FileContentsImport as
Client list (CSV)Name, mobile and telephone, email, address, date of birth, staff alert, tags, marketing preferencesClients
Appointments (CSV)Reference, client, service, date and time, team member, price, statusUpcoming bookings

Fresha doesn’t export services. Add them first under Bookings › Services (or import a spreadsheet), using Fresha’s service and staff names so appointments match.

  1. Clients: go to Clients › Clients list, then Options › Export › CSV.
  2. Appointments: go to Sales › Appointments, choose dates from today to as far ahead as you take bookings, then Export › CSV.
  1. Go to Imports › Clients and choose the client list. You see Read as a Fresha client export, the column feeding each field (and why any are left out), and a dry run: new clients, existing ones (same email or phone), and unreadable rows.
  2. Select Import. You can undo it for 24 hours.
  3. Go to Imports › Upcoming bookings and choose the appointments file. Calendar clashes are named before anything is created. Bookings import as confirmed and nobody is messaged: Fresha already told your clients, so their first message from you is the reminder.

With the API, upload the file unchanged to POST /v1/imports; source and format show how it was read:

import os
from tuppence import Tuppence
tuppence = Tuppence(os.environ["TUPPENCE_SECRET_KEY"])
export = """Client ID,First Name,Last Name,Full Name,Blocked,Block Reason,Gender,Mobile Number,Telephone,Email,Accepts Marketing,Accepts SMS Marketing,Address,Apartement Suite,Area,City,State,Post Code,Date of Birth,Added,Staff alert,Referral Source,Tags
20417300,Harper,Quill,Harper Quill,No,,Female,+44 7700 900100,,harper.quill@example.com,Yes,Yes,,,,,,,,2023-01-01,,Instagram,VIP
20417307,Rowan,Ashdown,Rowan Ashdown,No,,Male,,+44 7700 900101,rowan.ashdown@example.com,No,No,11 Mill Lane,Flat 2,,Bristol,,BS6 1AB,,2024-06-08,Nervous of the dryer,Google,
"""
upload = tuppence.request("POST", "/v1/imports", body={"kind": "clients", "file": export})
print(upload["source"], "·", upload["format"]["name"]) # fresha · Fresha client export
print(upload["mapping"]["phone"], "·", upload["mapping"]["notes"]) # Mobile Number · Staff alert
print(upload["dry_run"]["created"], "clients to import") # 2 clients to import
Fresha’s columnIn Tuppence
First Name, Last NameName
Mobile Number (else Telephone)Phone, in E.164 (+44…, +1…)
EmailEmail (matches existing clients before phone)
Address, Apartement Suite, City, State, Post CodeAddress
Date of BirthDate of birth
Staff alertNotes
TagsTags
Client, Service, Scheduled Date, Time, StaffBooking; client, service and staff member matched by name
StatusCancelled and no-show appointments skipped

Rows sharing a Ref # and person become one booking, services back to back. Rows of one appointment with different people stay separate: a visit here has one person.

  • Marketing consent (Accepts Marketing, Accepts SMS Marketing): consent doesn’t transfer. Ask clients again before sending anything but booking messages.
  • Cards, payments, prices: cards and paid deposits stay with Fresha. Bookings use the service’s price here.
  • Vouchers, memberships, packages, sales: set them up again.
  • Blocks (Blocked, Block Reason): block the client again from their page.
  • Gender, area, referral source, join date and Fresha’s client ID.
  • Past appointments, and who or what channel booked each one.

A file is recognised when most of Fresha’s columns are present. Missing or renamed columns are matched by header or content (a column of email addresses becomes the email) and flagged, for example Mobile Number: Phone is matched to Mobile No. instead. Fix any wrong match, then select Check with these columns. In the API, format.missing lists each with its field and the column matched instead. An unrecognisable file is read as a plain spreadsheet; send source: "fresha" to force the Fresha format.

Docs assistant

Open as a page
Loading the assistant…