Omnisend · AsyncAPI Specification

Omnisend Webhooks

Version

View Spec View on GitHub Email MarketingMarketing AutomationE-CommerceSMS MarketingCustomer EngagementSegmentationCampaignsFormsPopupsWeb PushAutomation WorkflowsAnalyticsMCPAgent ReadyTransactional MessagingAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: >-
  https://api-docs.omnisend.com/docs/how-to-send-webhooks-from-automations,
  https://api-docs.omnisend.com/reference/events-overview,
  https://api-docs.omnisend.com/reference/event-tracking,
  https://api-docs.omnisend.com/llms.txt,
  and openapi/omnisend-automations-api-openapi.yml
asyncapi_published: false
description: >-
  Omnisend has a real, two-directional event surface but publishes NO AsyncAPI document for it.
  Inbound, customer events are POSTed to /events (and declared through the Event Metadata API).
  Outbound, Omnisend does not offer a subscribable webhook registry at all — instead a webhook is a
  BLOCK inside an automation workflow: you create an automation whose trigger is an event and whose
  action is `sendWebhook`, and Omnisend POSTs your payload to your callbackUrl when a contact
  reaches that block. The consequence is that the outbound event catalog is not a fixed list an
  integrator can subscribe to; it is whatever set of trigger events the integrator wires up.

outbound:
  model: automation-action webhook (no subscription registry)
  configured_via:
    api: POST https://api.omnisend.com/api/automations
    spec: openapi/omnisend-automations-api-openapi.yml
    block_type: action
    action_type: sendWebhook
  scope_required: automations.write
  plan_required: paid — webhooks in automations are not available on the free plan
  transport:
    method: POST
    url_field: callbackUrl
    constraints:
      - callbackUrl must be HTTPS
      - IP literals rejected
      - non-443 ports rejected
      - non-FQDN hosts rejected
      - internal/private IP addresses rejected
    custom_headers: 'headers[] of {key, value} — the documented example uses X-Webhook-Secret as a shared secret'
    body: >-
      Caller-authored JSON string. Supports personalization tags — [[contact.email]],
      [[contact.first_name]], [[event.raw.<property>]].
  security:
    signature: false
    note: >-
      Omnisend does NOT sign outbound webhooks. There is no HMAC signature header, no timestamp and
      no published verification procedure. The only integrity mechanism offered is a static shared
      secret the integrator puts in a custom header. There is also no documented retry or delivery
      guarantee for a failed callback.
  trigger_events_documented:
    - subscribed to marketing
    - added product to cart
    - started checkout
    - placed order
    - paid for order
    - ordered product
    - order refunded
    - order fulfilled
    - order canceled
    - viewed product
    - viewed page
    - opened message
    - clicked message
    - marked message as spam
  note: >-
    Some trigger events (for example "placed order") require an `origin` naming the source platform,
    because the same event name can exist under several origins.

inbound:
  model: customer event ingest
  endpoint: POST https://api.omnisend.com/api/events
  spec: openapi/omnisend-events-api-openapi.yml
  scope_required: events.write
  rate_limit: 400 requests/minute
  browser_transport:
    snippet: https://omnisnippet1.com/inshop/launcher-v2.js
    api: 'omnisend.push(["track", "<eventName>", {...}])'
    docs: https://api-docs.omnisend.com/reference/javascript-snippet
  custom_events:
    declare: POST https://api.omnisend.com/api/event-metadata
    update: PUT https://api.omnisend.com/api/event-metadata
    query: POST https://api.omnisend.com/api/event-metadata/query
    spec: openapi/omnisend-event-metadata-api-openapi.yml
    note: >-
      A brand-custom event is identified by name + origin and must be declared (with at least one
      top-level property) before its properties can be used in segment filters.
  warning: >-
    Omnisend's own docs warn that importing a batch of historic events can fire live automations and
    send duplicate messages to real customers. Combined with the absence of any idempotency key,
    replaying event ingest is unsafe.

event_reference_pages:
  - https://api-docs.omnisend.com/reference/events-overview
  - https://api-docs.omnisend.com/reference/added-product-to-cart
  - https://api-docs.omnisend.com/reference/started-checkout
  - https://api-docs.omnisend.com/reference/placed-order
  - https://api-docs.omnisend.com/reference/paid-for-order
  - https://api-docs.omnisend.com/reference/ordered-product
  - https://api-docs.omnisend.com/reference/order-refunded
  - https://api-docs.omnisend.com/reference/order-fulfilled
  - https://api-docs.omnisend.com/reference/order-cancelled
  - https://api-docs.omnisend.com/reference/viewed-product
  - https://api-docs.omnisend.com/reference/omnisend-forms-events
  - https://api-docs.omnisend.com/docs/segments-events-properties

gaps:
  - No AsyncAPI document. Probed /asyncapi.yaml and /asyncapi.json on api.omnisend.com and api-docs.omnisend.com — no spec.
  - No webhook subscription API — an integrator cannot list, create or delete a webhook endpoint as a first-class resource.
  - No webhook signing or verification. A shared header secret is the only offered mechanism.
  - No published delivery/retry semantics for a failing callbackUrl.