Klaviyo
Integrate Klaviyo with VRIO for automated email and SMS marketing with real-time customer data sync and comprehensive event tracking.
Klaviyo is a powerful email and SMS marketing platform that combines customer data with intelligent automation to drive personalized marketing campaigns.
Vrio integrates with Klaviyo to automatically sync customer profiles and send real-time event data. This integration ensures all your customer interactions and transaction data are available in Klaviyo for your marketing campaigns.
Getting Started
What You'll Need
- Active Klaviyo account
- Private API Key with Read/Write access for Events, Lists, and Profiles
- Public API Key (optional, for JavaScript tracking)
To get your API keys:
- Log into Klaviyo
- Navigate to Account page
- Select "API Keys"
- Create a Private API Key with proper permissions
Quick Setup Guide
-
Add the Connection
- Go to Settings > Connections > Add New Connection
- Find Klaviyo under the "Marketing" category
- Click "Connect Now"

-
Enter Your Credentials
- Connection Name: Something descriptive like "Klaviyo Production"
- Private API Key: Your Klaviyo private key (required)
- Push Events: ✓ Check to send customer and order events

-
Select Campaigns (Optional)
- Choose specific campaigns to sync
- Leave empty to sync all campaigns
- Useful for testing or segmented operations
-
Save and Activate
- Click "Save" to complete setup
- Vrio immediately starts syncing data
How Vrio + Klaviyo Works Together
The Data Flow
When key events happen in Vrio, we automatically send that data to Klaviyo for you to use in your marketing campaigns:
- Customer places order → Vrio creates/updates customer profile in Klaviyo
- Transaction completes → Vrio sends order details and products purchased
- Order ships → Vrio sends fulfillment event with tracking info
- Cart abandoned → Vrio sends abandoned order event with cart contents
- Subscription changes → Vrio updates subscription status and details
What Data Does Vrio Send to Klaviyo?
When events happen in Vrio, we send data to Klaviyo in two parts: Profile data (always included) and Event-specific properties.
Profile Data (Sent with Every Event)
Vrio always sends customer profile information:
"profile": {
"data": {
"type": "profile",
"attributes": {
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"properties": {
"CLV": "150.00",
"NextChargeDate": "2025-09-15",
"$phone_number": "+15551234567"
}
}
}
}Event Types and Properties
Automatic Event Timestamps
Every event sent to Klaviyo automatically includes two additional properties that can be used as merge tags in your email content:
- EventDate: The date the event occurred (format:
YYYY-MM-DD) - EventTime: The time the event occurred (format:
HH:MM:SS)
These fields are automatically added to all events that have a timestamp, making it easy to personalize emails with order dates and times.
Customer Created
When Vrio creates a new customer (Customer Created event), we create or update their profile in Klaviyo. No event is triggered, only profile data is sent.
Abandoned Order
When Vrio detects an abandoned cart (Order Abandoned event), we send an Abandoned Order event to Klaviyo with full cart contents (same structure as placed orders).
Placed Order / Placed Non-Recurring Order
When a sale or capture transaction completes successfully in Vrio (Transaction Completed event), we send either Placed Order (for all subscription orders, both new and recurring) or Placed Non-Recurring Order (for one-time purchases). The Cycle field indicates whether it's a new subscription (Cycle: 1) or a recurring charge (Cycle: 2, 3, etc.) with these properties:
"properties": {
"OrderId": "1253",
"TransactionId": "1668",
"SaleId": "1234",
"Cycle": "1",
"Attempt": "1",
"MerchantId": "5",
"CardLastFour": "4242",
"Categories": ["Supplements"],
"ItemNames": ["Monthly Vitamins"],
"DiscountCode": "SAVE10",
"DiscountValue": "5.00",
"Items": [
{
"OfferName": "Monthly Vitamins",
"OfferId": "1",
"ItemId": "2",
"ItemName": "Vitamin D3",
"SKU": "VIT-D3",
"Quantity": "1",
"ItemPrice": "29.99",
"RowTotal": "29.99",
"Categories": ["Supplements"]
}
],
"BillingAddress": { /* address details */ },
"ShippingAddress": { /* address details */ },
"TransactionDateComplete": "2025-08-30",
"TransactionPrice": "29.99",
"TransactionShipping": "5.00",
"TransactionSubTotal": "29.99",
"TransactionTax": "2.40",
"TransactionDiscountTotal": "5.00",
"TransactionTotal": "32.39",
"TransactionTotalDue": "32.39"
}Declined Order
When a transaction is declined in Vrio (Transaction Completed event for declined type), we send a Declined Order event with all attempted order data including customer information, items, and decline details:
"properties": {
"OrderId": "1254",
"TransactionId": "1670",
"SaleId": "1235",
"Cycle": "1",
"Attempt": "1",
"MerchantId": "5",
"CardLastFour": "4242",
"Categories": ["Supplements"],
"ItemNames": ["Monthly Vitamins"],
"DiscountCode": "SAVE10",
"DiscountValue": "5.00",
"Items": [
{
"OfferName": "Monthly Vitamins",
"OfferId": "1",
"ItemId": "2",
"ItemName": "Vitamin D3",
"SKU": "VIT-D3",
"Quantity": "1",
"ItemPrice": "29.99",
"RowTotal": "29.99",
"Categories": ["Supplements"]
}
],
"BillingAddress": { /* address details */ },
"ShippingAddress": { /* address details */ },
"TransactionDateComplete": "2025-08-30",
"TransactionPrice": "29.99",
"TransactionShipping": "5.00",
"TransactionSubTotal": "29.99",
"TransactionTax": "2.40",
"TransactionDiscountTotal": "5.00",
"TransactionTotal": "32.39",
"TransactionTotalDue": "32.39"
}Fulfilled Order
When Vrio ships an order (Shipment Shipped event), we send a Fulfilled Order event with all original order data plus shipping details:
"properties": {
/* All order properties, plus: */
"ShipDate": "2025-08-30",
"CarrierName": "UPS",
"TrackingNumber": "1Z123456789"
}Shipment RMA
When a shipment is marked as RMA (Return Merchandise Authorization) in Vrio (Shipment RMA event), we send a Shipment RMA event with all original order data plus RMA details:
"properties": {
/* All order properties, plus: */
"RMADate": "2025-08-30",
"RMA": "RMA123456"
}Refunded Order
When a refund transaction completes in Vrio (Transaction Completed event for refund type), we send a Refunded Order event showing what was refunded:
"properties": {
"OrderId": "1253",
"TransactionId": "1669",
"SaleId": "1234",
"Cycle": "2",
"Attempt": "1",
"MerchantId": "5",
"CardLastFour": "4242",
"Categories": ["Supplements"],
"ItemNames": ["Monthly Vitamins"],
"DiscountCode": "SAVE10",
"DiscountValue": "5.00",
"Items": [
{
"OfferName": "Monthly Vitamins",
"OfferId": "1",
"ItemId": "2",
"ItemName": "Vitamin D3",
"SKU": "VIT-D3",
"Quantity": "1",
"ItemPrice": "29.99",
"RowTotal": "29.99",
"Categories": ["Supplements"]
}
],
"BillingAddress": { /* address details */ },
"ShippingAddress": { /* address details */ },
"RefundAmount": "29.99",
"RefundDate": "2025-08-30",
"RefundedTransactionId": "1668"
}Note: Item arrays show specifically refunded items, plus refund-specific details
Voided Order
When a void transaction completes in Vrio (Transaction Completed event for void type), we send a Voided Order event with the same refund-specific fields (RefundAmount, RefundDate, RefundedTransactionId).
Order Chargeback
When a chargeback transaction is recorded in Vrio (Transaction Completed event for chargeback type), we send an Order Chargeback event with full transaction details.
Order Alert
When a fraud alert transaction is recorded in Vrio (Transaction Completed event for alert type), we send an Order Alert event with full transaction details.
Order Auth
When an authorization transaction completes in Vrio (Transaction Completed event for auth type), we send an Order Auth event with full transaction details.
Started Subscription
When a new subscription begins in Vrio (Transaction Completed event, first cycle), we send a Started Subscription event for each subscription item:
"properties": {
"$event_id": "1668_1_sub",
"$value": "29.99",
"ItemNames": ["Monthly Vitamins"],
"OrderIntervalUnit": "days",
"OrderIntervalFrequency": "30",
"DiscountCode": "SAVE10",
"DiscountValue": "5.00",
"Items": [
{
"OfferName": "Monthly Vitamins",
"OfferId": "1",
"ItemId": "2",
"ItemName": "Vitamin D3",
"SKU": "VIT-D3"
}
]
}Cancelled Subscription
When an order offer is cancelled in Vrio (Order Offer Cancelled event), we send a Cancelled Subscription event with the cancellation reason and subscription details.
Subscription Status Changes
When an order offer is updated in Vrio (Order Offer Updated event), we send the appropriate event:
Paused Subscription- when subscription is pausedUnpaused Subscription- when subscription is resumedReactivated Subscription- when cancelled subscription is reactivated
Ordered Product
For each item in a completed transaction (triggered by Transaction Completed event in Vrio), we send an individual Ordered Product event:
"properties": {
"$event_id": "1668_1",
"$value": "29.99",
"OfferId": "1",
"OfferName": "Monthly Vitamins",
"ItemId": "2",
"ItemName": "Vitamin D3",
"SKU": "VIT-D3",
"Quantity": "1",
"ProductCategories": ["Supplements"]
}Customer Profile Data
Every customer in Vrio automatically syncs to Klaviyo with:
- Email: Primary identifier
- First Name & Last Name: For personalization
- Phone Number: Automatically formatted with country codes (+1 for US/CA)
- CLV: Customer lifetime value
- Next Charge Date: Next subscription renewal date
- ActiveSubscriber: True/false based on subscription status
- Custom Properties: All tracking fields (tracking1-20) from orders
Technical Details
Smart Deduplication
Vrio uses unique event IDs to prevent duplicate events:
- Transaction events:
transaction_id - Product events:
transaction_id_product_id - Subscription events:
transaction_id_product_id_sub
This ensures Klaviyo metrics stay accurate even if events are replayed.
Phone Number Formatting
Vrio automatically handles phone number formatting to ensure compatibility with Klaviyo's requirements:
- US and Canada: Phone numbers are automatically formatted with +1 country code
- International: Phone numbers are passed as-is from your order data
- SMS Compliance: Properly formatted numbers enable Klaviyo's SMS features
- Profile Field: Phone numbers are sent in the
$phone_numberprofile property
Example formatting:
- Input:
(555) 123-4567→ Output:+15551234567 - Input:
555.123.4567→ Output:+15551234567 - Input:
+44 20 7946 0958→ Output:+442079460958
Validation & Retry Logic:
If Klaviyo rejects a phone number due to validation errors, Vrio automatically:
- Removes the phone number from the profile data
- Immediately retries the event without the phone number
- Ensures your event data is captured even if phone validation fails
This automatic retry mechanism ensures your customer data and events are never lost due to phone number formatting issues, while still attempting to provide phone numbers when they're valid.
Where to See Results
Customer Profile and Event Timeline in Klaviyo
All Vrio customer data appears in Klaviyo profiles:
Vrio Webhooks Tab
On the customer screen, see exactly what was sent to Klaviyo:
Troubleshooting Common Issues
🔴 Events Not Appearing in Klaviyo
Check These:
- "Push Events" is enabled in connection settings
- Private API Key has proper permissions (Events, Lists, Profiles)
- Connection is marked "Active"
- Customer has valid email address
- Campaign filtering isn't excluding the customer
🔴 "Invalid API Key" Errors
The Problem: Can't connect to Klaviyo
The Fix:
- Verify Private API Key is copied correctly from Klaviyo
- Check key has Read/Write access for required scopes
- Ensure you're not using Public key in Private key field
🏥 Need Help?
Check connection logs in Vrio:
- Go to the customer screen
- Click the "Webhooks" tab to see Klaviyo API calls
- Look for error messages in responses
- Each request shows exact data sent and received
For API key issues, check your Klaviyo account settings or contact Klaviyo support.
Updated 6 days ago
