Integrate a ticket-based or registration-based platform

Learn how to integrate a ticket-based or registration-based platform with Klaviyo.

❗️

This guide refers to Klaviyo's v1/v2 legacy APIs.

We are in the process of updating these guides, please check back later! For more information about the differences between legacy and new APIs, check out the comparison chart and new API overview.

If you’ve built your own custom cart solution, or the data you would like to track is not currently supported by one of Klaviyo’s pre-built integrations or partner integrations, you can integrate with Klaviyo using our JavaScript API, server-side API, and custom catalog integration

The naming scheme for the events or properties you track may vary depending on your type of business. For example, you may include events, tickets, trips, experiences, courses, webinars or other data related to your business. For the sake of simplicity, in this guide we'll refer to items purchased (e.g., a ticket or registration) as "experiences." Please use your own naming conventions where applicable.

Additionally, if people can subscribe or pay in a subscription-based manner to the experiences you offer, see our guide to integrating a subscription ecommerce platform for additional help. 

Key integration components

The key components of integrating an experience-based business are:

  • Registrant data
    Tracking information such as name, email, phone number, or other profile attributes
  • Email subscribers
    Tracking who is subscribed to your newsletter
  • Website activity
    Tracking who is active on your site, what experiences they view, etc.
  • Purchase activity
    Tracking when a customer places an order, what experiences are ordered, etc.
  • Experience catalog
    Syncing your catalog of experiences to Klaviyo

About JavaScript and server-side Track and Identify APIs

This guide focuses on how to sync important metrics, or key customer activities, to Klaviyo. While our JavaScript and server-side Track and Identify APIs can be used interchangeably, we recommend using the setup in the following checklist. For a deep dive on why this structure works best, head to our article Getting started with Track and Identify APIs.

  • Use our JavaScript Track API for the following metrics:
    • Active on Site
      When someone visits your website
    • Viewed Experience
      When someone views an experience
    • Added to Cart
      When someone adds an experience to their cart
    • Started Checkout
      When someone lands on the checkout page
  • Use our server-side Track API for the following metrics:
    • Placed Order
      When an order successfully processes in your system
    • Ordered Experience
      An event for each item in a processed order
    • Attended Experience
      When an experience date has passed
    • Experience Updated
      When something about an experience is updated (e.g.,time, location, etc.)
    • Cancelled Order
      When an order is cancelled
    • Refunded Order
      When an order is refunded
  • Use our server-side Identify API for the following profile properties:
    • Next Experience ID
      Property representing the ID of the next experience for which a customer is registered; the ID should
      correspond with the ID used for that experience in the catalog feed
    • Next Experience Date
      Property representing the date of the next experience for which a person is registered
  • Use our custom catalog feed for the following:
    • Catalog feed
      An XML feed or JSON feed of your experience catalog

Filtering and segmenting on these events and profile properties is based on the level of detail in the event data sent to Klaviyo. For example, if you want to filter customers based on those who ordered products in a specific category, you’ll want to include item categories for your Ordered Product events. If the event is lacking the Category property, you won’t be able to filter users by it. To understand how data must be structured so that key event details are available for segmentation, check out our articles on segment conditions and how to structure your data for segment and flow filters.

🚧

The code snippets in this guide use example data. You will need to update the values of the JSON properties in these snippets so that they dynamically pull the relevant information needed for that property.

Check out our Custom integration FAQ for any questions about custom integrations.

JavaScript Track API for onsite metrics

Active on Site tracking snippet

To publish forms directly from Klaviyo to your site, add the following JavaScript snippet so it appears on every page on your website (the end of the footer is often a good place to add it). Make sure to replace PUBLIC_API_KEY with your Klaviyo account's six character public API key:

<script type="application/javascript" async
src="https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=PUBLIC_API_KEY"></script>

Once you’ve added the snippet above, an Active on Site metric will trigger for any person who is cookied. A browser can be cookied in any of the ways listed in our article on Klaviyo onsite tracking.

Viewed Experience tracking snippet

To set up a browse abandonment flow or build segments based on experience browsing activity, you'll need to add JavaScript event tracking for the Viewed Experience metric. All Viewed Experience metrics are tied to user profiles. On your experience page template, add the following snippet:

