Skip to content

Switching from Vagaro

Export your customers from Vagaro, get upcoming appointments from Vagaro support or a report, and import both. Tuppence recognises Vagaro’s columns and previews every row before importing.

  1. Exportcustomers, appointments
  2. Add servicesand staff
  3. Import clientsdry run, then Import
  4. Import bookingsclashes named first
In VagaroIn TuppenceComes over?
CustomerClientYes
AppointmentBookingUpcoming only
ServiceServiceNo, add first
Service providerStaff memberNo, add first with hours
Packages, memberships, gift cardsSession packages, memberships, gift vouchersNo, set up again
FileContentsImport as
Customer list (Excel report)Name, email, cell and home phone, address, birthday, notes, visits, spend, marketing choicesClients
Upcoming appointments (CSV from Vagaro support, or an Excel report)Date, start time, customer, service, service provider, statusUpcoming bookings

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

  1. Customers: signed in as the business owner, go to Reports › Customers › Export › Excel. Save the file as CSV (in Excel, Numbers or Google Sheets).
  2. Appointments: Vagaro has no self-serve export of upcoming appointments. Ask Vagaro support for a CSV of them all, or run Reports › Appointments › Appointments Summary from today, switch to the grid view, download as Excel and save as CSV.
  1. Go to Imports › Clients and choose the customer list. You see Read as a Vagaro customer 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. Calendar clashes are named before anything is created. Bookings import as confirmed and nobody is messaged: Vagaro 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 = """First Name,Last Name,Email,Cell Phone,Home Phone,Address,City,State,Zip,Birthday,Customer Since,Last Visit,Total Visits,Total Spent,Email Marketing,Text Marketing,Notes
Greta,Holm,greta.holm@example.com,+44 7700 900501,,,,,,4/18/1991,2/3/2023,9/14/2026,14,£640.00,Yes,No,Scissor finish only
Barnaby,Cole,barnaby.cole@example.com,,+44 7700 900502,,,,,,6/21/2024,8/30/2026,5,£210.00,No,No,
"""
upload = tuppence.request("POST", "/v1/imports", body={"kind": "clients", "file": export})
print(upload["source"], "·", upload["format"]["name"]) # vagaro · Vagaro customer export
print(upload["dry_run"]["created"], "clients to import") # 2 clients to import
import os
from tuppence import Tuppence
tuppence = Tuppence(os.environ["TUPPENCE_SECRET_KEY"])
export = """First Name,Last Name,Email,Cell Phone,Home Phone,Address,City,State,Zip,Birthday,Customer Since,Last Visit,Total Visits,Total Spent,Email Marketing,Text Marketing,Notes
Greta,Holm,greta.holm@example.com,+44 7700 900501,,,,,,4/18/1991,2/3/2023,9/14/2026,14,$640.00,Yes,No,Scissor finish only
Barnaby,Cole,barnaby.cole@example.com,,+44 7700 900502,,,,,,6/21/2024,8/30/2026,5,$210.00,No,No,
"""
upload = tuppence.request("POST", "/v1/imports", body={"kind": "clients", "file": export})
print(upload["source"], "·", upload["format"]["name"]) # vagaro · Vagaro customer export
print(upload["dry_run"]["created"], "clients to import") # 2 clients to import
import os
from tuppence import Tuppence
tuppence = Tuppence(os.environ["TUPPENCE_SECRET_KEY"])
export = """First Name,Last Name,Email,Cell Phone,Home Phone,Address,City,State,Zip,Birthday,Customer Since,Last Visit,Total Visits,Total Spent,Email Marketing,Text Marketing,Notes
Greta,Holm,greta.holm@example.com,+44 7700 900501,,,,,,4/18/1991,2/3/2023,9/14/2026,14,€640.00,Yes,No,Scissor finish only
Barnaby,Cole,barnaby.cole@example.com,,+44 7700 900502,,,,,,6/21/2024,8/30/2026,5,€210.00,No,No,
"""
upload = tuppence.request("POST", "/v1/imports", body={"kind": "clients", "file": export})
print(upload["source"], "·", upload["format"]["name"]) # vagaro · Vagaro customer export
print(upload["dry_run"]["created"], "clients to import") # 2 clients to import
Vagaro’s columnIn Tuppence
First Name, Last NameName
EmailEmail (matches existing clients before phone)
Cell Phone (else Home Phone)Phone, in E.164 (+44…, +1…)
Address, City, State, ZipAddress
BirthdayDate of birth
NotesNotes
Appointment Date, Start Time, Customer, Email, Cell PhoneBooking, and who it’s for
Service, Service ProviderService and staff member, matched by name
StatusCancelled and no-show appointments skipped

Dates are read month-first or day-first, as the file’s dates show.

  • Email and text marketing choices: consent doesn’t transfer. Ask clients again before sending anything but booking messages.
  • Cards, payments, prices: cards and payments stay with Vagaro. Bookings use the service’s price here.
  • Visit and spend history (Customer Since, Last Visit, Total Visits, Total Spent).
  • Packages, memberships, gift cards: set them up again.
  • Online booking flag and the appointment’s end time (bookings use the service’s length here).
  • Past appointments.

A file is recognised when most of Vagaro’s columns are present. Missing or renamed columns are matched by header or content (a column of email addresses becomes the email) and flagged. 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: "vagaro" to force the Vagaro format.

Docs assistant

Open as a page
Loading the assistant…