Omnisend
Ecommerce-focused email and SMS marketing platform with automation workflows, segmentation, and product-aware campaigns.
Datafly Signal delivers events to Omnisend’s Customer Events API server-side, with no client-side pixel. Each event triggers Omnisend custom-event automations (welcome series, abandoned cart, back-in-stock, post-purchase) and is recorded on the contact’s timeline.
Why route Omnisend through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Omnisend even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- One consent decision governs every destination. Omnisend is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Complete these steps in Omnisend before configuring Signal.
Access your Omnisend account
Log in to the Omnisend dashboard at omnisend.com. API access is available on all plans.
Create an API key
Go to Store Settings > API keys and click Create API key. Give it a name (e.g. “Datafly Signal”) and grant at least the Events (write) permission. Copy the key immediately — Omnisend shows it only once.
API keys are case-sensitive. Copy and paste the key exactly as shown.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
api_key | secret | Yes | Your Omnisend API key with Events write permission. Sent as the Authorization: Omnisend-API-Key <key> header on every request. |
Configure in Signal
Quick Setup
- Navigate to Integrations in the sidebar.
- Open the Integration Library tab.
- Find Omnisend under the Marketing Automation category.
- Click Install and paste your API key.
- Click Install Integration to create the integration with the ready-to-use default configuration.
API Setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/omnisend/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Omnisend",
"variant": "default",
"config": {
"api_key": "AjWvksZpTG4JZBdc4xxxxxxxx"
},
"delivery_mode": "server_side"
}'API Endpoint
All events are sent to:
POST https://api.omnisend.com/api/events
Authorization: Omnisend-API-Key {api_key}
Omnisend-Version: 2026-03-15
Content-Type: application/jsonOmnisend returns a success status on accepted events. A 400 indicates a malformed body or a missing contact identifier; 401/403 indicate a bad or under-scoped API key.
Identity Signals
Server-side Omnisend recommended events over the Events API (POST /api/events): added product to cart, started checkout, placed order, order refunded and order fulfilled, with lineItems[], totals and eventID/eventTime de-duplication, for cart abandonment, order confirmation and follow-up automations. The contact is keyed by email (plain text, trimmed and lowercased, because Omnisend keys the contact on it) or phone (E.164); events with neither are not sent.
| Field | Source | Notes |
|---|---|---|
contact.email | traits.email | Plain text, trimmed and lowercased: Omnisend keys the contact on it. |
contact.phone | traits.phone | E.164. |
contact.firstName / lastName | traits.first_name / last_name | Optional contact attributes. |
Consent
Omnisend events are sent under the marketing consent category. Omnisend records opt-ins and opt-outs on the contact (contact.optIns / optOuts), which Signal does not set: subscription status is managed by Omnisend’s own forms and preference centre.
Event Mapping
Blueprint 0.4.1, reviewed against the vendor’s documentation on 2026-09-23. Each preset maps the events below; every other event is dropped. Events use the canonical names from the event specs (transaction_id, value, items[], search_term); the legacy order_id, revenue and flat product fields are still read as a fallback.
Retail / E-commerce (ecommerce)
Omnisend recommended events over the Events API (POST /api/events, Omnisend-Version 2026-03-15): added product to cart and started checkout (cart and checkout abandonment), placed order, order refunded and order fulfilled (eventVersion v2), with lineItems[], order totals, the currency upper-cased and eventID/eventTime for de-duplication. Adds a signed up custom event for sign-up automations. Omnisend creates or updates the contact from contact.email (sent in plain text, trimmed and lowercased, because Omnisend keys the contact on it) or contact.phone (E.164); events with neither are not sent. viewed product is only accepted through Omnisend’s JavaScript snippet, so it is not sent server-side.
| Datafly event | Vendor event / call | Fields |
|---|---|---|
add_to_cart | added product to cart | cartID, abandonedCheckoutURL, value, currency, lineItems[].productID, lineItems[].productTitle, lineItems[].productPrice, lineItems[].productQuantity … |
begin_checkout | started checkout | cartID, abandonedCheckoutURL, value, currency, lineItems[].productID, lineItems[].productTitle, lineItems[].productPrice, lineItems[].productQuantity … |
purchase | placed order | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
refund | order refunded | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
order_shipped | order fulfilled | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
sign_up | signed up | method |
Default (default)
Omnisend recommended events over the Events API (POST /api/events, Omnisend-Version 2026-03-15): added product to cart and started checkout (cart and checkout abandonment), placed order, order refunded and order fulfilled (eventVersion v2), with lineItems[], order totals, the currency upper-cased and eventID/eventTime for de-duplication. Omnisend creates or updates the contact from contact.email (sent in plain text, trimmed and lowercased, because Omnisend keys the contact on it) or contact.phone (E.164); events with neither are not sent. viewed product is only accepted through Omnisend’s JavaScript snippet, so it is not sent server-side.
| Datafly event | Vendor event / call | Fields |
|---|---|---|
add_to_cart | added product to cart | cartID, abandonedCheckoutURL, value, currency, lineItems[].productID, lineItems[].productTitle, lineItems[].productPrice, lineItems[].productQuantity … |
begin_checkout | started checkout | cartID, abandonedCheckoutURL, value, currency, lineItems[].productID, lineItems[].productTitle, lineItems[].productPrice, lineItems[].productQuantity … |
purchase | placed order | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
refund | order refunded | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
order_shipped | order fulfilled | eventVersion, orderID, totalPrice, currency, createdAt, totalTax, shippingPrice, discounts[].code … |
An identified purchase (preset ecommerce) is delivered as:
POST https://api.omnisend.com/api/events{
"contact": {
"email": "jane.doe@example.com",
"firstName": "Jane",
"lastName": "Doe",
"phone": "+447700900123"
},
"eventID": "3f2b8c1e-9d4a-4e7b-8f6a-2c1d0e9b7a65",
"eventName": "placed order",
"eventTime": "2025-09-23T04:00:00Z",
"eventVersion": "v2",
"origin": "api",
"properties": {
"createdAt": "2025-09-23T04:00:00Z",
"currency": "GBP",
"discounts": [
{
"code": "SUMMER"
}
],
"lineItems": [
{
"productID": "SKU_1",
"productPrice": 120,
"productQuantity": 2,
"productTitle": "Helmet",
"productVariantID": "M",
"productVendor": "Shoei"
},
{
"productID": "SKU_2",
"productPrice": 199.99,
"productQuantity": 1,
"productTitle": "Gloves",
"productVariantID": "L",
"productVendor": "Alpinestars"
}
],
"orderID": "T-1001",
"shippingPrice": 4.99,
"totalPrice": 439.99,
"totalTax": 73.33
}
}Testing
- After installing the integration, trigger a test event from your website or via the Signal event API. Make sure the visitor is identified (has an email or phone).
- In Omnisend, open Audience > Contacts and search for the test contact by email.
- Open the contact and check the activity timeline for the delivered event.
- In Signal, check Live Events to confirm delivery with a success status.
Troubleshooting
| Symptom | Possible Cause | Resolution |
|---|---|---|
401 / 403 | Invalid or under-scoped API key | Regenerate the key in Store Settings > API keys and grant Events (write). |
400 Bad Request | Missing contact identifier | Omnisend requires email or phone on every event. Call datafly.identify() before tracking. |
| Event not in automation dropdown | Event never triggered | Custom events appear only after the first successful trigger. Send a test event, then build the flow. |
| Property type error | Inconsistent property types | Re-triggering an event with a different type for the same property key errors. Keep property types stable across events. |
See the Omnisend API documentation for full reference and custom-event details.
See also
- Klaviyo — ecommerce email/SMS alternative
- Mailchimp — email marketing alternative
- Customer.io — event-driven messaging alternative