Customer conversations
Three apps, one queue, one owner per conversation
WhatsApp, Instagram and Messenger each have their own app, their own notification and their own person who happens to be watching. Merging them into one queue is the easy half. The half that matters is that each channel runs a different clock — and a conversation nobody is named against is a conversation everybody assumes somebody else has.
- Triggers
- Two
- Runs
- On every message
- Stack
- 5 tools
- Durable execution
- Not required
The flow
Two webhook shapes in, one row shape out. The branch only asks one thing: does this conversation have a name against it yet.
A WhatsApp message
WhatsApp Cloud API
Normalise the payload
n8n · Make
Write the queue row
Sheets · Airtable
An Instagram or Messenger message
Instagram · Messenger API
Look up the owner
n8n · Make
Nobody owns it yet?
n8n IF
Name an owner and tell them
Slack · WhatsApp
Leave the owner as is
—
Step by step
- 01
A WhatsApp message
WhatsApp Cloud APIThe Cloud API webhook, carrying the sender's WhatsApp id, their profile name and the message body. It also starts that channel's own 24-hour clock.
- 02
Normalise the payload
n8n · MakeMap every channel onto one shape: who, which channel, what they said, when the reply is due by that channel's rule. The deadline is stored per channel because the three do not share one.
- 03
Write the queue row
Sheets · AirtableOne row per conversation, not per message. Channel, customer, owner, and the deadline. This row is the queue — there is no second dashboard to keep in step with it.
- 04
An Instagram or Messenger message
Instagram · Messenger APIThe second webhook shape. Both arrive through Meta's platform but carry different windows and different rules about who may send first.
- 05
Look up the owner
n8n · MakeRead the queue row for this customer on this channel and see whether anyone is already named against it.
- 06
Nobody owns it yet?
n8n IFOne question, deliberately. Reassigning a live conversation because a new message arrived is how two people end up answering the same customer differently.
- 07
Name an owner and tell them
Slack · WhatsAppAssign from the roster and send that person the conversation with its channel deadline attached. An alert without a name on it is a notification, not an assignment.
What the platform will not allow
One queue does not mean one rule. Each channel keeps its own window, and the shared row has to store the difference rather than average it.
On WhatsApp, "when a WhatsApp user messages you or calls you, a 24-hour timer called a customer service window starts", it resets if they write again, and "when the window closes, you can only send pre-approved template messages".
WhatsApp Cloud API — Send messagesOn Messenger, "businesses have up to 24 hours to respond to a user"; outside that, message tags cover specific approved use cases, and the Human Agent tag "allows businesses to manually respond to user messages within a 7-day period". Messenger's escape hatch is far longer than WhatsApp's, and only for a human reply.
Messenger Platform — Policy overviewOn Instagram, "your app has 24 hours to respond to any message sent from an Instagram user to your app user", you cannot send until the user contacts you first, and "group messaging is not supported. An Instagram professional account can only converse with one customer per conversation."
Instagram Platform — Messaging APIMessenger treats conversation ownership as a platform concept: the pass_thread_control callback "will occur when thread ownership for a user has been passed to your application".
Messenger Platform — messaging_handovers webhookInstagram has its own Conversation Routing controls. Meta documents the current thread owner, passing thread control, and the migration of Handover Protocol integrations into Conversation Routing, so Instagram ownership can be platform-backed too.
Instagram Platform — Conversation Routing
When this is not worth building
Three cases where the upkeep costs more than the missed messages.
One person answers all three apps. A queue for one person is a written copy of what they already know, and it will drift out of date faster than they will forget anything.
The channels serve different businesses — retail on Instagram, wholesale on WhatsApp, warranty on Messenger. Merging them puts unlike work in one line, and each kind waits behind the other for no reason.
You will not keep a roster. One owner per conversation is a staffing decision; the workflow only records it. Without the roster, the assignment step picks a name at random and calls it accountability.