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

FieldTypeRequiredDescription
private_api_keysecretYesA Klaviyo private API key (Settings > API keys) with the events:write scope. Sent as Authorization: Klaviyo-API-Key <key>.

Signal Setup

  1. Navigate to Integrations in the sidebar and open the Integration Library tab.
  2. Find Klaviyo, click Install and fill in the fields above.
  3. 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-15

Example 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 eventSent to the vendor as
view_itemViewed Product
add_to_cartAdded to Cart
begin_checkoutStarted Checkout
purchasePlaced Order
sign_upCreated Account
generate_leadSubmitted Form
order_shippedFulfilled Order
refundRefunded Order
searchSearched Site
add_to_wishlistAdded 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 eventSent to the vendor as
view_itemViewed Product
add_to_cartAdded to Cart
begin_checkoutStarted Checkout
purchasePlaced Order
sign_upCreated Account
generate_leadSubmitted 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.

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

SymptomCause and fix
400Missing profile identifier or malformed body.
401 / 403Private key wrong or missing events:write.

See also

  • Iterable — cross-channel marketing alternative
  • Braze — multi-channel engagement alternative
  • Attentive — SMS-focused alternative