8
n8n 한국어amn8n.com

Rapiwa를 사용한 Shopify 포기한 장바구니 WhatsApp 알림 자동화 (제품 링크 포함)

고급

이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 19개의 노드를 포함합니다.주로 If, Code, Wait, HttpRequest, GoogleSheets 등의 노드를 사용하며. Shopify 포기한 장바구니 WhatsApp 알림 자동화: Rapiwa 통해 제품 링크 포함

사전 요구사항
  • 대상 API의 인증 정보가 필요할 수 있음
  • Google Sheets API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "id": "H1rJA5MTCuWx5IFF",
  "meta": {
    "instanceId": "cb9a1e5321767b6316634728341237e564b2587ab15b74ca0a89eb02a53484d6",
    "templateCredsSetupCompleted": true
  },
  "name": "Automate Shopify Abandoned Cart WhatsApp Reminders with Product Links via Rapiwa",
  "tags": [],
  "nodes": [
    {
      "id": "4159f1ee-7b87-4320-8716-2d601b41bcd9",
      "name": "HTTP 요청",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2064,
        32
      ],
      "parameters": {
        "url": "https://salebotsg.myshopify.com/admin/api/2025-07/checkouts.json",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "i9zvAj1mpabm9ci9",
          "name": "shopify-app-auth"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "53535899-1bed-495b-a12c-38f7d4b38e21",
      "name": "일정 트리거",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2400,
        32
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "69fbf648-32c5-42cf-8c8c-f504e3faec97",
      "name": "Rapiwa 발신자",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -144,
        112
      ],
      "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 {{ $('Clean WhatsApp Number').item.json.customerName }},\n\nYou left items in your cart at SpaGreen Creative. Here’s a quick look:\n\n🧾 Order Details:\n• Product: {{ $('Clean WhatsApp Number').item.json.productTitle }}\n• Qty: {{ $('Clean WhatsApp Number').item.json.quantity }}\n• Total: {{ $('Clean WhatsApp Number').item.json.totalPrice }} {{ $('Clean WhatsApp Number').item.json.presentment_currency }}\n\n🎁 Use code SPAGREEN10 for 10% OFF at checkout!\n\n👉 Complete your order: {{ $('Clean WhatsApp Number').item.json.abandonedCheckoutURL }}\n\nHurry — your cart won’t wait forever!\n\n— Team SpaGreen Creative"
            },
            {
              "name": "status"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "jnaHCyYia9OAFozh",
          "name": "Rapiwa Bearer Auth"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "c925eed9-596d-4f47-a3bb-b1e7d366a14c",
      "name": "WhatsApp 번호 정리",
      "type": "n8n-nodes-base.code",
      "position": [
        -1264,
        48
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst updatedItems = items.map((item) => {\n  let rawNumber = item?.json[\"number\"];\n  rawNumber = rawNumber ? String(rawNumber) : \"\";\n  const cleanedNumber = rawNumber.replace(/\\D/g, \"\");\n  item.json[\"number\"] = cleanedNumber;\n  return item;\n});\nreturn updatedItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "90aa8a3d-47eb-473f-afb4-906360350cd9",
      "name": "Rapiwa1을 사용하여 유효한 WhatsApp 번호 확인",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -976,
        48
      ],
      "parameters": {
        "url": "=https://app.rapiwa.com/api/verify-whatsapp",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "number",
              "value": "={{ $json.number }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "jnaHCyYia9OAFozh",
          "name": "Rapiwa Bearer Auth"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a35dc547-b9c5-4a4c-9d7e-7fecd812bf71",
      "name": "고정 메모10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        -352
      ],
      "parameters": {
        "color": 6,
        "width": 576,
        "height": 992,
        "content": "## Clean and Verify WhatsApp Numbers\nBefore sending messages, each WhatsApp number is cleaned (removing spaces and symbols) and checked to make sure it’s a real, active WhatsApp account. Only valid numbers will get a message, so you don’t waste time or credits.\n\n- **Node:** Clean WhatsApp Number\n\n**Purpose:** Removes extra characters (like spaces, dashes, or parentheses) from the phone number.\n\n**Why it's important:** WhatsApp only accepts clean numeric formats. This step avoids delivery errors.\n\n- **Node:** Check valid whatsapp number Using Rapiwa\n  - Checks if the WhatsApp number is real and can receive messages.\n  - Only valid numbers will get a message."
      },
      "typeVersion": 1
    },
    {
      "id": "45349501-247a-443c-b58e-1cea7f8f7e35",
      "name": "고정 메모9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -352
      ],
      "parameters": {
        "color": 5,
        "width": 432,
        "height": 992,
        "content": "## Conditional Logic\n\nThe **If** node checks whether `data.exists == true`:\n\n- **True branch (verified):**\n  - Sends a WhatsApp confirmation via Rapiwa.\n  - Appends to Google Sheets with validity: verified.\n\n- **False branch (unverified):**\n  - Appends data to the sheet with validity: unverified.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4cffcb7b-6473-4c5d-a52c-23f33c28edfd",
      "name": "고정 메모12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        -352
      ],
      "parameters": {
        "color": 4,
        "width": 880,
        "height": 688,
        "content": "## Send Message via HTTP Request Using Rapiwa\n\n**Purpose:** Sends the actual message via the Rapiwa API.\n\n**How it works:** Makes a POST request to `https://app.rapiwa.com/api/send-message` with:\n- `number`: Cleaned WhatsApp number  \n- `message`: The text from the sheet\n\n**Why it's important:** This is the core of the automation — it connects your message to WhatsApp via Rapiwa.\n\n\n\n## Change State of Rows in Sent\n**Why it's important:** So you don’t accidentally resend the same message in the next cycle. Keeps track of what’s already done.\n\nTwo separate Google Sheets nodes:\n- **Verified append row in sheet** – for valid numbers.\n- **Unverified append row in sheet** – for invalid numbers.\n- **A Google Sheet** formatted like this ➤ [sample](https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit?usp=sharing)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d789b7a8-84ab-4143-98fc-d9b270302118",
      "name": "고정 메모13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        352
      ],
      "parameters": {
        "color": 2,
        "width": 880,
        "height": 608,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Append Unverified Row to Sheet\nThis node is triggered after a phone number is checked and found to be **unverified**. It appends the form submission data to the Google Sheet with the field `validity` set to `\"unverified\"`.\n\nThis node appends data to a Google Sheet when a WhatsApp number is **unverified**.\n- **A Google Sheet** formatted like this ➤ [sample](https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit?usp=sharing)  \n\n\n## Wait\n\n**Purpose:** Pauses for a few seconds (e.g., 5 sec) before sending the next message.\n\n**Why it's important:** Prevents sending too many messages too quickly, which could get your WhatsApp number flagged or blocked.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6da3b3f7-8e68-41fb-b889-c62a0ca8f88b",
      "name": "조건문",
      "type": "n8n-nodes-base.if",
      "position": [
        -576,
        288
      ],
      "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": "9ff80aa5-754b-4e07-b21d-c55ea9772a06",
      "name": "Verified & Sent에서 행 상태 변경",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        112,
        112
      ],
      "parameters": {
        "columns": {
          "value": {
            "name": "={{ $('Clean WhatsApp Number').item.json.customerName }}",
            "number": "={{ $('If').item.json.data.number }}",
            "status": "sent ",
            "order id": "={{ $('Clean WhatsApp Number').item.json.checkoutId }}",
            "validity": "vaeified",
            "item link": "={{ $('Clean WhatsApp Number').item.json.abandonedCheckoutURL }}",
            "item name": "={{ $('Clean WhatsApp Number').item.json.productTitle }}",
            "total price": "={{ $('Clean WhatsApp Number').item.json.totalPrice }} {{ $('Clean WhatsApp Number').item.json.presentment_currency }}"
          },
          "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": "order id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "order id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "item name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "item name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "coupon",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "coupon",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "item link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "item link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total price",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "total price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "validity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "validity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit?usp=drivesdk",
          "cachedResultName": "Shopify - Send WhatsApp reminder with cart items link"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "gFH3Wjq6yYqSEAei",
          "name": "Google Sheets"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "44f406aa-e919-4c6a-a3fb-3eef71d5cb23",
      "name": "Unverified & Not Sent에서 행 상태 변경",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -144,
        416
      ],
      "parameters": {
        "columns": {
          "value": {
            "name": "={{ $('Clean WhatsApp Number').item.json.customerName }}",
            "number": "={{ $json.data.number }}",
            "status": "not sent",
            "order id": "={{ $('Clean WhatsApp Number').item.json.checkoutId }}",
            "validity": "unverified",
            "item link": "={{ $('Loop Over Items').item.json.abandonedCheckoutURL }}",
            "item name": "={{ $('Clean WhatsApp Number').item.json.productTitle }}",
            "total price": "={{ $('Loop Over Items').item.json.totalPrice }} {{ $('Loop Over Items').item.json.presentment_currency }}"
          },
          "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": "order id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "order id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "item name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "item name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "coupon",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "coupon",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "item link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "item link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total price",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "total price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "validity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "validity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit?usp=drivesdk",
          "cachedResultName": "Shopify - Send WhatsApp reminder with cart items link"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "gFH3Wjq6yYqSEAei",
          "name": "Google Sheets"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "f385eb14-50dd-4cac-82cd-30d9374adf70",
      "name": "대기",
      "type": "n8n-nodes-base.wait",
      "position": [
        112,
        416
      ],
      "webhookId": "6c474e54-eb3c-4fcd-b455-948322cd0121",
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "965c02e8-8d9f-4edb-88b5-5cb8a509f633",
      "name": "HTTP 응답 데이터 형식 지정",
      "type": "n8n-nodes-base.code",
      "position": [
        -1840,
        32
      ],
      "parameters": {
        "jsCode": "const checkouts = items[0].json.checkouts;\n\nif (!Array.isArray(checkouts)) {\n  throw new Error(\"Checkouts not found or not an array\");\n}\n\nreturn checkouts.map((checkout) => {\n  const customer = checkout.customer || {};\n  const product = (checkout.line_items && checkout.line_items[0]) || {};\n\n  return {\n    json: {\n      checkoutId: checkout.id || null,\n      customerName: `${customer.first_name || ''} ${customer.last_name || ''}`.trim(),\n      number: checkout.phone || customer.phone || 'N/A',\n      productTitle: product.title || 'N/A',\n      quantity: product.quantity || 'N/A',\n      totalPrice: checkout.total_price || '0.00',\n      presentment_currency: checkout.presentment_currency,\n      abandonedCheckoutURL: checkout.abandoned_checkout_url || 'N/A'\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "01a37d2b-5e5b-4c00-ac3d-49f0fd7ce840",
      "name": "항목 반복",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1584,
        32
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "a2e4b5cb-996a-4d6e-a120-4a3c1955bec8",
      "name": "고정 메모",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4048,
        -352
      ],
      "parameters": {
        "color": 2,
        "width": 1424,
        "height": 2752,
        "content": "# Automate Shopify Abandoned Cart WhatsApp Reminders with Product Links via Rapiwa\n\n## Overview\nThis n8n workflow automatically identifies customers who have abandoned their carts on your Shopify store, cleans and verifies their WhatsApp numbers, and sends them personalized reminders via the Rapiwa API. It also logs each interaction—whether the number was valid or not—into a connected Google Sheet. Designed for marketers, small business owners, freelancers, and support teams, this solution makes it easy to run bulk WhatsApp campaigns using just a Google Sheet and your own WhatsApp number—no need for the official WhatsApp Business API. It’s a budget-friendly, scalable, and easy-to-manage alternative for anyone looking to automate WhatsApp follow-ups without the tech hassle.\n\n## Features\n- Fetches abandoned checkouts from Shopify\n- Cleans phone numbers to WhatsApp-ready format\n- Verifies if the number is registered on WhatsApp using Rapiwa\n- Sends customized cart recovery WhatsApp messages\n- Logs status (sent/not sent) and validity (verified/unverified) in Google Sheets\n- Batches messages to avoid API rate limits or number bans\n- Automatically loops with a scheduler\n- Fully customizable messages and structure\n\n## Requirements\n- A Shopify store with abandoned checkouts\n- Rapiwa API access with Bearer token\n- Google Sheets OAuth2 credentials set up in n8n\n- WhatsApp number linked and authorized in Rapiwa\n- Google Sheet structured like this: sample sheet\n\n## Workflow Logic Breakdown\n1. Scheduled Trigger  \n   - Node: Schedule Trigger  \n   - What it does: Runs automatically based on a scheduled interval (e.g., every few hours).  \n   - Why it matters: Ensures the automation works in the background without manual input.\n\n2. Fetch Abandoned Checkouts  \n   - Node: HTTP Request  \n   - Endpoint: `https://salebotsg.myshopify.com/admin/api/2025-07/checkouts.json`  \n   - Auth: Shopify private app token via HTTP Header Auth  \n   - What it does: Pulls all active abandoned checkouts from Shopify.  \n   - Why it matters: It's the data source for your WhatsApp reminders.\n\n3. Format the API Response  \n   - Node: Format HTTP Response Data (Code Node)  \n   - What it does: Extracts customer name, phone, product title, quantity, price, and checkout URL from the raw JSON response.  \n   - Why it matters: Structures data for clean downstream use.\n\n4. Loop Through Each Checkout  \n   - Node: Loop Over Items (SplitInBatches)  \n   - What it does: Processes one checkout at a time.  \n   - Why it matters: Enables batching and individual handling.\n\n5. Clean WhatsApp Numbers  \n   - Node: Clean WhatsApp Number (Code Node)  \n   - What it does: Strips all non-numeric characters from the phone number.  \n   - Why it matters: WhatsApp requires properly formatted numbers.\n\n6. Check if Number is WhatsApp-Valid  \n   - Node: Check valid whatsapp number Using Rapiwa1  \n   - API Endpoint: `https://app.rapiwa.com/api/verify-whatsapp`  \n   - Method: POST  \n   - What it does: Validates if the number is active on WhatsApp.  \n   - Why it matters: Saves API credits and avoids errors by skipping invalid numbers.\n\n7. Conditional Logic  \n   - Node: If  \n   - Condition: `data.exists == true`  \n   - What it does: Branches based on WhatsApp validity.  \n     - True: Number is valid, send message and log as verified.  \n     - False: Number is invalid, skip sending and log as unverified.\n\n### If Number Is Verified\n\n8. Send WhatsApp Message via Rapiwa  \n   - Node: Rapiwa Sender  \n   - API Endpoint: `https://app.rapiwa.com/api/send-message`  \n   - Method: POST  \n   - Auth: Bearer Token  \n   - Message Template:\n\n```\nHi {{ customerName }},\n\nYou left items in your cart at SpaGreen Creative. Here’s a quick look:\n\nOrder Details:\n• Product: {{ productTitle }}\n• Qty: {{ quantity }}\n• Total: {{ totalPrice }} {{ presentment_currency }}\n\nUse code SPAGREEN10 for 10% OFF at checkout!\n\nComplete your order: {{ abandonedCheckoutURL }}\n\nHurry — your cart won’t wait forever!\n\n— Team SpaGreen Creative\n```\n\n9. Log Verified + Sent  \n   - Node: Change State of Rows in Verified & Sent  \n   - What it does: Appends row to Google Sheet with:\n     - `status: sent`\n     - `validity: verified`  \n   - Why it matters: Helps keep a record and prevent re-sending.\n\nIf Number Is Not Verified\n\n10. Log Unverified + Not Sent  \n    - Node: Change State of Rows in Unverified & Not Sent  \n    - What it does: Appends row to Google Sheet with:\n      - `status: not sent`\n      - `validity: unverified`  \n    - Why it matters: Logs failed entries for review and debugging.\n\n11. Wait Between Messages  \n    - Node: Wait  \n    - What it does: Pauses (e.g., 5 seconds) between each cycle.  \n    - Why it matters: Prevents Rapiwa from flagging or blocking your number.\n    - A Google Sheet formatted like this ➤ [sample](https://docs.google.com/spreadsheets/d/1zsVzniJTeiFOafCI_V0B3_7VnlAPQ2CTWQa-N30qCqs/edit?usp=sharing)\n\n| name            | number        | order id       | item name   | coupon | item link      | total price     | validity   | status   |\n|-----------------|---------------|----------------|----------------------------------------------------------------------------------------------|--------|-------------------------------------------|\n| Golam Rabbi     | 8801758152474 | 39248398811454 | S25 Ultra 5XXXXX Price Cell Phone |        | https://salebotsg.myshopify.com/946181xxxxxx&locale=en-BD | 11500.00 BDT     | unverified | not sent |\n| Shakil Ahammed  | 8801322827753 | 39248402153790 | S25 Ultra 5XXXXX Price Cell Phone |        | https://salebotsg.myshopify.com/946181xxxxxx&locale=en-BD | 11500.00 BDT     | verified   | sent     |\n| Shakil Ahammed  | 8801322827753 | 39248403431742 | S25 Ultra 5XXXXX Price Cell Phone |        | https://salebotsg.myshopify.com/946181xxxxxx&locale=en-BD | 11500.00 BDT     | verified   | sent     |\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3524bc1e-7f0d-4cc2-8a45-339d60817664",
      "name": "고정 메모1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2496,
        -352
      ],
      "parameters": {
        "color": 4,
        "width": 256,
        "height": 656,
        "content": "## Scheduled Trigger  \n- What it does: Runs automatically based on a scheduled interval (e.g., every few hours).  \n- Why it matters: Ensures the automation works in the background without manual input."
      },
      "typeVersion": 1
    },
    {
      "id": "cbacf837-95cc-4509-aa67-75b57b045e06",
      "name": "고정 메모2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2224,
        -352
      ],
      "parameters": {
        "color": 5,
        "width": 528,
        "height": 656,
        "content": "## Fetch Abandoned Checkouts  \n### Node: HTTP Request  \n   - Endpoint: `https://salebotsg.myshopify.com/admin/api/2025-07/checkouts.json`  \n   - Auth: Shopify private app token via HTTP Header Auth  \n   - What it does: Pulls all active abandoned checkouts from Shopify.  \n   - Why it matters: It's the data source for your WhatsApp reminders.\n\n## Format the API Response  \n### Node: Format HTTP Response Data (Code Node)  \n   - What it does: Extracts customer name, phone, product title, quantity, price, and checkout URL from the raw JSON response.  \n   - Why it matters: Structures data for clean downstream use.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "35958d98-85da-45fb-ab7f-04057fd18f63",
      "name": "고정 메모3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -352
      ],
      "parameters": {
        "color": 4,
        "width": 336,
        "height": 656,
        "content": "## Loop Through Each Checkout  \n### Node: Loop Over Items (SplitInBatches)  \n   - What it does: Processes one checkout at a time.  \n   - Why it matters: Enables batching and individual handling."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e21de6c3-502d-4100-b905-da2afd677ada",
  "connections": {
    "6da3b3f7-8e68-41fb-b889-c62a0ca8f88b": {
      "main": [
        [
          {
            "node": "69fbf648-32c5-42cf-8c8c-f504e3faec97",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "44f406aa-e919-4c6a-a3fb-3eef71d5cb23",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f385eb14-50dd-4cac-82cd-30d9374adf70": {
      "main": [
        [
          {
            "node": "01a37d2b-5e5b-4c00-ac3d-49f0fd7ce840",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4159f1ee-7b87-4320-8716-2d601b41bcd9": {
      "main": [
        [
          {
            "node": "965c02e8-8d9f-4edb-88b5-5cb8a509f633",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "69fbf648-32c5-42cf-8c8c-f504e3faec97": {
      "main": [
        [
          {
            "node": "9ff80aa5-754b-4e07-b21d-c55ea9772a06",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "01a37d2b-5e5b-4c00-ac3d-49f0fd7ce840": {
      "main": [
        [],
        [
          {
            "node": "c925eed9-596d-4f47-a3bb-b1e7d366a14c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "53535899-1bed-495b-a12c-38f7d4b38e21": {
      "main": [
        [
          {
            "node": "4159f1ee-7b87-4320-8716-2d601b41bcd9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c925eed9-596d-4f47-a3bb-b1e7d366a14c": {
      "main": [
        [
          {
            "node": "90aa8a3d-47eb-473f-afb4-906360350cd9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "965c02e8-8d9f-4edb-88b5-5cb8a509f633": {
      "main": [
        [
          {
            "node": "01a37d2b-5e5b-4c00-ac3d-49f0fd7ce840",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9ff80aa5-754b-4e07-b21d-c55ea9772a06": {
      "main": [
        [
          {
            "node": "f385eb14-50dd-4cac-82cd-30d9374adf70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "90aa8a3d-47eb-473f-afb4-906360350cd9": {
      "main": [
        [
          {
            "node": "6da3b3f7-8e68-41fb-b889-c62a0ca8f88b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "44f406aa-e919-4c6a-a3fb-3eef71d5cb23": {
      "main": [
        [
          {
            "node": "f385eb14-50dd-4cac-82cd-30d9374adf70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

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

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

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

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

유료인가요?

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

워크플로우 정보
난이도
고급
노드 수19
카테고리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