Opportunity & pipeline automation to decrease manual data entry and drive reporting efficiency
Automate Google review collection after appointments
Automate post-appointment follow-up
Automate patient retention campaigns for specific treatment and service types
Collect data for better patient/client segmentation
Automated birthday campaigns
DND (Do Not Disturb) sync for email and SMS marketing preferences
Patient lifetime value tracking from closed invoices
Multi-location support from a single integration
The integration uses AX Connect, a HIPAA-compliant middleware platform that runs all integrations between Aesthetix CRM and your EMR.
Aesthetix CRM collects the integration fee directly. Zenoti will enable the API access once confirmed.
Pricing: $149/month for the first location, $75/month for each additional location.
Aesthetix CRM will send an email with the client and Zenoti team CC'd to confirm access to the API and integration. Once the client approves, Zenoti will issue credentials and we will proceed with setup.
This is a one-way sync from Zenoti to Aesthetix CRM utilizing Zenoti webhooks, which enable near-instantaneous updates (typically within 30 seconds).
For multi-location practices, the integration is configured at the organization level in Zenoti, meaning we listen for events across all of your locations and route contacts to the correct Aesthetix CRM sub-account automatically.
Each sync event triggers a series of actions inside AX Connect: we receive the webhook, enrich the data with additional API calls to Zenoti (guest details, appointment details, etc.), map it to the appropriate custom fields, and push it into Aesthetix CRM — including adding the contact to the appropriate workflow for pipeline and automation processing.
What triggers it: A new appointment is created in Zenoti (by staff, online booking, or the Zenoti mobile app).
What happens:
We receive the webhook and extract all services attached to the appointment.
We make a GET request to Zenoti to pull full guest details (opt-in info, guest ID, etc.).
We make an additional GET request to pull appointment-specific details.
We format the appointment date into the Next Visit Date field.
We identify the appointment booking source (staff, online, or mobile app).
We pull the guest's current email and SMS marketing opt-in/opt-out status.
Fields updated in Aesthetix CRM:
First Name, Last Name, Email, Phone
Gender
Next Visit Date
Next Visit Service
Zenoti Appointment Booking Source
Zenoti Guest Center ID & Guest Center Name
Zenoti Guest ID
Zenoti Receive Marketing Email
Zenoti Receive Marketing SMS
Workflow actions in Aesthetix CRM:
A contact note is added with: appointment status (Booked), booking source, appointment service, appointment date, and guest center name. These notes serve as your audit log — if an appointment is in the notes, we received it.
An "Appointment Booked" tag is added.
The contact's opportunity is updated to the Booked stage of the pipeline. Existing patients maintain their current status; new leads keep an open status.
The contact is added to the Zenoti Opt-In/Opt-Out workflow to sync DND preferences.
Important: The Next Visit Date field uses a date-only format (e.g., 3/12/2026). We do not currently support time-based dates (e.g., 9:00 AM on 3/12/2026).
Audit Log Tip: You can always check a contact's notes to see the full history of appointments we've received. If an appointment is not in the notes, it means we did not receive the webhook event — this could indicate a Zenoti-side issue or a system issue that we can investigate.
What triggers it: An existing appointment is rescheduled or modified in Zenoti (time change, date change, etc.).
Note: This is a newer webhook. Some older customer accounts may not have this enabled yet. It was added relatively recently to Zenoti's API.
What happens:
The workflow mirrors the New Appointment Booked flow.
Updated contacts are routed into the same appointment booked workflow in Aesthetix CRM.
All the same fields are updated and the same note/tag/pipeline logic applies.
This ensures that reschedules and time changes are always captured and reflected in your CRM.
What triggers it: An appointment status changes in Zenoti. The three statuses we focus on are: Check-In, Cancellation, and No-Show.
Fields updated in Aesthetix CRM:
First Name, Last Name, Email, Phone
Zenoti Guest Center ID & Guest Center Name
Zenoti Appointment Status (custom field)
Workflow actions in Aesthetix CRM:
A contact note is added with the appointment status and guest center name. Then, routing depends on the status:
For Cancellations and No-Shows:
The contact's opportunity is updated to the Cancel/No-Show stage of the pipeline.
For Check-Ins:
The Last Visit Date is updated to the check-in date.
If this is the contact's first appointment, their Contact Type is changed to Patient and a Patient tag is added.
The opportunity is updated to the Patient stage with a won status.
Why Check-In instead of Appointment Completed? Zenoti does have an "appointment completed" webhook, but most practices don't trigger it based on their operational workflow. Check-in is the most reliable indicator that a patient actually showed up, so we use it to update Last Visit Date and move contacts through the pipeline.
What triggers it: An invoice is closed in Zenoti. This includes payments for services, memberships, gift cards, and any other transaction.
What happens:
We receive the webhook and make additional API calls to get full guest details and closed invoice details.
We update the contact in Aesthetix CRM with the invoice information.
Fields updated in Aesthetix CRM:
First Name, Last Name, Email, Phone
Last Visit Service
Zenoti Appointment Service Name
Zenoti Guest Center Name
Zenoti Invoice Number
Invoice Paid Amount (net price from the closed invoice)
Zenoti Guest ID
Workflow actions in Aesthetix CRM:
A contact note is added with: invoice status (closed), invoice amount, invoice line items, invoice number, and guest center name.
A math function adds the Invoice Paid Amount to the Patient Lifetime Value custom field on the contact.
The opportunity value is updated to reflect the all-time spend / patient lifetime value.
If no opportunity exists, one is created in the Patient stage.
The contact is added to the Birthday workflow (see below for why).
Known Limitation — Duplicate Invoice Counts: Zenoti allows an invoice to be closed multiple times. From a webhook standpoint, it is currently difficult for us to determine how many times an invoice has been previously closed. This can result in duplicate amounts being counted toward Patient Lifetime Value. We are actively working with Zenoti on this — they have recently added new payment webhooks that may provide a better solution.
Recommendation for Reporting-Heavy Practices: If accurate revenue attribution and reporting is critical for your practice (especially multi-location), we recommend using Corral Data, which has a robust Zenoti integration for bringing in payment data. Corral can pair that data with our opportunity and contact attribution data to provide 99%+ certainty on patient source, spend, CAC, and more.
What triggers it: A new membership is created in Zenoti.
Note: This workflow is only relevant if you actively use Zenoti memberships. We will enable it during your integration setup.
Fields updated in Aesthetix CRM:
First Name, Last Name, Email, Phone
Zenoti Guest Membership Center ID
Zenoti Guest Center Name
Zenoti Guest ID
Zenoti Membership Name
Zenoti Membership Purchase Date
Workflow actions in Aesthetix CRM:
The membership amount is added to Patient Lifetime Value.
A Membership tag is added.
Customization Available: We can pull this workflow out of the locked/hidden workflows if you'd like to build custom automations on top of it — for example, email drips, SMS sequences, recurring membership reminders, or anything triggered by the membership tag being added. Just let us know.
What triggers it: A membership is cancelled in Zenoti.
Note: Like the new membership workflow, this is only enabled if you are using Zenoti memberships.
What triggers it: A guest's email or SMS marketing opt-in/opt-out preference changes in Zenoti — whether from an appointment event or a standalone change.
What happens:
We pull the updated SMS and email marketing opt-in status from Zenoti.
We update the Zenoti Receive Marketing Email and Zenoti Receive Marketing SMS fields.
The contact is added to the Opt-In/Opt-Out workflow, which evaluates these fields and updates the DND (Do Not Disturb) settings in Aesthetix CRM for both email and SMS accordingly.
This keeps your CRM's DND settings continuously in sync with what the guest has set in Zenoti.
Aesthetix CRM (GoHighLevel) does not currently expose the native Date of Birth field via API. To work around this, we create a custom field called Zenoti Birthday and bring in the birthday data from Zenoti into that field.
A dedicated Birthday workflow then copies the value from the Zenoti Birthday custom field into the native Date of Birth field, keeping them in sync. This ensures that any birthday automations you've built in the CRM will work correctly using data from Zenoti.
The Birthday workflow is triggered when a contact enters the Invoice Closed workflow, which is why we add contacts to it at that stage.
We do have the capability to create guests in Zenoti from Aesthetix CRM, enabling a two-way sync. However, there is an important requirement to be aware of:
Zenoti typically requires a referral source to create a guest. If you want to use this functionality, you must reduce your guest creation requirements in Zenoti down to the minimum: first name, last name, email, and phone number.
This is available as a custom setup — contact us if you'd like to enable it.
Several workflows in your Aesthetix CRM account are hidden and locked. This is intentional — these workflows contain the core integration logic, and modifications could break the integration. The locked workflows include:
Zenoti Appointment Booked
Zenoti Appointment Status Update
Zenoti Opt-In/Opt-Out Import
Zenoti New Guest Membership
Zenoti Invoice Paid
Zenoti Birthday
If you need custom automation built on top of any of these (for example, a membership drip campaign), let us know and we can either unlock specific workflows or help you build triggers off of the tags and fields these workflows create.
All Zenoti-specific fields are organized in a Zenoti folder within your custom fields. You can find them by navigating to your custom fields and looking for the Zenoti folder.
Custom Field Name
Type
Custom Value
Zenoti Guest ID | Text |
|
Zenoti Guest Center ID | Text |
|
Zenoti Guest Center Name | Text |
|
Zenoti Guest Anniversary Date | Date |
|
Zenoti Guest Gender | Text |
|
Zenoti Event Type | Text |
|
Zenoti Appointment Service Name | Text |
|
Zenoti Invoice Number | Text |
|
Zenoti Membership Type | Text |
|
Zenoti Membership Name | Text |
|
Zenoti Membership Purchase Date | Date |
|
Zenoti Membership Price | Monetary |
|
Zenoti Appointment Booking Source | Single Options |
|
Zenoti Receive Marketing Email | Single Options |
|
Zenoti Receive Marketing SMS | Single Options |
|
Zenoti Birthday | Date |
|
Zenoti Appointment Status | Text |
|
Zenoti Provider | Text |
|
Invoice Paid Amount | Monetary |
|
In addition to the Zenoti-specific fields above, the integration also updates these standard Aesthetix CRM fields:
Next Visit Date
Next Visit Service
Last Visit Date
Last Visit Service
Patient Lifetime Value
Contact Type
First Name, Last Name, Email, Phone
Next Visit Date is date-only. We cannot store appointment times — only the date (e.g., 3/12/2026).
Last Visit Date is set on check-in, not appointment completion. Most practices don't trigger Zenoti's "appointment completed" webhook, so check-in is the reliable indicator.
Last Visit Service is set on invoice close, not check-in. The check-in event updates the date, while the invoice closed event updates the service — these are handled by separate workflows.
Invoice Paid Amount may have duplicates. Because Zenoti allows invoices to be closed multiple times, Patient Lifetime Value can occasionally reflect duplicate amounts. For accurate revenue reporting, we recommend Corral Data.
Birthday requires a workaround. GoHighLevel's native Date of Birth field isn't accessible via API, so we use a custom Zenoti Birthday field and a sync workflow to keep them aligned.
Membership workflows are optional. If you don't use Zenoti memberships, these workflows won't be enabled.
Appointment Update webhook may not be enabled for older accounts. If you're not seeing reschedules reflected, contact us and we can add the newer webhook to your configuration.
Q: How do I know if the integration received an appointment? Check the contact's Notes tab. Every appointment event we receive generates a note with the status, service, date, and location. If there's no note, we didn't receive the event.
Q: Why is a contact stuck in the wrong pipeline stage? Review the contact's notes for the audit trail. If the expected status update note is missing, the webhook event may not have fired from Zenoti's side, or there may have been a processing issue we can investigate.
Q: Can I build custom automations off the integration? Yes. You can use the tags added by our workflows (e.g., Appointment Booked, Membership, Patient) as triggers for your own workflows. You can also trigger off custom field changes. If you need a locked workflow unlocked for customization, contact us.
Q: Why does my Patient Lifetime Value seem too high? This is likely due to the known invoice duplication issue. If accurate revenue data is critical, we recommend integrating Corral Data alongside Aesthetix CRM.
Q: How does the DND sync work? Every time we receive an appointment, opt-in/opt-out change, or other event from Zenoti, we check the guest's current marketing preferences and update the DND settings in Aesthetix CRM to match.