8
n8n 한국어amn8n.com

Rapiwa API를 사용한 Shopify 주문 이행 및 WhatsApp으로 추적 링크 발송

고급

이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 17개의 노드를 포함합니다.주로 If, Code, Wait, HttpRequest, GoogleSheets 등의 노드를 사용하며. WhatsApp을 통한 Shopify 주문 이행 알림 자동화

사전 요구사항
  • 대상 API의 인증 정보가 필요할 수 있음
  • Google Sheets API 인증 정보
  • Shopify Admin API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "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": "모든 고객 데이터 가져오기",
      "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": "항목 반복 처리",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        80,
        896
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "0e597ab7-be2c-45fd-8b2b-6a34989b3b9a",
      "name": "Shopify 트리거",
      "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": "웹훅 응답 데이터 형식 지정",
      "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": "번호 정리",
      "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": "확인된 항목 시트에 행 추가",
      "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": "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": "대기",
      "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": "Rapiwa를 사용하여 유효한 WhatsApp 번호 확인",
      "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": "조건문",
      "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": "확인된 항목 시트1에 행 추가",
      "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": "스티커 노트",
      "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": "스티커 노트1",
      "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": "스티커 노트2",
      "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": "스티커 노트3",
      "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": "스티커 노트4",
      "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": "스티커 노트5",
      "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
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 콘텐츠 제작, 멀티모달 AI

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수17
카테고리2
노드 유형8
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

저자
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.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34