Your Zenoti integration continuously syncs appointment, visit, guest, and membership data into Aesthetix CRM. This guide shows how to turn that data into revenue through two motions: always-on workflows that reactivate patients automatically, and targeted smart lists you send campaigns to on demand. It covers the decision framework for choosing between them, ready-to-build workflow and smart list recipes, the compliance guardrails that keep patient outreach safe, and the limitations you need to design around.
This guide assumes your Zenoti integration is already live. For how the integration itself works and the full field list, see the Overview of Zenoti Integration with Aesthetix CRM article in this help center.
Every time a patient books, checks in, cancels, closes an invoice, or updates their profile in Zenoti, that event syncs to their contact record in Aesthetix CRM (typically within 30 seconds). Those synced fields and tags are exactly what smart list filters and workflow triggers read. That means you can build:
Automated reactivation for patients who have lapsed past their normal visit cadence
Treatment-specific rebooking timed to when results wear off
Cancellation and no-show recovery that fires the moment status changes
New-patient second-visit nudges
Birthday, anniversary, and membership-renewal touchpoints
Targeted campaign audiences segmented by service, spend, location, provider, and more
The integration's own workflows are locked (they contain the core sync logic), so everything in this guide is built as your own workflows and smart lists, triggered off the fields and tags the integration populates. You never modify the locked workflows.
All Zenoti fields live in a Zenoti folder inside your custom fields. The fields most useful for reactivation:
Field | What It Tells You |
Last Visit Date | Date of the most recent visit. Set when the patient checks in at Zenoti. |
Last Visit Service | The service from the most recent closed invoice. |
Next Visit Date | Date of the patient's next booked appointment. Important: this retains the past date after a visit rather than clearing (see the booked-guard section below). |
Next Visit Service | The service scheduled for the upcoming appointment. |
Zenoti Appointment Status | Latest appointment status: Check-In, Cancellation, or No-Show. |
Patient Lifetime Value | Cumulative spend from closed invoices. |
Contact Type | Lead vs. Patient. Flips to Patient at the first check-in. |
Zenoti Appointment Booking Source | How the appointment was booked: staff, online, or mobile app. |
Zenoti Guest Center Name | The location the patient belongs to. |
Zenoti Provider | The provider attached to the appointment. |
Zenoti Guest Gender | Patient gender from the Zenoti profile. |
Zenoti Birthday / Guest Anniversary Date | Birthday and guest anniversary dates. |
Zenoti Membership Name / Purchase Date | Membership details, when memberships are in use. |
Zenoti Receive Marketing Email / SMS | The patient's marketing consent, synced from Zenoti to your DND settings. |
The integration also applies tags you can filter and trigger on: Appointment Booked, Patient, and Membership.
The rule is simple: look at what drives the timing of the message.
If the timing is driven by the patient's own lifecycle (days since their last visit, a cancellation, a birthday, a service wearing off), build it as an automated workflow. Every patient gets the right message at exactly the right point in their journey, with no one pulling lists.
If the timing is driven by the business calendar (a seasonal promotion, an event, a new-service launch, a flash offer), build a smart list and send to it on demand with human review.
In practice, this means the reactivation segments many practices send manually every month should not be manual at all. A patient who hits day 90 with nothing booked should hear from you on day 90, not whenever the next monthly blast happens to run. Automating those frees your team's energy for the promotional sends where judgment and creativity matter.
This is the single most important thing to get right, so read it before building anything.
After a visit, the Next Visit Date field keeps the past appointment date instead of clearing. It only changes when a new appointment is booked. So a filter of "Next Visit Date is empty" would exclude almost all of your lapsed patients, which are exactly the people reactivation is meant to reach.
Use this two-part check for every "nothing booked" condition instead:
Booked-guard: Next Visit Date is before today OR Next Visit Date is empty.
A patient passes the guard (safe to include in reactivation) when either is true. The inverse, Next Visit Date is after today, is your suppression filter to exclude already-booked patients from any promotional send.
Two rules that go with it:
Check the guard at send time, not just at entry. In workflows, evaluate the booked-guard in an If/Else immediately before each message, not only when the patient enters. Patients book mid-sequence.
Add a booking exit goal. Every reactivation workflow should also carry a goal that removes the patient the moment they book (Next Visit Date becomes a future date, or the Appointment Booked tag is added), so no one who just booked keeps getting win-back messages.
These eight workflows form the always-on layer. Build each as a new workflow in your account. All of them share the booked-guard and the compliance guardrails covered below.
Trigger: Last Visit Date is updated (fires at check-in).
Logic: Wait 90 days. Then an If/Else on the booked-guard. If Next Visit Date is in the future, exit. Otherwise, run a 3 to 4 touch win-back sequence over about three weeks (SMS and email), leading with a booking link.
Exit goal: Appointment booked. The patient leaves the sequence immediately.
Re-entry: Allow re-entry so every new visit restarts the 90-day clock. This becomes a permanent safety net for every patient.
Optional escalation: If there's no response and Patient Lifetime Value is above your VIP threshold, create a call task for the patient's home location instead of continuing digital touches.
Trigger: Last Visit Service is updated (fires at invoice close, so the service is populated).
Logic: Branch on Last Visit Service. Neurotoxin waits about 75 days (ahead of the typical 90-day wear-off). Filler waits about 6 months. Laser hair removal and IPL wait about 45 days for series cadence. Monthly facials wait about 40 days. Each branch runs the booked-guard, then sends a message referencing the specific treatment.
Exit goal: Appointment booked.
Why it wins: Relevance. "It's about time for your next tox touch-up" outperforms a generic "we miss you," and the timing reaches patients right as results fade, when intent is highest.
Trigger: Zenoti Appointment Status changes to Cancellation.
Logic: Wait 1 to 2 days, then a soft two-touch rebook sequence over about a week with a direct booking link.
Exit goal: Appointment booked.
Why status-based: Because Next Visit Date can still hold the cancelled appointment's date, a date-based filter may miss these patients for days. Triggering on the status change catches every cancellation the moment it happens.
Trigger: Zenoti Appointment Status changes to No-Show.
Logic: Wait a few hours, then a single warm, no-guilt message with a rebooking link. One gentle follow-up a few days later if nothing is booked (run the booked-guard first).
Exit goal: Appointment booked.
Tone: Keep this softer than cancellation recovery. No-show patients are often embarrassed, and guilt-heavy messaging drives them away.
Trigger: Contact Type changes to Patient, or the Patient tag is added (first check-in).
Logic: Day 2, a thank-you with care tips. Day 30, a check-in with a soft rebook prompt. Day 45, run the booked-guard, then offer a second-visit incentive if nothing is booked.
Exit goal: Appointment booked.
Why it matters: The gap between visit one and visit two is where most patient lifetime value is won or lost. Patients who return within 60 days are far more likely to become regulars.
Trigger: Date-based on Zenoti Birthday (run about 7 days before) and Zenoti Guest Anniversary Date.
Logic: Birthday, a gift message with a treatment credit or gift-card offer valid through their birthday month. Anniversary, a "one year with us" appreciation message.
Exit goal: None needed. These are single goodwill touches.
Trigger: Membership cancellation (available when Zenoti memberships are in use).
Logic: Wait a few days, then a two-touch sequence acknowledging the change, highlighting what they keep as a patient, and presenting a rejoin path. A final "door is open" message about 30 days later.
Exit goal: New membership, or appointment booked.
Note: Route high-value cancellations to a personal call task first.
Trigger: Date-based on Zenoti Membership Purchase Date plus 11 months.
Logic: A value-recap message before renewal: services used, savings earned, what's ahead. Position the renewal as a win, not an invoice.
Exit goal: None. A single annual touch.
Smart lists update themselves as Zenoti data syncs. Use them for campaigns where your team picks the moment and the offer. Every list that targets "nothing booked" uses the booked-guard from above.
Reactivation and win-back
High-value lapsed: Contact Type = Patient, Last Visit Date more than 90 days ago, Patient Lifetime Value above your VIP threshold, booked-guard. Route to personal outreach, not just email.
6-month lapsed: Contact Type = Patient, Last Visit Date more than 180 days ago, booked-guard.
12-month win-back: Contact Type = Patient, Last Visit Date more than 365 days ago, booked-guard. Best-offer, last-chance territory.
One-and-done: Contact Type = Patient, Patient Lifetime Value under a single-visit threshold, Last Visit Date more than 60 days ago, booked-guard.
Treatment-based
Tox overdue: Last Visit Service contains Botox, Dysport, or Jeuveau, Last Visit Date more than 100 days ago, booked-guard.
Filler due: Last Visit Service contains a filler service, Last Visit Date more than 6 months ago, booked-guard.
Laser series incomplete: Last Visit Service contains laser hair removal or IPL, Last Visit Date 45 to 90 days ago, booked-guard.
Facial regulars, no membership: Last Visit Service contains a monthly facial service, Last Visit Date within 90 days, no Membership tag. Your warmest membership upsell audience.
Value and loyalty
VIP patients: Patient Lifetime Value above your top tier, Last Visit Date within 180 days. For events, early access, and referral asks. Never discount-lead this group.
Members going quiet: Membership tag present, Last Visit Date more than 45 days ago, booked-guard. Your highest recurring-revenue churn risk.
Lifecycle, demographic, and channel
Men's campaigns: Zenoti Guest Gender = Male, Contact Type = Patient. Combine with a lapse filter for "men, 90+ days out."
Booking-source split: Zenoti Appointment Booking Source = online (lead with a booking link) vs. staff (route to a call task).
Per-location: Any list plus Zenoti Guest Center Name = a specific location. Essential for multi-location practices, since offers and providers vary by market. This also lets each location own its own reactivation queue.
Per-provider: Any list plus Zenoti Provider = a specific provider. Great for "your injector has openings this week," or retention outreach when a provider transitions.
Reactivation means sending marketing messages to patients, which puts you in TCPA and HIPAA territory. Build these guardrails into every workflow and smart list from the start.
Honor consent on every send. The integration syncs each patient's Zenoti email and SMS marketing opt-in status into your Do Not Disturb (DND) settings automatically, so a patient who opts out in Zenoti is suppressed in Aesthetix CRM. Respect DND on every campaign, and as an added layer, filter reactivation smart lists on Zenoti Receive Marketing SMS and Zenoti Receive Marketing Email so your audience counts reflect only consented, deliverable patients. Never send marketing SMS to a patient who has not opted in.
Split your sends by channel. Keep separate versions for SMS-consented and email-only audiences so no segment goes unreached and no consent line is crossed. Include a clear opt-out in marketing messages and honor opt-outs immediately.
Mind quiet hours and frequency. Keep marketing sends within reasonable local hours and cap total volume so no patient receives more than 2 to 3 marketing touches per week across all workflows and campaigns combined.
Keep PHI out of message content. Reference services in general, promotional terms rather than disclosing specific clinical details that a third party could see on a lock screen. "Time for your next visit" is safer than naming a specific diagnosis or treatment plan. This keeps patient outreach appropriate even though the messages travel over SMS and email.
Beyond the booked-guard and compliance basics, design around these:
Check the booked-guard at send time, and use a booking exit goal. Covered above, and worth repeating because it is the most common mistake.
Last Visit Date is set on check-in; Last Visit Service is set on invoice close. These come from two different events. If you trigger a workflow the instant Last Visit Date changes (check-in) and immediately branch on Last Visit Service, the service may not be populated yet if the invoice has not closed. For service-cadence timing, trigger on Last Visit Service instead so the service is always present.
Next Visit Date reflects the most recently booked or modified appointment. For a patient with several future bookings, treat it as "a future appointment exists," not necessarily "the soonest one."
Confirm events actually synced. Every appointment event the integration receives is written to the contact's Notes as an audit log. If an expected event is not in the notes, the webhook may not have fired (for example, some back-office or bulk changes in Zenoti do not generate per-guest webhooks). After any bulk operation in Zenoti, spot-check a few contacts before relying on a segment.
Patient Lifetime Value can occasionally double-count. Because Zenoti allows an invoice to be closed more than once, PLV may be inflated for some patients. If you use PLV thresholds to gate VIP or high-value lists, treat the boundary as approximate rather than exact, and see the data warehouse section below if precise revenue is critical.
Time-of-day is not stored. Next Visit Date is date-only, so you cannot build logic around appointment times.
The workflows and smart lists above run on the data the integration syncs today, which is a live stream of each patient's latest events. Some of the highest-converting reactivation segments are historical by nature, and they need more than the live stream can provide. Specifically, the synced fields are:
Forward-only. The integration begins capturing data at go-live. Patients whose last activity predates that have no Last Visit Date until their next event, so lapse-based lists undercount your true lapsed pool, most heavily in the first year.
Snapshot, not history. Last Visit Date, Last Visit Service, and similar fields store only the most recent value. There is no visit count, visit history, or average cadence.
Single-value, not aggregate. Segments that require math across a patient's full history cannot be expressed with these fields.
To build those, you pull complete historical data from Zenoti's API into an analytics or data warehouse platform, compute the segments there against the full appointment, sales, and membership history, and activate the results back into Aesthetix CRM as tags, custom field values, or list memberships. From there, the workflow and smart list recipes above take over: the activated segment becomes a trigger or filter like any other field. If your practice already runs an analytics platform on top of Zenoti, it is likely already warehousing the data these segments need.
Segments that typically require this approach:
Advanced Segment | Why the Live Sync Can't Do It |
Pre-go-live win-back (patients whose last visit predates the integration) | The live stream has no record they exist as lapsed. |
Personal cadence decay (gap since last visit exceeds their own historical average) | Needs full visit history and per-patient math. |
Visit-count cohorts (3+ lifetime visits, none in 12 months) | Needs counts across the entire visit history. |
Cross-sell journeys (multi-treatment tox patients who never tried filler) | Needs complete service history, not just the last invoice. |
Package and series balances (unused sessions remaining) | Needs Zenoti package and redemption data. |
Membership tenure and usage | Needs full membership and redemption history. |
Precise revenue and churn scoring | Needs clean, deduplicated longitudinal sales data. |
Departed-provider cohorts (everyone who ever saw a provider) | The Provider field only holds the most recent one. |
You do not need to build everything at once. A sensible order:
Foundation: Adopt the booked-guard convention, then build W1 (evergreen reactivation), W3 (cancellation recovery), and W4 (no-show recovery). These target the highest-intent patients and close the biggest gaps in most practices' follow-up.
Relevance: Add W2 (service cadence) and W5 (second-visit nudge), plus your core reactivation smart lists with per-location overlays.
Loyalty: Add W6 through W8 (birthday, membership win-back, renewal) and your VIP and value segments.
Precision: If you need the historical segments, stand up a data warehouse activation to feed them back into your account.
Why can't I just filter on "Next Visit Date is empty" to find lapsed patients?
Because Next Visit Date keeps the past appointment date after a visit instead of clearing. "Is empty" would exclude nearly everyone you want to reach. Use the booked-guard: Next Visit Date is before today OR is empty.
Can I edit the Zenoti integration workflows to add my campaigns?
No. Those workflows are locked because they contain the core sync logic. Build your own separate workflows triggered off the fields and tags the integration populates (Last Visit Date, Zenoti Appointment Status, Contact Type, the Patient tag, and so on).
What trigger should I use for a reactivation workflow?
For general reactivation, trigger on Last Visit Date being updated, which fires at check-in. For treatment-specific rebooking, trigger on Last Visit Service being updated, which fires at invoice close and ensures the service is populated.
Why does my reactivation workflow need a booking check right before each message?
Patients often book partway through a sequence. Evaluating the booked-guard immediately before each send, plus a booking exit goal on the workflow, prevents anyone who just booked from receiving a win-back message.
How do I make sure I'm not messaging patients who opted out?
The integration syncs Zenoti marketing opt-in status into your DND settings automatically, so opted-out patients are suppressed. Respect DND on every send, and filter smart lists on the Zenoti Receive Marketing SMS and Email fields as an extra layer.
Can I build reactivation by provider or by location?
Yes. Add Zenoti Guest Center Name for location-specific lists and Zenoti Provider for provider-specific lists. Both are especially useful for multi-location practices.
Why does a lapsed patient still look like they had a facial when they're really a tox patient?
Last Visit Service reflects only the most recent closed invoice. A patient's full service history is not stored in the synced fields. If you need to segment on complete treatment history, see the data warehouse section.
Some of my long-time patients aren't showing up in reactivation lists. Why?
The integration is forward-only: it starts capturing data at go-live, so patients who have not had an event since then have no Last Visit Date yet. To reach patients whose last visit predates your integration, use a data warehouse activation to bring in historical appointment data.
My Patient Lifetime Value looks too high for some patients. Can I still use it for VIP lists?
You can, but treat the threshold as approximate. Zenoti allows invoices to be closed more than once, which can occasionally double-count toward PLV. For precise revenue-based targeting, a data warehouse gives you deduplicated numbers.
How do I confirm the integration actually received a patient's appointment?
Check the contact's Notes. Every event the integration receives is logged there with status, service, date, and location. If it is not in the notes, the event was not received.