HomeGuidesAPI Reference
ChangelogHelp CenterCommunityContact Us

Integrate a ticket-based or registration-based platform

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

❗️

This guide contains examples that are incompatible with our latest revisions.

We are in the process of updating this guide, please check back later!

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, or you’ve built your own custom solution, you can integrate with Klaviyo using our APIs, which enable, for example:

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 event APIs

This guide focuses on how to sync important metrics, or key customer activities, to Klaviyo. These events can be created in the browser with the JavaScript API and on the backend with the server-side API.

Use our JavaScript API to track customer actions during a browsing session:

  • 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 API for events that happen on the backend, starting with when a customer places an order:

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

🚧

For populating your Klaviyo product catalog, you can use either a custom catalog feed or the new catalog API. You can only populate products using one option. To shift from a custom catalog feed to the new catalog API you must first disable the existing custom catalog feed before using the API.

The level of detail in the data you send within these events will determine how you can filter and segment based on these events in Klaviyo. 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 API for onsite metrics

Active on Site tracking snippet

To be able 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.

Initialize the klaviyo object

Ensure that you have initialized the klaviyo object on your page before executing any of the following code snippets.

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. Add the following snippet to your experience page template or associated JavaScript:

📘

Make sure to replace item.___ in the below code snippet with whatever item object your platform uses for experience properties.

<script type="text/javascript">
 var item = {
  "Title": item.Title,
  "ExperienceID": item.ExperienceID,
  "Description": item.Description,
  "ExperienceDate": item.ExperienceDate,
  "Price": item.Price,
  "Categories": item.Categories,
  "ImageURL": item.ImageURL,
  "URL": item.URL
 };
 klaviyo.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">
 klaviyo.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">
   klaviyo.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">
  klaviyo.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 front-end. For example, if someone has a slow connection or a ad-blocking extension on their browser, the JavaScript API 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 POST create event API. For more information on this question, check out our custom integration FAQ on the topic.

Klaviyo also has SDKs in several languages.

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 the entire order.
  • One event for each line item named Ordered Product (see below).
    • This includes a value property that represents the total cost of an item in the order before any adjustments as well as more SKU-level detailed information about the item.

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

  • Make sure to replace PRIVATE_API_KEY with a private key from your Klaviyo account; this key must have write permissions to create events.
  • The unique_id should be a unique identifier for the order (e.g., Order ID).
  • If the same combination of event and unique_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.
  • The Items array should contain one JSON block/dictionary for each line item.
  • time is a special property that should bean ISO 8601 datetime (i.e. 2022-11-08T00:00:00Z) for the order date and time.

Here’s an example POST create event request for Placed Order:

curl --location --request POST 'https://a.klaviyo.com/api/events/' \
--header 'Authorization: Klaviyo-API-Key PRIVATE_API_KEY' \
--header 'Revision: 2022-10-17' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
	"data": {
		"type": "event",
		"attributes": {
			"profile": {
				"$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"
			},
			"metric": {
				"name": "Placed Order"
			},
   	 "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": "2022-12-05T15:00:00Z",
        "value": 9.99,
        "unique_id": "1234567890"
    }
	}
}'

Ordered Experience

For each line item, you should also generate an Ordered Experience event. This metric is useful if you plan to create any filters or triggers based on product-specific information (as opposed to the order as a whole) that isn't "top-level" for the Placed Order metric. This metric is also used in conjunction with your Catalog Feed in order to enable personalized recommendations and in the benchmarks feature to calculate average item value and average cart size.

The remainder of the POST create event calls in this guide will use the same headers as the Placed Order call.

{
   "data": {
       "type": "event",
       "attributes": {
           "profile": {
               "$email": "[email protected]",
               "$first_name": "John",
               "$last_name": "Smith"
           },
           "metric": {
               "name": "Ordered Experience"
           },
           "properties": {
               "OrderId": "1234567890",
               "ExperienceID": "1111",
               "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/product",
               "ImageURL": "http://www.example.com/path/to/product/image.png",
               "Categories": [
                   "Owned Marketing",
                   "Data"
               ],
           },
       "time": "2022-12-05T15:00:00Z",
       "value": 9.99,
       "unique_id": "1234567890"
       }
   }
}

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. 

The only update needed is the metric name and the time at which the attendance ocurred. You can also track additional details about the attendance itself:

{
   "token": "PUBLIC_API_KEY",
   "event": "Attended Experience",
   "customer_properties": {
     "$email": "[email protected]",
     "$first_name": "John",
     "$last_name": "Smith"
             },
           "metric": {
               "name": "Attended Experience"
           },
   "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).

{
   "data": {
       "type": "event",
       "attributes": {
           "profile": {
               "$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"
           },
           "metric": {
               "name": "Experience Updated"
           },
   "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:

{
   "data": {
       "type": "event",
       "attributes": {
           "profile": {
               "$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"
           },
           "metric": {
               "name": "Cancelled Order"
           },
 	   "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
   "value": 29.98,
   "unique_id": "1234567890"
   }
  }
}

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:

{
   "data": {
       "type": "event",
       "attributes": {
           "profile": {
               "$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"
           },
           "metric": {
               "name": "Refunded Order"
           },
   "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": "2022-12-07T12:00:00Z",
       "value": 29.98,
       "unique_id": "1234567890"
       }
   }
}

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 request payload for Next Experience ID:

   "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 request payload for Next Experience Date:

   "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