<script type="text/javascript">
 var _learnq = _learnq || [];
 var item = {
  "Title": "Barks and Brews",
  "ExperienceID": "1111",
  "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
  "ExperienceDate": "2019-11-13 09:00:00",
  "Price": 9.99,
  "Categories": ["Beer","Dogs","Flights"],
  "ImageURL": "http://www.example.com/path/to/product/image.png",
  "URL": "http://www.example.com/path/to/experience"
 };
 _learnq.push(["track", "Viewed Experience", item]);
</script>

Make sure to update the values of the JSON properties in the snippet so that they dynamically pull from the relevant information needed for that property.

Additionally, if you want to add entries to a “Recently Viewed Items” list in a profile, add the following snippet directly below the Viewed Experience snippet. For more information on how to use the “Recently Viewed Items” feature in a template, check out our article on inserting recently viewed items into an email.

<script type="text/javascript">
 _learnq.push(["trackViewedItem", {
  "Title": item.Title,
  "ItemId": item.ExperienceID,
  "Categories": item.Categories,
  "ImageUrl": item.ImageURL,
  "Url": item.URL,
  "Metadata": {
   "Price": item.Price,
   "Description": item.Description,
   "ExperienceDate": item.ExperienceDate
  }
 }]);
</script>

Added to Cart tracking snippet

To send abandoned cart emails to visitors who add experiences to their cart, but don’t make it to the checkout page, you’ll need to track an Added to Cart metric. A customer must be identified (i.e., cookied) to track this event. For the payload, you should include all of the cart information (like Started Checkout below) and information about the experience that was just added (like Viewed Experience above). 

Here's an example Track request where the cart already contained one item (Barks and Brews) and another item was just added to the cart (Klaviyo Atlanta Workshop):

<script type="text/javascript">
   _learnq.push(["track", "Added to Cart", {
     "$value": 9.99,
     "AddedItemProductID": "1112",
     "AddedItemSKU": "KL-ATL",
     "AddedItemProductName": "Klaviyo Atlanta Workshop",
     "AddedItemDescription": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
     "AddedItemExperienceDate": "2020-01-22 08:30:00",
     "AddedItemQuantity": 1,
     "AddedItemPrice": 0.00,
     "AddedItemCategories": ["Owned Marketing", "Data"],
     "AddedItemImageURL": "http://www.example.com/path/to/product/image2.png",
     "AddedItemURL": "http://www.example.com/path/to/experience2"
     "ItemNames": ["Barks and Brews", "Klaviyo Atlanta Workshop"],
     "CheckoutURL": "http://www.example.com/path/to/checkout",
     "Items": [{
         "ExperienceID": "1111",
         "SKU": "BNB1",
         "ExperienceName": "Barks and Brews",
         "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
         "ExperienceDate": "2019-11-13 09:00:00",
         "Quantity": 1,
         "ItemPrice": 9.99,
         "RowTotal": 9.99,
         "ExperienceCategories": ["Beer","Dogs","Flights"],
         "ImageURL": "http://www.example.com/path/to/product/image.png",
         "URL": "http://www.example.com/path/to/experience"
       },
       {
         "ExperienceID": "1112",
         "SKU": "KL-ATL-2020",
         "ExperienceName": "Klaviyo Atlanta Workshop",
         "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
         "ExperienceDate": "2020-01-22 08:30:00",
         "Quantity": 1,
         "ItemPrice": 0.00,
         "RowTotal": 0.00,
         "ExperienceCategories": ["Owned Marketing", "Data"],
         "ImageURL": "http://www.example.com/path/to/product/image2.png",
         "URL": "http://www.example.com/path/to/experience2"
       }
     ]
   }]);
</script>

Started Checkout

Checkout data is important if you'd like to send abandoned cart emails once a person makes it to the checkout page. Abandoned cart emails based on Started Checkout, as opposed to Added to Cart, will target shoppers who are potentially more serious about completing their purchase. When someone starts the checkout process, send Klaviyo a metric indicating they’ve started checking out. The best place to trigger this event is either:

  • When someone visits the checkout page after they’ve been identified
  • When they enter their email address on the checkout page if they have not already been identified

Include all line items details so your abandoned checkout emails can be customized to include pictures, links, and other information about the experiences in someone's cart. Here's an example Track request:

