Flowziac Docs

Webhooks

Webhooks

Receive real-time event notifications on your server when things happen in Flowziac.

How it works

When an event occurs in your workspace, Flowziac sends an HTTP POST request to your configured webhook URL. This lets you react to events in real-time without polling.

๐Ÿ“จ

Event occurs

โ†’
๐Ÿ””

Flowziac POSTs

โ†’
๐Ÿ–ฅ๏ธ

Your server

Event Types

message.sent

Message was sent to WhatsApp

{ "event": "message.sent", "data": { "messageId": "...", "phone": "..." } }
message.delivered

Message was delivered to recipient

{ "event": "message.delivered", "data": { "messageId": "...", "deliveredAt": "..." } }
message.read

Message was read by recipient

{ "event": "message.read", "data": { "messageId": "...", "readAt": "..." } }
message.failed

Message failed to send

{ "event": "message.failed", "data": { "messageId": "...", "error": "..." } }
flow.started

A flow execution began

{ "event": "flow.started", "data": { "flowId": "...", "contactId": "..." } }
flow.completed

A flow execution finished

{ "event": "flow.completed", "data": { "flowId": "...", "status": "completed" } }
contact.created

A new contact was added

{ "event": "contact.created", "data": { "contactId": "...", "phone": "..." } }

Security

Every webhook request includes a signature header that you can use to verify the request came from Flowziac:

Header: X-Flowziac-Signature

Algorithm: HMAC-SHA256

Secret: Your webhook secret (shown once at creation)

Verification example (Node.js):

const crypto = require('crypto');
const signature = req.headers['x-flowziac-signature'];
const expected = crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(JSON.stringify(req.body))
  .digest('hex');
if (signature !== expected) {
  return res.status(401).send('Invalid signature');
}

Retry Policy

If your server returns a non-2xx response or doesn't respond within 5 seconds, Flowziac will retry the delivery:

3 retries

Maximum retry attempts

Exponential backoff

1s โ†’ 2s โ†’ 4s

24h max

Then marked failed

Your endpoint should respond with 200 OK within 5 seconds. Process the payload asynchronously after responding.