This guide explains the structure of event data sent to Klaviyo when subscription events occur. Understanding this structure will help you create more effective email templates and automation flows.
Overview
All subscription events sent to Klaviyo include a comprehensive payload containing information about the subscription contract, customer, line items, pricing, delivery, and payment details. The event data structure is consistent across all event types.
Event Types
The following subscription events send data to Klaviyo:
Subscription Contract Create - When a new subscription is created
Subscription Contract Pause - When a subscription is paused
Subscription Contract Activate - When a subscription is activated/resumed
Subscription Contract Cancel - When a subscription is cancelled
Billing Attempt Success - When a billing attempt succeeds
Billing Attempt Failure - When a billing attempt fails
Order Skipped - When a subscription order is skipped
Order Unskipped - When a previously skipped order is unskipped
Complete Payload Structure
Top-Level Fields
Field | Type | Description | Example |
| string | Unique identifier for the subscription contract |
|
| string | Three-letter currency code |
|
| number | Total number of line items in the subscription |
|
| boolean | Whether this is a prepaid subscription |
|
| string | URL where customers can manage their subscription |
|
| string or null | Merchant's support email address |
Customer Object
Contains detailed information about the subscriber:
Field | Type | Description | Example |
| string | Unique customer identifier |
|
| string | Customer's email address | |
| string or null | Customer's first name |
|
| string or null | Customer's last name |
|
| string or null | Customer's full display name |
|
| string or null | How long the customer has been active |
|
| string or null | Customer's locale/language |
|
| number or null | Total orders placed by customer |
|
| array of strings | Customer tags |
|
| boolean or null | Whether email is verified |
|
Common Customer Tags:
kaching-subscriber- Customer has at least one subscriptionkaching-has-active-subscription- Has an active subscriptionkaching-has-paused-subscription- Has a paused subscriptionkaching-has-cancelled-subscription- Has a cancelled subscriptionkaching-has-payment-failure- Has experienced payment failures
Line Items Array
Each subscription can have multiple line items. Access via lines array:
Field | Type | Description | Example |
| string | Product title |
|
| string or null | Variant title (e.g., size, color) |
|
| string or null | Unique product identifier |
|
| string or null | Unique variant identifier |
|
| number | Quantity of this line item |
|
| string or null | URL to variant image |
|
| string or null | Alt text for image |
|
| number | Line total after discounts (numeric) |
|
| string | Formatted price with currency symbol |
|
Pricing Information
All monetary values are provided in both raw and formatted versions:
Subtotal:
subtotalPrice.amount(number): Raw subtotal amountsubtotalPrice.currencyCode(string): Currency codesubtotalPriceFormatted(string): Formatted subtotal (e.g.,"$20.00")
Shipping:
totalShippingPrice.amount(number): Raw shipping amounttotalShippingPrice.currencyCode(string): Currency codetotalShippingPriceFormatted(string): Formatted shipping (e.g.,"$10.00")
Total:
totalPrice.amount(number): Raw total amounttotalPrice.currencyCode(string): Currency codetotalPriceFormatted(string): Formatted total (e.g.,"$30.00")
Next Order Information
Details about the upcoming order:
Field | Type | Description | Example |
| string or null | ISO 8601 date in customer's timezone |
|
| string or null | Formatted date for display |
|
| number or null | The cycle number for next order |
|
Modified Order Information
When an order is skipped or unskipped, these fields contain the modified order details:
Field | Type | Description | Example |
| string or null | ISO 8601 date of modified order |
|
| string or null | Formatted modified date |
|
| number or null | The cycle number that was modified |
|
Note: These fields are only populated for order_skipped and order_unskipped events.
Delivery Schedule
Information about when products are delivered:
Field | Type | Description | Possible Values |
| string | Time unit for delivery |
|
| number | Number of intervals between deliveries |
|
Examples:
Deliver every month:
deliveryInterval: "MONTH",deliveryFrequency: 1Deliver every 2 weeks:
deliveryInterval: "WEEK",deliveryFrequency: 2
Billing Schedule:
Information about when payments are processed:
Field | Type | Description | Possible Values |
| string | Time unit for billing |
|
| number | Number of intervals between billing |
|
| number or null | Maximum number of billing cycles |
|
| number or null | Minimum number of billing cycles |
|
Delivery Method
Shipping or local delivery details.
The structure varies by delivery type.
For shipping delivery (typename: "SubscriptionDeliveryMethodShipping"):
{
"typename": "SubscriptionDeliveryMethodShipping",
"address": {
"address1": "2515 South Broad Street",
"address2": null,
"city": "Linden",
"province": "New Jersey",
"provinceCode": "NJ",
"countryCodeV2": "US",
"zip": "07036",
"firstName": "John",
"lastName": "Doe",
"phone": null
},
"shippingOption": {
"title": "Standard shipping",
"presentmentTitle": "Standard shipping"
}
}
For local delivery (typename: "SubscriptionDeliveryMethodShipping"):
{
"typename": "SubscriptionDeliveryMethodLocalDelivery",
"address": {
"address1": "123 Main Street",
"address2": "Apt 4",
"city": "Portland",
"province": "Oregon",
"provinceCode": "OR",
"countryCodeV2": "US",
"zip": "97201",
"firstName": "Jane",
"lastName": "Smith",
"phone": "+15551234567"
},
"localDeliveryOption": {
"title": "Local Delivery",
"presentmentTitle": "Same-Day Local Delivery"
}
}
For pickup (typename: "SubscriptionDeliveryMethodPickup"):
{
"typename": "SubscriptionDeliveryMethodPickup",
"pickupOption": {
"title": "In-Store Pickup",
"presentmentTitle": "Pick up at Downtown Store"
}
}
You can find out more about delivery method object structure in the official Shopify API docs: SubscriptionDeliveryMethod.
Payment Method
Details about the customer's payment method:
Field | Type | Description | Example |
| string | Unique payment method identifier |
|
| string | Type of payment method |
|
| string or null | When the payment method was revoked |
|
| string or null | Why the payment method was revoked |
|
Payment Instrument (for Credit Cards):
When paymentMethod.instrument.typename is "CustomerCreditCard":
{
"typename": "CustomerCreditCard",
"brand": "visa",
"lastDigits": "4242",
"billingAddress": {
"firstName": "John",
"lastName": "Doe",
"address1": "2515 South Broad Street",
"province": "New Jersey",
"countryCode": "US",
"city": "Linden",
"zip": "07036"
}
}
Possible Card Brands:
visamastercardamerican_expressdiscoveretc.
You can find out more about payment method object structure in the official Shopify API docs: CustomerPaymentMethod.
Example event data
{
"subtotalPrice": {
"currencyCode": "USD",
"amount": 20
},
"humanReadableNextOrderDate": "November 25, 2025",
"contractId": "44017680677",
"currencyCode": "USD",
"deliveryInterval": "MONTH",
"isPrepaid": false,
"subtotalPriceFormatted": "$20.00",
"modifiedOrderDate": null,
"manageSubscriptionUrl": "https://shopify.com/",
"merchantSupportEmail": "[email protected]",
"customer": {
"numberOfOrders": "0",
"lastName": "John",
"firstName": "Doe",
"id": "9313802453285",
"displayName": "John Doe",
"tags": [
"kaching-has-active-subscription",
"kaching-has-cancelled-subscription",
"kaching-has-paused-subscription",
"kaching-has-payment-failure",
"kaching-subscriber"
],
"lifetimeDuration": "about 2 months",
"locale": "en-US",
"email": "[email protected]",
"isEmailVerified": true
},
"totalShippingPrice": {
"currencyCode": "USD",
"amount": "10.0"
},
"nextOrderDate": "2025-11-25T13:00:00.000+02:00",
"deliveryMethod": {
"typename": "SubscriptionDeliveryMethodShipping",
"shippingOption": {
"title": "Standard shipping",
"presentmentTitle": "Standard shipping"
},
"address": {
"address1": "2515 South Broad Street",
"lastName": "Doe",
"address2": null,
"province": "New Jersey",
"phone": null,
"firstName": "John",
"provinceCode": "NJ",
"zip": "07036",
"countryCodeV2": "US",
"city": "Linden"
}
},
"totalPriceFormatted": "$30.00",
"billingInterval": "MONTH",
"nextCycleIndex": 1,
"paymentMethod": {
"id": "gid://shopify/CustomerPaymentMethod/1283f7016e680465b7ab15f47d971432",
"instrument": {
"lastDigits": "4242",
"typename": "CustomerCreditCard",
"billingAddress": {
"address1": "2515 South Broad Street",
"lastName": "Doe",
"firstName": "John",
"province": "",
"countryCode": "US",
"zip": "07036",
"city": "Linden"
},
"brand": "visa"
},
"revokedAt": null,
"revokedReason": null
},
"billingFrequency": 1,
"totalPrice": {
"currencyCode": "USD",
"amount": 30
},
"linesCount": 2,
"maxCycles": null,
"modifiedCycleIndex": null,
"minCycles": null,
"totalShippingPriceFormatted": "$10.00",
"lines": [
{
"variantImageUrl": "https://cdn.shopify.com/s/files/1/0957/5756/6245/files/hat.jpg?v=1761388161",
"lineDiscountedPriceFormatted": "$10.00",
"quantity": 1,
"variantTitle": null,
"variantId": "51451354349861",
"title": "Hat",
"productId": "10200405147941",
"lineDiscountedPrice": "10.0",
"variantImageAltText": null
},
{
"variantImageUrl": "https://cdn.shopify.com/s/files/1/0957/5756/6245/files/shirt.jpg?v=1761388177",
"lineDiscountedPriceFormatted": "$10.00",
"quantity": 1,
"variantTitle": null,
"variantId": "51451354415397",
"title": "Blue Shirt",
"productId": "10200405213477",
"lineDiscountedPrice": "10.0",
"variantImageAltText": null
}
],
"deliveryFrequency": 1,
"humanReadableModifiedOrderDate": null
}Practical Examples for Email Templates
Example 1: Personalized Greeting with Order Total:
Hi {{ event.customer.firstName }},
Your next subscription order of {{ event.totalPriceFormatted }} will be processed on {{ event.humanReadableNextOrderDate }}.Output:
Hi John,
Your next subscription order of $30.00 will be processed on November 25, 2027.
Example 2: List All Subscription Items
Your subscription includes:
{% for line in lines %}
- {{ line.quantity }}x {{ line.title }}{% if line.variantTitle %} ({{ line.variantTitle }}){% endif %} - {{ line.lineDiscountedPriceFormatted }}
{% endfor %}
Output:
Your subscription includes:
- 1x Hat - $10.00
- 1x Blue Shirt - $15.00
Example 3: Display Delivery Schedule
You'll receive deliveries every {{ deliveryFrequency }} {{ deliveryInterval | downcase }}{% if deliveryFrequency > 1 %}s{% endif %}.Output:
You'll receive deliveries every 1 month. You'll receive deliveries every 2 weeks.
Important Notes
Date Formats
nextOrderDateandmodifiedOrderDateare ISO 8601 formatted strings in the customer's timezonehumanReadableNextOrderDateandhumanReadableModifiedOrderDateare pre-formatted strings ready for display, localized based on the customer's locale
Price Formats
Use the
*Formattedfields (e.g.,totalPriceFormatted) for display in emails - these include the currency symbol and proper formattingUse the
.amountfields (e.g.,totalPrice.amount) for calculations or comparisons
Null Values
Many fields can be
nullif the information is not availableAlways check for null values in your templates to avoid display issues
Customer Tags
Use customer tags to segment and personalize your communications
Tags are automatically managed by the app based on subscription status
Delivery Method Types
Always check
deliveryMethod.typenameto determine which fields are availableShipping and Local Delivery have
addressobjects, while Pickup haspickupOption
Testing Your Templates
You can send test events from the Klaviyo integration settings page to verify your email templates work correctly with real subscription data. Test events are available for all event types.
Need help? Drop us a message in the live chat, and we'll sort it out together.