<script type="text/javascript">
   _learnq.push(["track", "Started Checkout", {
     "$event_id": "1000123_1387299423",
     "$value": 9.99,
     "ItemNames": ["Barks and Brews", "Klaviyo Atlanta Workshop 2020"],
     "CheckoutURL": "http://www.example.com/path/to/checkout",
     "Categories": ["Beer", "Dogs", "Flights", "Owned Marketing", "Data"],
     "Items": [{
         "ExperienceID": "1111",
         "SKU": "BNB1",
         "ExperienceName": "Barks and Brews",
         "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
         "ExperienceDate": "2019-11-13 09:00:00",
         "Quantity": 1,
         "ItemPrice": 9.99,
         "RowTotal": 9.99,
         "ExperienceCategories": ["Beer", "Dogs", "Flights"],
         "ImageURL": "http://www.example.com/path/to/product/image.png",
         "URL": "http://www.example.com/path/to/experience"
       },
       {
         "ExperienceID": "1112",
         "SKU": "KL-ATL-2020",
         "ExperienceName": "Klaviyo Atlanta Workshop 2020",
         "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
         "ExperienceDate": "2020-01-22 08:30:00",
         "Quantity": 1,
         "ItemPrice": 0.00,
         "RowTotal": 0.00,
         "ExperienceCategories": ["Owned Marketing", "Data"],
         "ImageURL": "http://www.example.com/path/to/product/image2.png",
         "URL": "http://www.example.com/path/to/experience2"
       }
     ]
   }]);
</script>

The $event_id should be a unique identifier for the cart combined with the UNIX formatted time when the event was triggered. This allows someone to trigger Started Checkout more than once when they return after adding additional items.

Server-side metrics

We recommend tracking certain metrics on the server side due to potential limitations of frontend code, security concerns, and general availability of data on the server side versus the frontend. For example, if someone has a slow connection or a JavaScript-blocking plugin on their browser, the JavaScript requests might not fire. In the case of more crucial metrics (e.g., transactional events and properties) or ones that may contain sensitive data, use our server-side Track API. For more information on this question, check out our Custom integration FAQ

Klaviyo has libraries in several server-side languages. Generally, the API requires making an HTTP GET request with a base64 encoded JSON payload. More information can be found in our Track and Identify API reference.

Key things to be aware of when tracking server-side events:

  • Make sure to replace PUBLIC_API_KEY with your public API key
  • The $event_id should be a unique identifier for the order (e.g., Order ID)
  • If the same combination of event and $event_id are sent more than once, we will skip all tracked events after the first with the same combination
  • $value is a special property that allows Klaviyo to track revenue; this should be the total numeric (not a string), monetary value of the event it’s associated with, in your Klaviyo account’s currency
  • The "Items" array should contain one JSON block/dictionary for each line item.
  • time is a special property that should be a UNIX timestamp of the order date and time

Syncing historical data

Along with your ongoing data, it is best practice to send your historical order data, which will enhance your ability to segment off past data and improve historical accuracy in revenue tracking and predictive analytics. Historical data can be sent to Klaviyo by iterating through your historical orders and generating Track API requests for each server-side event as needed. The special “time” property for these events should be the UNIX timestamp of when that order occurred. 

Placed Order

After an order is placed, you should make a Track request to our server-side API. This metric will be used for customer lifetime value (CLV) calculations and predictive analytics in order to get an accurate scope of a customer’s lifetime value and their predicted next order date. 

For ongoing data, you can send order data to Klaviyo in one of two ways: real-time or batch.

  • Real-time
    Make requests as soon as an order is placed
  • Batch
    Write some code that will run (for example) at least every 30 minutes (e.g., on a cron) to send all order events that occurred in that past 30 minutes

If you plan to send abandoned cart messages, you'll need to send order data at a frequency that falls within your flow time delay (at least) in order to stop the flow email from sending to people who have completed their order. For example, if you have a one hour time delay between when someone triggers the abandoned cart flow and when they receive the first email, make sure that you send data at least once every hour to fall within that window and filter those who complete their order out of the flow before the email sends.

For each order, we recommend you send two types of events:

  • One event named Placed Order for the entire order
    • This includes a $value property that represents the total value of an entire order including shipping, tax,
      discounts, etc.
  • One event for each line item named Ordered Experience
    • This includes a $value property that represents the total cost of an experience in the order before any
      adjustments as well as more SKU-level detailed information about the experience

Here’s an example Track request payload for Placed Order:

