Exécution des commandes Shopify et envoi de liens de suivi via WhatsApp avec l'API Rapiwa

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 17 nœuds.Utilise principalement des nœuds comme If, Code, Wait, HttpRequest, GoogleSheets. Automatiser les notifications d'exécution des commandes Shopify via WhatsApp

Prérequis
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
  • Informations d'identification Admin API Shopify
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "qIxpz1WNuNQMj4Hq",
  "meta": {
    "instanceId": "cb9a1e5321767b6316634728341237e564b2587ab15b74ca0a89eb02a53484d6",
    "templateCredsSetupCompleted": true
  },
  "name": "Shopify Order Fulfillment & Send Tracking Link via WhatsApp Using Rapiwa API",
  "tags": [],
  "nodes": [
    {
      "id": "bb285dab-fc99-4d5b-8b3b-36959d591a4f",
      "name": "obtenir toutes les données clients",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -112,
        896
      ],
      "parameters": {
        "url": "=https://your_domain.myshopify.com/admin/api/2025-07/orders/{{ $json.order_id }}.json",
        "method": "=GET",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Shopify-Access-Token",
              "value": "your_shopify_accesstoken like this➡️shpat_57xx78xxxxx90fxxx67"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "357f157e-ebd1-4865-8384-c2202c69461a",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        80,
        896
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "0e597ab7-be2c-45fd-8b2b-6a34989b3b9a",
      "name": "Shopify Trigger",
      "type": "n8n-nodes-base.shopifyTrigger",
      "position": [
        -624,
        896
      ],
      "webhookId": "a8c45cbe-04b8-4c78-8418-1e50b9b8fd06",
      "parameters": {
        "topic": "fulfillments/create",
        "authentication": "accessToken"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "id": "cWoMnmp2EszIQYpj",
          "name": "Shopify Access Token account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e9854c40-304b-49a8-a3e2-f3aae6a0996a",
      "name": "Formater les données de réponse Webhook",
      "type": "n8n-nodes-base.code",
      "position": [
        -448,
        896
      ],
      "parameters": {
        "jsCode": "const result = $input.all().map(item => {\n  const body = item.json;\n\n  return {\n    customer_id: body.id,\n    fulfillment_id: body.id,\n    order_id: body.order_id,\n    status: body.status,\n    created_at: body.created_at,\n    updated_at: body.updated_at,\n    tracking_company: body.tracking_company,\n    tracking_number: body.tracking_number,\n    tracking_url: body.tracking_url,\n    product_title: body.line_items?.[0]?.title || '',\n    customer_name: body.destination?.name || '',\n    country: body.destination?.country || '',\n    shop_domain: item.json.headers?.['x-shopify-shop-domain'] || '',\n  };\n});\n\nreturn result;"
      },
      "typeVersion": 2
    },
    {
      "id": "9df911dd-af84-4a81-8b15-4c758ed36c9e",
      "name": "Nettoyer le numéro",
      "type": "n8n-nodes-base.code",
      "position": [
        304,
        992
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nconst updatedItems = items.map((item) => {\n  const customer = item?.json?.order?.customer || {};\n\n  const rawPhone = customer?.phone || \"\";\n  const phoneStr = typeof rawPhone === 'string' ? rawPhone : String(rawPhone || \"\");\n  const cleanedPhone = phoneStr.replace(/\\D/g, \"\");\n\n  // Combine first and last name into full name\n  const firstName = customer.first_name || \"\";\n  const lastName = customer.last_name || \"\";\n  const fullName = `${firstName} ${lastName}`.trim();\n\n  return {\n    json: {\n      customer_id: customer.id || \"\",\n      name: fullName,\n      email: customer.email || \"\",\n      phone: cleanedPhone\n    }\n  };\n});\n\nreturn updatedItems;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9c7f6119-154c-4abf-8336-3ebe8133f479",
      "name": "ajouter une ligne vérifiée dans la feuille",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1184,
        1008
      ],
      "parameters": {
        "columns": {
          "value": {
            "email": "={{ $('Clean Number').item.json.email }}",
            "name ": "={{ $('Clean Number').item.json.name }}",
            "number": "={{ $('Clean Number').item.json.phone }}",
            "status": "verified",
            "customer_id": "={{ $('Clean Number').item.json.customer_id }}",
            "tracking_url": "={{ $('Format Webhook Response Data').item.json.tracking_url }}",
            "product_title": "={{ $('Format Webhook Response Data').item.json.product_title }}",
            "tracking_number": "={{ $('Format Webhook Response Data').item.json.tracking_number }}",
            "tracking_company": "={{ $('Format Webhook Response Data').item.json.tracking_company }}"
          },
          "schema": [
            {
              "id": "customer_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "customer_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "name ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "name ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "product_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "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/1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY/edit?usp=drivesdk",
          "cachedResultName": "Shopify - Send tracking link via WhatsApp"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "gFH3Wjq6yYqSEAei",
          "name": "Google Sheets"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "ed921c20-60e1-4c65-a946-cd477658d7e1",
      "name": "Envoyer un message via Rapiwa",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        960,
        1008
      ],
      "parameters": {
        "url": "=https://app.rapiwa.com/api/send-message",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "number",
              "value": "={{ $json.data.number }}"
            },
            {
              "name": "message_type",
              "value": "text"
            },
            {
              "name": "message",
              "value": "=Hi {{ $('Loop Over Items').item.json.name }},\nGood news! Your order has just been fulfilled.\n\nTracking Number: *{{ $('Format Webhook Response Data').item.json.tracking_number }}*\n\nTrack your package here: *{{ $('Format Webhook Response Data').item.json.tracking_url }}*\n\nThank you for shopping with us.  \n-Team SpaGreen Creative\n"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "jnaHCyYia9OAFozh",
          "name": "Rapiwa Bearer Auth"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "53198fba-bd3b-4169-bfed-647f13caa22a",
      "name": "Attendre",
      "type": "n8n-nodes-base.wait",
      "position": [
        1184,
        1216
      ],
      "webhookId": "6c474e54-eb3c-4fcd-b455-948322cd0121",
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "af670da1-14e9-4a4d-9d06-6e8d2bcbe051",
      "name": "Vérifier le numéro whatsapp valide via Rapiwa",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        528,
        992
      ],
      "parameters": {
        "url": "=https://app.rapiwa.com/api/verify-whatsapp",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "number",
              "value": "={{ $json.phone }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "jnaHCyYia9OAFozh",
          "name": "Rapiwa Bearer Auth"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "63985bfb-4fcd-427a-b6f5-ca56972dfa4a",
      "name": "Si",
      "type": "n8n-nodes-base.if",
      "position": [
        720,
        1120
      ],
      "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": "ef4e6f6f-5c3b-4598-ace3-bb47d91882fe",
      "name": "ajouter une ligne vérifiée dans la feuille1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        976,
        1216
      ],
      "parameters": {
        "columns": {
          "value": {
            "email": "={{ $('Clean Number').item.json.email }}",
            "name ": "={{ $('Clean Number').item.json.name }}",
            "number": "={{ $('Clean Number').item.json.phone }}",
            "status": "unverified",
            "customer_id": "={{ $('Clean Number').item.json.customer_id }}",
            "tracking_url": "={{ $('Format Webhook Response Data').item.json.tracking_url }}",
            "product_title": "={{ $('Format Webhook Response Data').item.json.product_title }}",
            "tracking_number": "={{ $('Format Webhook Response Data').item.json.tracking_number }}",
            "tracking_company": "={{ $('Format Webhook Response Data').item.json.tracking_company }}"
          },
          "schema": [
            {
              "id": "customer_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "customer_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "name ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "name ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tracking_url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tracking_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "product_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "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/1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY/edit?usp=drivesdk",
          "cachedResultName": "Shopify - Send tracking link via WhatsApp"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "gFH3Wjq6yYqSEAei",
          "name": "Google Sheets"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "92e8dfd3-a657-49a7-8c6f-f9a77e467b72",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2576,
        192
      ],
      "parameters": {
        "color": 4,
        "width": 1728,
        "height": 3536,
        "content": "# Shopify Order Fulfillment & Send Tracking Link via WhatsApp Using Rapiwa API\n\n\n# Overview\nThis **n8n workflow** automatically sends **WhatsApp notifications** to customers when their **Shopify orders are fulfilled**. It extracts order details, validates customer phone numbers for WhatsApp compatibility using the **Rapiwa API**, sends tracking information via WhatsApp, and logs all interactions in **Google Sheets** with appropriate verification status.\n---\n## Features\n- Listens to **Shopify fulfillment creation** via webhook\n- Retrieves detailed **order and customer information** from Shopify\n- **Cleans and formats** customer phone numbers\n- **Validates WhatsApp numbers** using Rapiwa's verification API\n- Sends **automated WhatsApp messages** with tracking details to verified numbers\n- Logs customer data in **Google Sheets** with verification status\n- Includes **Wait node** to space out API calls and prevent rate limiting\n- Handles both **verified and unverified** numbers with appropriate branching\n---\n## Requirements\n### Tools & Services\n- **Shopify store** with API access\n- **Google Sheet** formatted with required columns\n- **Rapiwa API account** with:\n  - Valid **Bearer Token**\n  - Access to `verify-whatsapp` and `send-message` endpoints\n  - Connected WhatsApp number\n- **Active Rapiwa subscription** (~$5/month)\n### n8n Credentials\n- **Shopify Access Token API** credentials\n- **Rapiwa Bearer Auth** credentials\n- **Google Sheets OAuth2** credentials\n### Google Sheet Required Columns:\n- `customer_id`\n- `name ` (note the trailing space)\n- `email`\n- `number`\n- `tracking_company`\n- `tracking_number`\n- `tracking_url`\n- `product_title`\n- `status` (either `verified` or `unverified`)\n> **Note:** Field `name ` contains a trailing space. Keep it as-is.\n---\n## Nodes Used in the Workflow\n- **Shopify Trigger** (webhook for fulfillment creation)\n- **Format Webhook Response Data** (code node for data extraction)\n- **get all customer data** (HTTP request to Shopify API)\n- **Clean Number** (code node for phone number formatting)\n- **Loop Over Items** (split in batches node)\n- **Check valid whatsapp number Using Rapiwa** (HTTP request)\n- **If** (conditional branching based on verification)\n- **Send Message Using Rapiwa** (HTTP request for WhatsApp messaging)\n- **verified append row in sheet** (Google Sheets node)\n- **verified append row in sheet1** (Google Sheets node for unverified)\n- **Wait** (delay node)\n---\n## How to Use This Workflow\n### 1. Trigger: New Fulfillment Created\n- **Node**: `Shopify Trigger`\n- **Event**: `fulfillments/create`\n- **Function**: Shopify sends payload when a new fulfillment is created.\n### 2. Format Webhook Response\n- **Node**: `Format Webhook Response Data`\n- **Function**: Extracts key information including:\n  - `order_id`, `fulfillment_id`, `status`\n  - `tracking_company`, `tracking_number`, `tracking_url`\n  - `product_title`, `customer_name`, `country`\n  - `shop_domain`\n### 3. Retrieve Customer Data\n- **Node**: `get all customer data`\n- **Method**: `GET`\n- **URL**: `https://your_domain.myshopify.com/admin/api/2025-07/orders/{{ $json.order_id }}.json`\n- **Headers**: Includes Shopify access token\n- **Function**: Retrieves complete order and customer information\n### 4. Clean Phone Numbers\n- **Node**: `Clean Number`\n- **Function**: \n  - Extracts phone number from customer data\n  - Removes all non-numeric characters\n  - Combines first and last name into full name\n  - Formats customer data for downstream processing\n### 5. Process in Batches\n- **Node**: `Loop Over Items`\n- **Function**: Processes customers one at a time\n### 6. Verify WhatsApp Number\n- **Node**: `Check valid whatsapp number Using Rapiwa`\n- **Method**: `POST`\n- **URL**: `https://app.rapiwa.com/api/verify-whatsapp`\n- **Authentication**: Bearer token\n- **Function**: Checks if the phone number is active on WhatsApp\n### 7. Branch Based on Verification\n- **Node**: `If`\n- **Condition**: If `data.exists === \"true\"`, then verified\n- **Function**: Routes to appropriate path based on verification status\n### 8. Send WhatsApp Message (if verified)\n- **Node**: `Send Message Using Rapiwa`\n- **Method**: `POST`\n- **URL**: `https://app.rapiwa.com/api/send-message`\n- **Authentication**: Bearer token\n- **Function**: Sends tracking information via WhatsApp\n#### Message Template:\n```\nHi [Customer Name],\nGood news! Your order has just been fulfilled.\nTracking Number: [Tracking Number]\nTrack your package here: [Tracking URL]\nThank you for shopping with us.\n-Team SpaGreen Creative\n```\n### 9. Log to Google Sheets\n- **Node**: `verified append row in sheet` → Logs verified users\n- **Node**: `verified append row in sheet1` → Logs unverified users\n- **Node**: `Wait` → Adds delay to avoid API rate limits\n---\n## Google Sheet Column\n**A Google Sheet** formatted like this ➤ [Sample](https://docs.google.com/spreadsheets/d/1vxocktoY-y-PYBZNxmUDuQv02b5F8QKhbQ0yLHjwjBY/edit?usp=sharing)\n| customer_id   | name            | email                          | number        | tracking_company | tracking_number | tracking_url                                | product_title                          | status     |\n|---------------|-----------------|--------------------------------|---------------|------------------|-----------------|---------------------------------------------|----------------------------------------|------------|\n| 8986XXXX06 | Abdul Mannan | contact@spagreen.net  | 8801322827799 | Amazon Logistics | SG-OT-02        | https://traxxxG-OT-02 | S25 Ultra 5G Smartphone     | verified   |\n| 883XXX7982 | Abdul Mannan     | contact@spagreen.net             | 8801322827799 | Amazon Logistics | SG-OT-N03       | https://traxxxGOT-N03| Samsung Galaxy S24 Ultra  | verified   |\n\n> **Note**: The `name ` column includes a **trailing space**. Do not remove it.\n---\n## Customization Ideas\n- Modify the WhatsApp message template to include additional order details\n- Add product images to the WhatsApp messages\n- Create separate sheets for different product categories or regions\n- Extend logic to send follow-up messages after delivery\n- Add notifications to store administrators for failed message deliveries\n---\n## Notes & Warnings\n- Ensure your Rapiwa account has a valid, connected WhatsApp number\n- Google Sheets credentials must allow write access to the specified sheet\n- The Wait node helps prevent rate limiting but may need adjustment based on volume\n- The workflow uses the Shopify API version 2025-07, which may need updating in the future\n- Rapiwa is an unofficial WhatsApp API and delivery rates are not guaranteed\n- Make sure to comply with WhatsApp's terms of service and customer privacy regulations\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": "9242aaa7-3458-4bba-8965-4ee434a92421",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -768,
        192
      ],
      "parameters": {
        "color": 4,
        "width": 592,
        "height": 1056,
        "content": "## 1. Node: Shopify Trigger\n**Purpose:**  \nThis node monitors your Shopify store for the `fulfillments/create` webhook event. It automatically triggers when an order is marked as fulfilled.\n\n**When it’s Triggered:**  \nWhenever an order is fulfilled (i.e., shipped or marked as complete) in your Shopify store.\n\n**Webhook Event:**  \n`fulfillments/create`\n\n## 2. Node: Format Webhook Response Data\n**Purpose:**  \nThis node takes the raw data from the Shopify webhook and extracts the key information you need. It organizes the data in a cleaner format for further processing or use.\n\n**Data Extracted Includes:**\n\n- Order ID  \n- Tracking number and tracking link  \n- Total Price\n- Per Product Price\n- Product Image link\n- Customer’s name and country  \n- Product title(s)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "21e5181e-236e-47aa-aec2-a90b8980972d",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        192
      ],
      "parameters": {
        "color": 5,
        "width": 384,
        "height": 1232,
        "content": "## 1. Node: get all customer data\n**Purpose:**\n- Uses the `order_id` to make a Shopify API request and get full customer details for that order.\n\n\n## 2. Node: Loop Over Items\n**Purpose:**\n- Loops through each item (e.g., fulfillment) in the workflow — useful if multiple fulfillments come through at once."
      },
      "typeVersion": 1
    },
    {
      "id": "0b192c42-a681-458e-9c04-b327c8c1d3fe",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        192
      ],
      "parameters": {
        "color": 6,
        "width": 432,
        "height": 1232,
        "content": "## 1. Node: Check Valid WhatsApp Number Using Rapiwa\n**Purpose:**\nThis node uses [Rapiwa’s API](https://rapiwa.com) to verify whether a given phone number is registered and active on WhatsApp.\n\n\n## 2. Node: Clean Number\n**Purpose:**\n- Extracts and cleans up the customer’s phone number.\n- Formats full name from first and last name.\n- Prepares `customer_id`, email, phone, and name.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "28edb9e1-79e8-4519-940b-17fba681a694",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        192
      ],
      "parameters": {
        "color": 4,
        "width": 656,
        "height": 1232,
        "content": "## 1. Node: If\n**Purpose:**\nChecks the result of the WhatsApp verification:\nIf number exists (i.e., valid WhatsApp number), go one way.\nIf number does not exist, go another way.\n\n## 2. Node: Send Message Using Rapiwa\n**Purpose:**\nSends a personalized WhatsApp message to the customer using Rapiwa, with tracking details and a thank-you note.\n\n## 3. Node: verified append row in sheet\n**Purpose:**\nLogs customer and tracking info to Google Sheets with the status verified (i.e., they have WhatsApp and message was sent).\n\n## 4. Node: verified append row in sheet1\n**Purpose:**\nLogs the same data to Google Sheets, but with the status unverified (i.e., customer doesn't have WhatsApp, so message wasn't sent).\n\n## 5. Node: Wait\n**Purpose:**\nPauses briefly before processing the next item — helps to avoid rate-limiting or API overload.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0cd9fd3c-ef9a-4ff3-bbdb-d6be4ac3a962",
      "name": "Note adhésive5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -768,
        -96
      ],
      "parameters": {
        "color": 3,
        "width": 2112,
        "height": 272,
        "content": "# Workflow Summary\n- Webhook receives new Order Fulfillment event from Shopify\n- Retrieves full customer details using the Shopify API\n- Extracts and formats customer data (name, phone, product, tracking info)\n- Cleans and verifies the customer's phone number\n- Checks if the number is valid on WhatsApp using Rapiwa\n- Sends personalized WhatsApp message with tracking details (if verified)\n- Logs all fulfillment and contact info in Google Sheets\n- Marks contacts as verified or unverified based on WhatsApp status\n- Fully automated, with batching and throttling to prevent overload\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a4f318ef-c966-4231-8931-721438e6c92f",
  "connections": {
    "63985bfb-4fcd-427a-b6f5-ca56972dfa4a": {
      "main": [
        [
          {
            "node": "ed921c20-60e1-4c65-a946-cd477658d7e1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ef4e6f6f-5c3b-4598-ace3-bb47d91882fe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "53198fba-bd3b-4169-bfed-647f13caa22a": {
      "main": [
        [
          {
            "node": "357f157e-ebd1-4865-8384-c2202c69461a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9df911dd-af84-4a81-8b15-4c758ed36c9e": {
      "main": [
        [
          {
            "node": "af670da1-14e9-4a4d-9d06-6e8d2bcbe051",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "357f157e-ebd1-4865-8384-c2202c69461a": {
      "main": [
        [],
        [
          {
            "node": "9df911dd-af84-4a81-8b15-4c758ed36c9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0e597ab7-be2c-45fd-8b2b-6a34989b3b9a": {
      "main": [
        [
          {
            "node": "e9854c40-304b-49a8-a3e2-f3aae6a0996a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "bb285dab-fc99-4d5b-8b3b-36959d591a4f": {
      "main": [
        [
          {
            "node": "357f157e-ebd1-4865-8384-c2202c69461a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ed921c20-60e1-4c65-a946-cd477658d7e1": {
      "main": [
        [
          {
            "node": "9c7f6119-154c-4abf-8336-3ebe8133f479",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e9854c40-304b-49a8-a3e2-f3aae6a0996a": {
      "main": [
        [
          {
            "node": "bb285dab-fc99-4d5b-8b3b-36959d591a4f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9c7f6119-154c-4abf-8336-3ebe8133f479": {
      "main": [
        [
          {
            "node": "53198fba-bd3b-4169-bfed-647f13caa22a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ef4e6f6f-5c3b-4598-ace3-bb47d91882fe": {
      "main": [
        [
          {
            "node": "53198fba-bd3b-4169-bfed-647f13caa22a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "af670da1-14e9-4a4d-9d06-6e8d2bcbe051": {
      "main": [
        [
          {
            "node": "63985bfb-4fcd-427a-b6f5-ca56972dfa4a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Création de contenu, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds17
Catégorie2
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
SpaGreen Creative

SpaGreen Creative

@spagreen

SpaGreen Creative is a leading software company specializing in SaaS solutions, AI automation, and Laravel/Vue.js development. With 800+ eCommerce platforms and 8,000+ global clients, we deliver powerful tools for OTT, CRM, ERP, and WhatsApp marketing. We combine innovation and tech to build scalable digital products.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34