Send a WhatsApp Template Broadcast to a List in Google Sheets
An n8n workflow that reads a contact list from Google Sheets and sends each person a personalized, pre-approved WhatsApp template message — with a built-in rate limit and per-contact status logging — so you can run compliant WhatsApp campaigns without a paid blast tool.
- 1
Trigger the broadcast
Use a
Manual Trigger(run it when you're ready) or aSchedule Triggerfor recurring campaigns. Manual is safest for one-off blasts so you control exactly when it fires. - 2
Read opted-in contacts
A
Google Sheetsnode reads the list, and aFilterkeeps only rows whereopt_inisyesandstatusisn't alreadysent. This enforces consent and makes the run resumable if it stops partway. - 3
Send the template per contact
An
HTTP RequestPOSTs to the WhatsApp Cloud API/messageswithtype: template, your approved template name, language, and acomponentsarray mapping sheet columns (like first name) into the template variables. - 4
Pace the sends
A
Waitnode adds a short delay (e.g. 2–5 seconds) between contacts. This keeps you under WhatsApp's rate limits and protects your number's quality rating — critical for deliverability on future campaigns. - 5
Log delivery per row
A
Google Sheetsupdate node writessentand a timestamp back to each contact's row (orfailedwith the error onContinue on Fail). You end with a clear per-contact record and can safely re-run to catch any failures.
Frequently asked questions
Do I have to use a message template?
Yes — WhatsApp only allows business-initiated (outbound) messages via templates you've submitted and Meta has approved. Free-form text is only for replies within 24 hours of a customer message. The workflow sends an approved template and fills its variables per contact, which is the compliant way to broadcast.
How do I avoid getting my number flagged?
Two ways the workflow helps: it only messages contacts with an `opt_in` of yes in the sheet, and it adds a `Wait` between sends to stay under rate limits and look human. Blasting non-opted-in numbers is the fastest route to a quality-rating drop or ban — the opt-in filter is not optional.
How do I personalize each message?
Your template has numbered variables like {{1}} for first name. The workflow maps sheet columns into the template's `components` parameters per contact, so everyone gets their own name/detail. Keep personalization honest and relevant — templates get rejected or flagged if they read like spam.