This n8n workflow helps Shopify store owners and teams automatically confirm orders via WhatsApp. It checks if the customer's number is valid using Rapiwa API, sends a personalized message, and logs every attempt in Google Sheets—saving time and reducing manual work.
Whether you're a solo entrepreneur or managing a small team, this solution gives you a low-cost alternative to the official WhatsApp Business API, without losing control or personalization.
status
and validity
Triggered by a Shopify webhook or by reading rows from a Google Sheet.
Normalizes and cleans the order payload.
Extracts details like customer name, phone, items, shipping, and payment info.
Cleans phone numbers (removes special characters).
Verifies if the number is registered on WhatsApp via Rapiwa API.
If valid:
validity = verified
and status = sent
.If invalid:
validity = unverified
and status = not sent
.Adds wait/delay between sends to prevent rate limits.
Keeps an audit trail in the connected Google Sheet.
Set up a Shopify webhook for new orders (or connect a Google Sheet).
Create a Google Sheet with columns:
name
, number
, order id
, item name
, total price
, validity
, status
Create and configure a Rapiwa Bearer token in n8n.
Add Google Sheets OAuth2 credential in n8n.
Import the workflow in n8n and configure these nodes:
order id
in your Google Sheet to prevent mismatches.verify-whatsapp
endpoint.send-message
endpoint.Use an HTTP Request node:
https://app.rapiwa.com/api/verify-whatsapp
POST
httpBearerAuth
using your Rapiwa token{ "number": "cleaned_number" }
Use an If
node:
{{ $json.data.exists }} == true
(or "true"
if string)https://app.rapiwa.com/api/send-message
POST
Hi *{{ $json.customer_full_name }}*,
Thank you for shopping with *SpaGreen Creative*! We're happy to confirm that your order has been successfully placed.
🧾 Order Details
• Product: {{ $json.line_item.title }}
• SKU: {{ $json.line_item.sku }}
• Quantity: {{ $json.line_item.quantity }}
• Vendor: {{ $json.line_item.vendor }}
• Order ID: {{ $json.name }}
• Product ID: {{ $json.line_item.product_id }}
📦 Shipping Information
{{ $json.shipping_address.address1 }} {{ $json.shipping_address.address2 }}
{{ $json.shipping_address.city }}, {{ $json.shipping_address.country }} - {{ $json.shipping_address.zip }}
💳 Payment Summary
• Subtotal: {{ $json.subtotal_price }} BDT
• Tax (VAT): {{ $json.total_tax_amount }} BDT
• Shipping: {{ $json.total_shipping_amount }} BDT
• Discount: {{ $json.total_discount_amount }} BDT
• Total Paid: {{ $json.total_price }} BDT
Order Date: {{ $json.created_date }}
Warm wishes,
*Team SpaGreen Creative*
name | number | order id | item name | total price | validity | status |
---|---|---|---|---|---|---|
Abdul Mannan | 8801322827799 | 8986469695806 | Iphone 10 | 1150 | verified | sent |
Abdul Mannan | 8801322827799 | 8986469695806 | S25 UltraXXXXeen Android Phone | 23000 | verified | sent |
replace(/\D/g, '')
true
vs "true"
).row_number
for sheet updates, or unique order id
for better targeting.row_number
.shopify-app-auth
is the credential name used in the export—make sure it's your Rapiwa token.message_type: media
.