Marketing · n8n

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.

difficulty Advancedsetup 65 minresult A personalized WhatsApp template lands with every opted-in contact in your sheet, delivery logged row by row
  1. 1

    Trigger the broadcast

    Use a Manual Trigger (run it when you're ready) or a Schedule Trigger for recurring campaigns. Manual is safest for one-off blasts so you control exactly when it fires.

  2. 2

    Read opted-in contacts

    A Google Sheets node reads the list, and a Filter keeps only rows where opt_in is yes and status isn't already sent. This enforces consent and makes the run resumable if it stops partway.

  3. 3

    Send the template per contact

    An HTTP Request POSTs to the WhatsApp Cloud API /messages with type: template, your approved template name, language, and a components array mapping sheet columns (like first name) into the template variables.

  4. 4

    Pace the sends

    A Wait node 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. 5

    Log delivery per row

    A Google Sheets update node writes sent and a timestamp back to each contact's row (or failed with the error on Continue 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.

About this recipe. Recipes on FlowRecipesHub are written for business owners, not developers, and are tested before publishing — how recipes get made. Some ingredient links are affiliate links that cost you nothing — full disclosure.