AutomationFlowsSlack & Telegram › Auto-send Woocommerce Invoices via Whatsapp with Rapiwa API

Auto-send Woocommerce Invoices via Whatsapp with Rapiwa API

ByRapiwa @rapiwa on n8n.io

This workflow listens for new or updated WooCommerce orders, cleans and structures the order data, processes orders in batches, and standardizes WhatsApp phone numbers. It verifies phone numbers via the Rapiwa API, sends invoice links or messages to verified numbers, and logs…

Event trigger★★★★☆ complexity15 nodesGoogle SheetsWoo Commerce TriggerN8N Nodes Rapiwa
Slack & Telegram Trigger: Event Nodes: 15 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9879 — 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Send WooCommerce Invoices on WhatsApp Automatically Using Rapiwa API",
  "nodes": [
    {
      "id": "5f97a4ae-506f-4eeb-b65b-7387d6db9d37",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        1600,
        784
      ],
      "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": "54f3f8ff-50f7-455d-8cbc-ba13df739240",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        2096,
        864
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "61f4a6bc-43fd-44f9-a1bf-09ad7fb8cc78",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        624,
        768
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "bff871ca-9ae6-4988-ada1-6d5f5ea9f959",
      "name": "Clean Webhooks Response Data",
      "type": "n8n-nodes-base.code",
      "position": [
        192,
        768
      ],
      "parameters": {
        "jsCode": "return $input.all().map(item => {\n  const body = item.json;\n\n  const customer = {\n    first_name: body.billing.first_name,\n    last_name: body.billing.last_name,\n    name: body.billing.first_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    name: product.name,\n    product_id: product.product_id,\n    variation_id: product.variation_id,\n    quantity: product.quantity,\n    total: `${body.currency} ${product.total}`, // for currency here\n    price: product.price,\n    currency: body.currency,\n    image: product.image?.src || null,\n    size: product.meta_data?.find(meta => meta.key === \"size\")?.value || 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": "bde660f4-cf63-4d5e-bff2-65f8c77f3342",
      "name": "Clean WhatsApp Number",
      "type": "n8n-nodes-base.code",
      "position": [
        1024,
        784
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nconst updatedItems = items.map((item) => {\n  const waNo = item?.json?.[\"number\"];\n  const waNoStr = typeof waNo === 'string'\n    ? waNo\n    : (waNo !== undefined && waNo !== null ? String(waNo) : \"\");\n\n  const cleanedNumber = waNoStr.replace(/\\D/g, \"\"); // Remove non-digit characters\n\n  item.json[\"number\"] = cleanedNumber;\n\n  return item;\n});\n\nreturn updatedItems;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "77e7e43e-79ca-48bd-a85d-7be61344a3bd",
      "name": "Append Rows in Sheet Verified & Sent",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2080,
        672
      ],
      "parameters": {
        "columns": {
          "value": {
            "name": "={{ $('Clean WhatsApp Number').item.json.data.customer.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 }}"
          },
          "schema": [
            {
              "id": "name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "address1",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "address1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productTitle",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "productTitle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productId",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "productId",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "size",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "quantity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "quantity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "totalPrice",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "totalPrice",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productImage",
              "type": "string",
              "display": true,
              "removed": false,
              "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": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "validity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "validity",
              "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/1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk/edit?usp=drivesdk",
          "cachedResultName": "WooCommerce - Send WhatsApp invoice link"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "ffac664e-9c0c-48e8-aa24-2256cfbbaca2",
      "name": "WooCommerce Trigger",
      "type": "n8n-nodes-base.wooCommerceTrigger",
      "position": [
        -64,
        768
      ],
      "parameters": {
        "event": "order.updated"
      },
      "credentials": {
        "wooCommerceApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9ed7e611-af93-4329-a39c-992cbdc51b33",
      "name": "Append Rows in Sheet Unverified & Not sent",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1872,
        864
      ],
      "parameters": {
        "columns": {
          "value": {
            "name": "={{ $('Clean WhatsApp Number').item.json.data.customer.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 }}"
          },
          "schema": [
            {
              "id": "name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "address1",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "address1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productTitle",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "productTitle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productId",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "productId",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "size",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "quantity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "quantity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "totalPrice",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "totalPrice",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productImage",
              "type": "string",
              "display": true,
              "removed": false,
              "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": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "validity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "validity",
              "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/1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk/edit?usp=drivesdk",
          "cachedResultName": "WooCommerce - Send WhatsApp invoice link"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "7f93c1a4-5703-4edd-976f-fecf168023e4",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        480
      ],
      "parameters": {
        "width": 1216,
        "height": 1072,
        "content": "# Auto-Send WooCommerce Invoices via WhatsApp with Rapiwa API\n\n## Overview\nThis workflow listens for new or updated WooCommerce orders, cleans and structures the order data, processes orders in batches, and standardizes WhatsApp phone numbers. It verifies phone numbers via the Rapiwa API, sends invoice links or messages to verified numbers, and logs results into separate Google Sheets tabs for verified and unverified numbers. Throttling and looping are managed using batch processing and wait delays.\n\n\n## Features\n- Extracts customer, address, product, and invoice_link from order payloads.\n- Batch processing for controlled throughput.\n- WhatsApp verification step prior to sending messages.\n- Conditional branching based on verification result (`$json.data.exists == \"true\"`).\n- Personalized message templates using product and customer fields.\n- Logging to Google Sheets with distinct columns for verified and unverified flows.\n\n\n## Google Sheet Required Columns\n**A Google Sheet** formatted like this \u27a4 [Sample](https://docs.google.com/spreadsheets/d/1NVYsvOg3mzsAGlzJiL7-2mtkN-5gsmqd3fG8hboE3vk/edit?usp=sharing)\n\n\n## How to Use This Workflow\n1. Configure credentials:\n   - Add Rapiwa Bearer token to the `Rapiwa Bearer Auth` credential.\n   - Add Google Sheets OAuth2 credential and ensure the spreadsheet ID is accessible.\n   - Configure WooCommerce credentials for the trigger (or replace the trigger with a Shopify webhook and set Shopify credentials).\n2. Verify the Google Sheet has the required columns listed above.\n4. Watch the execution path: webhook \u2192 mapping \u2192 batch loop \u2192 number cleaning \u2192 verify \u2192 IF \u2192 send or log \u2192 append sheet \u2192 wait \u2192 continue.\n\n## Customization Ideas\n- Replace WooCommerce trigger with a Shopify webhook trigger and adapt the mapping code.\n- Change the message template to include different product or customer fields.\n- Add filters in the mapping code to target customers (e.g., `total_spent > 5000`, order count, or tags).\n- Add fallback channels (SMS or email) for unverified numbers before marking as 'not sent'.\n- Send an admin summary (Slack or email) after each run.\n- Enrich customer data with external lookups (CRM/loyalty service) before sending.\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"
      },
      "typeVersion": 1
    },
    {
      "id": "ffb8f162-d281-4700-a655-9c67cd3db51d",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1504,
        272
      ],
      "parameters": {
        "width": 848,
        "height": 816,
        "content": "## If (Condition)\n- Purpose: Branch the workflow based on Rapiwa verification response.\n- It's route to `Send Message Using Rapiwa` or `Unverified & Not sent`.\n\n\n## Send Message Using Rapiwa\n- Purpose: Send a personalized WhatsApp message (text) via Rapiwa to the verified number.\n- Credentials: `httpBearerAuth` (Rapiwa Bearer Auth)\n\n\n## Append Rows in Sheet Verified & Sent\n- Purpose: Append a row for each successful send with `status: sent` and `validity: verified`.\n\n\n## Append Rows in Sheet Unverified & Not sent\n- Purpose: Append a row for unverified numbers with `validity: unverified` and `status: not sent`."
      },
      "typeVersion": 1
    },
    {
      "id": "da93b6ea-eabe-49f2-82e1-74bfc22921cc",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        544
      ],
      "parameters": {
        "width": 656,
        "height": 544,
        "content": "## 1. Clean WhatsApp Number\n- Purpose: Ensure the `number` field is a string and remove non-digit characters.\n- Why it matters: Ensures Rapiwa receives a consistent numeric-only phone number.\n\n\n## 2. Check valid whatsapp number Using Rapiwa\n- Purpose: Verify whether the cleaned number is registered on WhatsApp via Rapiwa."
      },
      "typeVersion": 1
    },
    {
      "id": "3b65cf78-cfc1-417b-8a45-3719a25efbf0",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        480
      ],
      "parameters": {
        "width": 624,
        "height": 608,
        "content": "## 1. WooCommerce Trigger\n- Trigger event: `order. complete`\n- Purpose: Entry point for the workflow. Receives order complete from WooCommerce.\n- Credentials: `wooCommerceApi` (example name: \"WooCommerce (get customer)\").\n\n## 2. Clean Webhooks Response Data\n- Purpose: Transform the incoming order payload into a compact structure \n- Why it matters: Normalizes different incoming payload shapes into a single downstream contract.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8e38d72a-772a-4203-8d71-4953684bcc8e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        1104
      ],
      "parameters": {
        "color": 7,
        "width": 2512,
        "height": 448,
        "content": "## How to Use \u2014 Step-by-step Setup\n1) Configure credentials in n8n\n   - Rapiwa: add your Bearer token to an HTTP Bearer credential (`Rapiwa Bearer Auth`).\n   - Google Sheets: connect OAuth2 credentials (`Google Sheets`).\n   - WooCommerce: add WooCommerce API credentials for the trigger (`WooCommerce (get customer)`), or configure Shopify credentials if adapting.\n\n3) Configure nodes\n   - Trigger: `WooCommerce Trigger` (event: `order.updated`) or a Shopify webhook.\n   - Code: `Clean Webhooks Response Data` \u2014 map incoming order into `{ data: { customer, products, invoice_link } }`.\n   - Code: `Clean WhatsApp Number` \u2014 remove non-digit characters and normalize numbers.\n   - HTTP Request: `Check valid whatsapp number Using Rapiwa` \u2014 POST `https://app.rapiwa.com/api/verify-whatsapp` with `{ number }`.\n   - HTTP Request: `Send Message Using Rapiwa` \u2014 POST `https://app.rapiwa.com/api/send-message` with `{ number, message_type, message }`.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e2b00250-8849-48a2-8241-189cb53c4f08",
      "name": "Rapiwa (verify whatsapp number)",
      "type": "n8n-nodes-rapiwa.rapiwa",
      "position": [
        1232,
        784
      ],
      "parameters": {
        "number": "={{ $json.data.customer.phone }}",
        "operation": "verifyWhatsAppNumber"
      },
      "credentials": {
        "rapiwaApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a02dc376-b584-46f9-8da9-3101003fffa7",
      "name": "Rapiwa (send message)",
      "type": "n8n-nodes-rapiwa.rapiwa",
      "position": [
        1872,
        672
      ],
      "parameters": {
        "number": "={{ $json.data.number }}",
        "message": "=Hey *{{ $('Clean WhatsApp Number').item.json.data.customer.name }}*,\n\nThank you for your recent order from *SpaGreen Creative*!\nWe truly appreciate your support.\n\n\ud83d\udecd\ufe0f *Order Summary:*\n\u2022 *Product:* {{ $('Clean WhatsApp Number').item.json.data.products[0].name }}\n\u2022 *Size:* {{ $('Clean WhatsApp Number').item.json.data.products[0].size }}\n\u2022 *Quantity:* {{ $('Clean WhatsApp Number').item.json.data.products[0].quantity }}\n\u2022 *Product ID:* {{ $('Clean WhatsApp Number').item.json.data.products[0].product_id }}\n\u2022 *Price per item:* {{ $('Clean WhatsApp Number').item.json.data.products[0].price }}\n\u2022 *Total Price:* {{ $('Clean WhatsApp Number').item.json.data.products[0].total }} \n\n\ud83d\udce6 *Shipping Address:* {{ $('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\n\ud83e\uddfe *Invoice:* {{ $('Clean WhatsApp Number').item.json.data.invoice_link }}\n\nIf you have any questions or need help, feel free to reach out.\n\n\u2013 Team *SpaGreen Creative*\n"
      },
      "credentials": {
        "rapiwaApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Rapiwa (send message)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Append Rows in Sheet Unverified & Not sent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Clean WhatsApp Number",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WooCommerce Trigger": {
      "main": [
        [
          {
            "node": "Clean Webhooks Response Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean WhatsApp Number": {
      "main": [
        [
          {
            "node": "Rapiwa (verify whatsapp number)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rapiwa (send message)": {
      "main": [
        [
          {
            "node": "Append Rows in Sheet Verified & Sent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean Webhooks Response Data": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rapiwa (verify whatsapp number)": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append Rows in Sheet Verified & Sent": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append Rows in Sheet 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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow listens for new or updated WooCommerce orders, cleans and structures the order data, processes orders in batches, and standardizes WhatsApp phone numbers. It verifies phone numbers via the Rapiwa API, sends invoice links or messages to verified numbers, and logs…

Source: https://n8n.io/workflows/9879/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This workflow is ideal for WooCommerce store owners who want to automatically send promotional WhatsApp messages to their customers when new coupons are created. It’s designed for marketers and eComme

Woo Commerce Trigger, Google Sheets, WooCommerce +1
Slack & Telegram

This workflow is designed for business analysts, market researchers, lead generation specialists, and sales teams who need to gather detailed business intelligence from Google Maps. It's particularly

Telegram, OpenAI, N8N Nodes Apify +5
Slack & Telegram

checkProcess(old). Uses googleSheets, httpRequest, telegram, @n-octo-n/n8n-nodes-json-database. Event-driven trigger; 40 nodes.

Google Sheets, HTTP Request, Telegram +3
Slack & Telegram

Transform your lead list into an AI-powered calling machine. This workflow automates your entire cold calling process using Vapi's conversational AI to initiate calls, qualify leads, capture detailed

Google Sheets, HTTP Request, Slack
Slack & Telegram

Type in Slack. Walk away. Get a professional PDF report and a structured Excel fix sheet delivered to Google Drive and posted back in your Slack thread — fully automated, zero manual work.

Compression, HTTP Request, Google Drive +3