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.sentMessage was sent to WhatsApp
{ "event": "message.sent", "data": { "messageId": "...", "phone": "..." } }message.deliveredMessage was delivered to recipient
{ "event": "message.delivered", "data": { "messageId": "...", "deliveredAt": "..." } }message.readMessage was read by recipient
{ "event": "message.read", "data": { "messageId": "...", "readAt": "..." } }message.failedMessage failed to send
{ "event": "message.failed", "data": { "messageId": "...", "error": "..." } }flow.startedA flow execution began
{ "event": "flow.started", "data": { "flowId": "...", "contactId": "..." } }flow.completedA flow execution finished
{ "event": "flow.completed", "data": { "flowId": "...", "status": "completed" } }contact.createdA 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.