Bring your clients, services, products, team, memberships, packages, gift cards, loyalty balances, appointments and sales over from Fresha or another system under Settings → Plan & data → Import. Nothing is written until you've seen exactly what will happen: every column is shown beside your own data, a dry run shows what would be created or matched, and the whole import can be undone afterwards.
Before you start
- Who can do it: admins and owners.
- Export your files from the old system first. See below.
- Create your packages and membership plans first under Retail, so sold packages and memberships have a plan to match by name.
Get your files out
From Fresha
- Clients → Options → Export to CSV
- Team → Options → Export to CSV
- Everything else via Reports: Client list (it carries loyalty points), Service list, Product list, Membership list, Packages list, Gift card list, Waitlist detail, Stock movement summary, Appointment list, Sales log detail
For sales, export Sales log detail. The plain Sales list has one row per sale without the items sold, so the importer refuses it and tells you which report to use.
From anything else
Upload a CSV, tab-separated (.tsv or .txt) or Excel (.xlsx) file with a header row and one row per record. Exports from Square, Vagaro, Boulevard, Mindbody, Acuity, Pabau, GlossGenius, Booksy, Timely, Jane, HoneyBook, Dubsado, Studio Ninja and most other booking tools are recognised. A report with a title above the column names is fine, and every sheet of a workbook becomes its own file. Up to 15,000 rows per file.
Columns with no home in Owneli, such as a tattoo placement, a gallery link or a contract status, can be kept in each record's notes with Keep these in notes instead of being left out.
What won't come across
Three things, and it's worth knowing why before you start:
- Saved cards. For PCI reasons card details move processor-to-processor, never through a file. You re-collect them.
- Forms, consents and photos. These aren't part of a standard export from any of these platforms.
- Mid-cycle membership billing. Never resumed automatically. See the warning below.
Import your files
Source
Under Where is this data from?, choose Fresha, Zenoti, Mangomint or Generic CSV, so Owneli recognises the file layout. Then drop your files in.
Each file is analysed and labelled with what it appears to be. If a file can't be read as a list of records, it's marked as such and skipped; your other files are unaffected. Anything the importer isn't sure about, you'll set by hand on the next step.
Map columns
Every column in every file is listed, next to your own sample values, with the field it will import into. A column with no destination is one you chose to leave out. Nothing is dropped silently.
Three kinds of column:
- Mapped: it has a destination. Recognised automatically, suggested by AI, or set by you.
- Needs a decision: it wasn't recognised. Point it at a field to keep it, or acknowledge the loss explicitly and continue.
- Not imported by design: recognised and deliberately left out, with the reason shown. Tax and commission columns are in this bucket: they're calculated by Owneli's own engines from your configuration, and importing someone else's numbers would put two sources of truth in conflict.
You confirm each file's mapping before you can move on.
Dry run
Nothing has been written yet. The numbers on this screen are exactly what the import will do:
| Column | Meaning |
|---|---|
| Create | New records that will be added |
| Match existing | Rows that match records you already have. They're linked, not duplicated. |
| Skip | Rows that won't be imported |
| Errors | Rows that failed validation |
Validation problems are listed with row numbers matching your spreadsheet, where row 1 is the header, and can be downloaded as a CSV so you can fix the source file.
If anything blocks the import, the screen says so plainly and nothing can be written until you resolve it.
Consent. Marketing consent follows your file. A new client is opted in to email or SMS only where the file's own consent column for that channel says yes (Fresha's Accepts Marketing and Accepts SMS Marketing, for example). The consent date comes from the file when it has one, otherwise it is the time of the import, and the client keeps a note of where the consent came from. A no, a blank, or a file with no consent column leaves the client opted out, and clients you already have keep the consent they have. The check shows how many new clients will be opted in and why. Before you continue, confirm you have a lawful basis to hold and contact these clients.
Import
Files are written in dependency order, not the order you uploaded them: whatever other rows point at is created first. Services before the memberships and appointments that name them; sales last, because a sale line can reference anything.
Select Continue to dry run to check, then Run import. The import runs in the background, so you can leave the page and come back.
Check it worked
You get a per-entity breakdown of created, matched, skipped and errored, plus a downloadable report.
Importing in stages
You don't have to import everything at once. Import your services today and your clients next week, and a later file links to what an earlier import brought in:
- Appointments find their client by the old system's client ID, then email, then phone, then name. A "Last, First" name is read either way. A client who matches by name only but has a different email is never linked; the row is reported instead.
- Services are matched by name, and team members by name or by a first name only one person here has. If only one person here takes bookings, an export with no staff column is booked with them.
- Importing the same file again, or a newer export of it, never creates duplicates. Records already here are matched and kept exactly as they are: an import never overwrites changes you've made since, and rows missing from the newer file are never deleted.
Undoing an import
Roll back import deletes only the rows this import created. Rows that matched existing records are left untouched.
Loyalty points, gift cards and packages
These are what the business owes its clients, so they come across as balances, never as sales.
- Loyalty points. When a file carries points balances, the mapping step asks once what one point was worth in the old system. Each client gets one opening balance worth the same money at your own point value, labelled Imported from Fresha balance. It expires on your own expiry rule, counted from the import day. The old system's tier is not copied: tiers are worked out again from your own thresholds. Importing the file again never adds a second balance.
- A second client file. The Client list adds the points balance, a staff alert and notes to clients you already have. It never overwrites a staff alert that is already set, and rollback takes back exactly what it added.
- Gift cards. Each card keeps its code, remaining balance, issue and expiry dates, purchaser and recipient. Its history shows one Imported balance entry for what is still owed. A code already used here is refused.
- Packages. Each sold package is matched to a package of the same name in Retail → Packages, so create those first. A row naming a package that doesn't exist here is reported and not imported. Remaining sessions and the expiry date come across.
Sales history
- A membership line is linked to the matching membership plan when there is one; otherwise it is kept as a plain line and reported.
- Walk-in sales, and sales whose client can't be found or whose name fits more than one client, are kept without a client and listed for review, so your sales totals stay complete.
- Walk-in appointments with no client are listed and not imported, because every appointment here belongs to a client. Their sales still come across.
- Imported receipts say Imported from Fresha and can't be refunded here, because the money was taken in the old system.
- Fees the old system charged on a visit, such as a no-show fee, are noted on the appointment rather than added to it, because the fee is already in the sales.
Memberships import as records only
Suggested order
Although the importer handles dependencies itself, importing in stages makes problems easier to isolate:
Clients
The biggest file and the one everything else references. Check the matched-versus-created split carefully.
Services and products
Your catalogue. Review prices and durations after import.
Team
Then set their working hours. Imported team members don't appear on the calendar until they have hours.
Memberships, packages, gift cards, waitlist and stock
Records only for memberships; see the warning above. Create your packages before importing sold packages.
Appointments and sales
History last. These reference everything else, so import them once the rest is settled.
After the import
- Set working hours for imported team members under Team → Scheduling.
- Check imported prices and durations under Operations → Services.
- Look for duplicate clients and merge them. See Add, find, and merge clients.
- Collect card details again for anyone on a membership.
If something goes wrong
The importer refused a file
It's probably a summary report. Export the detail version with the date range set to All Time. For Fresha sales, use Sales log detail.
Appointments or sales didn't link to a client
They're listed in the result for review. Appointments match clients by the old system's client ID, then email, phone and name. Import or fix the client, then import the file again: nothing already imported is duplicated.
I want to start again
Select Roll back import on the import. See Undoing an import above.