When should you send WhatsApp messages from Google Sheets?
The ability to send WhatsApp message from Google Sheets rows makes sense when the sheet is already where your team keeps the list: bookings, fee dues, delivery runs, event registrations or service visits. If people update rows every day anyway, the sheet can also be the thing that tells customers what changed.
Typical examples: a coaching centre with a fee sheet that should remind parents three days before the due date; a clinic whose receptionist types tomorrow’s appointments into a sheet each evening; a small distributor whose dispatch clerk marks “Shipped” and wants the retailer told immediately; a wedding caterer whose event sheet should confirm menus a week ahead.
It stops making sense when the sheet has several thousand active rows edited by many people at once, when you need two-way conversations handled by agents, or when the data really belongs in a database. At that point a WhatsApp CRM or a small custom app is the better home, and we tell you so rather than stretching a spreadsheet.
Good signs
One sheet, a clear status column, messages that follow a row change, a few hundred sends a day at most.
Warning signs
Many editors typing at once, messages that need human replies, or formulas so heavy the sheet takes seconds to open.
What you need before you can send WhatsApp messages from Google Sheets
To send WhatsApp message from Google Sheets through the official route, you need four things: a Google account that owns the sheet, a number on Meta’s WhatsApp Business Platform, at least one approved message template, and an access token the script can use. The free WhatsApp Business app is not enough, because it has no API.
On the Meta side, a WhatsApp Business Account sits inside your business portfolio with a registered phone number. Many businesses register a separate number for automated messages so their everyday chat number stays on the WhatsApp Business app, untouched. Templates are submitted through WhatsApp Manager and approved by Meta before use.
On the Google side, the script lives in the sheet (Extensions › Apps Script) and runs under the account of whoever installs its triggers. For a business, that should be a shared operations account, not a staff member’s personal Gmail, so the automation does not stop when someone leaves.
- Google Sheet with one row per message-worthy event
- WhatsApp Business Platform number in your own Meta business portfolio
- Approved template(s) with variables that match your columns
- A permanent system-user token stored in Script Properties, not in the sheet
- A decision on who owns the Google account the triggers run under
Designing the sheet to send WhatsApp message from Google Sheets reliably
Give the script a fixed layout: one header row, stable column names, a phone column in international format, the variable columns, and a small group of columns the script owns for status. Most broken sheet automations fail because someone inserted a column or typed a number with spaces.
We read columns by header name rather than by position, so moving a column does not break sending. The phone column is normalised by the script (digits only, country code added when a ten-digit Indian number is found), and rows with invalid numbers are marked “Check number” instead of silently skipped.
Script-owned columns are protected with Google Sheets range protection so staff cannot overwrite them by accident. They hold the WhatsApp message ID, the status, the time of the last update and any error text from Meta. That small block is what turns a fire-and-forget script into something you can trust. The table further down shows a typical layout.
How Apps Script sends a WhatsApp message from Google Sheets
The script reads rows that are ready to send, builds a JSON request for Meta’s Cloud API messages endpoint with the template name, language and parameters, and posts it with UrlFetchApp. The response contains a message ID, which the script writes back to the row.
A careful sender does a few more things. It takes a script lock (LockService) so two triggers never process the same rows at once. It marks a row “Sending” before the call and “Sent” after, so a timeout does not cause a duplicate. It reads the token from Script Properties, never from a cell. It sets muteHttpExceptions so Meta’s error body can be recorded instead of crashing the run. And it stops cleanly when close to the execution time limit, leaving the remaining rows for the next run.
Here is the flow in plain steps. Our Google Apps Script developer page covers the same approach for other sheet automations.
- Acquire a script lock; exit if another run holds it
- Find rows where Status is empty and Send date is today or earlier
- Normalise the phone number; flag invalid ones
- Build template parameters from the mapped columns
- Mark the row Sending, call the API, record message ID or error
- Pause briefly between calls and stop before the time limit
Mapping sheet columns to WhatsApp template variables
When you send WhatsApp message from Google Sheets, each variable in an approved template, written as {{1}}, {{2}} and so on, is filled from one column or formula in the sheet. The wording around the variables is fixed at approval; only the values change per row.
Say your template reads “Hi {{1}}, your appointment at {{2}} is on {{3}} at {{4}}. Reply YES to confirm.” The script maps {{1}} to First name, {{2}} to Branch, {{3}} to a formatted date and {{4}} to Time. Dates need care: a Google Sheets date cell is a date object, so we format it explicitly (for example “Tue, 14 Oct”) using the sheet’s time zone, otherwise the message can show a long timestamp.
Empty cells are the other trap. Meta rejects a template send with a missing parameter, and a blank name produces an awkward message. We set rules per variable: use a default (“there” instead of a name), skip the row and flag it, or fetch a value from another tab. When different rows need different wording, such as first reminder versus final reminder, a “Template” column tells the script which approved template to use.
Scheduled or on-edit: which trigger should send WhatsApp message from Google Sheets?
Use a time-driven trigger for most sending, because it is predictable and batches work; use an installable on-edit or form-submit trigger only when a message must go out within seconds of a change.
Google’s Apps Script documentation sets clear limits on simple triggers: they cannot access services that require authorisation and cannot run longer than 30 seconds. Calling an external API needs authorisation, so a plain onEdit function is the wrong tool for sending WhatsApp messages. An installable edit trigger, created once by the account owner, can call the API.
Another rule from the same documentation catches many people out: script executions and API requests do not cause triggers to run. If another script or an integration writes “Shipped” into a cell, the edit trigger will not fire. That is a strong reason to prefer a time-driven trigger that checks for rows needing a message every few minutes, whoever or whatever changed them.
Our usual pattern: a five- or ten-minute time trigger does the sending; an installable form-submit trigger handles instant confirmations; a custom menu item lets staff resend a single row by hand. The trigger comparison table below lays out the trade-offs.
Writing WhatsApp delivery status back to the sheet
The API response only tells you Meta accepted the message; delivered, read and failed arrive later as webhook events. To show them in the sheet, something has to receive those webhooks and update the right row using the message ID.
Apps Script can publish a web app that accepts POST requests, and some people point Meta’s webhook straight at it. For production we prefer a small relay, usually a serverless function on your cloud account, which answers Meta’s verification request, checks the signature header, responds quickly, and then updates the sheet through the Google Sheets API. It keeps the webhook reliable when the sheet is slow or locked.
The relay finds the row by the stored message ID and writes the status and time. “Failed” rows also get Meta’s error code in plain words, such as “number not on WhatsApp” or “template parameter missing”, so staff know whether to call the customer or fix the data. A simple conditional format colours failed rows red, and a filter view shows everything still undelivered after an hour.
Staying within Google and WhatsApp rate limits
Two sets of limits apply whenever you send WhatsApp message from Google Sheets: Google’s Apps Script quotas on how long and how often your script runs, and Meta’s limits on how many people and how fast your number can message. A well-built sender respects both without anyone thinking about them.
Google’s published quotas give consumer accounts 20,000 URL Fetch calls a day and Google Workspace accounts 100,000. Each execution can run for up to 6 minutes, and total trigger runtime is capped at 90 minutes a day for consumer accounts and 6 hours for Workspace. So a sheet sending a few hundred messages a day is comfortable on either, while thousands of daily sends belong on Workspace or on a proper server.
On the WhatsApp side, Meta’s documentation says a business number can send up to 80 messages per second by default and one message every six seconds to the same user. More important for most sheets is the messaging limit: a new business portfolio can reach 250 unique people in a moving 24-hour window outside customer service windows, rising in steps to 2,000, 10,000, 100,000 and unlimited, shared across all numbers in the portfolio.
In practice we cap each run (for example 150 rows), spread large batches over several runs, and stop sending for the day when the script sees limit errors, writing “Limit reached, will retry” so nobody panics.
How much does it cost to send WhatsApp messages from Google Sheets?
The script itself costs nothing to run on Google’s side; the running cost is Meta’s per-message charge on each delivered template, plus the one-time build. BtechWaleTech builds sheet senders from ₹40,000.
Meta’s pricing documentation says it has charged per delivered template message since 1 July 2025, with separate rates for marketing, utility and authentication categories, and volume tiers that lower utility and authentication rates as monthly volume grows. Utility templates delivered while a customer service window is open are free, as are replies inside that window.
Most sheet-driven messages, like reminders, confirmations and status changes, are utility messages if written factually. Adding a discount to a reminder can push it into marketing, which usually costs more. Keep them separate. For current per-message rates and INR billing details, see our WhatsApp Business API cost guide.
Consent, opt-outs and not getting your number restricted
Before you send WhatsApp message from Google Sheets to anyone, confirm they agreed to hear from you, and give them an easy way to stop. Meta’s opt-in guidance asks businesses to state clearly that the person is opting in to receive communication and to name the business, and to honour opt-out requests.
In the sheet that becomes an “Opted in” column (with date and source) and an “Opted out” column the script always checks. When a customer replies STOP, the webhook relay can mark that number as opted out across every tab. Rows without consent are skipped and labelled, never sent.
The fastest way to damage a number is to paste an old contact list into a sheet and fire a promotional template at everyone. Blocks and reports lower your quality rating and can shrink your messaging limit. Sheets are good at bulk; that is exactly why they need guard rails. For planned bulk campaigns, our WhatsApp bulk message API page explains safer ways to run them.
Apps Script, no-code connectors or a server: choosing your approach
Choose Apps Script when the sheet is the source of truth and volumes are moderate; choose a no-code connector when you want to set it up yourself and accept a monthly fee; choose a small server app when volumes, editors or two-way chat outgrow the sheet.
No-code tools such as Zapier, Make or n8n can watch a sheet and call the WhatsApp API. They are quick to start and easy for non-developers to change. The trade-offs are per-task pricing on hosted plans, delays between polls, and limited control over locking and retries.
Apps Script lives inside Google, costs nothing extra and handles row-level logic well, but someone must maintain code. A server app, whether Node, Python or Laravel, handles high volume, queues and agent inboxes, but it is a bigger build. We are happy to recommend the lighter option when it fits.
How long does a Google Sheets to WhatsApp automation take?
To send WhatsApp message from Google Sheets in production, plan for two to four weeks, most of which is WhatsApp account setup, template approval and a test period with real rows. The Apps Script part is usually done within the first week.
A realistic plan: days 1–4 for sheet review, template wording and submission; days 3–8 for the sender script, locks and status columns; days 7–12 for the webhook relay and write-back; days 10–18 for testing with your own numbers and then a small group of real customers; and handover with a short video walkthrough. If your WhatsApp Business Platform number is already live with templates approved, it can be shorter.
Common mistakes when sending WhatsApp messages from a sheet
These are the problems we are most often asked to fix in sheet senders someone else built, or that a staff member put together from a tutorial to send WhatsApp message from Google Sheets.
- Access token typed into a cell, visible to anyone with the sheet link
- A simple onEdit function trying to call the API and failing silently
- No lock, so two runs send the same reminder twice
- Dates sent as long timestamps because the cell format was ignored
- Status written only as “Sent”, hiding the numbers that never received it
- Triggers owned by an employee’s personal account that later gets deleted
- Browser-based senders that got the business number banned
If you already have a sheet sender with some of these issues, we can review and repair it rather than rebuild from scratch, under automation support or a small fixed-scope quote.
Worked example: fee reminders from a hypothetical coaching centre sheet
Say a coaching centre in Kanpur keeps a Google Sheet with student name, parent’s mobile, batch, fee due date, amount due and a “Paid” checkbox. The accountant chases payments by phone every month. This is a made-up scenario to show the setup, not a client story.
We would submit two utility templates in Hindi and English: a gentle reminder three days before the due date and a follow-up two days after. A time-driven trigger runs every morning at 10, picks rows where Paid is unchecked, the due date matches the rule and the parent has opted in, and sends the right template with the student’s name, batch, amount and due date filled in.
A relay writes delivered and read back to the sheet. When the accountant ticks Paid, the next morning’s run simply skips that row. Failed rows turn red with the reason, so the accountant calls only those families. Parents who reply are handled from the WhatsApp Business inbox by a person.
After two cycles, the sheet itself shows how many reminders were delivered and read before payment, which tells the centre whether a third reminder is worth it. For a deeper version of this flow, see WhatsApp payment reminder automation.
Google Sheets to WhatsApp automation across India
Businesses that send WhatsApp message from Google Sheets are everywhere: Google Sheets is the working system for thousands of small Indian businesses, and WhatsApp is where their customers read messages. We work remotely with owners and operations staff anywhere in the country.
Coaching centres and schools in Kanpur, Varanasi and Ranchi send fee and class reminders. Exporters and garment units in Tiruppur and Jalandhar track orders in shared sheets. Hotels and tour desks in Udaipur and Jodhpur confirm bookings. Clinics and labs in Madurai and Vijayawada send appointment and report-ready alerts, often in Tamil or Telugu templates.
Wherever you are, the process runs over WhatsApp and screen-share calls in English or Hindi, and the sheet, script and number stay in your accounts.
Checklist before you send WhatsApp messages from Google Sheets to customers
Go through this list once before you send WhatsApp message from Google Sheets to real customers for the first time. It takes ten minutes and prevents nearly every embarrassing mistake.
- Templates approved in the languages your customers read
- Phone column normalised and invalid numbers flagged, not skipped
- Opt-in and opt-out columns present and checked by the script
- Token stored in Script Properties; sheet sharing reviewed
- Triggers installed from the shared business Google account
- Lock and “Sending” state tested by running two triggers together
- Per-run cap set and limit errors handled gracefully
- Status write-back tested for delivered, read and failed
- A test tab with your own numbers for any template change