No-code automation
Fliok + Pabbly Connect
Start a workflow when a WhatsApp message, a new lead, a form submission or a store order arrives in Fliok — and have any workflow send a WhatsApp template, add a lead or create a follow-up in Fliok. It works today with Pabbly Connect’s own Webhook by Pabbly and API by Pabbly steps and Fliok’s signed webhooks and REST API.
Fliok is not listed in Pabbly Connect’s app directory yet, so this guide uses Pabbly Connect’s generic webhook and request steps. Webhook by Pabbly and API by Pabbly are Pabbly Connect’s own apps.
Before you start
- The API and webhooks are part of the Pro and Enterprise plans (pricing).
- In Fliok, open API keys and create a key for Pabbly Connect. Give it the admin role if it will also register webhooks; sending and CRM changes need at least agent. The key starts with
wa_and is shown once. - Every request to Fliok carries it as a header:
Authorization: Bearer wa_…. Base URLhttps://fliok.com/api/v1.
Start a workflow from Fliok
- In Pabbly Connect, create a workflow with the trigger Webhook by Pabbly and copy the webhook URL.
- In Fliok, open API keys → Webhooks, paste the URL into Endpoint URL, pick the event (for example
order.event) and press Add. - Press Capture Webhook Response in Pabbly, then Send test event next to the webhook in Fliok. The response appears in Pabbly with every field ready to map.
Every delivery has the same shape — the event’s fields are under data:
{
"id": "evt_8f2c…",
"event": "lead.created",
"createdAt": "2026-10-06T10:00:00.000Z",
"data": {
"lead": { "id": "…", "phone": "919876543210", "name": "Asha", "stage": { "name": "New lead", "kind": "initial" }, … },
"source": "Website",
"via": "form",
"form": "Wedding enquiry",
"createdAt": "2026-10-06T10:00:00.000Z"
}
}Deliveries are signed (HMAC-SHA256, see the webhook reference) and retried when your URL does not answer 2xx, so the same id can arrive twice. A workspace can register 25 webhook URLs.
| Event | When it fires |
|---|---|
message.received | A contact sent a message to your number. Deduplicated — Meta redelivers webhooks, you do not get doubles. |
contact.created | A phone number became a contact for the first time. `source` is inbound_message, smb_echo, user_preferences or api_send. Bulk paths — CSV import, dashboard-created contacts, coexistence address-book sync and Coexistence history backfill — do NOT emit this. |
lead.created | A new lead entered the CRM. `via` is form, api, import, manual, integration or whatsapp. `lead` carries id, phone, name, email, stage {id,name,kind}, owner, source, rating, dealValue and tags. |
form.submitted | Somebody submitted a form to your lead-capture link (a website form, or a marketplace push such as IndiaMART or JustDial). Every submission fires, including a repeat from a number you already have (`created` false); a portal re-sending the same enquiry does not. `note` is what they wrote in the message box, `fields` holds answers matched to your custom fields, `extra` everything else the form sent. |
lead.stage_changed | A lead moved stage. `from`/`to` are {id,name,kind} with kind initial, active, won or lost; `lostReason` is set on a move to a lost stage. Restructuring the pipeline in settings does not fire this. |
lead.assigned | A lead's owner changed — by a person, a routing rule, an automation or inbox auto-assign. `to` is null when the lead was unassigned. |
task.created | A follow-up task was created on a lead. `task` carries id, title, type, dueAt, priority, status and assignee. |
message.status | An outbound message changed state: sent, delivered, read or failed. Each state fires at most once; statuses never move backwards. |
message.failed | An outbound message failed for good, with the Meta error code explained. Fires once per message. Messages we deliberately did not send (status "skipped") never appear here. |
conversation.closed | The 24-hour customer-service window expired. Only approved templates can be sent until the customer messages again. Detected within ~5 minutes of expiry. |
conversation.rated | A customer answered the satisfaction survey on a resolved conversation. `score` is 1-5. Fired once per conversation; later taps are ignored. |
template.approved | Meta approved a message template. Fired on the transition into approved, so a redelivered Meta webhook does not re-fire it. |
template.rejected | Meta rejected a message template. `reason` carries Meta's rejection reason when it supplies one. |
order.event | A connected Shopify or WooCommerce store reported an order event. `type` is order_placed, order_paid, order_shipped or order_cancelled. Fires once per store, event and order, whether or not a WhatsApp template is set for that event; the store's retries do not fire it again. |
payment.paid | A customer paid a WhatsApp Pay request. Amounts are in paise (INR); `paymentMethod` is Meta's method type (upi, card, netbanking, wallet…) when it says. If `paidPaise` differs from `totalPaise`, Meta reported a different amount than was asked: check the payment before you fulfil the order. Fired on the transition into paid, so Meta's repeated payment updates never fire it twice. |
Also available: template.category_changed, conversation.opened, flow.completed, call.missed, order.cod_response, broadcast.completed, lead.recaptured, task.completed, instagram.message.received, instagram.comment.received, instagram.post.published. Every field of every event is listed in the API reference.
Make Fliok do something from a workflow
- Add an action step with API by Pabbly and choose its request action.
- Method and URL from the table below, e.g.
POST https://fliok.com/api/v1/send. - Headers:
Authorization=Bearer wa_…(your API key) andContent-Type=application/json. Payload type JSON, with the body below and values mapped from earlier steps.
Send an approved template
Works at any time. variables fill the body’s {{1}}, {{2}}… in order; Fliok refuses a blank one before WhatsApp does.
{
"to": "919876543210",
"type": "template",
"payload": {
"type": "template",
"template": {
"name": "order_update",
"language": { "code": "en_US" },
"variables": ["Asha", "#1042"]
}
}
}Send a text message
Only within 24 hours of the customer’s last message to you — otherwise Fliok answers 422 outside_24h_window. Use a template outside the window.
{ "to": "919876543210", "type": "text", "text": "Your table is booked for 8 pm." }Create or update a contact
Keyed by phone number: a second call updates the same contact. tags here replaces the list; use the next call to add or remove single tags.
{ "phone": "919876543210", "displayName": "Asha", "attributes": { "city": "Kolkata" } }Add or remove tags
In Fliok a lead is a contact, so this works on any contact by phone number. Automations that start on a tag run as usual.
{ "addTags": ["diwali-sale"], "removeTags": ["cold"] }Create a lead
A number already in the CRM is not duplicated — it is recorded as having come in again. Stage and owner are given by name or email.
{ "phone": "919876543210", "name": "Asha", "source": "Facebook form", "stage": "New lead", "note": "Wants a December date" }Move a lead to a stage
GET /pipeline lists your stages and lost reasons. The move lands on the lead’s timeline and fires your stage automations.
{ "stage": "Lost", "lostReason": "Too expensive" }Create a follow-up task
leadId takes the lead’s phone number or id. The task goes to the lead’s owner unless you give assignee (an email).
{ "leadId": "919876543210", "title": "Call back about the venue", "dueAt": "2026-10-07T10:00:00+05:30", "type": "call" }Ask for a payment (WhatsApp Pay)
Needs WhatsApp Pay set up in Fliok and a chat the customer messaged in the last 24 hours. Amounts are in paise; your referenceId makes a retry safe.
{ "to": "919876543210", "referenceId": "ORD-1042", "items": [{ "name": "Silk saree", "quantity": 1, "unitPaise": 149900 }] }Find a contact by phone
An exact match, with or without the country code. No such contact is an empty list.
GET https://fliok.com/api/v1/contacts?phone=919876543210When Fliok refuses a call it answers with an error code and usually a message sentence — show the message in your workflow’s error handling. The full list of endpoints (contacts, conversations, broadcasts, Instagram and more) is in the API reference.