This workflow corresponds to n8n.io template #9880 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Send WooCommerce Order Status Updates to Customers via WhatsApp Using Rapiwa API",
"nodes": [
{
"id": "8fa0a1db-d6d4-420e-a7d3-e7eab8b050fd",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
432,
960
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3ab8725a-9268-45fd-b91c-0e055fe6fa7c",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.data.exists }}",
"rightValue": "=\"true\""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "d5efa97f-454d-4661-865c-8432481c0627",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
912,
1056
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "10f7dc66-1e40-4b8a-aa0b-8a2f38a4c44b",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-384,
944
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "0d1fa192-0b73-4960-b2a7-048516d7a4ac",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-816,
944
],
"parameters": {
"path": "4746f380-002d-494d-90fe-7c963bd7a67b",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "28386518-8878-4821-bd56-8ccf8c4acc00",
"name": "Format Webhook Response Data",
"type": "n8n-nodes-base.code",
"position": [
-624,
944
],
"parameters": {
"jsCode": "return $input.all().map(item => {\n const body = item.json.body;\n\n const customer = {\n first_name: body.billing.first_name,\n last_name: body.billing.last_name,\n email: body.billing.email,\n phone: body.billing.phone,\n address: {\n address_1: body.billing.address_1,\n address_2: body.billing.address_2,\n city: body.billing.city,\n state: body.billing.state,\n postcode: body.billing.postcode,\n country: body.billing.country\n }\n };\n\n const products = body.line_items.map(product => ({\n status: body.status,\n name: product.name,\n size: product.meta_data?.find(meta => meta.key === \"size\")?.value,\n product_id: product.product_id,\n variation_id: product.variation_id,\n quantity: product.quantity,\n price: `${body.currency} ${product.price}`,\n total: `${body.currency} ${product.total}`,\n image: product.image?.src || null\n }));\n\n return {\n json: {\n data: {\n customer,\n products,\n invoice_link: body.payment_url\n }\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "d852312f-b45c-4ce5-9671-e4c8c7cabc36",
"name": "Clean WhatsApp Number",
"type": "n8n-nodes-base.code",
"position": [
-96,
960
],
"parameters": {
"jsCode": "const items = $input.all();\nconst updatedItems = items.map((item) => {\n let rawNumber = item?.json[\"number\"];\n rawNumber = rawNumber ? String(rawNumber) : \"\";\n const cleanedNumber = rawNumber.replace(/\\D/g, \"\");\n item.json[\"number\"] = cleanedNumber;\n return item;\n});\nreturn updatedItems;"
},
"typeVersion": 2
},
{
"id": "b492da98-bae3-4140-bced-c7efe4b06f7f",
"name": "Store State of Rows in Verified & Sent",
"type": "n8n-nodes-base.googleSheets",
"position": [
896,
848
],
"parameters": {
"columns": {
"value": {
"name": "={{ $('Clean WhatsApp Number').item.json.data.customer.first_name }} {{ $('Clean WhatsApp Number').item.json.data.customer.last_name }}",
"size": "={{ $('Clean WhatsApp Number').item.json.data.products[0].size }}",
"email": "={{ $('Clean WhatsApp Number').item.json.data.customer.email }}",
"number": "={{ $json.to }}",
"status ": "sent",
"address1": "={{ $('Clean WhatsApp Number').item.json.data.customer.address.address_1 }}",
"quantity": "={{ $('Clean WhatsApp Number').item.json.data.products[0].quantity }}",
"validity": "verified",
"productId": "={{ $('Clean WhatsApp Number').item.json.data.products[0].product_id }}",
"totalPrice": "={{ $('Clean WhatsApp Number').item.json.data.products[0].total }}",
"invoiceLink": "={{ $('Clean WhatsApp Number').item.json.data.invoice_link }}",
"productImage": "={{ $('Clean WhatsApp Number').item.json.data.products[0].image }}",
"productTitle": "={{ $('Clean WhatsApp Number').item.json.data.products[0].name }}",
"product status": "={{ $('Clean WhatsApp Number').item.json.data.products[0].status }}"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "number",
"type": "string",
"display": true,
"required": false,
"displayName": "number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "address1",
"type": "string",
"display": true,
"required": false,
"displayName": "address1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productTitle",
"type": "string",
"display": true,
"required": false,
"displayName": "productTitle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productId",
"type": "string",
"display": true,
"required": false,
"displayName": "productId",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "size",
"type": "string",
"display": true,
"required": false,
"displayName": "size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "quantity",
"type": "string",
"display": true,
"required": false,
"displayName": "quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "totalPrice",
"type": "string",
"display": true,
"required": false,
"displayName": "totalPrice",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productImage",
"type": "string",
"display": true,
"required": false,
"displayName": "productImage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoiceLink",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "invoiceLink",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "product status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "validity",
"type": "string",
"display": true,
"required": false,
"displayName": "validity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status ",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI/edit?usp=drivesdk",
"cachedResultName": "WooCommerce - Send WhatsApp update to customer"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "a286ee00-45ea-4fff-83ff-c1fd72f79778",
"name": "Store State of Rows in Unverified & Not Sent",
"type": "n8n-nodes-base.googleSheets",
"position": [
672,
1056
],
"parameters": {
"columns": {
"value": {
"name": "={{ $('Clean WhatsApp Number').item.json.data.customer.first_name }} {{ $('Clean WhatsApp Number').item.json.data.customer.last_name }}",
"size": "={{ $('Clean WhatsApp Number').item.json.data.products[0].size }}",
"email": "={{ $('Clean WhatsApp Number').item.json.data.customer.email }}",
"number": "={{ $json.data.number }}",
"status ": "not sent",
"address1": "={{ $('Clean WhatsApp Number').item.json.data.customer.address.address_1 }}",
"quantity": "={{ $('Clean WhatsApp Number').item.json.data.products[0].quantity }}",
"validity": "unverified",
"productId": "={{ $('Clean WhatsApp Number').item.json.data.products[0].product_id }}",
"totalPrice": "={{ $('Clean WhatsApp Number').item.json.data.products[0].total }}",
"invoiceLink": "={{ $('Clean WhatsApp Number').item.json.data.invoice_link }}",
"productImage": "={{ $('Clean WhatsApp Number').item.json.data.products[0].image }}",
"productTitle": "={{ $('Clean WhatsApp Number').item.json.data.products[0].name }}",
"product status": "={{ $('Clean WhatsApp Number').item.json.data.products[0].status }}"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "number",
"type": "string",
"display": true,
"required": false,
"displayName": "number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "address1",
"type": "string",
"display": true,
"required": false,
"displayName": "address1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productTitle",
"type": "string",
"display": true,
"required": false,
"displayName": "productTitle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productId",
"type": "string",
"display": true,
"required": false,
"displayName": "productId",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "size",
"type": "string",
"display": true,
"required": false,
"displayName": "size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "quantity",
"type": "string",
"display": true,
"required": false,
"displayName": "quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "totalPrice",
"type": "string",
"display": true,
"required": false,
"displayName": "totalPrice",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productImage",
"type": "string",
"display": true,
"required": false,
"displayName": "productImage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoiceLink",
"type": "string",
"display": true,
"required": false,
"displayName": "invoiceLink",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "product status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "validity",
"type": "string",
"display": true,
"required": false,
"displayName": "validity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status ",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI/edit?usp=drivesdk",
"cachedResultName": "WooCommerce - Send WhatsApp update to customer"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "b16d300c-0e2a-4a25-af34-ae2db0f1b201",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1904,
496
],
"parameters": {
"width": 896,
"height": 1392,
"content": "# WooCommerce Order Updates to Customers via WhatsApp with Rapiwa API\n## Overview\nThe workflow listens for incoming WooCommerce order events\u2014either through a webhook or the `order.updated` trigger\u2014and processes them to send WhatsApp status updates to customers via the Rapiwa API. Upon receiving an order payload, it formats and normalizes the data into a structured object containing customer details, product information, and an invoice link. Orders are handled in batches to manage throughput and avoid triggering rate limits. Phone numbers are cleaned and verified for WhatsApp registration using Rapiwa's verification endpoint. Messages are then sent to verified numbers using predefined templates, while all actions (both successful and failed attempts) are logged to Google Sheets for tracking.\n\n## Features:\n- Trigger-based processing (Webhook / WooCommerce trigger).\n- Payload normalization via a Code node (`Format Webhook Response Data` / `Clean Webhooks Response Data`).\n- Batch iteration using `SplitInBatches` (`Loop Over Items`).\n- Phone cleaning (removes non-digit characters) in Code nodes.\n- WhatsApp verification via Rapiwa (`/api/verify-whatsapp`).\n- Conditional branching (IF node) to separate verified and unverified flows.\n- Sending personalized messages via Rapiwa (`/api/send-message`) using template fields.\n- Logging to Google Sheets for both verified (sent) and unverified (not sent) records.\n- Wait node for throttling and re-entering the processing loop.\n\n## Requirements:\n- n8n instance with nodes: Webhook, HTTP Request, Code, SplitInBatches, IF, Google Sheets, Wait.\n- Rapiwa account with a valid Bearer token for `verify-whatsapp` and `send-message` endpoints.\n- Google account with Google Sheets and OAuth2 credentials configured in n8n.\n- WooCommerce store with API/webhook access (or another source providing `billing` and `line_items` in the payload).\n\n## Google Sheet Column Structure\nCreate these columns exactly (the Google Sheets nodes in the flow expect these names):\n**A Google Sheet formatted like this** \u27a4 [sample](https://docs.google.com/spreadsheets/d/1WKOFqFdF3tqfes5KKO1WGAp20SpO3jJl9GsE9CmtfLI/edit?usp=sharing)\n\n\n## How to Use This Workflow:\n1. Add credentials in n8n:\n - Rapiwa Bearer token \u2192 HTTP Bearer credential.\n - Google Sheets OAuth2 \u2192 Google Sheets credential.\n - WooCommerce API creds \u2192 WooCommerce credential (or configure Shopify).\n2. Prepare a Google Sheet with the required columns (see above).\n3. Configure the Webhook node (or WooCommerce trigger) to receive order events.\n4. Verify Code nodes correctly reference `billing`, `line_items`, and `payment_url` from your payload.\n5. Set the SplitInBatches batch size and Wait delay to match your Rapiwa rate limits.\n6. Run manual tests with 2\u20135 orders, verify Google Sheet entries and message delivery.\n\n\n## Useful Links\n- **Dashboard:** [https://app.rapiwa.com](https://app.rapiwa.com/login)\n- **Official Website:** [https://rapiwa.com](https://rapiwa.com/)\n- **Documentation:** [https://docs.rapiwa.com](https://docs.rapiwa.com/)\n\n## Support & Help\n- **WhatsApp**: [Chat on WhatsApp](https://wa.me/8801322827799)\n- **Discord**: [SpaGreen Community](https://discord.gg/SsCChWEP)\n- **Facebook Group**: [SpaGreen Support](https://www.facebook.com/groups/spagreenbd)\n- **Website**: [https://spagreen.net](https://spagreen.net)\n- **Developer Portfolio**: [Codecanyon SpaGreen](https://codecanyon.net/user/spagreen/portfolio)\n"
},
"typeVersion": 1
},
{
"id": "b5196501-b7a3-403b-8608-32051a41c1b1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
496
],
"parameters": {
"width": 496,
"height": 784,
"content": "## 1. Webhook\n- Purpose: Accepts incoming HTTP POST requests (example path: `4746f380-002d-xxxx-90fe-7c963bd7a67b`).\n- Usage: configured for test/webhook mode in sample `pinData`.\n\n## 2. Format Webhook Response Data\n- Purpose: Transform the raw `body` into a compact `data` object.\n- Key behavior (JS):\n - Reads `body = item.json.body`.\n - Builds `customer` from `body.billing` (first_name, last_name, email, phone, address fields).\n - Maps `products` from `body.line_items` adding `status`, `name`, `size`, `product_id`, `variation_id`, `quantity`, `price`, `total`, `image`.\n - Returns `json: { data: { customer, products, invoice_link: body.payment_url } }`.\n"
},
"typeVersion": 1
},
{
"id": "7e7d4967-f95e-4f84-b778-7d37bb4d78c1",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
736
],
"parameters": {
"width": 464,
"height": 544,
"content": "## 1. Clean WhatsApp Number\n- Purpose: Ensure `number` field exists and strip non-digit characters.\n\n\n## 2. Check valid whatsapp number Using Rapiwa\n- Purpose: Verify WhatsApp registration via Rapiwa API."
},
"typeVersion": 1
},
{
"id": "4a8334f3-6dc4-4cf5-9357-f649986a6e0b",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
400
],
"parameters": {
"width": 912,
"height": 880,
"content": "## 1. If\n- False path: route to `Store State of Rows in Unverified & Not Sent`.\n\n\n## 2. Rapiwa Sender\n- Purpose: Send personalized WhatsApp messages for verified numbers.\n- Authentication: Rapiwa Bearer (`Rapiwa Bearer Auth`)\n\n\n## 3. Store State of Rows in Verified & Sent\n- Document: references a Google spreadsheet ID (example ID in the node configuration).\n- Credential: `googleSheetsOAuth2Api` (Google Sheets credential).\n\n\n## 4. Store State of Rows in Unverified & Not Sent\n- Purpose: Write a row for numbers that are not registered on WhatsApp.\n- Credential: `googleSheetsOAuth2Api`.\n"
},
"typeVersion": 1
},
{
"id": "ea94e52e-8729-4653-930e-a3c027aa708c",
"name": "Rapiwa",
"type": "n8n-nodes-rapiwa.rapiwa",
"position": [
112,
960
],
"parameters": {
"number": "={{ $json.data.customer.phone }}",
"operation": "verifyWhatsAppNumber"
},
"credentials": {
"rapiwaApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "83425184-4348-4892-b7be-1b59c94195a4",
"name": "Rapiwa (send message)",
"type": "n8n-nodes-rapiwa.rapiwa",
"position": [
656,
848
],
"parameters": {
"number": "={{ $json.data.number }}",
"message": "=Hi *{{ $('Clean WhatsApp Number').item.json.data.customer.first_name }} {{ $('Clean WhatsApp Number').item.json.data.customer.last_name }}*,\n\nYour order is currently: *{{ $('Clean WhatsApp Number').item.json.data.products[0].status }}*\n\n\ud83d\udecd\ufe0f *{{ $('Clean WhatsApp Number').item.json.data.products[0].name }}* \n\u2022 Size: {{ $('Clean WhatsApp Number').item.json.data.products[0].size }}\n\u2022 Qty: {{ $('Clean WhatsApp Number').item.json.data.products[0].quantity }}\n\u2022 Price: {{ $('Clean WhatsApp Number').item.json.data.products[0].price }}\n\u2022 Total: {{ $('Clean WhatsApp Number').item.json.data.products[0].total }}\n*Shipping to:*{{ $('Clean WhatsApp Number').item.json.data.customer.address.address_1 }}*\n\n\ud83d\uddbc\ufe0f Product Preview: {{ $('Clean WhatsApp Number').item.json.data.products[0].image }}\n\ud83e\uddfe View Invoice: {{ $('Clean WhatsApp Number').item.json.data.invoice_link }}\n\nThanks for shopping with *SpaGreen Creative*! \nLet us know if you need anything."
},
"credentials": {
"rapiwaApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
}
],
"connections": {
"If": {
"main": [
[
{
"node": "Rapiwa (send message)",
"type": "main",
"index": 0
}
],
[
{
"node": "Store State of Rows in Unverified & Not Sent",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Rapiwa": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Format Webhook Response Data",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Clean WhatsApp Number",
"type": "main",
"index": 0
}
]
]
},
"Clean WhatsApp Number": {
"main": [
[
{
"node": "Rapiwa",
"type": "main",
"index": 0
}
]
]
},
"Rapiwa (send message)": {
"main": [
[
{
"node": "Store State of Rows in Verified & Sent",
"type": "main",
"index": 0
}
]
]
},
"Format Webhook Response Data": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Store State of Rows in Verified & Sent": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Store State of Rows in Unverified & Not Sent": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2ApirapiwaApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is for online store owners, support teams, and marketing staff who want to automatically verify WhatsApp numbers and send order invoice links or personalized order updates to customers. It’s built against WooCommerce order webhooks but can be adapted to Shopify or…
Source: https://n8n.io/workflows/9880/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow provides a robust, end-to-end automated pipeline for managing e-commerce orders. It bridges the gap between your storefront and your fulfillment team by handling inventory validation, mu
This workflow is perfect for e-commerce store owners using Shopify who want to automatically recover abandoned carts through personalized WhatsApp messages. It's ideal for businesses looking to increa
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 e
This workflow is designed for online store owners, customer-success teams, and marketing operators who want to automatically verify customers' WhatsApp numbers and deliver order updates or invoice lin
This n8n workflow listens for order cancellations in Shopify, extracts relevant customer and order data, checks if the customer’s phone number is registered on WhatsApp via the Rapiwa API, and sends a