WhatsApp meets Slack for shared support threads
You’re trying to run support in Slack, but customers keep messaging in WhatsApp. So you end up copy-pasting, forwarding screenshots, and hunting for “that one voice note” when someone asks for context.
This WhatsApp Slack integration hits support leads first, honestly. But ops managers doing handoffs and agency owners juggling client comms feel it too. The outcome is simple: every WhatsApp conversation becomes a private Slack thread your team can actually collaborate in.
You’ll set up a workflow that pulls WhatsApp messages (including files) into Slack automatically, and sends Slack replies back to the right WhatsApp contact. Clean threads. Faster responses. Less “wait, who replied?”
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: WhatsApp meets Slack for shared support threads
flowchart LR
subgraph sg0["WhatsApp Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>WhatsApp Trigger"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send Message in Channel"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Message Type", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>get audio URL"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>get document URL"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>get image URL"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Create Channel"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>get All Channels"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Channel by Name", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>upload media"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>download media"]
n3 --> n1
n3 --> n4
n3 --> n6
n3 --> n5
n4 --> n11
n6 --> n11
n7 --> n8
n11 --> n10
n0 --> n7
n8 --> n9
n5 --> n11
n9 --> n3
end
subgraph sg1["Slack Flow"]
direction LR
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Trigger"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Get Channel by ID"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Checking Message Type", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Send Message"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Get Media URL"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Download Media"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Send Message1"]
n15 --> n16
n2 --> n12
n16 --> n17
n12 --> n13
n13 --> n15
n13 --> n14
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n2 trigger
class n3,n9,n13 decision
class n11,n16 api
classDef customIcon fill:none,stroke:none
class n0,n1,n4,n5,n6,n7,n8,n10,n11,n2,n12,n14,n15,n16,n17 customIcon
Why This Matters: Support Conversations Split Across Tools
WhatsApp is where customers are. Slack is where your team works. When those two worlds don’t connect, support turns into a messy relay race. Someone sees the WhatsApp message, pings Slack, drops a partial screenshot, forgets the file, then another teammate replies without the full backstory. Multiply that by a busy day and you get missed details, slow handoffs, and the kind of “we already answered this” frustration that drains your team.
It adds up fast. Here’s where it breaks down in real life:
- Copy-pasting WhatsApp messages into Slack steals about 5 minutes per customer thread, and it gets worse when there are attachments.
- Files shared in WhatsApp (photos, docs, voice notes) get lost in personal phones, which means the team can’t search or reference them later.
- Two people respond in parallel because there’s no single shared thread, and the customer ends up confused or annoyed.
- New teammates can’t see the full context, so handoffs become a mini onboarding session every time.
What You’ll Build: Two-Way WhatsApp Threads Inside Slack
This workflow turns WhatsApp into a front door and Slack into the shared workspace behind it. When a customer sends a WhatsApp message, n8n catches it instantly through a webhook trigger. The workflow checks for a matching private Slack channel named after that contact (typically their phone number). If it doesn’t exist yet, it creates one, so every customer gets their own dedicated thread. Then it routes the message based on type: text goes straight into Slack, while images, audio, and documents get fetched from WhatsApp, downloaded securely, and uploaded into the same Slack channel.
Replies work the other way too. When someone on your team posts in that Slack channel, the workflow listens for new Slack messages or file uploads, figures out if it’s text or a file, then sends it back to WhatsApp using the correct contact (identified by the Slack channel name). One shared place to collaborate, while the customer stays in WhatsApp.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you get about 30 WhatsApp messages a day, and around 10 of them include a file (photo, PDF, or voice note). Manually, logging each message into Slack might take 2 minutes, and file handling can take another 5 minutes. That’s roughly 2 hours of busywork on a normal day. With this automation, the “work” is basically just replying in Slack; messages sync in seconds, and attachments show up without anyone downloading and re-uploading them.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- WhatsApp Cloud API for receiving and sending messages
- Slack to create channels and post uploads
- WhatsApp access token (from Meta Developer dashboard)
Skill level: Intermediate. You’ll paste API tokens, test webhooks, and map a few fields, but you won’t be writing code.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A customer messages you on WhatsApp. The workflow starts when the WhatsApp trigger receives a new incoming message via webhook from the WhatsApp Cloud API.
A private Slack channel is found or created. n8n pulls your existing Slack channels, filters by the sender’s number, and creates a new private channel if there isn’t one yet, so each contact gets a dedicated space.
The message is routed by type. A Switch node checks if it’s text, an image, an audio message, or a document. Text posts into Slack immediately. For media, the workflow requests the media link from WhatsApp, downloads the file using an HTTP request, then uploads it into the same Slack channel.
Your team replies in Slack and it goes back to WhatsApp. A Slack trigger listens for new messages and file uploads. Another message-type check decides whether to send a WhatsApp text message or to download the Slack file and send it as WhatsApp media.
You can easily modify the channel naming and routing rules to match how your team works (for example, naming channels by customer name instead of phone number). See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the WhatsApp Incoming Trigger
Set up the workflow entry point so incoming WhatsApp messages can start the relay.
- Add the WhatsApp Incoming Trigger node as your trigger.
- Credential Required: Connect your
whatsAppTriggerApicredentials in WhatsApp Incoming Trigger. - Ensure updates includes
messagesso message events are captured.
Step 2: Connect Slack and WhatsApp Services
Authorize Slack and WhatsApp nodes that post messages, manage channels, and send media.
- Credential Required: Connect your
slackApicredentials in Post to Slack Channel, Slack Event Listener, Generate Slack Channel, Retrieve All Channels, Retrieve Channel Details, Fetch Slack File Link, and Upload File to Slack. - Credential Required: Connect your
whatsAppApicredentials in Fetch Audio Link, Fetch Image Link, Fetch Document Link, Send WhatsApp Text, and Send WhatsApp Media.
Step 3: Set Up Channel Creation and Message Routing
Create private Slack channels per WhatsApp sender and route message types through the correct branch.
- In Generate Slack Channel, set resource to
channel, channelVisibility toprivate, and channelId to={{ $('WhatsApp Incoming Trigger').item.json.messages[0].from }}. - In Retrieve All Channels, set resource to
channel, operation togetAll, and returnAll totrue. Add filters → types withprivate_channel. - In Filter Channels by Name, match leftValue
={{ $json.name }}to rightValue={{ $('WhatsApp Incoming Trigger').item.json.messages[0].from }}. - In Route Message Kind, keep the rules that map message type to outputs
text,audio,image, anddocumentusing={{ $('WhatsApp Incoming Trigger').item.json.messages[0].type }}. - In Post to Slack Channel, set text to
={{ $('WhatsApp Incoming Trigger').item.json.messages[0].text.body }}and channelId to={{ $json.id }}.
Step 4: Configure WhatsApp Media Upload to Slack
Fetch WhatsApp media URLs, download the files, and upload them to the correct Slack channel.
- In Fetch Audio Link, set resource to
media, operation tomediaUrlGet, and mediaGetId to={{ $('WhatsApp Incoming Trigger').item.json.messages[0].audio.id }}. - In Fetch Image Link, set mediaGetId to
={{ $('WhatsApp Incoming Trigger').item.json.messages[0].image.id }}. - In Fetch Document Link, set mediaGetId to
={{ $('WhatsApp Incoming Trigger').item.json.messages[0].document.id }}. - In Download Media File, set url to
={{ $json.url }}, authentication togenericCredentialType, and genericAuthType tohttpHeaderAuth. - Credential Required: Connect your
httpBearerAuthandhttpHeaderAuthcredentials in Download Media File. - In Upload File to Slack, keep resource as
fileand set options.channelId to={{ $('Route Message Kind').item.json.id }}.
Step 5: Configure Slack-to-WhatsApp Relay
Listen for Slack messages, map them back to WhatsApp recipients, and send text or media accordingly.
- In Slack Event Listener, keep watchWorkspace enabled to capture messages across channels.
- In Retrieve Channel Details, set resource to
channel, operation toget, and channelId to={{ $json.channel }}. - In Evaluate Slack Message, keep the rules that route file attachments with
={{ $('Slack Event Listener').item.json.files }}and text with={{ $('Slack Event Listener').item.json.text }}. - In Fetch Slack File Link, set fileId to
={{ $('Slack Event Listener').item.json.files[0].id }}, resource tofile, and operation toget. - In Download Slack File, set url to
={{ $json.url_private_download }}and keep genericAuthType ashttpHeaderAuth. Credential Required: Connect yourhttpHeaderAuthcredentials. - In Send WhatsApp Text, set textBody to
={{ $('Slack Event Listener').item.json.blocks[0].elements[0].elements[0].text }}, recipientPhoneNumber to={{ $('Retrieve Channel Details').item.json.name }}, and phoneNumberId to=[YOUR_ID]. - In Send WhatsApp Media, set mediaPath to
useMedian8n, messageType todocument, recipientPhoneNumber to={{ $('Retrieve Channel Details').item.json.name }}, and phoneNumberId to=[YOUR_ID].
=[YOUR_ID] in Send WhatsApp Text and Send WhatsApp Media with your real WhatsApp phone number ID, or messages will not send.Step 6: Test and Activate Your Workflow
Validate both directions of the relay and enable the workflow for production use.
- Click Test workflow and send a WhatsApp text, image, audio, and document to verify each branch of Route Message Kind.
- Confirm the Slack channel is created by Generate Slack Channel and messages/files appear in Slack via Post to Slack Channel or Upload File to Slack.
- Send a Slack message and file to the channel and verify Send WhatsApp Text or Send WhatsApp Media delivers to the correct WhatsApp recipient.
- When testing succeeds, toggle the workflow Active for continuous operation.
Troubleshooting Tips
- Slack credentials can expire or need specific permissions. If things break, check the n8n Credentials entry for Slack and confirm it still has access to create private channels and upload files.
- If you’re using HTTP downloads for media, processing times vary and some file links are short-lived. If downstream upload nodes fail, retry quickly and confirm the WhatsApp media URL or Slack file URL is still valid.
- Channel-name matching is unforgiving. If your workflow expects the Slack channel name to equal the WhatsApp phone number, any manual renaming will break replies going back to WhatsApp.
Quick Answers
About 30–60 minutes if your WhatsApp Cloud API and Slack apps are ready.
No. You’ll connect accounts and map a few fields in n8n. The logic is already built into the workflow nodes.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in WhatsApp Cloud API usage costs (usually small unless you’re doing heavy volume).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you probably should. You can change how channels are named by adjusting the Slack “create/get channel” logic (the nodes that retrieve channels, filter by name, and generate the Slack channel). Common tweaks include posting into a shared triage channel first, adding tags like “billing” vs “tech,” or routing VIP contacts to a different Slack workspace.
Usually it’s permissions. The Slack app/token needs access to create private channels, read channel events, post messages, and upload files. If someone reinstalled the app or changed scopes, update the Slack credentials in n8n and test by creating a channel and uploading a small file.
It depends more on your hosting and Slack/WhatsApp rate limits than the workflow itself.
For two-way messaging with attachments, n8n is often the more practical choice. You can branch on message type, download and re-upload files, and keep all the routing in one place without stitching together lots of separate zaps/scenarios. Self-hosting is a big deal if you expect higher volume because you’re not paying per tiny step. Zapier or Make can still work if you only need one-way forwarding of text. If you want help choosing (or you need this hardened for a real support team), Talk to an automation expert.
Once this is live, WhatsApp stops being a private inbox and starts acting like a proper shared support queue in Slack. Set it up once, and let the workflow carry the context for you.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.