Klaviyo Events
Event properties are structured as the following:
{{ event|lookup:'VARIABLE NAME' }}
For example, with the Points Awarded event, if you wanted to display the name of the earning rule, you can do: {{ event|lookup:'Earning Rule' }}. This returns a value such as Made a purchase or Follow on Instagram.
Points Awarded
Fired when a customer earns points through purchases, actions, or other earning rules.
Profile: Customer's email
Property | Tag | Description |
Points Awarded |
| Number of points earned |
Earning Rule |
| Name of the earning rule (or "Manual") |
Status |
| Status of the earning (e.g. |
Order Number |
| Shopify order number, if points were earned from a purchase |
Multiplier bonus campaign properties
The three properties below are only included when a multiplier bonus campaign boosted the purchase (for example, double points). The multiplied total is already in Points Awarded above; these just describe the boost. They are not present on a normal earning. Tiered bonus campaigns use the separate Bonus Points Awarded event instead.
Property | Tag | Description |
Bonus Campaign |
| Name of the multiplier bonus campaign that boosted these points |
Bonus Multiplier |
| The multiplier applied, e.g. |
Bonus Points |
| The extra points contributed by the campaign (the amount earned above the standard rate) |
Bonus Points Awarded
Tiered bonus campaigns only.
This event fires for the flat, per-order bonus from a tiered campaign (for example, "Spend $1,000, earn 200 bonus points"). Multiplier campaigns do not use this event. Their boost is folded into the Points Awarded event above.
This bonus is a separate award from the standard purchase points, so it has its own event and can power a dedicated bonus reward flow without affecting your Points Awarded flow.
Profile: Customer's email
Property | Tag | Description |
Bonus Points |
| Number of flat bonus points awarded |
Campaign Name |
| Name of the bonus campaign |
Qualifying Spend |
| The order spend that counted toward the threshold (item subtotal, excluding shipping and taxes) |
Spend Threshold |
| The spend threshold the customer reached to earn this bonus |
Status |
| Status of the bonus: |
Order Number |
| Shopify order number that earned the bonus |
Reward Redeemed
Fired when a customer redeems their points for a reward or discount.
Profile: Customer's email
Property | Tag | Description |
Reward Name |
| Name of the reward redeemed |
Points Spent |
| Number of points spent |
Discount Type |
| Type of discount (e.g. |
Discount Code |
| The discount code for the reward |
VIP Tier Changed
Fired when a customer moves up or down VIP tiers based on their lifetime points.
Profile: Customer's email
Property | Tag | Description |
New Tier Name |
| Name of the tier the customer moved to (e.g. Gold) |
Previous Tier Name |
| Name of the previous tier, if applicable |
Referral Invite Sent
Fired when an advocate sends a referral email invite to a friend.
Profile: Advocate's email
Property | Tag | Description |
Recipient Email |
| Email address of the invited friend |
Campaign Name |
| Name of the referral campaign |
Advocate Name |
| Name of the advocate (or "A friend" if not provided) |
Subject |
| Email subject line used for the invite |
Personal Message |
| Custom message written by the advocate |
Referral URL |
| The referral link sent to the friend |
Shop Name |
| Name of the Shopify store |
Shop Domain |
| Domain of the Shopify store |
Channel |
| Always |
Referral Claimed
Fired when a friend claims their referral discount code.
Profile: Friend's email
Property | Tag | Description |
Discount Code |
| The discount code generated for the friend |
Discount Type |
| Type of discount (e.g. |
Discount Amount |
| The discount value (e.g. |
Campaign Name |
| Name of the referral campaign |
Reward Description |
| Readable reward (e.g. "10% off", "$5 off", "free shipping") |
Advocate Email |
| Email of the advocate who referred the friend, if known |
Advocate Name |
| Name of the advocate, if known |
Shop Name |
| Name of the Shopify store |
Shop Domain |
| Domain of the Shopify store |
Referral Reward Earned
Fired when an advocate earns their reward after their referred friend completes a purchase.
Profile: Advocate's email
Property | Tag | Description |
Friend Email |
| Email of the friend whose purchase triggered the reward |
Discount Code |
| The advocate's reward discount code |
Discount Type |
| Type of discount (e.g. |
Discount Amount |
| The discount value (e.g. |
Reward Description |
| Readable reward (e.g. "10% off", "$5 off", "free shipping") |
Campaign Name |
| Name of the referral campaign |
Shop Name |
| Name of the Shopify store |
Shop Domain |
| Domain of the Shopify store |
Points Expiry Soon
Fired when a customer has loyalty points expiring within the next 7 days. This event is triggered once per customer per 7-day window — multiple earning rules expiring on different days are aggregated into a single event to prevent duplicate notifications.
This event is OFF by default. Merchants must enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Points Expiring |
| Total points expiring within the next 7 days |
Current Points |
| Customer's current point balance when the event fires |
Days Until Expiry |
| Days until the earliest expiring points (e.g. |
Customer Name |
| Customer's first name (or "there" if not set) |
Gift Reminder
Fired by the daily gift reminders cron when a customer's gift recipient has an upcoming occasion matching one of the configured reminder intervals (e.g. 30 days, 14 days, 7 days before).
Each reminder includes a unique discount code — created on the first reminder and reused on follow-ups.
Merchants must enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Recipient Name |
| Name of the gift recipient (e.g. "Mom") |
Relationship |
| How they're related (e.g. "Mother", "Friend") |
Occasion Type |
|
|
Occasion Date |
| Date in MM/DD format (e.g. "03/15") |
Occasion Month |
| Month as a number (1-12) |
Occasion Day |
| Day as a number (1-31) |
Days Until Occasion |
| How many days until the occasion |
Reminder Number |
| Which reminder this is (1, 2, or 3) |
Discount Code |
| Unique discount code for this recipient |
Customer Name |
| Customer's first name (or "there" if not set) |
Shop Domain |
| The store's public domain |
Suggested flow setup
In Klaviyo, go to Flows > Create Flow > Create from Scratch
Set the trigger to Metric > Points Expiry Soon
Add a Time Delay if desired (e.g. no delay, or a short delay to batch)
Add an Email action with your expiry reminder template
Use the event properties above as dynamic variables in your email template
Example subject line
{{ event.Customer Name }}, your {{ event.Points Expiring }} points expire in {{ event.Days Until Expiry }} days!
Birthday
Fired when a customer earns birthday points via the birthday earning rule.
This event is OFF by default. Merchants must enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Customer Name |
| Customer's first name (or "Valued Customer" if not set) |
Shop Name |
| Name of the Shopify store |
Points Earned |
| Number of birthday points awarded today |
Current Points |
| Customer's updated total point balance after the award |
Mage Welcome
Fired once when a customer joins the loyalty program. Use this to trigger a welcome email or onboarding flow.
Profile: Customer's email
Property | Tag | Description |
Current Points |
| Customer's point balance when they joined (usually 0, or any signup bonus you've configured) |
Cashback Credited
Fired when a customer earns cashback that is paid out as Shopify store credit.
This event is OFF by default. Merchants must enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Cashback Amount |
| The cashback value as a number (e.g. |
Cashback Amount Formatted |
| The cashback value with its currency symbol (e.g. |
Currency |
| Currency code (e.g. |
Offer Name |
| Name of the cashback offer that awarded this |
Order Number |
| Shopify order number that earned the cashback |
Reward Method |
| Always |
Expires At |
| When the cashback expires, in ISO format. Only present when the offer has an expiry |
Cashback Code Issued
Fired when a customer earns cashback that is issued as a single-use discount code. It also fires when a code is reissued at a lower value after a partial refund, carrying the new code.
This event is OFF by default. Merchants must enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Discount Code |
| The single-use discount code awarded to the customer |
Cashback Amount |
| The cashback value as a number (e.g. |
Cashback Amount Formatted |
| The cashback value with its currency symbol (e.g. |
Currency |
| Currency code (e.g. |
Offer Name |
| Name of the cashback offer that awarded this |
Order Number |
| Shopify order number that earned the cashback |
Reward Method |
| Always |
Expires At |
| When the code expires, in ISO format. Only present when the offer has an expiry |
Wishlist Reminder
Fired when items have been sitting in a customer's wishlist for the reminder delay configured in the Wishlist builder. One event per customer, batching their eligible items, with a cooldown between reminders so customers are not emailed repeatedly.
Enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Customer Name |
| Customer's first name (or "there" if not set) |
Shop Name |
| Your store name |
Shop Domain |
| Your storefront domain |
Items Count |
| Number of items included in this event |
Items |
| Array of products. See the item fields table below |
Each event carries an Items array with one entry per product. Always loop over the array rather than referencing fixed positions, because the number of items varies per customer:
{% for item in event.Items %} ... {{ item.ProductName }} ... {% endfor %}
Inside the loop, each item has the following fields:
Property | Tag | Description |
ProductId |
| Shopify product ID |
ProductName |
| Product title |
ProductPrice |
| Current product price as a number |
ProductQuantity |
| Units currently in stock. Can be empty for untracked inventory |
ProductBrand |
| Product vendor |
ProductCategory |
| Product type from Shopify |
VariantId |
| Shopify variant ID |
VariantInfo |
| Variant options (e.g. "Oat / Medium"). Empty for products without variants, so render it conditionally |
VariantSKU |
| Variant SKU. Can be empty |
ProductURL |
| Link to the product page with this variant preselected |
ImageURL |
| Variant image, falling back to the product's featured image. Can be empty if the product has no images, so guard your image block |
ProductTagsList |
| Product tags as a list |
ProductTags |
| Product tags as one comma separated string. Includes every tag on the product, including internal ones, so avoid rendering it directly |
AddedAt |
| When the customer added the item to their wishlist (ISO date) |
Wishlist Back in Stock
Fired when wishlisted items come back in stock at or above the threshold configured in the Wishlist builder. Batched per customer (up to 6 items per event) with a 24 hour cooldown; extra items roll over to the next event. Stock is rechecked live at send time, so the event never fires for items that sold out again.
Enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Customer Name |
| Customer's first name (or "there" if not set) |
Shop Name |
| Your store name |
Shop Domain |
| Your storefront domain |
Items Count |
| Number of items included in this event |
Items |
| Array of products. See the item fields table below |
Each event carries an Items array with one entry per product. Always loop over the array rather than referencing fixed positions, because the number of items varies per customer:
{% for item in event.Items %} ... {{ item.ProductName }} ... {% endfor %}
Inside the loop, each item has the following fields:
Property | Tag | Description |
ProductId |
| Shopify product ID |
ProductName |
| Product title |
ProductPrice |
| Current product price as a number |
ProductQuantity |
| Live units in stock at send time. Useful for "only X left" copy |
ProductBrand |
| Product vendor |
ProductCategory |
| Product type from Shopify |
VariantId |
| Shopify variant ID |
VariantInfo |
| Variant options (e.g. "Oat / Medium"). Empty for products without variants, so render it conditionally |
VariantSKU |
| Variant SKU. Can be empty |
ProductURL |
| Link to the product page with this variant preselected |
ImageURL |
| Variant image, falling back to the product's featured image. Can be empty if the product has no images, so guard your image block |
ProductTagsList |
| Product tags as a list |
ProductTags |
| Product tags as one comma separated string. Includes every tag on the product, including internal ones, so avoid rendering it directly |
AddedAt |
| When the customer added the item to their wishlist (ISO date) |
Wishlist Price Drop
Fired when wishlisted items drop in price by at least the minimum drop percentage configured in the Wishlist builder. Batched per customer with the biggest drops first (up to 8 items per event) and a 24 hour cooldown. Prices are rechecked live at send time, so the event never fires for a price that has already recovered.
Enable it in Settings > Integrations > Klaviyo before it will fire.
Profile: Customer's email
Property | Tag | Description |
Customer Name |
| Customer's first name (or "there" if not set) |
Shop Name |
| Your store name |
Shop Domain |
| Your storefront domain |
Items Count |
| Number of items included in this event |
Total Items On Sale |
| Total wishlisted items currently on sale for this customer, including items beyond the 8 shown |
Additional Items Count |
| Items on sale but not shown in this event. Use for "and X more on sale!" copy, and wrap it in a conditional because it is often 0 |
Items |
| Array of products on sale. See the item fields table below |
Each event carries an Items array with one entry per product. Always loop over the array rather than referencing fixed positions, because the number of items varies per customer:
{% for item in event.Items %} ... {{ item.ProductName }} ... {% endfor %}
Inside the loop, each item has the following fields:
Property | Tag | Description |
ProductId |
| Shopify product ID |
ProductName |
| Product title |
ProductPrice |
| Current product price as a number |
ProductQuantity |
| Units currently in stock. Can be empty for untracked inventory |
ProductBrand |
| Product vendor |
ProductCategory |
| Product type from Shopify |
VariantId |
| Shopify variant ID |
VariantInfo |
| Variant options (e.g. "Oat / Medium"). Empty for products without variants, so render it conditionally |
VariantSKU |
| Variant SKU. Can be empty |
ProductURL |
| Link to the product page with this variant preselected |
ImageURL |
| Variant image, falling back to the product's featured image. Can be empty if the product has no images, so guard your image block |
ProductTagsList |
| Product tags as a list |
ProductTags |
| Product tags as one comma separated string. Includes every tag on the product, including internal ones, so avoid rendering it directly |
AddedAt |
| When the customer added the item to their wishlist (ISO date) |
OldPrice |
| The tracked price before the drop. Use this for was/now or strikethrough copy |
NewPrice |
| The current sale price (same as ProductPrice) |
DropPercent |
| Drop percentage as a whole number (e.g. 30), always rounded down so it never overstates the discount |
CompareAtPrice |
| Shopify compare at price. Can differ from OldPrice and can be empty, so prefer OldPrice for discount copy |
Klaviyo Customer Properties
In addition to events, Mage syncs the following properties to each Klaviyo profile. These can be used in segments, conditional splits, and email personalization across any flow or campaign.
Points mode
Property | Example Value | Description |
|
| Customer's current spendable points |
|
| Cash value of the customer's current points balance. (Flexible redemption must be enabled) |
|
| Total points ever earned |
|
| Total points spent on rewards |
|
| Current VIP tier (e.g. Bronze, Silver, Gold) |
|
| The next VIP tier the customer has not reached yet. Empty when the customer is already in the highest tier. |
|
| How much more the customer needs in order to reach that next tier. Empty when the customer is already in the highest tier. |
|
| Customer's date of birth, if provided. Sent as a date (YYYY-MM-DD) so it can be used in date based segments and flows. |
|
| When the customer joined the loyalty program, as a date (YYYY-MM-DD). |
|
| Gift reminder recipients the customer has saved. Only synced when your program has a Gift Reminders earning rule. |
|
| When Mage last updated this profile. |
|
| Advanced Setting - Points still needed to unlock the cheapest reward the customer cannot yet afford. Empty when the customer can already redeem every reward. |
|
| Advanced Setting - Name of that next reward. Empty when the customer can already redeem every reward. |
|
| Advanced Setting - Points in the customer's next batch due to expire. Empty when nothing is due to expire. |
|
| Advanced Setting - When that batch expires. Sent as a date so it can be used in date based segments and flows. |
Store credit mode
If your loyalty program runs in store credit mode instead of points, the balance properties are replaced by the store credit set below. The VIP tier, date and gift recipient properties are the same in both modes.
Property | Example Value | Description |
|
| Customer's current store credit balance, formatted in your store currency |
|
| The same balance as a plain number, for filters and calculations |
|
| Total store credit ever earned |
|
| Total store credit spent |
|
| Current VIP tier (e.g. Bronze, Silver, Gold) |
|
| The next VIP tier the customer has not reached yet. Empty when the customer is already in the highest tier. |
|
| How much more the customer needs in order to reach that next tier. Empty when the customer is already in the highest tier.
If VIP tier is spend based, the value is rounded to the nearest major unit, e.g. 380 = $380. |
|
| Customer's date of birth, if provided. Sent as a date (YYYY-MM-DD) so it can be used in date based segments and flows. |
|
| When the customer joined the loyalty program, as a date. |
|
| Gift reminder recipients the customer has saved. Only synced when your program has a Gift Reminders earning rule. |
|
| When Mage last updated this profile. |
|
| Advanced Setting - Store credit in the customer's next batch due to expire, formatted. Empty when nothing is due to expire. |
|
| Advanced Setting - The same amount as above but as a plain number |
|
| Advanced Setting - When that batch expires. Sent as a date so it can be used in date based segments and flows. |
FAQ
Why are points not displaying in my emails?
Klaviyo treats 0 as empty, so any property with a value of 0 will display as a blank space in your email. Adding |default:'0' to a tag tells Klaviyo to display 0 instead of a blank when the value is zero. We've included it on the numeric tags above so they always render a value.
What unit is "Mage Amount to Next VIP Tier" measured in?
Whatever your VIP tiers are based on: points, amount spent, or number of orders. A value of 380 means 380 more points if your tiers are points based, or 380 more in your store currency if they are spend based. If your program uses more than one tier requirement, the amount reflects your primary requirement.
Why are the next tier properties empty for some customers?
Either VIP tiers are not enabled on your loyalty program, or the customer is already in your highest tier. You can use that second case to target your top tier members with a filter such as "Mage Next VIP Tier Name is not set".
