Zenoti S3 export bucket
How to connect Nabu to your Zenoti S3 export bucket, including the IP approval request, the credentials you need, and what to do if the test fails.
What this connection is
Zenoti can write your data exports into a secure Amazon S3 storage bucket on a schedule. Nabu reads that bucket, so your dashboards update on their own and you never have to export anything by hand.
Use this method when Zenoti has already set up an export bucket for you, or when API access is not available on your plan. If you have a Zenoti API key, the direct connection is simpler and you should use that instead.
Nabu only reads. It never changes anything in the bucket, and it never writes back into Zenoti.
What you need from Zenoti
Three things, and nothing beyond them:
- Bucket name
- Access key ID
- Secret access key
You will also enter your Zenoti organization name, which is the name in your Zenoti login URL. If you sign in at goldmedspa.zenoti.com, your organization name is goldmedspa.
You are not asked for an AWS region or a folder path. Nabu finds both on its own.
Step 1: Ask Zenoti to approve Nabu's IP addresses
Most Zenoti export buckets only accept connections from a short list of approved IP addresses. Nabu connects from a fixed set of addresses, and onboarding shows you that list with a copy button. Copy it from that screen rather than from this page, so you always send the current list.
Email the list to Zenoti support and ask them to allow read access to your export bucket from those addresses. This is a routine request for their team.
The addresses
These are placeholders, and sending them to Zenoti will not work. Nabu's permanent addresses are still being assigned. Copy the live list from Integrations → Zenoti in your dashboard, which always shows the current one, and use that instead. This page will be updated once the permanent addresses are in place.
203.0.113.10
203.0.113.11
203.0.113.12They are shown here only so you know what the request looks like.
What to ask for
Something like this is enough:
We use Nabu for financial reporting and it reads our Zenoti S3 export. Please allow read access to our export bucket from these IP addresses: [paste the list]. Read access only. Nabu never writes to the bucket.
If Zenoti asks what Nabu reads, it is appointments, sales and payments, clients, providers and services. No clinical notes, no intake forms, no protected health information.
Then choose I've requested access. Continue setup. This is the normal path, and it is what almost every new customer does. Nabu records that you are waiting on Zenoti and takes you to the rest of setup. You are not asked for bucket credentials yet, because nothing could be tested with them until Zenoti approves the addresses.
From there you finish your first location, reach Setup ready, and complete checkout if you are on a paid plan. Your account can be active and paid before the bucket is connected, so a slow reply from Zenoti does not hold anything up. Zenoti shows as waiting for IP approval until the connection is tested, and no data syncs before then.
If you had already coordinated with Zenoti before signing up, or your bucket has no IP restriction, choose Already whitelisted? Connect now instead. That opens the credentials form during onboarding and tests the connection right away. If the test fails, you can still switch to the waiting path and carry on.
Step 2: Connect the bucket once Zenoti approves
Open Integrations → Zenoti in your dashboard. This is where the connection gets finished, and where it lives from then on.
You will see the current status, Nabu's connection IPs with a copy button, links to this guide and to support, and a Zenoti approved access button. Choosing it opens the credentials form. It does not mark anything connected on its own.
Enter your Zenoti organization name, bucket name, access key ID, and secret access key, then choose Test and connect. Nabu connects to the bucket, checks that it can read your export, and reports the centers it found. Only a successful test marks Zenoti connected.
Nabu detects the AWS region itself, and expects your export to sit in a folder named after your Zenoti organization, which is how Zenoti usually sets it up. If your export is somewhere else, the test says so and an S3 root folder field appears. Enter the folder name Zenoti gave you and test again.
If the test fails, you stay on this page with the message and a retry. Nothing about your account changes, and you are never sent back through onboarding.
Where your locations come from meanwhile
Because the connection is not live yet, Nabu does not have your Zenoti center list during setup, so you enter your first location yourself. That location is real and your dashboards use it. Once the S3 connection is working, Nabu matches and enriches it from the export, and your other centers can be added from the Data Import page or from Setup.
If the test fails
| What you see | What it usually means |
|---|---|
| No S3 bucket with that name exists | The bucket name has a typo, or it is not the name Zenoti gave you |
| Access denied | The keys are valid, but they do not have permission to read that bucket. Ask Zenoti to confirm the keys are for read access to this bucket |
| Nabu could not find your Zenoti export | The keys work and the bucket is there, but the export is not. Ask Zenoti to confirm the export is running and writing to this bucket |
| Nabu could not find or open your export folder | The bucket is reachable, but your export is under a different folder name. Check your organization name, ask Zenoti for the folder name, and enter it in the S3 root folder field |
If a connection was working and later starts failing, the usual cause is rotated keys. Ask Zenoti for the current access key and secret, then enter them again in Integrations → Zenoti.
If a message keeps coming back after you have checked all of this, open a ticket from Help in your dashboard and include your bucket name and the exact message you saw.
After you connect
Open Data Import in your dashboard to watch it happen. Nabu imports in the order the numbers depend on each other, and each step tells you what it is for and what it brought in.
Your business first. Locations, rooms, your team, products, services, membership plans, packages, gift cards and clients. This is usually a couple of minutes.
Then the last thirty days of sales. Thirty days is what the dashboard needs to be useful, so it is what Nabu loads first rather than making you wait for everything.
Then further back, on its own. Nabu keeps loading older months in the background, as far back as your export goes. This carries on after you close the page, and the Earlier months panel shows how far it has got.
You never have to wait for the whole thing. Once the first thirty days land you can use the product, and comparisons against last year become more complete as the older months arrive.
Refreshing later
Zenoti regenerates the export on its own schedule, and Nabu keeps your data current from it automatically. There is nothing to run.
Nabu checks once a day, at 2am in your location's own time zone. Every location is on the same schedule, whatever plan you are on. If Zenoti has not published a new export since the last check, Nabu skips the run rather than re-reading a file that has not changed, so your data is only ever as fresh as your export. If your numbers look behind, the question is when Zenoti last regenerated it.
To pull something in immediately, use Refresh everything on the Data Import page, or Refresh on a single step when only one thing has changed.
Sales and visits also takes a date range, so you can re-import a specific stretch. One import covers up to 31 days at a time, and the calendar greys out anything outside that. This is for going back over a particular window, not for loading history: older months arrive on their own and you do not need to fetch them by hand.
Re-importing a range you already have updates those records rather than duplicating them, so it is always safe to run again.
What Zenoti sends, and what it does not
Nabu reports what your export actually contains. If services are uncategorized or appointments have no provider assigned in Zenoti, those gaps appear in Nabu too. Fix them in Zenoti and they fill in on the next sync.
Two gaps matter more than the rest, because they are the difference between revenue and profit:
- What your team is paid. Nabu imports who your providers are, and leaves their pay blank. Until you set pay rates in Setup, provider cost is left out of every margin rather than guessed at.
- What your products cost you. Retail price comes through reliably. What you paid for the product only comes through when Zenoti has it recorded. Any product that arrives without a cost is counted on the Data Import page, and retail margin stays incomplete until you add it.
Membership prices and benefits
Your export carries your membership plans by name, but not what they cost. Nabu fills in what it can and is explicit about the rest.
Price comes from what the plan has actually sold for. A plan people are buying arrives already priced, read from its own sales rather than guessed at. A plan nobody has bought yet cannot be priced this way, so it arrives without a price and with an Add the price flag on it. Type its recurring price and billing cadence in Setup.
Setup fees are detected even when the amount is not known. Zenoti records a plan's setup fee separately, so Nabu can tell which of your plans charge one. If nobody has been billed that fee yet, the plan says it charges one and leaves you to enter the amount.
Benefits are read from the plan's description. Whatever you have written in the plan's description in Zenoti, Nabu pulls the credits, member rates and discounts out of it and lists them for you to confirm. Nothing is taken as final, because a description is marketing copy and not a contract.
If a plan's description is blank in Zenoti, there is nothing to read and the plan arrives with no benefits and a No benefit text in Zenoti flag. The quickest fix is to paste your plan's benefit wording into its description in Zenoti, then refresh membership plans. It works for every plan after that.
Nabu tells you both on the import page rather than quietly showing you a margin built on zeros.
Client memberships and their history
Your export includes each client's memberships and a dated history of every status change. That's what lets Nabu tell you how many members you had on any past date, who cancelled or expired in a given month, and your member churn for past periods, not just today.
Nabu asks before it reads membership statuses. Zenoti's export describes statuses with its own codes, and they don't always mean the same as the same number elsewhere in Zenoti. The first time memberships come through, someone at your business confirms what each status means. Until then, membership counts show as Not available. If Zenoti later changes its status codes, Nabu stops reading them and asks again instead of quietly changing your numbers.
A status Zenoti doesn't define stays unknown. Some exports use codes for a membership's dues collection that Zenoti's own list doesn't explain. Nabu keeps those as unknown rather than guessing. Your member counts are unaffected, but Recurring Billing can't be stated while a membership in force has no known dues collection state.
Memberships waiting on a client or plan. A membership is added to Nabu once its client and its plan are both set up. Until then it waits, and it's added on the next sync after they are. Nothing is lost.
Sales and membership credit used are read the same way as the rest of your sales. A membership is counted from Zenoti's record of the membership itself, so a membership whose sale is still open is still a membership.
If a step says "Not sent"
That step's data is not in your export. It is a fact about what Zenoti is sending, not a problem with your connection, and the rest of your import is unaffected.
Ask your Zenoti contact to include that data in your export, then use Check again on that step. Nothing else needs redoing.
More than one center
Each Zenoti center becomes its own location in Nabu, with its own data. Nabu finds every center in your export during setup; the one you pick becomes your first location, and the rest are offered on the Data Import page and in Setup whenever you are ready to add them. Adding a location may need a plan change, and Nabu will say so rather than leaving a button that does nothing.
Once you have more than one, a location picker appears at the top of every page. Data Import follows it like the rest of the product, so you are always looking at one location at a time.
Frequently asked questions
Does Nabu need write access to the bucket? No. Read access is enough.
What does Nabu read out of the export? Your centers, rooms, team, products, services, membership plans, packages, gift cards and clients, plus sales, payments and appointments. It does not read clinical notes, intake forms, allergies, medications, or any other protected health information, even where your export contains them.
Can I switch to the API later? Yes. You can move between the API and the export bucket in either direction from Settings → Integrations, and either one can be switched to CSV import or manual setup.
How far back does Nabu go? As far as your export does. The most recent month arrives first so you can start using the product, and older history keeps loading behind you until there is nothing older to find.
What if Zenoti will not approve the IP addresses? First ask whether your bucket has an IP restriction at all, because many do not. If the request is refused, CSV import gives Nabu the same records with periodic manual exports.
Can I use a bucket my company owns instead of Zenoti's? Yes, as long as Zenoti's export is writing into it and the keys you give Nabu can read it.
What can Nabu do with these keys? Read your export, and nothing else. Nabu never writes to the bucket or back into Zenoti, and you can ask Zenoti to revoke the keys at any time.
Connecting Zenoti
How to connect Zenoti to Nabu by API key or S3 export bucket, which method suits your account, and what appointment and sales data gets synced.
Using CSV When No Integration Is Available
How to export from your booking software and import to Nabu when no direct connection exists. The dashboards end up the same, the sync is manual.