{
   "token": "PUBLIC_API_KEY",
   "event": "Placed Order",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith",
     "$phone_number": "5551234567",
     "$address1": "123 Abc st",
     "$address2": "Suite 1",
     "$city": "Boston",
     "$zip": "02110",
     "$region": "MA",
     "$country": "USA"
   },
   "properties": {
     "$event_id": "1234",
     "$value": 4.99,
     "OrderId": "1234",
     "Categories": ["Beer","Dogs","Flights","Owned Marketing", "Data"],
     "ItemNames": ["Barks and Brews", "Klaviyo Atlanta Workshop 2020"],
     "DiscountCode": "Beer Loyalty Discount",
     "DiscountValue": 5,
     "Items": [{
         "ExperienceID": "1111",
         "SKU": "BNB1",
         "ExperienceName": "Barks and Brews",
         "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
         "ExperienceDate": "2019-11-13 09:00:00",
         "Quantity": 1,
         "ItemPrice": 9.99,
         "RowTotal": 9.99,
         "ExperienceCategories": ["Beer","Dogs","Flights"],
         "ImageURL": "http://www.example.com/path/to/product/image.png",
         "URL": "http://www.example.com/path/to/experience"
       },
       {
         "ExperienceID": "1112",
         "SKU": "KL-ATL-2020",
         "ExperienceName": "Klaviyo Atlanta Workshop 2020",
         "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
         "ExperienceDate": "2020-01-22 08:30:00",
         "Quantity": 1,
         "ItemPrice": 0.00,
         "RowTotal": 0.00,
         "ExperienceCategories": ["Owned Marketing", "Data"],
         "ImageURL": "http://www.example.com/path/to/product/image2.png",
         "URL": "http://www.example.com/path/to/experience2"
       }
     ],
      "BillingAddress": {
        "FirstName": "John",
        "LastName": "Smith",
        "Company": "",
        "Address1": "123 abc street",
        "Address2": "apt 1",
        "City": "Boston",
        "Region": "Massachusetts",
        "RegionCode": "MA",
        "Country": "United States",
        "CountryCode": "US",
        "Zip": "02110",
        "Phone": "5551234567"
      },
   },
   "time": 1387302423
}

Ordered Experience

In addition to tracking a Placed Order event for each customer’s order, we recommend making a Track request payload for an Ordered Experience event for each line item in the order. This should include a $value property that represents the total cost of an experience in the order before any adjustments, as well as more SKU-level detailed information about the experience. 

This event is useful if you plan to create any filters or triggers based on experience-specific information (as opposed to the order as a whole) that isn't "top-level" in the Placed Order event. This event is also used in conjunction with your catalog feed to enable personalized recommendations.

{
   "token": "PUBLIC_API_KEY",
   "event": "Ordered Experience",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith"
   },
   "properties": {
     "$event_id": "1234_KL-ATL-2020",
     "$value": 9.99,
     "OrderId": "1234",
     "ExperienceID": "1112",
     "SKU": "KL-ATL-2020",
     "ExperienceName": "Klaviyo Atlanta Workshop 2020",
     "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
     "ExperienceDate": "2020-01-22 08:30:00",
     "Quantity": 1,
     "URL": "http://www.example.com/path/to/experience2",
     "ImageURL": "http://www.example.com/path/to/product/image2.png",
     "ExperienceCategories": ["Owned Marketing","Data"]
   },
   "time": 1387302423
}

Attended Experience

If you’d like to send followup emails about specific experiences, track an Attended Experience event. While you could send these types of emails via campaign after the event date for anyone who purchased it using the Placed Order event, you could end up including people who purchased the experience but did not attend, or who purchased and later cancelled their order. 

If you have a method of recording attendance, send an Attended Experience event to Klaviyo so you can guarantee that only attendees of a given experience will receive a type of communication. You can also perform reporting based on the number of spots purchased versus the number of actual attendees. 

Here’s an example Track request payload for Attended Experience:

{
   "token": "PUBLIC_API_KEY",
   "event": "Attended Experience",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith"
   },
   "properties": {
     "$event_id": "1234_KL-ATL-2020",
     "$value": 9.99,
     "ExperienceID": "1112",
     "SKU": "KL-ATL-2020",
     "ExperienceName": "Klaviyo Atlanta Workshop 2020",
     "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
     "ExperienceDate": "2020-01-22 08:30:00",
     "Quantity": 1,
     "URL": "http://www.example.com/path/to/experience2",
     "ImageURL": "http://www.example.com/path/to/product/image2.png",
     "ExperienceCategories": ["Owned Marketing","Data"]
   },
   "time": 1387302423
}

Experience Updated

If an experience is updated on your end due to a change of venue, date, etc., the following should happen:

  • Update your experience catalog feed (see catalog section below for more information on catalog setup)
  • If this experience is the next upcoming experience for a given person, update the Next Experience ID or Next Experience Date (if either have changed) on that person’s profile (these properties are also discussion in the Next Experience Date section below)
  • Track an Experience Updated event for each person registered for that experience

