Klaviyo Integration

Last reviewed: 2026-08-10

Available on:Ultimate
On this page

The Klaviyo integration pushes booking events from Easy Appointment Booking into your Klaviyo account in real time. You can use those events to send your own branded confirmations, reminders, and follow-ups, build customer segments, and run targeted campaigns, all without any custom code.

This integration is available on the Ultimate plan only. You'll need a Klaviyo account and a private API key to connect.

Klaviyo takes over most booking emails

This is the most important thing to understand before you connect. Klaviyo is not a parallel channel that duplicates the app's emails. For most triggers, once Klaviyo is connected the app stops sending its own email and fires a Klaviyo event instead.

Klaviyo triggerWhat the app does with its own email
Booking placedStill sends, if the event has confirmation emails on. Turn it off.
Booking reminderApp email is skipped. Klaviyo sends instead.
Booking rescheduledApp email is skipped. Klaviyo sends instead.
Booking cancelledApp email is skipped. Klaviyo sends instead.
Booking follow-upStill sends, if the event has follow-up emails on. Turn it off.
Package purchasedApp email is skipped. Klaviyo sends instead.
Waitlist joined / invitationApp email is skipped. Klaviyo sends instead.
Booking occurred / checked-in / no-showThe app has no email for these. Klaviyo only.

So there are only two places where a customer can get two emails: booking confirmation and follow-up. Uncheck those two on each event once your Klaviyo flows are live. See Turning off the app's own emails below.

Text messages are not affected. If an event has Send Automatic Reminder Text Message or the other SMS options checked, the app keeps sending those texts even with Klaviyo connected. Turn them off in the app if you want Klaviyo handling SMS too.

Connecting Klaviyo

  1. In Klaviyo, go to Account > Settings > API Keys and click Create Private API Key.
  2. Give the key any name, and grant it Full Access, or at minimum Events: Write and Profiles: Write.
  3. Click Save, then copy the key that is generated.
  4. In the app, go to Settings > Marketing & analytics > Klaviyo.
  5. Paste the key into the Klaviyo API Key field.
  6. Click Connect.

The Marketing and analytics settings page in Easy Appointment Booking, showing the Connect to Klaviyo card with an API key pasted into the Klaviyo API Key field and the Connect button in the card footer

The app immediately tests the key against Klaviyo and seeds all of its triggers as Klaviyo metrics. When it succeeds you'll see a Connected badge on the card and a "Klaviyo setup successful" message. If Klaviyo rejects the key, the app clears it and tells you, so a bad key never sits there looking connected.

Use a private API key, not the public key. The public key only identifies users from the browser and cannot receive server-side events.

Your saved key is hidden after you connect, so the field looks empty when you come back. That is expected. To swap keys, paste a new one and click Update API Key.

The triggers the app sends

Once connected, all of these are available in Klaviyo under Your Metrics > API. The name in the right column is exactly what you pick as your flow trigger, and is also available inside the event as {{ event.trigger }}.

