Build Your Own Klaviyo Flows

Every Klaviyo trigger the app sends, how the reminder trigger is timed, and the variables to use in your booking, package, and waitlist emails

Available onUltimateUpdated 7 min read
On this page

This page is for building your own Klaviyo flows, or changing the ready-made ones. To connect Klaviyo first, see Connect Klaviyo.

The triggers

In Klaviyo, the app's triggers are under Your Metrics > API. Pick the name exactly as written.

When it happensKlaviyo trigger
A customer booksBooking placed (Easy Appointment Booking)
A booking moves to a new timeBooking rescheduled (Easy Appointment Booking)
A booking is cancelledBooking cancelled (Easy Appointment Booking)
The reminder time is reachedBooking reminder (Easy Appointment Booking)
The appointment starts (up to 15 minutes later)Booking occurred (Easy Appointment Booking)
A customer 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 packagePackage purchased (Easy Appointment Booking)
A customer joins a waitlistWaitlist joined (Easy Appointment Booking)
You send a waitlist invitationWaitlist invitation (Easy Appointment Booking)

Each event also creates or updates the customer's Klaviyo profile. Changes only go from the app to Klaviyo, never back.

Build a flow

  1. In Klaviyo, go to Flows and click Create flow.
  2. Click Build your own, give it a name, and click Create Flow.
  3. For the trigger, click Your Metrics, then API, and pick a trigger from the table.
  4. Click Save, then Confirm & Save.
  5. Add an email step and choose or build a template. Use the variables below.

To check a template, click Preview & Test in Klaviyo, choose Search by event, and pick one of the app's triggers. Klaviyo fills in real booking details.

When the reminder is sent

The app, not Klaviyo, decides when the reminder trigger runs. It uses Send reminders... on the service's Notifications tab. Set it to 24 and the trigger runs about 24 hours before each booking.

The trigger runs even when Send Automatic Reminder Emails is unchecked. That is what you want when Klaviyo sends reminders.

The trigger runs once per booking. For two reminders, add a Time Delay step in the flow. For example, set the app's reminder to 48 hours, send one email right away, then another after a 46-hour delay.

Warning:

In each email's settings in Klaviyo, uncheck Skip recently emailed profiles. It is on by default, and it stops later emails in a reminder sequence.

Variables for booking emails

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 }}
Warning:

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.

Variables for package emails

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.

Variables for waitlist emails

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 }}

Show 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 %}

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 automations, 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 }}

Ideas

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.

Related articles

Was this page helpful?

Still stuck?

Message our support team and we’ll walk you through it.