An Experience Updated event allows you to send emails to registrants about experience updates. This event should contain all of the updated information about the event as well as a property specifically calling out what has changed. By including the mapped $id of the event that corresponds to the ID in your experience catalog you can also reference any additional data only passed to the catalog (such as the experience location).

{
   "token": "PUBLIC_API_KEY",
   "event": "Experience Updated",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith"
   },
   "properties": {
     "$event_id": "1234_BNB1",
     "$value": 9.99,
     "ExperienceID": "1111",
     "WhatChanged": ["Time","Location"],
     "SKU": "BNB1",
     "ExperienceName": "Barks and Brews",
     "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
     "ExperienceDate": "2019-11-13 09:30:00",
     "Quantity": 1,
     "ExperienceCategories": ["Beer","Dogs","Flights"],
     "ImageURL": "http://www.example.com/path/to/product/image.png",
     "URL": "http://www.example.com/path/to/experience"
   },
   "time": 1387302423
}

Cancelled Order

If your experience orders are able to be cancelled, track a Cancelled Order event when someone cancels an order. This event should contain all the information about the cancelled order, including a cancellation reason. Each event will have almost the same payload as a Placed Order event. For Cancelled Order events to be included in CLV calculations, they must have $event_ids that correspond to a previously tracked Placed Order event. 

For event, update the event name and the timestamp and add an additional property for the cancellation reason:

{
   "token": "PUBLIC_API_KEY",
   "event": "Cancelled Order",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith",
     "$phone_number": "5551234567",
     "$address1": "123 Abc st",
     "$address2": "Suite 1",
     "$city": "Boston",
     "$zip": "02110",
     "$region": "MA",
     "$country": "USA"
   },
   "properties": {
     "$event_id": "1234",
     "$value": 4.99,
     "Reason": "No longer needed",
     "Categories": ["Beer","Dogs","Flights","Owned Marketing", "Data"],
     "ItemNames": ["Barks and Brews", "Klaviyo Atlanta Workshop 2020"],
     "DiscountCode": "Beer Loyalty Discount",
     "DiscountValue": 5,
     "Items": [{
         "ExperienceID": "1111",
         "SKU": "BNB1",
         "ExperienceName": "Barks and Brews",
         "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
         "ExperienceDate": "2019-11-13 09:00:00",
         "Quantity": 1,
         "ItemPrice": 9.99,
         "RowTotal": 9.99,
         "ExperienceCategories": ["Beer","Dogs","Flights"],
         "ImageURL": "http://www.example.com/path/to/product/image.png",
         "URL": "http://www.example.com/path/to/experience"
       },
       {
         "ExperienceID": "1112",
         "SKU": "KL-ATL-2020",
         "ExperienceName": "Klaviyo Atlanta Workshop 2020",
         "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
         "ExperienceDate": "2020-01-22 08:30:00",
         "Quantity": 1,
         "ItemPrice": 0.00,
         "RowTotal": 0.00,
         "ExperienceCategories": ["Owned Marketing", "Data"],
         "ImageURL": "http://www.example.com/path/to/product/image2.png",
         "URL": "http://www.example.com/path/to/experience2"
       }
     ],
      "BillingAddress": {
        "FirstName": "John",
        "LastName": "Smith",
        "Company": "",
        "Address1": "123 abc street",
        "Address2": "apt 1",
        "City": "Boston",
        "Region": "Massachusetts",
        "RegionCode": "MA",
        "Country": "United States",
        "CountryCode": "US",
        "Zip": "02110",
        "Phone": "5551234567"
      },
   },
   "time": 1387312956
}

Refunded Order

If your experience orders are able to be refunded, track a Refunded Order event when an order is refunded. This event should contain all the information about the refunded order, including a refund reason. Each event will have almost the same payload as a Placed Order event. For Refunded Order events to be included in CLV calculations, they must have $event_ids that correspond to a previously tracked Placed Order event. 

For event, update the event name and the timestamp and add an additional property for the refund reason:

{
   "token": "PUBLIC_API_KEY",
   "event": "Refunded Order",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith",
     "$phone_number": "5551234567",
     "$address1": "123 Abc st",
     "$address2": "Suite 1",
     "$city": "Boston",
     "$zip": "02110",
     "$region": "MA",
     "$country": "USA"
   },
   "properties": {
     "$event_id": "1234",
     "$value": 4.99,
     "Reason": "No longer needed",
     "Categories": ["Beer","Dogs","Flights","Owned Marketing", "Data"],
     "ItemNames": ["Barks and Brews", "Klaviyo Atlanta Workshop 2020"],
     "DiscountCode": "Beer Loyalty Discount",
     "DiscountValue": 5,
     "Items": [{
         "ExperienceID": "1111",
         "SKU": "BNB1",
         "ExperienceName": "Barks and Brews",
         "Description": "Bring your dog to the brewery! Includes a free flight and bottomless dog treats.",
         "ExperienceDate": "2019-11-13 09:00:00",
         "Quantity": 1,
         "ItemPrice": 9.99,
         "RowTotal": 9.99,
         "ExperienceCategories": ["Beer","Dogs","Flights"],
         "ImageURL": "http://www.example.com/path/to/product/image.png",
         "URL": "http://www.example.com/path/to/experience"
       },
       {
         "ExperienceID": "1112",
         "SKU": "KL-ATL-2020",
         "ExperienceName": "Klaviyo Atlanta Workshop 2020",
         "Description": "Learn about Owned Marketing and how you can take control of your marketing relationships.",
         "ExperienceDate": "2020-01-22 08:30:00",
         "Quantity": 1,
         "ItemPrice": 0.00,
         "RowTotal": 0.00,
         "ExperienceCategories": ["Owned Marketing", "Data"],
         "ImageURL": "http://www.example.com/path/to/product/image2.png",
         "URL": "http://www.example.com/path/to/experience2"
       }
     ],
      "BillingAddress": {
        "FirstName": "John",
        "LastName": "Smith",
        "Company": "",
        "Address1": "123 abc street",
        "Address2": "apt 1",
        "City": "Boston",
        "Region": "Massachusetts",
        "RegionCode": "MA",
        "Country": "United States",
        "CountryCode": "US",
        "Zip": "02110",
        "Phone": "5551234567"
      },
   },
   "time": 1387312956
}

Server-side profile properties

We recommend tracking certain profile properties on the server-side due to the same limitations outlined in the case of the metrics above. Tracking the following profile properties can help you segment customers and send targeted messaging. 

Next Experience ID

This profile property should be sent as a string representing the ID for the next upcoming experience a customer has booked. This property should match the ID you map to $id in your catalog feed integration, and will allow you to reference information from your catalog feed about this experience in an email.

Here is an example server-side Identify API request payload for Next Experience ID:

{
   "token": "PUBLIC_API_KEY",
   "properties": {
     "$email": "[email protected]",
     "NextExperienceID": "1111",
   }
}

Next Experience Date

This profile property should be sent as a date representing the next upcoming date for which the customer has booked an experience. This property will allow you to create date-triggered flows to send messaging before and after the next experience date.

Here is an example server-side Identify API request payload for Next Experience Date:

{
   "token": "PUBLIC_API_KEY",
   "properties": {
     "$email": "[email protected]",
     "NextExperienceDate": "2019-10-31 00:00:00",
   }
}

Catalog feed integration

Integrating your catalog will allow you to utilize product blocks in emails. To set up a custom catalog integration, please follow the process outlined in our article on syncing a custom catalog feed to Klaviyo

For the feed of your experiences, include the following information and mapping for each item in the feed: 

Item FieldKlaviyo Field to Map ToExpected Data TypeKlaviyo Data Type to Map To
Unique ID (could be SKU)$idstringstring
Experience title$titlestringstring
Experience URL$linkstringURL
Experience description$descriptionstringstring
Experience pricepricenumber (float)number
Image URL$image_linkstringURL
Categoriescategoriesarray/list of stringscategories
Street address$address1stringstring
Address 2$address2stringstring
City$citystringstring
State/region$regionstringstring
Zip/postal code$zipstringstring
Country$countrystringstring

Example flow idea: browse abandonment

Purpose: To re-engage browsers who landed on an experience page but never went on to add it to their cart, you can create a browse abandonment flow. 

Trigger: Viewed Experience

Flow Filter: Has Added to Cart zero times since starting this flow AND Placed Order zero times since starting this flow

A more advanced targeting strategy for this flow could include using the property “ExperienceDate” to change the messaging based on how soon the viewed experience is slated to occur (e.g., use more urgent messaging if the experience is in 5 days versus 30 days). This could be achieved with a trigger split in the flow, or conditional logic within the message itself. 

Additional resources