This n8n workflow makes it easy to verify WhatsApp numbers submitted through a form. When someone fills out the form, the automation kicks in—capturing the data via a webhook , checking the WhatsApp number using the Rapiwa API , and sending a confirmation message if the number is valid. All submissions, whether verified or not, are logged into a Google Sheet with a clear status.
It’s a great solution for businesses , marketers , or developers who need a reliable way to verify leads , manage event signups , or onboard customers using WhatsApp.
This n8n automation listens for form submissions via a webhook, validates the provided WhatsApp number using the Rapiwa API , sends a confirmation message if the number is verified, and then appends the submission data to a Google Sheet , marking each entry as verified or unverified.
YYYY-MM-DD
formatWebhook
node to the canvas.POST
./a9b6a936-e5f2-4xxxxxxxxxe0a970d5
).{
"business_name": "ABC Corp",
"location": "New York",
"whatsapp": "+1 234-567-8901",
"email": "[[email protected]](/cdn-cgi/l/email-protection)",
"name": "John Doe"
}
Code
node after the Webhook
node.const result = $input.all().map(item => {
const body = item.json.body || {};
const submitted_date = new Date().toISOString().split('T')[0];
return {
business_name: body.business_name,
location: body.location,
whatsapp: body.whatsapp,
email: body.email,
name: body.name,
submitted_date: submitted_date
};
});
return result;
SplitInBatches
node after the data formatting.Note: If you expect only one submission at a time, it still helps future-proof your workflow.
Code
node named Cleane Number
.const items = $input.all();
const updatedItems = items.map((item) => {
const waNo = item?.json["whatsapp"];
const waNoStr = typeof waNo === 'string' ? waNo : (waNo !== undefined && waNo !== null ? String(waNo) : "");
const cleanedNumber = waNoStr.replace(/\D/g, "");
item.json["whatsapp"] = cleanedNumber;
return item;
});
return updatedItems;
HTTP Request
node.POST
https://app.rapiwa.com/api/verify-whatsapp
number
: ={{ $json.whatsapp }}
Expected Output:
```json
{
"success": true,
"data": {
"number": "+88017XXXXXXXX",
"exists": true,
"jid": "88017XXXXXXXXXXXXX",
"message": "✅ Number is on WhatsApp"
}
}
If
node after the Rapiwa validation.={{ $json.data.exists }}
true
Note: This step branches the flow based on the WhatsApp verification result.
HTTP Request
node under the TRUE branch of the If node.POST
https://app.rapiwa.com/api/send-message
number
: ={{ $json.data.phone }}
message_type
: text
message
:
Hi {{ $('Cleane Number').item.json.name }},
Thanks! Your form has been submitted successfully.
This sends a confirmation message via WhatsApp to the verified number.
Add a Google Sheets
node under the TRUE branch (after the message is sent).
Set:
Append
Sheet1
)Column Mapping:
Business Name
: ={{ $('Cleane Number').item.json.business_name }}
Location
: ={{ $('Cleane Number').item.json.location }}
WhatsApp Number
: ={{ $('Cleane Number').item.json.whatsapp }}
Email
: ={{ $('Cleane Number').item.json.email }}
Name
: ={{ $('Cleane Number').item.json.name }}
Date
: ={{ $('Cleane Number').item.json.submitted_date }}
validity
: verified
Use OAuth2 Google Sheets credentials for access.
Note: Make sure the sheet has matching column headers.
Google Sheets
node under the FALSE branch of the If node.validity
: unverified
This stores entries with unverified WhatsApp numbers in the same Google Sheet.
Wait
node after both Google Sheets nodes.This delay prevents API throttling and adds buffer time before processing the next item in the batch.
A Google Sheet formatted like this ➤ Sample Sheet
Business Name | Location | WhatsApp Number | Name | validity | Date | |
---|---|---|---|---|---|---|
SpaGreen Creative | Dhaka, Bangladesh | 8801322827754 | [email protected] | Foyshal Ahmed | unverified | 2025-09-14 |
SpaGreen Creative | Bagladesh | 8801322827753 | [email protected] | Shakil Ahammed | verified | 2025-09-14 |
Note : The