WhatsApp events that drive your n8n workflows.

Flowella’s signed webhooks start your n8n workflows through n8n’s own Webhook trigger, and the HTTP Request node sends WhatsApp templates back through the Flowella API.

  • Works todayThrough the Flowella API and webhooks
  • Coming soonA Flowella node for n8n
Flo, the Flowella mascot, plugging a cord into the last of three coloured nodes to link them together

Fire an event, follow the payload.

Here’s an n8n workflow, drawn in Flowella’s style. Pick a sample event and send it, then follow it from node to node: the Switch node routes each event, and an HTTP Request node alerts your team, updates your mailing list or sends a WhatsApp template back through the Flowella API. Select any node to see exactly what it received or sent.

Flo pointing along one of three signpost arrows, the way a workflow branch picks one path
Just n8n’s own nodes
Sample event
Acme ClubBusiness account
Sample data

Today

Hi Ada, your Acme Club membership renews on 31 October. Reply here if you have any questions.
Flowella eventsn8n workflow
Sample data

What Flowella posted to the webhook Sample data

POST/webhook/flowella-events

Content-Type
application/json
X-Flowella-Signature
Signed when an event arrives

Send an event to see the body Flowella posts here.

POST/webhook/flowella-events

Content-Type
application/json
X-Flowella-Signature
5d2c9f1a…e19a
{
  "id": "6f1d8a2c-4b7e-4c19-9a53-0e2b7c4d9f10",
  "type": "message.received",
  "created_at": "2026-10-16T08:41:07.000Z",
  "payload_version": "1",
  "data": {
    "messageId": "clsamplemsg00000000000043",
    "conversationId": "clsampleconv0000000000007",
    "contactId": "clsamplecontact0000000003",
    "direction": "INBOUND",
    "type": "TEXT",
    "metaMessageId": "wamid.sample00000000000043"
  }
}

POST/webhook/flowella-events

Content-Type
application/json
X-Flowella-Signature
5d2c9f1a…e19a
{
  "id": "6f1d8a2c-4b7e-4c19-9a53-0e2b7c4d9f10",
  "type": "optout.created",
  "created_at": "2026-10-16T08:41:07.000Z",
  "payload_version": "1",
  "data": {
    "contactId": "clsamplecontact0000000003",
    "conversationId": "clsampleconv0000000000007",
    "phone": "+447700900123",
    "reason": "USER_KEYWORD"
  }
}

POST/webhook/flowella-events

Content-Type
application/json
X-Flowella-Signature
5d2c9f1a…e19a
{
  "id": "6f1d8a2c-4b7e-4c19-9a53-0e2b7c4d9f10",
  "type": "template.status_updated",
  "created_at": "2026-10-16T08:41:07.000Z",
  "payload_version": "1",
  "data": {
    "metaTemplateId": "1234567890123456",
    "templateName": "autumn_fair_invite",
    "status": "APPROVED",
    "language": "en_GB"
  }
}

Every delivery has the same envelope, and the event’s own fields sit in its last key: id type created_at payload_version data

Check X-Flowella-Signature before you act: it’s an HMAC-SHA256 hex digest of the raw body, keyed with your signing secret.

Switch: each event takes the first rule whose conditions all pass

This event: Not checked yet type: message.received data.type: TEXT type: optout.created type: template.status_updated data.status: APPROVED

  1. Alert the team {{ $json.body.type }} is equal to message.received {{ $json.body.data.type }} is equal to TEXT
  2. Update the mailing list {{ $json.body.type }} is equal to optout.created
  3. Send the campaign {{ $json.body.type }} is equal to template.status_updated {{ $json.body.data.status }} is equal to APPROVED

Waiting for an event.

Rule 1 matches, so the event goes on to Alert the team.

Rule 2 matches, so the event goes on to Update the mailing list.

Rule 3 matches, so the event goes on to Send the campaign.

The Switch passes the event on unchanged, so the next node can read $json.body too.

What the HTTP Request node sent Sample data

POSThttps://alerts.example.com/hooks/whatsapp-replies

Content-Type
application/json

This node runs only when rule 1 matches.

POSThttps://alerts.example.com/hooks/whatsapp-replies

Content-Type
application/json

conversationId from {{ $json.body.data.conversationId }}contactId from {{ $json.body.data.contactId }}

{
  "conversationId": "clsampleconv0000000000007",
  "contactId": "clsamplecontact0000000003"
}
200 OK

POSThttps://alerts.example.com/hooks/whatsapp-replies

Content-Type
application/json

Not run. The Switch sent this event to another output.

The event carries ids, not the reply itself, so your team opens the conversation in the Flowella inbox and answers there.

What the HTTP Request node sent Sample data