When it firesKlaviyo trigger
A customer places a bookingBooking placed (Easy Appointment Booking)
A booking is moved to a new date or timeBooking rescheduled (Easy Appointment Booking)
A booking is cancelledBooking cancelled (Easy Appointment Booking)
The reminder window is reached before the bookingBooking reminder (Easy Appointment Booking)
The appointment start time passes (up to 15 minutes' delay)Booking occurred (Easy Appointment Booking)
A booking is checked inBooking checked-in (Easy Appointment Booking)
A booking is marked as a no-showBooking no-show (Easy Appointment Booking)
24 hours after the bookingBooking follow-up (Easy Appointment Booking)
A customer buys a prepaid packagePackage purchased (Easy Appointment Booking)
A customer joins the waitlistWaitlist joined (Easy Appointment Booking)
You send a waitlist invitationWaitlist invitation (Easy Appointment Booking)

Every event also creates or updates a Klaviyo profile for that customer, so your contact list stays current without any list syncing on your side.

This is a one-way push from Easy Appointment Booking to Klaviyo. Booking data flows into Klaviyo flows and segments, but changes in Klaviyo do not affect bookings in the app.

The reminder trigger

Booking reminder (Easy Appointment Booking) is the trigger most merchants set up second, and it behaves differently from the rest, so it is worth reading closely.

The app decides when it fires, not Klaviyo. The reminder timing comes from the event itself:

  1. Go to Dashboard, click Edit beside an event.
  2. Open the Notifications tab.
  3. Under Reminders, set Send reminders... hours before booking.

If you set 24, the Klaviyo trigger fires roughly 24 hours before the booking start time. If you change it to 5, it fires 5 hours before. Klaviyo receives the event at that moment and your flow sends immediately after.

It fires even when the app's reminder emails are unchecked. This is deliberate. Unchecking Send Automatic Reminder Emails stops the app's own reminder email, and the Klaviyo trigger keeps firing on the same schedule. That is exactly the state you want when Klaviyo owns reminders.

The Notifications tab of an event in Easy Appointment Booking, showing the Confirmations, Reminders and Follow-ups checkboxes with the "Send reminders... hours before booking" field set to 168

Sending more than one reminder. The app fires the reminder trigger once per booking. To send a sequence, build it inside the flow with Klaviyo's Time Delay step. A common setup is to set the app's reminder to 48 hours, then in Klaviyo send the first email on trigger and a second after a 46-hour delay, so the customer gets one reminder two days out and another two hours out.

In the flow's email settings, uncheck Skip recently emailed profiles. Klaviyo skips it by default, which quietly swallows the second and third emails in a reminder sequence, and any booking made by a customer who just received another email from you.

Building your first flow

  1. In Klaviyo, go to Flows and click Create flow.
  2. Click Build your own, name it (for example "Booking confirmation"), and click Create Flow.
  3. For the trigger, click Your Metrics, then API.
  4. Pick the trigger you want from the table above, for example Booking placed (Easy Appointment Booking).
  5. Click Save, then Confirm & Save.
  6. Add an email step, click Select Template on the right, and choose or build a template.

Booking variables for your email templates

Klaviyo personalizes emails with dynamic variables. Every booking trigger (placed, reminder, rescheduled, cancelled, occurred, checked-in, no-show, follow-up) carries the same set, so one template can serve several flows.

DataVariable
Customer first name{{ event.first_name }}
Customer last name{{ event.last_name }}
Customer email{{ event.customer_email }}
Customer phone{{ event.customer_phone }}
Booking ID{{ event.booking_id }}
Booking start date{{ event.start_date }}
Booking end date{{ event.end_date }}
Booking start time{{ event.start_time }}
Booking end time{{ event.end_time }}
Booking timezone{{ event.timezone }}
Service name{{ event.event_name }}
Service description{{ event.event_description }}
Location{{ event.event_location }}
Notes on the event or date{{ event.event_notes }}
Meeting link (Zoom, Google Meet, Teams){{ event.event_link }}
Number of attendees{{ event.number_of_attendees }}
Variant or ticket name{{ event.variant_title }}
Intake question answers{{ event.booking_line_items }}
Staff member name{{ event.availability_name }}
Staff member email{{ event.availability_email }}
Staff member contact link{{ event.availability_contact_link }}
Reschedule and cancel link{{ event.reschedule_booking_link }}
Subscription booking link{{ event.bundle_booking_link }}
Package redemption link{{ event.package_booking_link }}
POS check-in QR code image URL{{ event.qr_code_url }}
Shipping address{{ event.shipping_address }}
Internal notes{{ event.internal_notes }}
Shopify order ID{{ event.order_id }}
Which trigger fired{{ event.trigger }}
Your store name{{ event.shop_name }}
Your store email{{ event.shop_email }}
Your store website{{ event.shop_website }}

Klaviyo variables are case-sensitive and must match exactly. There is no # in front of the braces. Copy the names above as written, or copy them out of Klaviyo's own preview pane.

Anything you set under Email Variables in Settings > Email & SMS is merged into these events too, so your custom fields are available in Klaviyo under the same names.

Package purchase variables

A package purchase is not a booking, so Package purchased (Easy Appointment Booking) carries a different set:

DataVariable
Customer name{{ event.customer_name }}
Customer email{{ event.customer_email }}
Package name{{ event.package_name }}
Package code{{ event.package_code }}
Package redemption link{{ event.package_booking_link }}
Package expiry date, if set{{ event.package_expiry }}
Number of bookings included{{ event.booking_limit }}
Shopify order name, for example #1251{{ event.order_name }}
Your store name{{ event.shop_name }}
Your store email{{ event.shop_email }}
Your store website{{ event.shop_website }}

The redemption link is unique to that order. Customers open it to book the sessions they have paid for, so it belongs in every package email you send.

Waitlist variables

Waitlist joined and Waitlist invitation carry waitlist details rather than a confirmed booking:

DataVariable
Customer name{{ event.customer_name }}
Customer email{{ event.customer_email }}
Customer phone{{ event.customer_phone }}
Requested date{{ event.preferred_date }}
Requested time{{ event.preferred_time }}
Requested staff member{{ event.preferred_employee_name }}
Notes the customer left{{ event.customer_notes }}
Service name{{ event.event_name }}
Link to book{{ event.booking_page_url }}

Showing intake question answers

Intake question answers arrive as a list, so loop over them:

{% for item in event.booking_line_items %}
{{ item.name }}: {{ item.value }}
{% endfor %}

Hiding links that do not apply

reschedule_booking_link, bundle_booking_link, and qr_code_url are empty on bookings they do not apply to, which would leave a stray heading in your email. Wrap each one so the section only renders when there is something to link to:

{% if event.reschedule_booking_link %}
Need to reschedule?
You can reschedule or cancel your booking here: {{ event.reschedule_booking_link }}
{% endif %}

To make a link clickable rather than raw text, type your own wording in the Klaviyo editor ("Join the meeting"), highlight it, and set the link target to the variable.

For the POS QR code, turn on QR code check-in in Settings > Shopify automation, then add an image block in Klaviyo and set its source to {{ event.qr_code_url }}.

Starter templates

Copy these into Klaviyo to get moving, then restyle them however you like.

Booking confirmation

Hi {{ event.first_name }},

This is a booking confirmation for {{ event.event_name }}.

Date: {{ event.start_date }}
Time: {{ event.start_time }} to {{ event.end_time }} ({{ event.timezone }})
Location: {{ event.event_location }}

{{ event.event_notes }}
{{ event.event_link }}

{% if event.reschedule_booking_link %}
Need to reschedule?
You can reschedule or cancel your booking here: {{ event.reschedule_booking_link }}
{% endif %}

If you have any questions, contact us at {{ event.shop_email }}.

Thank you,
{{ event.shop_name }}

Booking reminder

Hi {{ event.first_name }},

This is a reminder about your upcoming booking for {{ event.event_name }}.

Date: {{ event.start_date }}
Time: {{ event.start_time }} to {{ event.end_time }} ({{ event.timezone }})
Location: {{ event.event_location }}

{{ event.event_notes }}
{{ event.event_link }}

{% if event.reschedule_booking_link %}
Need to reschedule?
You can reschedule or cancel your booking here: {{ event.reschedule_booking_link }}
{% endif %}

Thank you,
{{ event.shop_name }}

Booking cancelled

Hi {{ event.first_name }},

The following appointment has been cancelled:

Name: {{ event.event_name }}
Date: {{ event.start_date }}
Time: {{ event.start_time }} to {{ event.end_time }}

Thank you,
{{ event.shop_name }}

Turning off the app's own emails

Reminders, reschedules, cancellations, package emails, and waitlist emails switch over to Klaviyo on their own. Confirmations and follow-ups do not, so turn those off per event once your flows are live:

  1. Go to Dashboard and click Edit beside an event.
  2. Open the Notifications tab.
  3. Under Confirmations, uncheck Send Automatic Confirmation Emails. Under Follow-ups, uncheck Send Automatic Follow-up Emails.
  4. Uncheck Send Text Message upon Confirmation, Send Automatic Reminder Text Message, and Send Automatic Follow-up Text as well if Klaviyo is handling text messages.
  5. Save.

Leave Send reminders... hours before booking set to the timing you want. That field still drives the Klaviyo reminder trigger.

Repeat for each event you take bookings on. Settings live on the event, not on your account.

Recommended order when switching over: connect Klaviyo, leave the app's emails on, build and test your flows, then turn the app's confirmation and follow-up emails off and switch the flows live. Reminders, reschedules, and cancellations move to Klaviyo the moment you connect, so build those flows first.

Checking what was sent

Open any booking and click Notifications. Sends that went through Klaviyo appear in the history with a Klaviyo badge, next to any emails and texts the app sent directly. For the message content and open or click rates, go to Klaviyo.

In Klaviyo itself, Analytics > Activity Feed shows the raw events as they arrive, and Data Management > Events lists the app's triggers as metrics you can use in segments.

Testing your setup

  1. Create a booking, either with Add a booking in the app or from your storefront.
  2. Use an email address that is different from the one you send Klaviyo emails from.
  3. The Klaviyo email should arrive within 2 to 3 minutes.

To check a template without making a booking, open it in Klaviyo, click Preview & Test, switch to Search by event, and pick one of the Easy Appointment Booking triggers. Klaviyo fills the template with real event data so you can confirm every variable resolves.

Example use cases

Re-engagement after 30 days

Build a segment of customers who have a Booking placed event but no activity in the last 30 days, then send a campaign with a direct link to book again. This works well for recurring services like haircuts, coaching sessions, or monthly treatments.

Win-back after cancellation

Trigger a flow on Booking cancelled, wait 24 hours, then send a re-booking link and a small incentive. Customers who cancel often just need a nudge to rebook.

Review request after check-in

Trigger on Booking checked-in so only customers who actually turned up get asked, add a delay of a day or two, then ask for a review.

Upsell by service

Segment on event_name to send different follow-ups per service, for example aftercare instructions for treatments and a package offer for one-off classes.

Disconnecting Klaviyo

  1. Go to Settings > Marketing & analytics > Klaviyo.
  2. Click Disconnect and confirm.

Events stop immediately, and the app resumes sending its own emails for whichever notifications are still checked on your events. Existing profiles and past events in Klaviyo are untouched.

Disconnecting clears your stored key. To reconnect, create a new private API key in Klaviyo. Removing the Klaviyo add-on from your plan also disconnects the integration.

FAQ

Klaviyo is connected but no emails are going out. What should I check?

Make a test booking, then in Klaviyo open the customer's profile and look at their activity on the right. If you see a Booking placed event, the app's side is working and the problem is in Klaviyo: usually the flow is still in draft, the trigger is set to the wrong metric, or Skip recently emailed profiles is on. If you do not see the event, check that the API key is still valid in Settings > Marketing & analytics > Klaviyo, and that the profile is not suppressed under Profiles in Klaviyo.

Will my customers get two emails for the same booking?

Only for confirmations and follow-ups, and only until you uncheck those on the event. Reminders, reschedules, cancellations, package emails, and waitlist emails are handed to Klaviyo automatically, and the app does not send its own copy.

Do all emails move to Klaviyo the moment I connect?

Reminders, reschedules, and cancellations do, so if those flows are not built yet, those customers get nothing. Build those three flows first, or build them before you connect.

Does the integration work on Klaviyo's free plan?

Yes, events and profiles sync to a free Klaviyo account. Sending is governed by Klaviyo's own pricing, which includes a monthly free allowance.

Can I trigger SMS flows from booking events?

Yes. If your Klaviyo account includes SMS, the same triggers drive SMS flows. Remember to uncheck the app's own SMS options on the event, since Klaviyo does not suppress those.

Can I send booking data to a specific Klaviyo list?

You do not need to. Klaviyo creates or updates a profile from the customer's email on every event, and you can build segments from the events themselves, for example "has done Booking placed at least once in the last 90 days".

Next steps

Was this article helpful?

Still need help?

Our support team is available to answer any questions you have.