How to export your customer data before leaving Booksy, Square, Acuity, Vagaro, Schedulicity, or Fresha — the migration walkthrough for solo beauty pros
Your client list is the asset. The tool that holds it isn't. That sentence is easy to nod at when you're not switching booking platforms and surprisingly hard to act on when you are — because every incumbent has its own export quirks, its own missing fields, and its own polite-but-stalling support queue when you ask. This post is the migration walkthrough for solo beauty pros leaving an incumbent booking tool: how to pull a clean CSV out of Booksy, Square Appointments, Acuity (now Squarespace Scheduling), Vagaro, Schedulicity, and Fresha; what fields you actually get; what's silently missing; your portability rights under GDPR and CCPA when the export is incomplete; and the paste-ready client-comm template you send the morning your new booking link goes live. Three to six hours of work end-to-end if you do it on the right day; a multi-week ordeal if you skip the export step and try to rebuild the list from memory.
What "your customer data" actually means
The phrase is loose; the inventory matters. For a solo beauty business, "customer data" is six distinct datasets that live in your booking tool, and each migrates differently. Naming them up front saves a round of re-export when you discover the field you needed wasn't in the file you pulled.
- Contact list. Name, email, phone. The core of the migration. Every platform exports this; the quality varies (some include unsubscribed clients, some silently drop them; some normalize phone numbers to E.164, some leave them in whatever format the client typed).
- Booking history. Past appointments — date, service, price paid, deposit taken or not. Useful for two reasons: it lets you tag your VIPs (the top 20% of revenue is usually 50-70% of bookings for solo work) and it gives you a rebooking pretext ("you're due for a fill, here's the new link").
- Recurring schedules. The 6-week-rebook cadence on color clients, the 2-week-rebook on lashes, the monthly nail set. If your incumbent stored these, you want them in the CSV; if it didn't, you'll reconstruct from booking history.
- Client notes. Allergies, formula notes ("9NB + 8 vol on roots, 1 inch off"), price tier adjustments, "do not book on weekends." These are the highest-value strings in your account and the ones most commonly stripped from the export.
- Deposit / charge history. Which clients have a deposit on file, which have an outstanding credit, which have an open dispute. If your incumbent processed payments inside its own platform (Booksy Payments, Square Payments, Vagaro Pay), this is partly your booking-tool's data and partly your processor's data — and the export usually splits across two files.
- Reviews. Star ratings and written reviews tied to specific bookings. Most platforms decline to export these (they're considered platform content, not your content). The right move is a screenshot pass for the testimonial-page on your new booking surface, not a fight with support.
The contact list is the load-bearing dataset. The other five are valuable in descending order — booking history and client notes are worth real effort to recover; recurring schedules and deposit history are nice-to-have; reviews are screenshot-only for most operators. If the only thing you got out of the migration was a clean contact list, the migration succeeded; everything else is upside.
The day-of timing that makes export easier
One operational note before the per-platform walkthroughs: do the export on a quiet day, not a busy one. Two reasons. First, every export is a snapshot in time — bookings made after the snapshot won't be in the file, and if you're exporting a high-traffic Saturday afternoon you'll lose 12-30 bookings between snapshot and migration. Second, support tickets at every booking platform respond faster on Tuesday-Thursday than on Friday-Monday; if the export fails or returns garbled data, you want a real human at the other end. The window most solo pros choose: a Tuesday or Wednesday morning, with the new booking link already built (per the 10-minute setup walkthrough) but not yet announced. Run the export, import the contacts into the new tool, send the comm in the late afternoon, and the next morning's bookings land on the new link.
Booksy — Profile menu → Export → Customer list
Booksy's export lives in the web app, not the mobile app.
Sign in at booksy.com on a desktop browser
(the mobile-app menu doesn't expose the export option),
navigate to Profile → Settings
→ Export Data. The interface offers three
choices — Customers, Appointments, and
Reviews. Pull the first two. Reviews don't export
cleanly on Booksy (you get review IDs and timestamps but
not the review text or star count); plan to screenshot
the top ten on a separate pass.
The Customers export is a CSV with these columns: First Name, Last Name, Phone, Email, Last Visit Date, Total Visits, Total Spend, Notes. The Notes field is what most operators are checking for — Booksy honors short notes (the "Allergic to PPD" sort of line) but truncates at 500 characters and silently drops formatting, so a multi-line note becomes a single line with the line breaks stripped. This is the export's biggest known gap; if your client notes have structure, plan to re-paste the longest 10-20 notes manually after import.
The Appointments export is bigger — one row per past appointment, columns for Date, Time, Service, Staff (always you on a solo account), Duration, Price, Deposit Paid, Status (completed / cancelled / no-show), Client Email. The two columns that pay the migration off: Deposit Paid tells you which clients have already accepted a deposit-based flow with you (high priority for the comm), and Status + Date let you compute no-show rate and rebook gap on each client (useful for the VIP tagging before announcement).
What Booksy does not export: payment-method tokens (you can't move stored cards — they're tied to Booksy Payments / Stripe-Booksy-account, not yours), Booksy-internal client IDs (so you can't easily re-tie the appointments file to the customers file by ID — you match by email, with the usual deduplication problems), and recurring-appointment schedules (Booksy stores the rebook cadence but doesn't expose it in CSV; you reconstruct from the appointments file). Plan for the stored-card loss specifically — it's the single biggest friction point in a Booksy migration. The Booksy alternative post covers the broader why-leave; this post is the export step.
Square Appointments — Dashboard → Customers → Export
Square's export is the cleanest of the six platforms,
which makes sense given Square's broader CRM ambitions.
Sign in at squareup.com/dashboard, navigate
to Customers → Customer
Directory → Import / Export →
Export Customers. You get a CSV with 18+
columns: Reference ID, First Name, Last Name, Company,
Email, Phone, Address fields, Birthday, Notes, Customer
Since, Groups, Reference Source. The Reference ID column
is gold — you can re-import it into your new tool as the
external ID, which lets you join later exports cleanly.
For booking history, navigate to
Appointments → Reports →
Export Report. Square calls these
"transactions" and includes one row per appointment with
date, service, duration, price, tip, deposit (Square
stores deposits as a separate transaction type with a
deposit tag), and the linked Reference ID.
Because Reference ID joins back to the customers file,
Square's two-file export is actually re-mergeable, unlike
Booksy's email-based join.
Square does not export: stored card details (PCI-bound, never in any export), Square Marketing campaign history (if you've been using it), and Square's auto-generated "customer score" or insights tags. The marketing history absence is the only meaningful gap — if you've been running campaigns through Square Marketing, those open / click stats stay in Square. Re-build the list in the new marketing tool from the contact CSV.
Acuity / Squarespace Scheduling — Reports → Clients → Export
Acuity (now Squarespace Scheduling, but most solo pros
still call it Acuity) keeps the export buried. Sign in
at secure.acuityscheduling.com, navigate to
Reports → Client List,
use the date filter to capture the full history, then
click Download Spreadsheet. The CSV
includes Name, Email, Phone, Number of Appointments,
Total Spend, Last Appointment Date, and Notes (Acuity's
notes field is generous — it doesn't truncate at the same
500-character mark Booksy does).
For appointment history, separate export at Reports → Appointments with the date filter. Includes: Appointment Date, Appointment Time, Type (the Acuity "appointment type" — maps to your service), Calendar (always you on a solo account), Price, Deposit Paid, Status, Client Email, Client Phone, Forms (the intake-form responses — Acuity is one of the few platforms that exports these). The Forms column is genuinely valuable if you've been collecting allergy / patch-test / preference information via Acuity intake forms; it's a CSV-of-CSVs in practice (JSON inside a column), and you'll want to massage it with a quick spreadsheet step.
Acuity does not export: payment-method tokens (PCI), Stripe-side metadata if you connected your own Stripe (it stays in your Stripe), and the Acuity API's webhook history. The Stripe-side data is good news, not bad — if you ran Acuity with your own Stripe Connect account, your processor data is already yours and follows you across the migration; you only export Acuity's booking layer.
Vagaro — Reports → Customer List → Export
Vagaro's export ships from the web dashboard at
vagaro.com: Reports →
Customer Reports → Customer
List → Export to CSV. Columns
include First Name, Last Name, Email, Mobile, Birthday,
Address, Customer Since, Last Visit, Total Visits, Total
Sales, Notes, Tags. Vagaro's Tags column is the standout
— Vagaro encourages tagging clients ("VIP", "Allergic to
X", "Deposit Required") and the export preserves them as
a comma-separated string.
For booking history, separate export at Reports → Appointment Reports → Appointment Detail. Includes Date, Time, Service, Staff, Duration, Price, Tip, Discount, Deposit, Status, Customer ID, Customer Email. The Customer ID joins back to the customers file (like Square), so the two-file merge is clean.
Vagaro does not export: Vagaro Pay-stored cards (PCI), Vagaro Marketplace listing impressions / clicks (you lose the marketplace funnel data; if marketplace was a meaningful share of your bookings, screenshot the last 3 months of marketplace stats before you cancel), and Vagaro Forms responses (this is a real gap — Vagaro stores intake-form data but the export drops it; you have to re-key the highest-priority intake fields). The Forms gap is the Vagaro export's biggest known limitation; plan around it.
Schedulicity — Settings → Account → Export Data
Schedulicity's export is older-school — a single
bundled email with multiple CSVs zipped together. Sign
in at schedulicity.com, navigate to
Settings → Account →
Export Data, click Request
Export, and Schedulicity emails the bundle
within 24 hours (sometimes same-day, occasionally up to
48 hours on a Friday request). The bundle contains
clients.csv, appointments.csv, and (if you've been on
Schedulicity Pay) transactions.csv.
Clients CSV columns: Name, Email, Phone, Date Added, Last Visit, Number of Visits, Lifetime Spend, Notes, Marketing Opt-In. The Marketing Opt-In column is the one to flag — Schedulicity defaults marketing opt-in to true on signup unless the client explicitly declined, and the column tells you which clients you can email and which you can't. Importing the opt-out clients into a marketing tool and emailing them is a CAN-SPAM violation. Filter the import accordingly.
Schedulicity does not export: stored cards, the in-app message history between you and clients (this is a real loss if you've used Schedulicity messaging extensively; screenshot the active threads before you cancel), and the recurring-appointment schedule definitions (you reconstruct from the appointments file, like every other platform).
Fresha — Reports → Clients → Download
Fresha (formerly Shedul) is the youngest of the six
and has the most-modern export interface. Sign in at
partners.fresha.com, navigate to
Reports → Clients →
Download CSV. Columns: First Name,
Last Name, Email, Phone, Birthday, Gender, Notes,
Location, Total Visits, Total Spend, Last Visit, First
Visit. Fresha is generous with the demographic
fields (Birthday, Gender) — useful for segmentation if
you do birthday-month promos.
Appointment history at Reports → Appointments → Download CSV: Date, Time, Service, Duration, Price, Deposit, Status, Cancellation Reason, Staff, Client Email, Client Phone. The Cancellation Reason column is unusual among the six — Fresha asks the client (or you) for a cancellation reason at cancel time, and the column preserves it. Useful for understanding the no-show pattern (per the no-show rate post) before you migrate.
Fresha does not export: Fresha Pay tokenized cards, Fresha Marketplace funnel data (similar gap to Vagaro Marketplace), and the auto-generated Fresha "client score" / risk score. The marketplace gap is the meaningful one for solo pros who've been getting Fresha-marketplace-sourced bookings; capture a 90-day screenshot of the marketplace stats before cancellation.
The unified import schema
Once you've pulled the per-platform exports, normalize to a single CSV before importing into your new tool. The schema below is the lowest-common-denominator across all six platforms — every field listed is present in every export, so you can build the unified file without per-platform special cases.
| Field | Source columns | Notes |
|---|---|---|
| Email / E-mail / Email Address | Lowercase + trim. Dedupe key. | |
| phone_e164 | Phone / Mobile / Cell | Normalize to +1XXXXXXXXXX. Drop non-digit characters first. |
| first_name | First Name / Given Name | Title-case. Trim. |
| last_name | Last Name / Surname / Family Name | Title-case. Trim. |
| last_visit | Last Visit / Last Appointment Date | ISO 8601 (YYYY-MM-DD). Useful for "haven't seen you in X" rebooks. |
| total_visits | Total Visits / Number of Appointments | Integer. Used for VIP tagging. |
| total_spend | Total Spend / Lifetime Spend / Total Sales | Numeric. USD. Used for VIP tagging. |
| notes | Notes / Client Notes | String. Watch Booksy's 500-char truncation; spot-check. |
| marketing_opt_in | Marketing Opt-In / Email Subscribed | Boolean. Default false if missing. CAN-SPAM-load-bearing. |
| vip_flag | (computed) | True if total_visits ≥ 5 or total_spend ≥ $500. Tweak per business. |
Ten fields. Every CSV row hits this schema. Import order is contacts first (email-deduped), then per-row tags for VIP / opt-in status, then a separate import for booking history if your new tool supports it (most don't on the solo tier). The VIP flag is the column that matters most operationally — your top 20% by visits or spend gets the high-touch comm template (next section); the rest gets the standard one.
Your portability rights — GDPR and CCPA
If a platform's export is incomplete or refuses to cooperate, you have legal rights. Two regimes apply to US-based solo beauty businesses with US-based clients, depending on jurisdiction:
- GDPR Article 20 (Right to Data Portability). Applies to any client with a connection to the EU/EEA — most US solo beauty pros won't have many such clients, but it's worth knowing. The right requires the platform to provide personal data "in a structured, commonly used, and machine-readable format" — i.e., CSV is fine, an unstructured PDF is not. If a platform refuses, the escalation path is the GDPR-named DPO contact in the platform's privacy policy, then the EU client's national DPA. Booksy and Fresha have explicit GDPR Article 20 workflows; Square, Acuity, Vagaro, and Schedulicity handle it through general support.
- CCPA / CPRA (California residents). Applies to clients who are California residents. The right is similar — a "right to know" + "right to data portability" — and the regulated response window is 45 days (extendable to 90 with notice). Practically, every platform on this list responds within 1-3 weeks because the CCPA-compliant infrastructure is the same as the GDPR-compliant infrastructure. The CPRA expansion of CCPA in 2023 explicitly added the "machine-readable format" language, matching GDPR's standard.
The pragmatic takeaway: if the standard CSV export covers your needs, use it. If a platform is being difficult, cite "Article 20" or "CCPA portability request" in your support ticket subject line and the queue moves you up. None of the six platforms in this post have a track record of denying portability requests; they have a track record of slow-walking the export when you ask politely. The legal-cite path takes you from "we'll get to it" to "ticketed at priority 2" within 24 hours.
The "I'm moving my booking link" client comm
Once the export is clean and the new booking link is live, the comm is the migration's last load-bearing step. The wrong comm — too long, too apologetic, too technical, or too vague — costs you 10-30% of the clients who would have followed. The right comm is short, specific, and gives the client one tap to act. Paste-ready template:
Hi [first_name] —
Quick heads up: I've moved my booking to a new link.
Old link (Booksy/Square/Acuity): no longer accepting new
appointments after [date].
New link: [chairhold.com/yourhandle]
A small deposit at booking holds your spot — same as
before, just on a cleaner system. Same chair, same me,
same prices.
Save the new link in your contacts so you don't lose it.
— [your name]
Channel choice matters: send via SMS for high-value clients (the VIP-tagged 20%), email for the rest. SMS gets a 95%+ open rate within 3 hours; email gets 40-60% open rate over a week. The cost difference is meaningful at high client counts (Twilio SMS is roughly $0.0085 per US message; 200 SMS sends is ~$1.70 — fine for a one-time migration; not fine for monthly newsletters). Don't send the comm before the new link is live and tested with a real test booking; the comm-arrives-before-link-works failure mode loses more clients than the comm itself recovers.
One subtlety on the deposit-required language: if your incumbent platform did not require deposits and your new flow does, do not soft-pedal the deposit in the comm. The clients you'd lose by being clear are the clients who never would have shown up; the deposit-first flow is the no-show-killer, and underselling it on day one undercuts the reason you migrated. Frame it factually: "A small deposit at booking holds your spot." Most clients tap through without comment; the rare client who pushes back is answered with the deposit-conversation DM scripts.
Five common migration mistakes
- Exporting on a Saturday. Snapshot timing matters; Saturday exports leave the most bookings stranded between snapshot and migration. Do it midweek morning.
- Importing the unsubscribed list. The Marketing Opt-In column on Booksy / Schedulicity / Vagaro flags clients who declined marketing. Importing them into a new email tool and emailing them is a CAN-SPAM violation. Filter on import.
- Forgetting the booking-history file. Most operators export contacts and stop, then realize at week two that the VIP tagging needs visit counts and dollar totals — which require the appointment CSV. Pull both files, even if you only import the contacts initially.
- Sending the comm before the new link works. The first 30 minutes after the comm are the highest-conversion window. If clients tap through to a broken page, you lose them on the recovery attempt. Verify the new link with a real test booking on a separate phone before sending.
- Cancelling the old subscription on day one. Keep the old platform live for 30-45 days as a redirect surface. Some clients will tap the old bookmark; if the old page is dead, they bounce off; if the old page is live with a "we've moved — new link here" message, they convert. Most platforms let you switch to a free tier or pause; pick the option that keeps the page reachable.
Decision matrix — which file to pull and what to do with it
| Platform | Customer file | Appointment file | Biggest gap |
|---|---|---|---|
| Booksy | Profile → Settings → Export | Same path, second tab | Notes truncated at 500 chars; no recurring schedules |
| Square Appointments | Customers → Directory → Export | Appointments → Reports → Export | Marketing campaign history doesn't follow |
| Acuity / Squarespace | Reports → Client List | Reports → Appointments | Forms exported as JSON-in-column (massage) |
| Vagaro | Reports → Customer Reports | Reports → Appointment Detail | Forms responses dropped entirely |
| Schedulicity | Settings → Account → Export | Same bundle | In-app message history not exported |
| Fresha | Reports → Clients → Download | Reports → Appointments → Download | Marketplace funnel data doesn't follow |
Where ChairHold sits in the migration
Honest disclosure: ChairHold is pre-launch as of this post (v1.0 ships with Stripe Checkout-hosted deposits, one link, your Stripe; v1.1 adds SMS reminders; v1.2 adds the import path described next). On v1.0, the import is manual — paste the unified CSV into your own email tool (Mailchimp, Beehiiv, ConvertKit) and the booking link itself is per-client (clients book by tapping your link in their inbox, not by being looked up in a directory). On v1.2, ChairHold will accept the unified-schema CSV directly, store the contact list, and offer a one-tap "send the migration comm" flow with the template above pre-filled. Until v1.2, treat ChairHold as the booking surface and your existing email tool as the contact-list surface; the migration still works, the steps are just split across two tools.
If you're considering ChairHold but stuck on the incumbent because you don't want to re-build your client list, this post is the answer to that hesitation: the export is recoverable, the rights are real, the comm is paste-ready, and the migration takes one quiet Tuesday morning. The booking-page copy post is what your new page should say; the mobile-optimization post is how it should behave on a phone; this post is how to bring your existing clients with you. Three posts in sequence; one weekend of work; a clean deposit-first flow on the other side.
FAQ
Can I export from the mobile app, or do I need a desktop?
Desktop on every platform listed. Booksy, Vagaro, and Schedulicity hide the export from the mobile menus entirely; Square, Acuity, and Fresha technically expose it but the mobile UI is awkward (you'll be downloading a CSV to a phone and then re-uploading to your laptop anyway). Sign in on a laptop or desktop browser, pull the files there, save to a folder, and skip the mobile-CSV step.
What if my incumbent platform isn't on this list?
The six covered are the dominant platforms for solo beauty in the US (and most of the EU): Booksy, Square Appointments, Acuity / Squarespace Scheduling, Vagaro, Schedulicity, Fresha. If you're on something else — Mindbody (more salon-focused), GlossGenius, StyleSeat, Zenoti, Phorest, Salon Iris, or a regional platform — the same general approach applies: find the export-data option in account settings, pull customers and appointments, normalize to the unified schema. The CCPA / GDPR portability rights apply regardless of platform. If the platform doesn't expose an export at all, that's the legal-cite escalation path; "Article 20 portability request" in a support ticket subject is honored more often than not.
How do I handle clients I have on my phone but not in the booking tool?
Common case for solo pros — repeat clients who book by DM or text and never went through the booking system. These don't show up in any export. The fix is a manual pass through your phone's contact list before the comm — tag the ones who are clients (most pros have a rough mental list of 20-50 names), add their email or phone to the unified CSV, and include them in the comm send. The migration is incomplete without this manual pass; the booking-tool export captures the booking-tool's view of your client list, not the full list.
What about reviews — can I move them to the new tool?
No, in practice. Every platform on this list considers reviews "platform content" and declines to export the review text or star count. The pragmatic move is a screenshot pass for the top 5-10 reviews — paste them as testimonials on the new booking page (per the 7-block copy structure, social proof is one of the seven blocks) with the client's first name and city for context. Don't fight a multi-week support ticket to recover reviews you can screenshot in 10 minutes.
Should I keep the old platform live as a redirect?
Yes, for 30-45 days. Most platforms let you switch to a free or paused tier. Set the bio of the old account to "We've moved — book at chairhold.com/yourhandle"; some clients will tap the old bookmark for weeks before updating. After 30-45 days, cancel for real — the redirect-recovery curve goes effectively flat after six weeks.
How do I handle deposit / outstanding-credit balances on the old platform?
Two cases. Outstanding deposits on future bookings: honor them at the appointment on the new platform — apply as a credit at checkout, no re-charge needed. Outstanding credits (client paid for a service they haven't taken yet, platform-hosted gift cards, etc.): these are platform- specific. Square and Vagaro let you cash out platform-credit balances; Booksy and Fresha do not cleanly. The honest move is to cash out where you can and absorb the rest as cost-of-migration; the alternative (asking clients to use up their credit on the old platform before you migrate) extends the timeline by weeks and costs more in lost bookings than the absorbed credits cost.
What about HIPAA / health-information notes (allergies, conditions)?
HIPAA technically doesn't apply to most solo beauty
businesses (it covers covered entities — providers
billing health insurance, plus their business
associates — and a beauty business is neither), but
the data is still sensitive and worth handling
carefully. The migration practice: include allergy /
condition notes in the unified CSV's notes
column with the original phrasing; do not paste them
into a marketing-tool's tag system or a public-facing
field. Treat the notes like medical strings even
though the law doesn't require it — privacy hygiene
is the right default for any list with that kind of
content.
The migration in one Tuesday morning
Three to six hours of work, end-to-end, in this order. Sign into the incumbent on a laptop. Pull the customer CSV and the appointment CSV. Pull any additional files the platform offers that you'll regret not having (Acuity Forms, Vagaro Tags, Fresha Cancellation Reasons). Normalize the customer file to the unified ten-field schema. Compute VIP flags (top 20% by visits or spend). Filter out marketing-opt-out clients before import. Manually add the off-platform clients from your phone contacts. Send a test booking through the new link from a different phone to verify it works end-to-end. Send the comm in the late afternoon — SMS to VIPs, email to the rest. Set the old platform to redirect mode for 30-45 days. The next morning's bookings land on the new link; the migration is done.
Your client list is the asset. The tool that holds it isn't. The export is recoverable, the rights are real, the comm is paste-ready. One quiet Tuesday morning, and the chair holds on the system you actually want.