How to Connect Google Sheets to WhatsApp Without Paying for Zapier
Connect Google Sheets to WhatsApp without Zapier using Apps Script and Meta's WhatsApp Cloud API. Free to set up; costs depend on message type. Steps and code.
Quick answer: Use Google Apps Script to call Meta's WhatsApp Cloud API when a row in your sheet changes. Free? Setup is free; sending can cost money depending on the message type. Time: about 30 to 45 minutes, plus template approval, which can take up to 24 hours.
You do not need Zapier. Apps Script is built into Google Sheets, and Meta's Cloud API accepts a plain web request. The only real cost is WhatsApp's own per-message pricing, which Meta says has been charged per delivered message since 1 July 2025.
What do you need before you start?
You need four things:
- A Google account and a Google Sheet with phone numbers in international format (for example
+14155550123). - A Meta developer account and a Meta app with the WhatsApp product added.
- A WhatsApp Business phone number. For testing, Meta's API Setup page provides a test number.
- Permission to message each person. WhatsApp's policy says you may only contact people who gave you their number and opted in.
Keep three values handy: your Phone number ID, an access token, and the name of an approved message template. The sections below show where each one comes from.
How do you connect Google Sheets to WhatsApp for free? (Method 1: Apps Script)
This is the free route. Your sheet triggers a script, and the script sends a request to the WhatsApp Cloud API. Follow the steps in order.
Step A: Get your WhatsApp credentials
- In the Meta App Dashboard, open your app, then go to Customize use case, Connect on WhatsApp, Quickstart, Start using the API. This opens the API Setup page, as Meta's guide describes.
- Note your test phone number ID and your WhatsApp Business account ID. Meta tells you to keep both for later use.
- Click Generate access token to get a temporary token for testing. Meta says this kind of token expires quickly, so you will need a new one every few hours.
- For a token that lasts, open Business Settings and click System users. Click Add+ and create a system user.
- Select that user and click Assign Assets. Select your app and toggle Manage app under Full control. Select your WhatsApp account and toggle Manage WhatsApp Business accounts under Full control.
- Click Generate token and add the permissions
business_management,whatsapp_business_messagingandwhatsapp_business_management.
Step B: Create and approve a template
Meta says templates are the only type of message you can send to someone outside a customer service window. A template must have the status APPROVED before you can send it. Create one in WhatsApp Manager with a body such as Hi {{1}}, your order {{2}} is ready. and wait for approval.
Pick the category honestly. Meta treats mixed or unclear templates as marketing, and marketing templates cost more than utility ones.
Step C: Add the script to your sheet
- Open your Google Sheet.
- Click Extensions > Apps Script.
- Delete the sample code and paste the script below.
- Replace the three placeholders at the top:
PHONE_NUMBER_ID,ACCESS_TOKENandTEMPLATE_NAME. - Click Save project.
The script assumes column A holds the name, column B holds the phone number with country code, column C holds an order or reference code, and column D holds a status. When you type Send in column D, it sends the template to that row and writes the result back to column E.
// Placeholders: never share real values or paste them into public places.
const PHONE_NUMBER_ID = 'YOUR_PHONE_NUMBER_ID';
const ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';
const TEMPLATE_NAME = 'your_approved_template_name';
const LANGUAGE_CODE = 'en_US';
const API_VERSION = 'v25.0';
// Run this from an installable trigger (see Step D), not a simple onEdit.
function onSheetEdit(e) {
const range = e.range;
const sheet = range.getSheet();
// Only react when a single cell in column D (status) is set to "Send".
if (range.getColumn() !== 4 || range.getNumRows() !== 1) return;
if (String(range.getValue()).trim() !== 'Send') return;
const row = range.getRow();
if (row === 1) return; // skip the header row
const name = String(sheet.getRange(row, 1).getValue());
const phone = String(sheet.getRange(row, 2).getValue()).replace(/\s+/g, '');
const reference = String(sheet.getRange(row, 3).getValue());
const result = sendTemplate_(phone, name, reference);
sheet.getRange(row, 4).setValue(result.ok ? 'Sent' : 'Failed');
sheet.getRange(row, 5).setValue(result.message);
}
function sendTemplate_(to, name, reference) {
const url = 'https://graph.facebook.com/' + API_VERSION + '/' + PHONE_NUMBER_ID + '/messages';
const payload = {
messaging_product: 'whatsapp',
recipient_type: 'individual',
to: to,
type: 'template',
template: {
name: TEMPLATE_NAME,
language: { code: LANGUAGE_CODE },
components: [
{
type: 'body',
parameters: [
{ type: 'text', text: name },
{ type: 'text', text: reference }
]
}
]
}
};
const response = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + ACCESS_TOKEN },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const code = response.getResponseCode();
const body = response.getContentText();
return { ok: code >= 200 && code < 300, message: 'HTTP ' + code + ': ' + body.substring(0, 200) };
}
The request shape (POST to /{Version}/{Phone-Number-ID}/messages, a Bearer token and a JSON body with "type": "template") comes from Meta's reference and template guide. The options method, contentType, headers, payload and muteHttpExceptions are documented in Google's UrlFetchApp reference. Meta's own samples show version v25.0 on its send-messages page and v23.0 on its get-started page, so set API_VERSION to a version you have checked in the current docs.
Step D: Add an installable trigger
A plain onEdit function is a simple trigger and cannot use services that need authorization. An installable trigger can call those services, so use one.
- In the Apps Script editor, click Triggers on the left.
- Click Add Trigger at the bottom right.
- Choose
onSheetEditas the function to run. - Set the event to the spreadsheet edit event. Verify this step: the dropdown labels may differ from what is written here.
- Click Save and approve the permissions prompt, which includes permission to connect to an external service.
- In your sheet, put a test number in column B, then type
Sendin column D of that row.
Google describes an edit trigger as one that runs when a user modifies a value in a spreadsheet.
Is there a no-code alternative? (Method 2: Make's WhatsApp Business Cloud app)
Yes. Make has a native app. Make says its WhatsApp Business Cloud app lets you monitor events, send a message and send template messages. It needs a Facebook account, a Meta Business Suite account and a valid WhatsApp Business number.
The outline: create a scenario, add a Google Sheets module that watches for new rows, add a WhatsApp Business Cloud module that sends a template message, and map the sheet columns to the template parameters. Follow Make's on-screen prompts and confirm each module against its help pages.
As of 12 October 2026, Make's pricing page says the Free plan includes 1000 credits per month and that most actions use 1 credit each. Make's WhatsApp Business Cloud app page also says its legacy WhatsApp connection type is supported only until April 2027.
Zapier is not the only paid option, but it is the one the question names. As of 12 October 2026, Zapier's pricing page lists 100 tasks a month on the Free plan, two-step Zaps only, and no premium apps. Check Zapier's app directory to see whether its WhatsApp app is available on your plan.
Which method should you choose?
Pick Apps Script if you are comfortable pasting code and want no extra account. Pick Make if you prefer a visual builder. Prices as of 12 October 2026.
| Method | Cost | Difficulty | Limits | Best for |
|---|---|---|---|---|
| Apps Script + Cloud API | Free tooling; WhatsApp per-message fees apply | Medium (paste code, set trigger) | 20,000 URL Fetch calls/day (consumer), 100,000 (Workspace); 6 min per run | Sheets-first users who want full control |
| Make + WhatsApp Business Cloud | Free plan: 1000 credits/month; WhatsApp fees apply | Easy to medium | Credits run out quickly on large sheets | People who prefer a visual builder |
| Zapier | Free plan: 100 tasks/month, two-step Zaps | Easy | No premium apps on Free | Very small, simple jobs |
What's free and what costs money?
Setup is free, but sending is not always free. Here is the pricing logic from Meta's pricing page, as of 12 October 2026.
| Message type | Cost |
|---|---|
| Non-template messages inside an open 24-hour customer service window | Free |
| Utility templates delivered inside an open customer service window | Free |
| Utility templates outside the window | Charged |
| Marketing templates | Always charged |
| Any message inside an open free entry point window (from a Click to WhatsApp ad or Facebook Page button) | Free for 72 hours |
Rates depend on the template category and the recipient's country calling code. Meta publishes them in downloadable rate cards, which it says reflect rates effective 1 July 2026, and it changes prices only on the first day of a quarter. Look up your countries there before you send in bulk.
A customer service window starts when a user messages or calls you, and resets to 24 hours each time they message again. When it closes, you can only send approved templates.
For Google's side, URL Fetch quotas are 20,000 calls a day on consumer accounts and 100,000 on Google Workspace accounts, and a script runs for up to 6 minutes per execution. Google says quotas can change without notice, so check the quotas page.
What can go wrong, and how do you fix it?
- HTTP 401 or an "invalid OAuth access token" message. Your temporary token expired. Meta says it expires quickly. Generate a system user token as shown in Step A.
- A template error or "template not found". The template must be
APPROVED, and the name and language code in your script must match it exactly. - The message is not delivered to a test number. Add the recipient as a To number in the API Setup page first. Verify this step: the exact wording of the recipient setup may differ in your dashboard.
- The script asks for authorization or does nothing. You used a simple
onEdit. Switch to the installable trigger in Step D. - Nothing happens when you fill many rows at once. The script ignores edits that span several cells. Paste-fills are skipped on purpose; set
Sendone row at a time or loop over rows in a custom function. - Your send limit is reached. New business portfolios have a messaging limit of 250 unique users per moving 24 hours outside a customer service window. Meta says it can rise to 2,000 through verification.
Is this allowed?
Using the official WhatsApp Business Platform is allowed. Automating your personal WhatsApp account is not.
- Unofficial automation. WhatsApp's Terms of Service prohibit sending "bulk messaging, auto-messaging, auto-dialing, and the like" and non-personal use unless WhatsApp authorizes it. The terms say WhatsApp may disable or suspend the account of anyone who violates them. Do not link a sheet to a personal number through unofficial tools.
- Opt-in. The Business Messaging Policy (last updated 23 September 2026) says you may only contact people who gave you their number and gave opt-in permission. It also says you must respect requests to block or opt out.
- Templates first. The same policy says you may only start conversations using an approved message template.
- Enforcement. The policy says WhatsApp may limit or remove your access, or limit how many messages you can send, if you get significant negative feedback or violate its terms.
- Your local laws. The policy puts responsibility for lawful opt-in on you. Marketing rules such as the US TCPA or email-style consent laws in your country may apply. Ask a lawyer if you message at scale.
What is the weakest point of this method?
- Maintenance. Apps Script is free, but you maintain the code, the token and the template yourself. If a script breaks at 3am, nothing alerts you. For anything customer-critical, add logging to the sheet (the script above writes the API response to column E) and check it daily.
Last checked: 12 October 2026. This guide is based on vendor documentation, and the steps have not been run end to end by the author.
Frequently asked questions
Can I connect Google Sheets to WhatsApp for free?
Setup is free: Apps Script costs nothing and Meta gives you a test number in the API Setup page. Sending costs depend on message type. As of 12 October 2026, Meta says all non-template messages are free inside an open 24-hour customer service window, and marketing templates are always charged. Rates vary by country.
Do I need a Zapier account to send WhatsApp messages from a sheet?
No. You can call the WhatsApp Cloud API directly from Google Apps Script, or use Make's native WhatsApp Business Cloud app. As of 12 October 2026, Zapier's Free plan allows 100 tasks a month and two-step Zaps only, so Apps Script or Make suits larger sheets better.
Can I use my personal WhatsApp number to send messages from a sheet?
Not safely. WhatsApp's Terms of Service prohibit bulk messaging, auto-messaging and auto-dialing, and say WhatsApp may disable or suspend an account that violates its terms. The sanctioned route for automation is the WhatsApp Business Platform, which this guide uses.
Why does my message fail with a template error?
Templates must have the status APPROVED before they can be sent, and the template name and language code in your script must match the approved template exactly. Meta says reviews of templates that are in review can take up to 24 hours.
How many people can I message per day?
Meta says newly created business portfolios have a messaging limit of 250 unique users per moving 24-hour period for messages sent outside a customer service window. The limit can rise to 2,000 through business verification or by sending high-quality template messages to 2,000 unique users in 30 days.
Do recipients need to agree to get my messages?
Yes. WhatsApp's Business Messaging Policy says you may only contact people who gave you their number and gave opt-in permission to receive messages from you. Keep a record of how and when each person agreed, and stop messaging anyone who opts out.
Sources
- Send messages (WhatsApp Cloud API), Meta for Developers (2026-10-12)
- Get started with the WhatsApp Cloud API, Meta for Developers (2026-10-12)
- Templates overview, Meta for Developers (2026-10-12)
- Template categorization, Meta for Developers (2026-10-12)
- WhatsApp Business Platform pricing, Meta for Developers (2026-10-12)
- Messaging limits, Meta for Developers (2026-10-12)
- Access tokens, Meta for Developers (2026-10-12)
- UrlFetchApp reference, Google for Developers (2026-05-15)
- Installable triggers, Google for Developers (2026-09-03)
- Apps Script quotas, Google for Developers (2026-09-03)
- WhatsApp Business app in Make, Make (2026-10-12)
- Make pricing, Make (2026-10-12)
- Zapier pricing, Zapier (2026-10-12)
- WhatsApp Business Messaging Policy, WhatsApp (2026-09-23)
- WhatsApp Terms of Service, WhatsApp (2021-01-04)