Chatwoot to WhatsApp, send replies and media clean
Your support team replies in Chatwoot, but the customer is waiting on WhatsApp. So someone copies text, re-uploads files, and hopes nothing gets missed. It’s slow. It’s messy. And “private note vs. public reply” mistakes are a little too easy to make.
This Chatwoot WhatsApp forwarding automation hits Support Leads first, but Ops Managers and agency teams running shared inboxes feel it too. The outcome is simple: every public Chatwoot reply (plus media) goes to WhatsApp automatically, while private notes stay private.
Below you’ll see how the workflow routes messages, detects media types, and sends clean WhatsApp-ready content through Evolution API without extra manual steps.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Chatwoot to WhatsApp, send replies and media clean
flowchart LR
subgraph sg0["When Executed by Another Workflow Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Gateway", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Possui texto?", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if message is private", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has attachment?", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Array of attachments"]
n8@{ icon: "mdi:web", form: "rounded", label: "Send message text", pos: "b", h: 48 }
n9@{ icon: "mdi:web", form: "rounded", label: "Send video message", pos: "b", h: 48 }
n10@{ icon: "mdi:web", form: "rounded", label: "Send audio message", pos: "b", h: 48 }
n11@{ icon: "mdi:web", form: "rounded", label: "Send image message", pos: "b", h: 48 }
n12@{ icon: "mdi:web", form: "rounded", label: "Send document message", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check attachment file type", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop array of attachments", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Object message"]
n16@{ icon: "mdi:web", form: "rounded", label: "Send text - Satisfaction Sur..", pos: "b", h: 48 }
n4 --> n15
n4 --> n1
n2 --> n6
n2 --> n16
n3 --> n8
n15 --> n5
n6 --> n7
n6 --> n3
n10 --> n14
n11 --> n14
n9 --> n14
n7 --> n14
n12 --> n14
n14 --> n13
n13 --> n12
n13 --> n11
n13 --> n10
n13 --> n9
n5 --> n2
n5 --> n1
n0 --> n4
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 trigger
class n2,n3,n4,n5,n6,n13 decision
class n8,n9,n10,n11,n12,n16 api
class n7,n15 code
classDef customIcon fill:none,stroke:none
class n7,n15 customIcon
The Challenge: Forwarding Chatwoot Replies Without Breaking Context
Forwarding from Chatwoot to WhatsApp sounds straightforward until you’re in the middle of a real conversation. A customer asks for an invoice PDF, your agent replies with a note to the team, then adds a voice message, then sends an image. Now someone has to decide what to forward, download attachments, re-upload them, and keep the thread readable. Do that all day and you get delays, missing files, and support that feels “manual” even when you have a helpdesk.
It adds up fast. Here’s where it usually breaks down.
- Agents end up copying and pasting the same reply twice, which burns focus and invites typos.
- Attachments get skipped because downloading and re-sending a PDF or video is annoying on a busy shift.
- Private notes accidentally leak into customer chat when someone forwards the wrong message.
- Media types behave differently on WhatsApp, so what looked fine in Chatwoot can land as a broken link or wrong format.
The Fix: Clean Chatwoot → WhatsApp Delivery (Text + Media)
This workflow acts like a “delivery layer” between Chatwoot and WhatsApp. When a new Chatwoot message comes in from your main workflow, it immediately checks what kind of message it is and whether it should be forwarded at all. Public replies get packaged into a WhatsApp-friendly message object. Private notes are filtered out so they never leave your team. If the message includes attachments, the workflow builds a list, loops through each file, detects the content type (image, audio, video, document), and sends it using the correct Evolution API action. The end result is a WhatsApp conversation that looks intentional: readable text, properly delivered media, and no internal chatter.
The flow starts with an incoming Chatwoot event handed into this subworkflow. Then routing logic decides “text, media, survey, or nothing,” and a privacy check blocks internal notes. Finally, Evolution API sends the right WhatsApp message format for each item.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say your team handles 40 WhatsApp-bound replies a day from Chatwoot, and about half include some kind of attachment. Manually, even a quick forward is maybe 2 minutes for a text reply and about 5 minutes when there’s a PDF, photo, or voice note. That’s roughly 2–3 hours of busywork daily. With this workflow, the “human time” becomes close to zero after the message is sent in Chatwoot, because WhatsApp delivery happens automatically in the background.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Chatwoot as your customer support inbox.
- Evolution API to send WhatsApp messages.
- Evolution API key (get it from your Evolution API provider dashboard).
Skill level: Intermediate. You’ll connect credentials and map a few fields from the Chatwoot payload to the Evolution API nodes.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A Chatwoot message enters the subworkflow. This is designed to be attached to a “main” workflow that receives Chatwoot events (webhook or native integration) and then calls this subworkflow to handle WhatsApp delivery.
Routing decides what should happen. Switch and If logic check if there’s text, if the message is a private/internal note, and if attachments exist. If it’s private, the workflow intentionally does nothing. Quietly. Honestly, that one decision prevents a lot of awkward incidents.
Attachments are normalized and classified. A code step builds an attachment list from the Chatwoot payload, then a loop processes each file. Another routing check detects the attachment type using the content_type field so the workflow can send it the right way.
WhatsApp receives the final, formatted messages. Evolution API nodes send text, image, audio, video, or document messages as appropriate. If your use case includes surveys, there’s a dedicated “survey text” route too.
You can easily modify the routing rules to match your policy, like forwarding only certain inboxes or skipping large file types based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Execute Workflow Trigger
This workflow starts as a subworkflow and waits for another workflow to call it.
- Add the Subworkflow Trigger Start node to your canvas.
- Connect Subworkflow Trigger Start to Route Selector to begin routing when the subworkflow is invoked.
- Leave the parameters in Subworkflow Trigger Start as default unless the parent workflow sends special input keys.
Step 2: Configure Routing and Message Assembly
These nodes determine how incoming payloads are structured and routed through the workflow.
- In Route Selector, define your routing rules (outputs connect to Assemble Message Object or Do Nothing Step).
- Configure Assemble Message Object to build the unified message payload used downstream.
- Connect Assemble Message Object to Private Message Check to determine whether the message should be processed.
- In Private Message Check, route valid messages to Routing Gateway and invalid ones to Do Nothing Step.
Step 3: Handle Attachments and Batch Processing
This section checks for attachments, builds a list, and iterates through each item to detect type.
- From Routing Gateway, send attachment-related traffic to Attachment Present Check.
- Configure Attachment Present Check to route true cases to Build Attachment List and false cases to Text Present Check.
- In Build Attachment List, aggregate incoming attachments into a list suitable for iteration.
- Connect Build Attachment List to Iterate Attachments to split attachments into batches.
- From Iterate Attachments, route items to Detect Attachment Type to branch by media format.
Step 4: Configure Message Dispatch Actions
These nodes send text, survey, and media content through the Evolution API integration.
- From Text Present Check, send text messages to Dispatch Text Message.
- In Routing Gateway, route survey traffic to Send Survey Text.
- In Detect Attachment Type, map each attachment type to the corresponding sender: Send Document File, Send Image Content, Send Audio Content, and Send Video Content.
- After each media sender, ensure the flow returns to Iterate Attachments to continue processing remaining items.
- Connect Evolution API credentials to all evolution nodes (6 total): Dispatch Text Message, Send Video Content, Send Audio Content, Send Image Content, Send Document File, and Send Survey Text.
Step 5: Test and Activate Your Workflow
Run a manual test to validate routing, attachment handling, and sending behavior.
- Click Execute Workflow and invoke the parent workflow to trigger Subworkflow Trigger Start.
- Confirm that Route Selector routes correctly to Assemble Message Object and that Private Message Check forwards to Routing Gateway.
- Test with a message that includes attachments to ensure Build Attachment List, Iterate Attachments, and Detect Attachment Type route to the correct sender nodes.
- Verify that Evolution API nodes send the expected text or media output.
- Once successful, toggle the workflow to Active for production use.
Watch Out For
- Evolution API credentials can expire or need specific permissions. If things break, check your Evolution API key status and base URL configuration in the Evolution API node first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About an hour if your Chatwoot and Evolution API credentials are ready.
Yes, but you’ll want someone comfortable with mapping fields in n8n. No coding is required if your Chatwoot payload structure is already known.
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 Evolution API costs from your provider.
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.
Start with the routing logic: the “Routing Gateway” and “Route Selector” Switch nodes decide which kinds of messages get forwarded. If you need stricter privacy rules, adjust the “Private Message Check” so only public replies pass through. For media, the “Detect Attachment Type” Switch node is where you can block certain file types, set size limits, or route PDFs to a different WhatsApp template. You can also modify the “Assemble Message Object” code step to add prefixes like agent name, ticket ID, or business hours notices.
Usually it isn’t Chatwoot itself, it’s the incoming payload shape from your main workflow. Confirm the subworkflow is receiving the expected Chatwoot fields (message text, attachments array, and the content_type values). If those are present, check the Evolution API node credentials next, because a valid Chatwoot event can still fail at delivery time due to an expired key or wrong base URL.
On n8n Cloud, capacity depends on your plan’s monthly executions, and this workflow typically uses multiple executions per conversation when attachments are present. If you self-host, there’s no execution cap, but throughput depends on your server and how fast Evolution API responds. In practice, most small teams can run this all day without thinking about it, then upgrade only when volume spikes.
Often, yes. The big difference is how comfortably n8n handles branching logic and looping through multiple attachments in one message, without turning your automation into a fragile chain of mini-zaps. You can also self-host, which matters when message volume grows and pricing starts to sting. Zapier and Make can still work for simple text-only forwarding, but they get awkward once you need content-type detection for images, audio, video, and documents. If you’re undecided, Talk to an automation expert and describe your message volume and media mix.
Once this is running, Chatwoot stays your workspace and WhatsApp stays the customer’s channel. The workflow handles the repetitive forwarding so your team can just support people.
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.