Webhooks & APIOutbound

message.outbound.created

Emitted when Wexio sends a message to a contact

type: message.outbound.created

Fired when Wexio sends a message out to the contact — from a flow card, the inbox operator UI, the API, or any internal process.

When it fires

  • A flow card (Text, Media, Template, Buttons, …) sends to the contact.
  • An operator replies manually from the Inbox.
  • An AI Agent or external API call writes a message to the contact.

data shape

type Data = {
  chat: ChatPayload;
  message: MessagePayload;  // direction: "OUTBOUND"
  contact?: ContactPayload;
};
  • chat — the owning chat. See ChatPayload.
  • message — the outbound message. direction is always "OUTBOUND". See MessagePayload.
  • contact — the recipient, when resolvable.

Example envelope

{
  "id": "evt_b1c2d3e4-f5a6-7890-bcde-f12345678901",
  "type": "message.outbound.created",
  "timestamp": "2026-04-24T12:14:30.000Z",
  "data": {
    "chat": {
      "id": "6804f4c2a6f9f35f6e66f1a1",
      "integrationId": "67f95b0126a4d1c9e3f0aa12",
      "channel": "WHATSAPP",
      "whatsappId": "wa_99887766"
    },
    "message": {
      "id": "msg_02",
      "chatId": "6804f4c2a6f9f35f6e66f1a1",
      "integrationId": "67f95b0126a4d1c9e3f0aa12",
      "direction": "OUTBOUND",
      "type": "TEXT",
      "text": "Hi Alex — how can we help?",
      "sentAt": "2026-04-24T12:14:30.000Z",
      "raw": { "providerMessageId": "wamid.HBg..." }
    },
    "contact": {
      "peopleId": "6804f4d5a6f9f35f6e66f1a2",
      "phoneNumber": "+46700000000"
    }
  },
  "meta": {
    "eventId": "evt_b1c2d3e4-f5a6-7890-bcde-f12345678901",
    "event": "message.outbound.created",
    "occurredAt": "2026-04-24T12:14:30.000Z",
    "organisationId": "6640f3d5c8a0d7e8b7f20222",
    "connectionId": "6640f45ac8a0d7e8b7f2014a",
    "apiVersion": "2026-04-01",
    "attempt": 1
  }
}

Notes

  • Fires for both bot/flow-sent messages and operator-sent messages.
  • Use message.raw.providerMessageId to correlate with your own provider-side webhook status updates.
  • Subsequent delivery transitions (deliveredAt, readAt, failedAt) arrive as message.outbound.updated events, not as a new created event.

On this page