Klaviyo Event Tracking: 7 Steps to Smarter Segmentation & Revenue-Driving Flows
Missing triggers, blunt segments, fuzzy ROI? The root cause is almost always the same: poor Klaviyo event tracking. In Klaviyo, events record real customer actions as a metric with properties on a profile — and that data is what powers precise segmentation, personalised flows, and reliable revenue attribution.
- What a Klaviyo event is and how metrics, properties, and profiles work together
- Standard vs custom events — and when to use each
- 7-step setup: install, identify, name, enrich, send, test, monitor
- Testing and debugging with the Metrics Activity feed
- Scaling best practices for naming, hygiene, deduplication, and governance
- Strategic DTC use cases that turn events into revenue
unique_id on every single event. Test in Analytics → Metrics → Activity feed before enabling any flows. These two habits prevent the most common event tracking failures.
What Is Klaviyo Event Tracking and Why Does It Matter?
In Klaviyo, an event is a customer action you record and use to power segmentation, personalisation, and automation. Every event belongs to a specific metric, includes properties with context, and links to the right customer profile.
This structure lets you trigger flows the moment someone acts, filter audiences by precise behaviour, and attribute revenue back to specific actions with confidence. Clean, well-named metrics and lean properties are the foundation of reliable reporting and higher conversion rates.
Core Components of a Klaviyo Event
A single action taken by a profile at a specific timestamp. Every event has exactly one metric (its type) and links to its profile and metric in the relationships object.
The named type of action — for example, Completed Quiz or Placed Order. When you send an event with a metric name, Klaviyo matches an existing metric or creates a new one automatically.
JSON properties carry context like sku, category, or value. Only top-level, non-object properties are segmentable. Put extra detail in $extra. Max 400 properties per event. Values of 0, null, and empty strings are ignored in segmentation.
A recommended identifier to prevent accidental deduplication. If you omit unique_id, events with the same metric and profile sent simultaneously can be silently dropped. Use UUIDv4.
The customer the event belongs to. Include at least one identifier per event: id, email, phone_number, or external_id. Events sent with @example.com or @test.com emails are silently dropped.
An optional numeric amount — for example, a purchase price. If a metric historically included a value, events missing it will default to 0. Always send value explicitly to keep reporting accurate.
Standard vs Custom Klaviyo Events
Standard e-commerce and on-site events come automatically via your platform integration. Custom events are for brand-specific moments you need to track and act on via the API.
- Checkout Started
- Placed Order
- Ordered Product
- Fulfilled Order
- Cancelled Order
- Refunded Order
- Viewed Product (default)
- Active on Site (default)
- Added to Cart (toggle on)
- Viewed Collection (toggle on)
- Submitted Search (toggle on)
- Loyalty Points Redeemed
- Wishlist Added
- Quiz Completed
- Back in Stock Clicked
- Pre-Order Reserved
- Subscription Paused
7-Step Klaviyo Event Tracking Setup Guide
Install Tracking on Your Platform
Connect your platform (e.g. Shopify). Enable the app embed so Viewed Product and Active on Site fire automatically, then switch on Track behavioral events for Added to Cart, Viewed Collection, and Submitted Search.
Identify the User on Every Event
Send at least one profile identifier with every event. Without an identifier, Klaviyo cannot link the event to a profile — and the event is effectively lost.
"profile": {
"data": {
"type": "profile",
"attributes": {
"email": "sarah@example.com",
"external_id": "cust_12345"
}
}
}
Name the Metric Clearly
Use action-first names you will immediately recognise in segments and flow triggers. Klaviyo creates a new metric every time you use a new name — so inconsistent naming creates duplicate metrics that pollute your dashboard.
- ✓
Completed Quiz,Redeemed Reward,Back In Stock Clicked - ✗
quiz,reward event,bisc - Keep casing consistent —
Completed Quizandcompleted quizcreate two different metrics - If your schema changes, create a new name like
Completed Quiz v2to protect existing flows
Add Only the Properties You’ll Actually Use
Include only top-level, non-object properties you will segment or filter on. Keep payloads lean — max 400 properties per event. Store extra, non-segmentable context in $extra.
"properties": {
"category": "Skincare",
"value": 45.00,
"sku": "SK-001",
"quiz_result": "hydration",
"$extra": {
"session_id": "abc123",
"referrer": "email_campaign"
}
}
Send the Event via the Right Endpoint
The endpoint you use depends on where the code runs. Using the wrong one exposes your private API key or causes events to be rejected.
- Server-side: Create Event or Bulk Create Events — use private or OAuth credentials
- Browser/client-side: Bulk Create Client Events — use your public API key only
- Never expose a private API key in browser code — it gives full account access to anyone who inspects the page
Test in Klaviyo’s Activity Feed
Open Analytics → Metrics, find your metric, and click into the Activity feed to confirm events are arriving with the correct properties, profile associations, and timestamps.
Create Metric-Triggered Flows and Enable Monitoring
Create a metric-triggered flow and add trigger filters as needed. Then enable metric anomaly monitoring for your most critical metrics — checkout, purchase, renewals — so unusual drops trigger alerts before flows silently underperform.
Strategic DTC Use Cases for Klaviyo Event Tracking
These are the highest-ROI event tracking setups for DTC brands — each one turns a customer signal into a targeted, timely flow.
Subscribed to Back in Stock metric to queue shoppers, then trigger email or SMS when inventory returns. Pull product properties like sku and product_name into the message for relevance.Completed Quiz custom event with a top-level property like quiz_result = hydration. Branch your welcome flow by result to serve personalised product recommendations and content.Wishlist Added event via the API, then follow up with a back-in-stock or price-drop reminder when inventory or pricing changes for that specific product.Viewed Collection to power category-specific browse abandonment and social proof campaigns targeted by product category interest.Testing & Debugging Klaviyo Event Tracking
Validate your tracking before you launch any automations. Use Klaviyo’s built-in views to check payloads, identifiers, and timing — then preview messages that depend on those events.
Your Testing Toolkit
- Activity feed: Go to Analytics → Metrics → Activity feed to confirm events are arriving, inspect properties, and see the linked profile and timestamp — the fastest way to spot mapping issues
- Preview & Test: From any flow message, open Preview & Test, choose a profile and the triggering event, and confirm dynamic content resolves from event properties correctly
- API spot checks: Query Get Events and Get Event Relationships to verify the metric and profile associations and event timestamps
- Client vs server sends: Browser code must call Bulk Create Client Events with a public key. Server code must use Create Event or Bulk Create Events with private or OAuth credentials
Common Issues & Fixes
| Issue | Likely Cause | Fix | Where to Verify |
|---|---|---|---|
| Events not appearing in Klaviyo | No profile identifier included | Add email, phone_number, id, or external_id to every event payload | Analytics → Metrics → Activity feed |
| Duplicate events being created | Missing unique_id field | Generate and include a UUIDv4 as unique_id on every event send | Activity feed — duplicate timestamps |
| Events dropped silently | Test email domain used (@example.com, @test.com) | Use a real email address for development testing | API response — no error thrown but event missing |
| Flow not triggering on event | Metric name mismatch or trigger filter too restrictive | Confirm metric name matches exactly; check trigger filters in flow settings | Flow → Trigger setup → Metric name |
| On-site events not firing | App embed not enabled or tracking toggle off | Enable app embed in Shopify → Klaviyo integration; toggle on behavioural events | Shopify integration settings |
| Private key exposed in browser | Wrong endpoint used client-side | Switch to Bulk Create Client Events with public API key only | Network inspector — check request headers |
| Properties not segmentable | Property stored as nested object instead of top-level | Flatten properties to top-level; move nested data into $extra | Segment builder — property not appearing in dropdown |
Best Practices for Scalable Klaviyo Event Tracking
Use action-first metric names with consistent casing and tense — Completed Quiz, Redeemed Reward. Klaviyo creates a new metric every time you use a new name, so labels must stay consistent across your codebase.
Send only top-level, non-object properties you’ll segment or analyse — for example category, value, sku. Max 400 properties per event. Put extra, non-segmentable detail in $extra. Values of 0, null, and empty strings are ignored in segmentation.
Include a stable unique_id (UUIDv4) and the correct time field, especially for backfills. Events with the same metric and profile sent simultaneously without unique_id can be silently dropped as duplicates.
Maintain a shared metric catalogue with owner, purpose, and schema for each event. If your schema changes, create a new metric name (e.g. Completed Quiz v2) so existing flows and reports remain valid and unaffected.
Enable metric anomaly monitoring for checkout, purchase, and renewal metrics so unusual volume drops trigger alerts before flows silently underperform for days without you noticing.
Set a consistent Conversion metric across campaign and flow reports. Confirm message attribution windows are aligned so revenue from event-triggered flows rolls up cleanly to the right source.
Lifecycle Segmentation from Klaviyo Event Data
Once events are flowing correctly, use them to build precision segments that power smarter lifecycle automations:
- Win-back from inactivity: Has not done
Placed Orderin 90 days - Churn prevention: Fewer site or message events than usual in a rolling 30-day period
- Replenishment: Delay from
Placed Orderby expected usage interval; branch by product category or quantity purchased - Category affinity: Has done
Viewed Collectionwherecategory = Footwearat least 3 times in the last 14 days - Quiz personalisation: Has done
Completed Quizwherequiz_result = hydration
category, price_band, or quiz_result. This approach keeps segments dynamic and self-updating.
Frequently Asked Questions About Klaviyo Event Tracking
Key Takeaways
- Identify every event: Include a profile identifier and a
unique_idon every event to keep data clean and prevent duplicates. - Send lean properties: Use only top-level fields you’ll segment on — store extras in
$extra. Max 400 properties per event. - Use the right endpoints: Server uses Create Event or Bulk Create Events; browser uses Bulk Create Client Events with public key only.
- Test before launch: Validate payloads in Analytics → Metrics → Activity feed to catch mapping issues before flows go live.
- Name metrics clearly: Action-first, consistent casing — Klaviyo creates a new metric for every unique name, so consistency is critical.
- Segment with intent: Build frequency + recency rules first, then add property filters for precision targeting.
- Measure correctly: Set a Conversion metric and confirm attribution windows for reliable, trustworthy ROI reporting.