Google Sheets + Rapiwa: cleaner WhatsApp campaigns
Your WhatsApp outreach looks simple until you do it at scale. A few bad numbers, a few duplicate sends, one messy spreadsheet, and suddenly you’re spending your morning chasing “who got what” instead of following up with real leads.
This WhatsApp campaign automation hits marketers first, but small business owners and busy agency operators feel it too. You get cleaner lists, fewer failed sends, and a sheet that updates itself as messages go out.
Below you’ll see the workflow in action, what it fixes, and how to set it up so your Google Sheet becomes your WhatsApp campaign control panel.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Google Sheets + Rapiwa: cleaner WhatsApp campaigns
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:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger Every 5 Minute", 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/code.svg' width='40' height='40' /></div><br/>Clean WhatsApp Number"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Send Message Using Rapiwa"]
n6["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Check valid whatsapp number .."]
n7@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Change State of Rows in Veri..", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Change State of Rows in Unve..", pos: "b", h: 48 }
n8 --> n5
n8 --> n10
n7 --> n1
n2 --> n1
n1 --> n4
n4 --> n6
n3 --> n0
n5 --> n9
n9 --> n7
n0 --> n2
n6 --> n8
n10 --> n7
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 n3 trigger
class n8 decision
class n0,n9,n10 database
class n5,n6 api
class n4 code
classDef customIcon fill:none,stroke:none
class n4,n5,n6 customIcon
Why This Matters: Bulk WhatsApp Outreach Gets Messy Fast
Bulk WhatsApp messaging usually starts as “just send this list a quick update.” Then the list grows. Someone pastes numbers with spaces, parentheses, or a leading +. A few contacts aren’t even on WhatsApp, so your sends fail and you don’t notice until you’re wondering why replies are low. Worst part: tracking becomes a human job. You end up scrolling rows, filtering, re-sending, and hoping you didn’t message the same person twice. It’s not hard work. It’s draining work.
The friction compounds. Here’s where things typically break down.
- Manual sending turns into hours once you have 50+ contacts, especially if you personalize even slightly.
- Bad number formatting causes preventable API failures, and you only find out after the campaign is already running.
- Without automatic status updates, follow-ups become guesswork and leads slip through the cracks.
- When you can’t reliably separate “sent” from “not sent,” duplicate outreach becomes way too easy.
What You’ll Build: Google Sheets to WhatsApp Sends With Verification
This workflow turns a simple Google Sheet into a controlled WhatsApp sending system using the Rapiwa API (an unofficial WhatsApp integration that sends from your own number). Every 5 minutes, n8n pulls rows marked Status = pending. Each phone number is cleaned up first, so formatting issues don’t sabotage the run. Then the workflow checks if that number is a real WhatsApp user. If it is, n8n sends the message through Rapiwa and marks the row as sent and verified. If it isn’t, it skips sending and updates the row as not sent and unverified. A short wait between messages helps avoid rapid-fire sending and keeps campaigns steadier.
The workflow starts on a schedule, not a manual button press. From there it batches a manageable number of rows, validates each contact, then sends and writes back results to the same spreadsheet. You end up with a living campaign tracker you can trust.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you run a weekly promo to 200 contacts. Manually, even a quick copy/paste routine can take about 1 minute per person once you factor in searching, checking names, and tracking who’s done, which is roughly 3 hours. With this workflow, you update the sheet once, set Status to pending, and let it run. If you process 5 contacts per cycle with a short wait between sends, you’ll usually clear the batch in under an hour of background time, with almost no hands-on work besides reviewing results and replies.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for contacts, messages, and statuses
- Rapiwa to send WhatsApp messages from your number
- Rapiwa API key (get it from your Rapiwa dashboard)
Skill level: Beginner. You’ll connect accounts, paste an API key, and map a few spreadsheet columns.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A 5-minute schedule trigger kicks things off. n8n wakes up automatically and looks for rows you marked as pending, so you don’t have to remember to “run a campaign.”
Google Sheets rows are pulled and limited to a safe batch. The workflow grabs your sheet data, caps how many messages it will try in a single run, then processes contacts in small chunks. That keeps runs stable and makes it easier to control sending speed.
Each phone number is cleaned, then verified with Rapiwa. A short code step removes spaces and symbols, then an HTTP request checks if the number is actually reachable on WhatsApp. If it passes, the send request goes out; if not, the workflow skips messaging that contact.
Your sheet becomes the source of truth. Every contact gets a status update in Google Sheets (sent/not sent and verified/unverified), and a short wait happens before moving to the next record.
You can easily modify batch size and the wait duration based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set up the workflow to run on a recurring schedule to fetch pending WhatsApp messages.
- Add and open Five-Minute Schedule.
- In Rule, set the interval to
minutesso it triggers every five minutes. - Connect Five-Minute Schedule to Retrieve Pending Messages.
Step 2: Connect Google Sheets
Pull queued messages from a spreadsheet and update their delivery status after processing.
- Open Retrieve Pending Messages and set Document to
WhatsApp Bulk Messaging via Unofficial API. - Set Sheet to
Message Queueand apply the filter on Status as needed. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Pending Messages.
- Open Mark Verified as Sent and confirm Operation is
updatewith row_number set to{{ $('Cap Batch Size').item.json.row_number }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Mark Verified as Sent.
- Open Mark Unverified as Unsent and confirm Operation is
updatewith row_number set to{{ $('Cap Batch Size').item.json.row_number }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Mark Unverified as Unsent.
Step 3: Set Up Batch Processing & Normalization
Limit processing volume and ensure WhatsApp numbers are clean before verification.
- In Cap Batch Size, set Max Items to
60. - Connect Retrieve Pending Messages → Cap Batch Size → Iterate Records.
- In Iterate Records, keep the default batch behavior to process items one-by-one.
- Open Normalize WhatsApp Number and keep the JavaScript Code that cleans non-numeric characters from
WhatsApp No. - Connect Iterate Records to Normalize WhatsApp Number.
WhatsApp No so the normalization script updates the correct field.Step 4: Configure Verification, Routing, and Sending
Verify each number using Rapiwa, route based on validity, and send messages only to verified recipients.
- Open Verify WhatsApp Number and set URL to
=https://app.rapiwa.com/api/verify-whatsappwith MethodPOST. - Enable Send Body and set the number parameter to
{{ $json["WhatsApp No"] }}. - Credential Required: Connect your httpBearerAuth credentials in Verify WhatsApp Number.
- In Validation Branch, ensure the condition checks
{{ $json.data.exists }}with the boolean operatortrue. - Validation Branch outputs to both Dispatch WhatsApp via Rapiwa (true) and Mark Unverified as Unsent (false).
- Open Dispatch WhatsApp via Rapiwa and set URL to
https://app.rapiwa.com/api/send-messagewith MethodPOST. - Set query parameters: number to
{{ $json.data.number }}, message to{{ $('Normalize WhatsApp Number').item.json.Message }}, imageUrl to{{ $('Normalize WhatsApp Number').item.json["Image URL"] }}, and message_type totext. - Credential Required: Connect your httpBearerAuth credentials in Dispatch WhatsApp via Rapiwa.
- Connect Dispatch WhatsApp via Rapiwa → Mark Verified as Sent.
{{ $json.data.exists }} and {{ $json.data.number }} expressions will fail—verify API response structure in a test run.Step 5: Add Throttling Between Sends
Control message cadence to avoid API rate limits and allow batch iteration.
- Open Pause Between Sends and configure a wait duration that fits your sending limits.
- Connect Mark Verified as Sent → Pause Between Sends and Mark Unverified as Unsent → Pause Between Sends.
- Ensure Pause Between Sends connects back to Iterate Records to continue processing the batch.
Step 6: Test and Activate Your Workflow
Validate the end-to-end flow before turning it on for continuous outreach.
- Click Execute Workflow to run a manual test from Five-Minute Schedule.
- Confirm that Retrieve Pending Messages loads rows, Normalize WhatsApp Number cleans data, and Verify WhatsApp Number returns verification results.
- Check that verified numbers route to Dispatch WhatsApp via Rapiwa and then update via Mark Verified as Sent.
- Verify unverified numbers update via Mark Unverified as Unsent and that Pause Between Sends loops back to Iterate Records.
- Once results look correct, toggle the workflow to Active for production use.
Troubleshooting Tips
- Google Sheets credentials can expire or lose access to the file. If rows stop updating, check the Google account connection in n8n and confirm the spreadsheet is still shared with that account.
- If you’re using Wait nodes or external sending, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Rapiwa requests can fail because of an invalid or rotated API key, or because your connected WhatsApp number is temporarily disconnected. Check the HTTP Request node’s last response first, then confirm the token in n8n credentials matches your Rapiwa dashboard.
Quick Answers
About 30 minutes if your sheet and accounts are ready.
No. You’ll map Google Sheets columns and paste your Rapiwa API key into n8n credentials.
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 Rapiwa subscription/API costs from your plan.
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.
Yes, and you should. Most people tweak the “Cap Batch Size” limit, the “Pause Between Sends” wait time, and the Google Sheets filter (for example, switch from Status = pending to a specific campaign tag). You can also adjust the “Dispatch WhatsApp via Rapiwa” HTTP Request body to include media if your Rapiwa endpoint supports it, as long as your Image URL is publicly accessible.
Usually it’s permissions. Reconnect the Google Sheets credential in n8n, then confirm the same Google account can open the exact spreadsheet and tab you selected in the node.
On n8n Cloud Starter you can run a healthy number of executions each month for small campaigns, and higher plans handle more. If you self-host, there’s no n8n execution cap, but your server resources and Rapiwa limits still matter. Practically, this workflow is designed to run in batches, so sending a few hundred messages a day is realistic if your wait time and batch size are reasonable.
Often, yes. n8n is better when you need batching, conditional logic (only send if verified), and a reliable “write back to the sheet” loop without paying more for every branch. Self-hosting is a big deal too if you’re running frequent scheduled checks. Zapier or Make can be quicker for a tiny setup, but they get awkward once you need verification + status updates + rate limiting in one flow. If you want a second opinion, Talk to an automation expert.
Once this is running, your spreadsheet stops being a list and starts being a system. Cleaner campaigns, less second-guessing, and follow ups you can actually trust.
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.