Klaviyo
Sends server-side events to Klaviyo’s Create Event API with Klaviyo’s recommended ecommerce metric names and properties, so flows such as browse abandonment, abandoned cart and post-purchase run from server data.
Why route Klaviyo through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Klaviyo even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- Delivery is batched, rate-limited, and retried. Signal buffers to Kafka, respects the Klaviyo rate limit, and retries on 429 or transient failure rather than dropping the event.
- One consent decision governs every destination. Klaviyo is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Create a private API key
In Klaviyo, Settings > API keys > Create Private API Key, with the events:write scope. Copy it; it is shown once.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
private_api_key | secret | Yes | A Klaviyo private API key (Settings > API keys) with the events:write scope. Sent as Authorization: Klaviyo-API-Key <key>. |
Signal Setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Klaviyo, click Install and fill in the fields above.
- Pick the preset for your vertical, then review the mappings in the blueprint editor.
curl -X POST http://localhost:8084/v1/admin/integration-catalog/klaviyo/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Klaviyo",
"config": {
"private_api_key": "pk_..."
},
"delivery_mode": "server_side"
}'API endpoint
POST https://a.klaviyo.com/api/events
Authorization: Klaviyo-API-Key {private_api_key}
revision: 2026-07-15Example body:
{"data": {"type": "event", "attributes": {
"metric": {"data": {"type": "metric", "attributes": {"name": "Placed Order"}}},
"profile": {"data": {"type": "profile", "attributes": {"email": "jane.doe@example.com", "phone_number": "+447700900123", "external_id": "user-123"}}},
"properties": {"OrderId": "T-1001", "ItemNames": ["Running Shoes"], "Items": [{"ProductID": "SKU_1", "ProductName": "Running Shoes", "Quantity": 1, "ItemPrice": 120}]},
"time": "2026-09-22T10:00:00.000Z", "value": 120, "value_currency": "GBP", "unique_id": "T-1001"}}}The presets turn on the strict output contract: only the fields the blueprint maps are sent.
Event mapping
Retail preset (ecommerce)
Klaviyo’s recommended ecommerce metrics for flows: Viewed Product (browse abandonment), Added to Cart, Started Checkout (abandoned cart), Placed Order (order ID as unique_id), Fulfilled Order, Refunded Order, Searched Site, Added to Wishlist, Created Account and Submitted Form, with Klaviyo’s property names and the Items array. The profile is identified by email (trimmed, lowercased), which Klaviyo needs in plain text to send to it; phone_number (E.164, plain text for SMS) and external_id (Signal user_id) are added when known. Events without an email are not sent.
| Signal event | Sent to the vendor as |
|---|---|
view_item | Viewed Product |
add_to_cart | Added to Cart |
begin_checkout | Started Checkout |
purchase | Placed Order |
sign_up | Created Account |
generate_lead | Submitted Form |
order_shipped | Fulfilled Order |
refund | Refunded Order |
search | Searched Site |
add_to_wishlist | Added to Wishlist |
Default preset (default)
Core Klaviyo metrics: Viewed Product, Added to Cart, Started Checkout, Placed Order, Created Account and Submitted Form, with Klaviyo’s property names. The profile is identified by email (trimmed, lowercased), which Klaviyo needs in plain text to send to it; phone_number (E.164, plain text for SMS) and external_id (Signal user_id) are added when known. Events without an email are not sent.
| Signal event | Sent to the vendor as |
|---|---|
view_item | Viewed Product |
add_to_cart | Added to Cart |
begin_checkout | Started Checkout |
purchase | Placed Order |
sign_up | Created Account |
generate_lead | Submitted Form |
Identity and personal data
The profile is identified by email (trimmed, lowercased), with phone_number (shaped to E.164) and external_id (the Signal user_id) when known. Email and phone are sent in plain text: Klaviyo sends email and SMS to them. Events without an email are not sent. Order events use the order ID as unique_id, so a retry never double-counts revenue.
Consent
Klaviyo events should be sent under the marketing consent category. Klaviyo also manages its own subscription consent records per channel (email, SMS) — Signal forwards the visitor’s CMP consent state on every event so flows can suppress messaging where appropriate.
Known limitations
- Klaviyo’s per-line-item Ordered Product metric needs one event per item, which one Signal event cannot produce.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
400 | Missing profile identifier or malformed body. |
401 / 403 | Private key wrong or missing events:write. |