POSThttps://lists.example.com/v1/unsubscribes

Content-Type
application/json

This node runs only when rule 2 matches.

POSThttps://lists.example.com/v1/unsubscribes

Content-Type
application/json

phone from {{ $json.body.data.phone }}reason from {{ $json.body.data.reason }}

{
  "phone": "+447700900123",
  "reason": "USER_KEYWORD"
}
200 OK

POSThttps://lists.example.com/v1/unsubscribes

Content-Type
application/json

Not run. The Switch sent this event to another output.

optout.created is the event that carries a phone number, so your other tools can stop messaging her too.

What the HTTP Request node sent Sample data

POSThttps://api.flowella.io/v1/templates/send

Authorization
Bearer flo_(masked)From your n8n credential
Content-Type
application/json

This node runs only when rule 3 matches.

POSThttps://api.flowella.io/v1/templates/send

Authorization
Bearer flo_(masked)From your n8n credential
Content-Type
application/json
Idempotency-Key
6f1d8a2c-4b7e-4c19-9a53-0e2b7c4d9f10

templateId from {{ $json.body.data.metaTemplateId }}Idempotency-Key from {{ $json.body.id }}, so a retried delivery never sends twicerecipients from the members list n8n holds

{
  "templateId": "1234567890123456",
  "whatsappChannelId": "clsamplechannel0000000001",
  "recipients": [
    { "phone": "+447700900123", "bodyParameters": ["Ada"] },
    { "phone": "+447700900456", "bodyParameters": ["Ben"] }
  ]
}
202 Accepted{ "id": "v1ts-0123456789abcdef", "status": "accepted" }

POSThttps://api.flowella.io/v1/templates/send

Authorization
Bearer flo_(masked)From your n8n credential
Content-Type
application/json

Not run. The Switch sent this event to another output.

Keep the API key in an n8n credential, never in the workflow itself. 202 Accepted means Flowella queued the send and delivers it in the background.

Set it up in three steps.

You need a Flowella account with WhatsApp connected, a template Meta has approved, and an n8n workflow. Then:

  1. Step 1: Add a Webhook trigger

    Start the workflow with n8n’s Webhook node, set it to POST, and copy its production URL.

    Webhook nodeSample data
    Method
    POST
    Path
    flowella-events
    URL
    https://n8n.example.com/webhook/flowella-events
    Listening
    Outbound webhooks
  2. Step 2: Subscribe in Flowella

    In Settings → Webhooks, add that URL, pick the events you want and save the signing secret. Send test fires a webhook.test event. You need the Owner or Admin role.

    WebhooksSample data
    Endpoint
    https://n8n.example.com/webhook/flowella-events
    Events
    message.received, optout.created, template.status_updated
    Signing secret
    Saved
    Test sent
    Webhook settings
  3. Step 3: Send back with HTTP Request

    Add an HTTP Request node that POSTs to /v1/templates/send, with your Flowella API key in a header credential.

    HTTP Request nodeSample data
    Method
    POST
    URL
    https://api.flowella.io/v1/templates/send
    Credential
    Header: Authorization
    202 Accepted
    API reference

What works today, and what’s on the way.

Everything above runs on the Flowella API and webhooks, available now. A Flowella node for n8n is coming soon.

Coming soon

A Flowella node for n8n

We’ll publish how it works here when it’s ready. Until then, n8n’s Webhook trigger and HTTP Request node do the job.

Good to know

  • Check the signatureEach request carries X-Flowella-Signature, an HMAC-SHA256 hex digest of the raw body. Verify it before you act. While you rotate the secret, X-Flowella-Signature-Previous carries the old one’s signature too.
  • Answer within 10 secondsFlowella waits up to 10 seconds for a 2xx and tries a delivery at most 3 times, 1 and 2 seconds apart. Respond first, then do any slow work.
  • Expect repeatsA retried delivery carries the same envelope id, so keep the ids you’ve handled and treat a repeat as a no-op.
  • Ids, not wordsmessage.received carries ids, the direction and the type of message, never its text. Your team reads and answers replies in the Flowella inbox.

Available today Works today

Open to any tool that sends and receives HTTP requests, n8n included.

Webhook events you can subscribe to today

  • message.received
  • message.sent
  • message.delivered
  • message.read
  • message.failed
  • conversation.opened
  • conversation.closed
  • optout.created
  • template.status_updated
  • contact.created
  • contact.updated
  • contact.deleted

Plus webhook.test, which Send test fires on demand.

Flo jumping for joy with her fist in the air and a phone in her hand

Start building with Flowella and n8n.

Everything on this page works today through the Flowella API and webhooks. Book a 30-minute demo on Teams and we’ll look at your workflows together.

See all integrations