Google Sheets to WhatsApp, broadcasts tracked as Sent
You queue up a WhatsApp broadcast, then the real headache starts. Who already got the message, which rows are still pending, and did anyone accidentally send the same template twice?
This Sheets WhatsApp automation hits marketing managers first (campaign lists get messy fast). But support leads and small business owners feel it too, especially when the spreadsheet becomes the “system of record” by default. The outcome is simple: send approved WhatsApp template messages in bulk and automatically mark each row as Sent so your list stays clean.
Below is the exact workflow logic, what it fixes, and how to run it safely without turning your outreach sheet into a guessing game.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets to WhatsApp, broadcasts tracked as Sent
flowchart LR
subgraph sg0["Trigger Every 5 Minute Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Fetch All Pending Queries fo..", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Change State of Rows in Sent1", 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/>Send Message to 100 Phone No1"]
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/code.svg' width='40' height='40' /></div><br/>Clean WhatsApp Number"]
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger Every 5 Minute", pos: "b", h: 48 }
n1 --> n2
n2 --> n3
n2 --> n5
n6 --> n0
n4 --> n2
n0 --> n1
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 n6 trigger
class n0,n3 database
class n5 code
classDef customIcon fill:none,stroke:none
class n4,n5 customIcon
The Challenge: Bulk WhatsApp Sends Without Losing Track
Sending WhatsApp messages from a spreadsheet sounds straightforward until you do it at volume. One person exports a list, another person edits the copy, and someone else starts sending, which means status updates happen “later” (or never). Then you get the worst mix: some leads complain they got duplicates, others say they never got anything, and your team is stuck reconciling rows instead of running the campaign. Even when you do remember to update the sheet, it’s easy to mark the wrong row, paste into the wrong place, or forget where you left off after an interruption.
It adds up fast. Here’s where it breaks down in real life.
- People re-send to the same number because the Status column wasn’t updated immediately.
- Formatting issues in the WhatsApp number field cause silent failures, so rows look “fine” but never deliver.
- Large sheets turn into risky “select all, copy, send” moments where one mistake can hit hundreds of contacts.
- When you throttle manually to avoid API limits, the process becomes slow and inconsistent across team members.
The Fix: Send WhatsApp Templates from Sheets and Auto-Mark “Sent”
This workflow turns your Google Sheet into a controlled broadcast queue. On a schedule, it checks the sheet for rows where the Status cell is empty, grabs a small batch, and processes each row one-by-one. Before sending anything, it cleans the WhatsApp number so the API receives a valid format (no spaces, brackets, or stray symbols). Then it sends a pre-approved WhatsApp template message through the WhatsApp Business Cloud API, using your row data for variables like Name and Message, and it can also attach an optional image header via the Image URL column. Once the API call succeeds, the workflow updates that exact row to “Sent,” so the list stays accurate without anyone babysitting it.
The workflow starts with a scheduled check, pulls only pending rows from Google Sheets, and limits how many get processed each run. It then normalizes the phone number, dispatches the template message, and finally writes back to the sheet to confirm the send.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you’re broadcasting to 200 contacts from a Google Sheet. Manually, you might spend about 1 minute per contact between copying details, checking if it was already sent, fixing number formatting, and updating the Status cell, which is roughly 3 hours of focused work. With this workflow, you add rows once, then the scheduled run processes 2 rows per execution automatically. You’ll still wait for sending in the background, but your hands-on time drops to about 10 minutes to prep the sheet and spot-check results.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store recipients, message fields, and status.
- WhatsApp Business Cloud API to send approved template messages.
- OAuth2 credentials (get them from Google Cloud and Meta for Developers).
Skill level: Intermediate. You won’t code an app, but you will connect accounts, confirm permissions, and paste a template ID correctly.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Scheduled check for pending rows. A schedule trigger runs automatically (the workflow description notes frequent polling). Each run looks for sheet rows where Status is blank so only unsent entries get picked up.
Batch control and safe pacing. A Limit step caps the number of rows processed per execution (2 by default). That pacing helps you stay inside API throughput guidelines and keeps failures from snowballing across a whole list.
Clean the data before sending. The workflow iterates through each row and sanitizes the WhatsApp number by stripping non-numeric characters. This simple cleanup prevents a surprising number of “why didn’t it send?” moments.
Send the template and write back “Sent.” n8n dispatches the WhatsApp template message via an HTTP/API-based WhatsApp node, optionally using the Image URL for a header. After a successful send, it updates the matching Google Sheets row to mark Status as Sent.
You can easily modify the batch size and schedule frequency to match your list size and sending policy. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Poll Trigger
Set the workflow schedule so it polls your sheet on a recurring basis.
- Add the Scheduled Poll Trigger node as your trigger.
- Configure the schedule in Scheduled Poll Trigger to match how often you want to send WhatsApp broadcasts.
- Connect Scheduled Poll Trigger to Retrieve Pending Sheet Rows.
Step 2: Connect Google Sheets
Pull pending rows and update them once messages are sent.
- Open Retrieve Pending Sheet Rows and select your spreadsheet and worksheet containing pending recipients.
- Credential Required: Connect your Google Sheets credentials.
- Open Mark Rows as Sent and configure it to update the same sheet with a “sent” status or timestamp.
- Credential Required: Connect your Google Sheets credentials for Mark Rows as Sent.
- Ensure Retrieve Pending Sheet Rows outputs to Cap Record Count.
Step 3: Set Up Batch Processing
Limit the number of records and iterate through each row for messaging and status updates.
- In Cap Record Count, set a maximum number of rows to process per run.
- Connect Cap Record Count to Batch Iterate Records.
- Configure Batch Iterate Records with your desired batch size to control throughput.
- Batch Iterate Records outputs to both Mark Rows as Sent and Normalize WhatsApp Digits in parallel.
- Confirm Dispatch WhatsApp Batch A loops back to Batch Iterate Records to continue processing the next batch.
Tip: If you see unexpected repeats, verify your Batch Iterate Records batch size and ensure the loop from Dispatch WhatsApp Batch A to Batch Iterate Records is intentional.
Step 4: Configure WhatsApp Processing and Sending
Normalize phone numbers and send WhatsApp messages for each batch.
- In Normalize WhatsApp Digits, implement your phone normalization logic to produce valid WhatsApp numbers.
- Connect Normalize WhatsApp Digits to Dispatch WhatsApp Batch A.
- Configure Dispatch WhatsApp Batch A with your message template, recipient field, and any media or parameters.
- Credential Required: Connect your WhatsApp credentials in Dispatch WhatsApp Batch A.
⚠️ Common Pitfall: If numbers are not in the correct international format, WhatsApp delivery will fail. Validate your output in Normalize WhatsApp Digits.
Step 5: Test and Activate Your Workflow
Run a controlled test before enabling the workflow in production.
- Click Execute Workflow and verify Retrieve Pending Sheet Rows pulls the expected rows.
- Confirm Dispatch WhatsApp Batch A sends a message and Mark Rows as Sent updates the sheet.
- Check that Batch Iterate Records continues through remaining items without errors.
- Once the test succeeds, switch the workflow to Active to enable scheduled runs.
Watch Out For
- Google Sheets credentials can expire or lose permission after a password change. If rows stop updating, check the n8n Credentials screen and re-auth your Google Sheets OAuth2 connection 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.
- WhatsApp Business Cloud API template variables are strict, and the Meta side must match what you send. If your template expects {{1}} and {{2}}, but your workflow maps fields differently, you’ll get send failures that look like “bad request.” Also, default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
Usually about an hour if your WhatsApp template is already approved.
Yes. No coding is required, but someone needs to be comfortable connecting Google and Meta credentials in n8n.
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 Business Cloud API messaging costs based on your region and template category.
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.
You can adjust throughput by changing the workflow’s Limit step, and you can change the schedule trigger to run every 5 minutes instead of constantly polling. The “Normalize WhatsApp Digits” step is also a common customization point if your numbers include country codes inconsistently. Most teams also add an extra branch to set Status to Failed when the send node returns an error, so nothing gets stuck in limbo.
Usually it’s an expired token, the wrong WhatsApp Business account, or a template mismatch. Regenerate or re-connect your Meta/WhatsApp credentials in n8n, then confirm the template name/ID is approved in the Meta Developer Portal. If it fails only on some rows, check the number cleaning result and make sure the final value includes the correct country code.
With the default settings, it processes 2 rows per scheduled run, and you can raise that limit when you’re confident in deliverability and policy compliance.
Often, yes, if you need batching, queue-like behavior, and reliable “write back to the row that triggered the send.” n8n makes it easier to cap volume (like this workflow’s 2-at-a-time design) and to insert logic that keeps your Google Sheet as the single source of truth. It also gives you a self-hosting option, which matters when your sends run frequently. Zapier or Make can be quicker for a simple one-off message, but the moment you need “only send rows where Status is empty” plus a clean update to “Sent,” you end up fighting edge cases. If you’re on the fence, Talk to an automation expert and we’ll help you pick the simplest safe path.
Once “Sent” is handled automatically, your Google Sheet stops being a liability and starts acting like a proper broadcast queue. Set it up, let it run, and get back to the work that actually moves results.
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.