Open the contact record in Aesthetix CRM and click Notes. Every time the integration receives an event from Zenoti, it automatically adds a note with the appointment status, service, date, and guest center name.
Note exists → the integration received the event. Jump to the relevant section below.
No note exists → the integration did not receive the event. Start with the steps in that section.
The Notes tab is your audit log. If an appointment is not in the notes, Aesthetix CRM did not receive it from Zenoti.
The Zenoti integration uses webhooks — real-time notifications sent from Zenoti to Aesthetix CRM when an event occurs. If no note exists, one of the following is likely:
The appointment was booked through a channel not connected to the webhook. Webhooks are configured at the organization level in Zenoti. If your practice has multiple locations and a new location was added after the integration was set up, that location may not be sending webhooks.
Check which guest center the appointment was booked under.
Contact Aesthetix CRM support with the guest center name — they can confirm whether that location is included in the webhook configuration.
The reschedule webhook may not be enabled on your account. The appointment reschedule webhook was added to Zenoti's API more recently and is not enabled on all accounts. If rescheduled appointments are consistently missing notes, contact Aesthetix CRM support to have it added to your configuration.
Multiple contacts affected over the same time period. Contact Aesthetix CRM support immediately with the date the issue started and two or three example guest names.
The contact's opportunity may not exist. The integration updates existing opportunities — it does not always create new ones. Check the contact record and confirm an opportunity exists in the correct pipeline. If it does not, create one manually and it will be updated by future Zenoti events.
The contact is an existing patient. For existing patients, the integration maintains their current pipeline status rather than moving them backward. A returning patient booking a new appointment will not be moved back to the Booked stage if they are already in the Patient stage. This is intentional behavior.
The contact was checked in but the pipeline shows Cancel/No-Show. Confirm the correct status was recorded in Zenoti. The integration maps directly to whatever status Zenoti sends — if the status was entered incorrectly in Zenoti, it will reflect incorrectly in Aesthetix CRM. Correct the status in Zenoti and contact support to manually update the contact's pipeline stage.
Last Visit Date updates when a guest is checked in in Zenoti — not when the appointment is marked complete. If a patient was completed in Zenoti without being checked in first, Last Visit Date will not update.
Confirm the guest was checked in through Zenoti's check-in process.
If check-in was skipped, contact Aesthetix CRM support to manually update the field.
Note: Last Visit Service updates separately — it is set when an invoice is closed, not at check-in. If Last Visit Date updated but Last Visit Service did not, confirm the invoice was fully closed in Zenoti.
Next Visit Date updates when a new appointment is booked. It stores the date only — appointment times are not currently supported.
If Next Visit Date did not update:
Check the contact's Notes tab for an Appointment Booked note
If no note exists, the webhook event was not received — see the section above
If a note exists, the field should have updated — contact support with a screenshot of the note
This is a known limitation. Zenoti allows invoices to be closed multiple times. Each time an invoice is closed, the integration adds the invoice amount to Patient Lifetime Value. If an invoice was closed more than once in Zenoti, the amount is counted multiple times.
Aesthetix CRM is actively working with Zenoti on a solution. For practices where accurate revenue reporting is critical — particularly multi-location practices — Corral Data integrates directly with Zenoti and provides verified revenue data that can be paired with Aesthetix CRM attribution reporting.
Guest creation from Aesthetix CRM to Zenoti requires Zenoti's guest creation requirements to be set to the minimum fields. If Zenoti requires additional fields — such as referral source, address, or date of birth — the creation will fail.
Log into Zenoti as an admin
Reduce the required guest creation fields at the organization level to: first name, last name, email, and phone only
Refer to Zenoti's help article on adding a new guest for the exact setting location
Once updated, retry the guest creation from Aesthetix CRM
This setting must be changed at the organization level, not the individual guest center level, as the integration uses organization-level API credentials.
The integration syncs DND preferences from Zenoti to Aesthetix CRM automatically. When a guest's opt-in/opt-out status changes in Zenoti, the integration updates the Zenoti Receive Marketing Email and Zenoti Receive Marketing SMS fields and runs the DND sync workflow.
If a contact is still receiving messages after opting out:
Open the contact record and check the Zenoti Receive Marketing Email and Zenoti Receive Marketing SMS custom fields — confirm they show the correct opt-out value
Check the contact's DND settings — confirm DND is enabled for the correct channels (SMS, email, or both)
If the custom fields are correct but DND is not set, the locked Opt-In/Opt-Out workflow may need to be reviewed — contact support
If the custom fields do not reflect the opt-out, the webhook event may not have fired from Zenoti — contact support
If a contact opted out in Aesthetix CRM but not in Zenoti: The sync is one-directional — opt-out preferences flow from Zenoti to Aesthetix CRM only. If a guest opted out directly in Aesthetix CRM, that preference will not automatically update in Zenoti.
Zenoti birthday data is stored in a custom field called Zenoti Birthday rather than the native Date of Birth field. A dedicated Birthday workflow syncs the value from the Zenoti Birthday field into the native Date of Birth field.
This sync is triggered when a contact enters the Invoice Closed workflow — meaning a contact will not have their birthday synced until at least one invoice is closed for them in Zenoti.
If birthday campaigns are not firing:
Check the contact record — confirm the Zenoti Birthday custom field is populated
Confirm the native Date of Birth field is also populated — if it is empty, the Birthday sync workflow may not have run yet
Confirm at least one invoice has been closed for this contact in Zenoti
If the Zenoti Birthday field is populated but Date of Birth is empty, contact support
Several core integration workflows are locked and hidden. This protects the integration logic from accidental modification.
The following tags and fields are created by the locked workflows and can be used as triggers in your own custom workflows without needing the locked workflows unlocked:
Tags: Appointment Booked, Patient, Membership, Cancel/No-Show
Fields: Next Visit Date, Last Visit Date, Zenoti Appointment Status, Zenoti Membership Name, Patient Lifetime Value
If you need a locked workflow unlocked for deeper customization, contact Aesthetix CRM support.
Situation | Action |
No note on contact, single appointment | Check guest center configuration, then contact support |
No note on contact, multiple appointments | Contact support immediately with date and example guest names |
Reschedules not syncing | Contact support to enable the reschedule webhook |
Pipeline not moving, note exists | Check for existing opportunity, then contact support |
Last Visit Date not updating | Confirm check-in was completed in Zenoti |
Patient Lifetime Value incorrect | Known limitation — review Corral Data for accurate reporting |
Guest creation failing from Aesthetix CRM | Update Zenoti's required guest fields at the organization level |
DND not syncing | Contact support with custom field screenshot |
Birthday not syncing | Confirm invoice has been closed, then contact support |
Locked workflow customization needed | Contact support |