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]",
"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.POSThttps://app.rapiwa.com/api/verify-whatsappnumber: ={{ $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 }}trueNote: This step branches the flow based on the WhatsApp verification result.
HTTP Request node under the TRUE branch of the If node.POSThttps://app.rapiwa.com/api/send-messagenumber: ={{ $json.data.phone }}message_type: textmessage: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:
AppendSheet1)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: verifiedUse 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: unverifiedThis 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 | 8801322827799 | [email protected] | Abdul Mannan | unverified | 2025-09-14 |
| SpaGreen Creative | Bagladesh | 8801322827799 | [email protected] | Abdul Mannan | verified | 2025-09-14 |
Note: The