8
n8n 한국어amn8n.com

Airtable 판매 주문에서 자동으로 QuickBooks 인보이스 발행 및 고객 생성

고급

이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 35개의 노드를 포함합니다.주로 If, Code, Merge, Webhook, Airtable 등의 노드를 사용하며. Airtable과 QuickBooks 간의 자동화된 워크플로우.

사전 요구사항
  • HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
  • Airtable API Key
  • 대상 API의 인증 정보가 필요할 수 있음
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "id": "bBQjdycmZkCpFBuf",
  "meta": {
    "instanceId": "1a54c41d9050a8f1fa6f74ca858828ad9fb97b9fafa3e9760e576171c531a787"
  },
  "name": "Automate QuickBooks Invoicing & Customer Creation from Airtable Sales Orders",
  "tags": [],
  "nodes": [
    {
      "id": "db74e2e3-bc33-4277-89de-1b62bce61d6c",
      "name": "고객 세부 정보 가져오기",
      "type": "n8n-nodes-base.airtable",
      "position": [
        304,
        432
      ],
      "parameters": {
        "id": "={{ $json['(Q) Customer'][0] }}",
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblhOxgN7qzl8UVTi",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tblhOxgN7qzl8UVTi",
          "cachedResultName": "Customers"
        },
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "ec49c44f-54fe-4f02-860f-2f492e46be18",
      "name": "QuickBooks - 고객 찾기",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        656,
        432
      ],
      "parameters": {
        "filters": {
          "query": "=WHERE DisplayName = '{{ $json[\"(Q) Customer Name\"] }}'"
        },
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "5299c75c-d158-42eb-b9a6-16291eb83efd",
      "name": "고객 생성",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        1136,
        304
      ],
      "parameters": {
        "operation": "create",
        "displayName": "={{ $('Get Customer Details').item.json['(Q) Customer Name'] }}",
        "additionalFields": {
          "BillAddr": {
            "details": {
              "City": "={{ $('Get Customer Details').item.json['(Q) Bill City'] }}",
              "Line1": "={{ $('Get Customer Details').item.json['(Q) Bill Line1'] }}",
              "PostalCode": "={{ $('Get Customer Details').item.json['(Q) Bill PostalCode'] }}",
              "CountrySubDivisionCode": "={{ $('Get Customer Details').item.json['(Q) Bill Country'] }}"
            }
          },
          "PrimaryPhone": "={{ $('Get Customer Details').item.json['(Q) Phone Number'] }}",
          "PrimaryEmailAddr": "={{ $('Get Customer Details').item.json['(Q) Email Address'] }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f83c8c16-ac6e-4f02-8db9-83befb18abf0",
      "name": "제품 목록 가져오기",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1600,
        368
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblZHt0JDc6U6HvEI",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tblZHt0JDc6U6HvEI",
          "cachedResultName": "Order Lines"
        },
        "options": {},
        "operation": "search",
        "filterByFormula": "={Sales Order} = \"{{ $('Get Airtable Orders Records').item.json['Sales Order ID'] }}\""
      },
      "typeVersion": 2.1
    },
    {
      "id": "dba10e50-b393-43d7-91ec-eac513be2ab7",
      "name": "고객 목록 추가",
      "type": "n8n-nodes-base.merge",
      "position": [
        1424,
        784
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "e56db207-580e-4ac9-affc-ed490d0674bb",
      "name": "HTTP에서 파싱",
      "type": "n8n-nodes-base.code",
      "position": [
        2416,
        352
      ],
      "parameters": {
        "jsCode": "const out = [];\n\nfor (const input of $input.all()) {\n  const data = input.json;\n\n  // Map terms string to QuickBooks SalesTermRef value\n  let termValue;\n  if (data.terms) {\n    const match = data.terms.match(/\\d+/); // extract number from \"Net 7\"\n    if (match) {\n      termValue = match[0]; // e.g., \"7\"\n    }\n  }\n\n  // Build QuickBooks Line array\n  const Line = (data.products || []).map(p => ({\n    DetailType: \"SalesItemLineDetail\",\n    Amount: p.amount,\n    Description: p.description || \"\",\n    SalesItemLineDetail: {\n      ItemRef: {\n        value: p.qbItemId || p.itemId, // Must be QuickBooks Item ID\n        name: p.itemName\n      },\n      Qty: p.qty || 1,\n      UnitPrice: p.rate || 0\n    }\n  }));\n\n  // ✅ Add discount line if discount exists\n  if (data.discount) {\n    Line.push({\n      DetailType: \"DiscountLineDetail\",\n      Amount: 0, // QuickBooks will calculate based on percentage\n      DiscountLineDetail: {\n        PercentBased: true,\n        DiscountPercent: data.discount // only percent from previous output\n      }\n    });\n  }\n\n  // Invoice payload\n  const invoicePayload = {\n    CustomerRef: { value: String(data.customerId) },\n    TxnDate: data.invoiceDate,\n    DueDate: data.dueDate,\n    PrivateNote: data.salesOrder,\n    BillEmail: data.customerEmail\n      ? { Address: data.customerEmail }\n      : undefined,\n    //SalesTermRef: termValue ? { value: termValue } : undefined,\n    Line\n  };\n\n  out.push({ json: { customer: invoicePayload } });\n}\n\nreturn out;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "10f6d569-a928-41f8-a768-2c6646a4072d",
      "name": "제품 ID 검색",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1872,
        368
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbluYcq0Zkka8uI8c",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tbluYcq0Zkka8uI8c",
          "cachedResultName": "Product & Service"
        },
        "options": {},
        "operation": "search",
        "filterByFormula": "={(Q) Product/Service Name}= \"{{ $json['(Q) Item Name (A)'][0] }}\""
      },
      "typeVersion": 2.1
    },
    {
      "id": "d4090bb0-4d0a-430d-8a9e-bee8860fc136",
      "name": "청구서 URL 생성",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2992,
        496
      ],
      "parameters": {
        "url": "https://sandbox-quickbooks.api.intuit.com/v3/company/9341455145770046/invoice?minorversion=75",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify($json.customer) }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "quickBooksOAuth2Api"
      },
      "retryOnFail": true,
      "typeVersion": 4.2
    },
    {
      "id": "9b6f19f2-ac4c-4baa-af6b-730b18cb2186",
      "name": "항목1 반복 처리",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2720,
        480
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "dac5c7fa-a488-4f97-b8f0-aa8a56ca23ec",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -448,
        448
      ],
      "webhookId": "321f46d5-66da-49f5-a8d1-6b61e4a7321f",
      "parameters": {
        "path": "321f46d5-66da-49f5-a8d1-6b61e4a7321f",
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "d8e97ca6-608d-456b-af0c-01563c747444",
      "name": "청구서 미생성 시",
      "type": "n8n-nodes-base.if",
      "position": [
        112,
        752
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "6412d0e3-1fe5-423c-a0bb-29ef90240843",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json[\"Synced to QBO (A)\"] }}",
              "rightValue": "FALSE"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "05c1e7bc-bc42-415a-8052-50a852ccf19a",
      "name": "IF - 고객이 존재하지 않음?",
      "type": "n8n-nodes-base.if",
      "position": [
        992,
        784
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json.Id }}",
              "operation": "isEmpty"
            }
          ]
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "id": "da33b092-a29d-4e07-8992-251c2e8d5cdd",
      "name": "청구서 레코드 생성",
      "type": "n8n-nodes-base.airtable",
      "position": [
        3280,
        496
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblXEKsfxMDVhFMcg",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tblXEKsfxMDVhFMcg",
          "cachedResultName": "Invoices & Payments"
        },
        "columns": {
          "value": {
            "Customer": "={{ $json.Invoice.CustomerRef.name }}",
            "Due Date": "={{ new Date($json.Invoice.DueDate).toISOString() }}",
            "Tax Code": "={{ $json.Invoice.Line[1].SalesItemLineDetail.TaxCodeRef.value }}",
            "Amount Paid": 0,
            "Invoice Date": "={{ new Date($json.Invoice.TxnDate).toISOString() }}",
            "Invoice Amount": "={{ $json.Invoice.TotalAmt }}",
            "Invoice Number": "={{ $json.Invoice.DocNumber }}",
            "Payment Status": "Unpaid",
            "Outstanding Balance": "={{ $json.Invoice.Balance }}"
          },
          "schema": [
            {
              "id": "Invoice Number",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Invoice Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Order",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Customer",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Invoice Date",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Invoice Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Due Date",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Due Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Invoice Amount",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Invoice Amount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Amount Paid",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Amount Paid",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Outstanding Balance",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Outstanding Balance",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Status",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Unpaid",
                  "value": "Unpaid"
                },
                {
                  "name": "Partially Paid",
                  "value": "Partially Paid"
                },
                {
                  "name": "Paid",
                  "value": "Paid"
                },
                {
                  "name": "Overdue",
                  "value": "Overdue"
                }
              ],
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Payment Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Date",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Payment Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Method",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Bank Transfer",
                  "value": "Bank Transfer"
                },
                {
                  "name": "Credit Card",
                  "value": "Credit Card"
                },
                {
                  "name": "Cheque",
                  "value": "Cheque"
                },
                {
                  "name": "Cash",
                  "value": "Cash"
                },
                {
                  "name": "Other",
                  "value": "Other"
                }
              ],
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Payment Method",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Invoice Document",
              "type": "array",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Invoice Document",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notes",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created By",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Created By",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Created",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Date Created",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Modified",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Last Modified",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Tax Code",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Tax Code",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Gross Margin",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Order Gross Margin",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Total Purchases",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Order Total Purchases",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Total Labour",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Order Total Labour",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Industry",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Customer Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Type",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Customer Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Status",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Order Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Days Overdue",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Days Overdue",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Completion %",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Payment Completion %",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Outstanding Balance Check",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Outstanding Balance Check",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Invoice Summary (AI)",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Invoice Summary (AI)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Risk Assessment (AI)",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Payment Risk Assessment (AI)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "typeVersion": 2.1
    },
    {
      "id": "85f4579d-008c-469c-bfa0-085e17e33b80",
      "name": "주문 레코드 업데이트",
      "type": "n8n-nodes-base.airtable",
      "position": [
        3568,
        496
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbluRdjyw8xiWgJht",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tbluRdjyw8xiWgJht",
          "cachedResultName": "Confirmed Orders"
        },
        "columns": {
          "value": {
            "Sales Order ID": "={{ $('Create Invoice URL').item.json.Invoice.PrivateNote }}",
            "(Q) QBO Invoice Id": "={{ $('Create Invoice URL').item.json.Invoice.Id }}",
            "(Q) QBO Invoice Number": "={{ $('Create Invoice URL').item.json.Invoice.DocNumber }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Sales Order ID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Sales Order ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Customer",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Customer",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Date",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Order Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Pick Up",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Pick Up",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Delivery Date",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Delivery Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(A) Days Left",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "(A) Days Left",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Status",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Confirmed",
                  "value": "Confirmed"
                },
                {
                  "name": "In Progress",
                  "value": "In Progress"
                },
                {
                  "name": "Completed",
                  "value": "Completed"
                },
                {
                  "name": "Cancelled",
                  "value": "Cancelled"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Order Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Type",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Residential",
                  "value": "Residential"
                },
                {
                  "name": "Commercial",
                  "value": "Commercial"
                },
                {
                  "name": "Contractor",
                  "value": "Contractor"
                },
                {
                  "name": "Other",
                  "value": "Other"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Order Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Subtotal (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Subtotal (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Purchases Total (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Purchases Total (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Terms",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Due on Receipt",
                  "value": "Due on Receipt"
                },
                {
                  "name": "Net 7",
                  "value": "Net 7"
                },
                {
                  "name": "Net 14",
                  "value": "Net 14"
                },
                {
                  "name": "Net 30",
                  "value": "Net 30"
                },
                {
                  "name": "Net 45",
                  "value": "Net 45"
                },
                {
                  "name": "Net 60",
                  "value": "Net 60"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Terms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Invoice Date",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "(Q) Invoice Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Due Date (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "(Q) Due Date (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Order Lines",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Order Lines",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Public Holidays (Synced)",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Public Holidays (Synced)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) QBO Customer Id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "(Q) QBO Customer Id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) QBO Invoice Number",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) QBO Invoice Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) QBO Invoice Id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) QBO Invoice Id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notes (Internal)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Notes (Internal)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Purchases",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Purchases",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Labour Tasks",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Labour Tasks",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issues & Feedback",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Issues & Feedback",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Synced to QBO (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Synced to QBO (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "SLA Breach (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "SLA Breach (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Tasks",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Job Tasks",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Labour Charges",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Labour Charges",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Total Labour Charges (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Total Labour Charges (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "True Days Left",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "True Days Left",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Days Remaining (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Days Remaining (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Holiday Weight Sum",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Holiday Weight Sum",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Holiday Count",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Holiday Count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Sales Order ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8b60a7d0-ecf8-4f7f-8c59-e40be0441b49",
      "name": "고객 레코드 업데이트",
      "type": "n8n-nodes-base.airtable",
      "position": [
        3872,
        496
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblhOxgN7qzl8UVTi",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tblhOxgN7qzl8UVTi",
          "cachedResultName": "Customers"
        },
        "columns": {
          "value": {
            "(Q) Customer Name": "={{ $('Create Invoice URL').item.json.Invoice.CustomerRef.name }}",
            "(Q) QBO Customer Id": "={{ $('Create Invoice URL').item.json.Invoice.CustomerRef.value }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "(Q) Customer Name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Customer Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Phone Number",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Phone Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Customer ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Bill Line1",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Bill Line1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Bill City",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Bill City",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Bill PostalCode",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Bill PostalCode",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Type",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "Individual",
                  "value": "Individual"
                },
                {
                  "name": "Business",
                  "value": "Business"
                },
                {
                  "name": "Other",
                  "value": "Other"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Customer Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Synced to QBO (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Synced to QBO (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Number ",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Customer Number ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) QBO Customer Id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) QBO Customer Id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Modified",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last Modified",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Last Sync Attempt",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Last Sync Attempt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Sync Error",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Sync Error",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Billing Address (A)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Full Billing Address (A)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Email Address",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Contact Person",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Contact Person",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notes (Internal)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Notes (Internal)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Confirmed Orders",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Confirmed Orders",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "(Q) Bill Country",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "SG",
                  "value": "SG"
                },
                {
                  "name": "MY",
                  "value": "MY"
                },
                {
                  "name": "Other",
                  "value": "Other"
                },
                {
                  "name": "Singapore",
                  "value": "Singapore"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "(Q) Bill Country",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Auto Number (raw)",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Auto Number (raw)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "(Q) Customer Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "typeVersion": 2.1
    },
    {
      "id": "d459f712-afa2-48f2-b321-c8137508ee61",
      "name": "스티키 노트",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        224
      ],
      "parameters": {
        "width": 294,
        "height": 416,
        "content": "## Purpose: Entry point. \n\n-Triggered automatically when a Sales Order is confirmed in Airtable.\n\n-Ensure your webhook URL is added in Airtable’s automation as a “POST request” when order status = Confirmed."
      },
      "typeVersion": 1
    },
    {
      "id": "f50402f8-8b25-4573-b67f-89827dabbd1a",
      "name": "스티키 노트1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        224
      ],
      "parameters": {
        "width": 310,
        "height": 416,
        "content": "## Get Orders Records\n\n--Fetch details of the confirmed Sales Order using the record ID received from webhook.\n\n--Must have “Sales Order ID” field populated for linkage with Products and Customer."
      },
      "typeVersion": 1
    },
    {
      "id": "09a7dae1-3f7f-4b5f-87ed-dd7a5d0f7b0f",
      "name": "Airtable 주문 레코드 가져오기",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -80,
        448
      ],
      "parameters": {
        "id": "={{$json[\"query\"][\"recordId\"]}}",
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appFsCGQkVElarpyF",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF",
          "cachedResultName": "(Intuz) Operations Hub (Sample) (Copy)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbluRdjyw8xiWgJht",
          "cachedResultUrl": "https://airtable.com/appFsCGQkVElarpyF/tbluRdjyw8xiWgJht",
          "cachedResultName": "Confirmed Orders"
        },
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "83c2470f-4811-468d-bf32-802c7f19b397",
      "name": "스티키 노트2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        688
      ],
      "parameters": {
        "width": 310,
        "height": 432,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Invoice record check\n\n--Skip records that already have a QuickBooks invoice created.\n\n--Checks if “Synced to QBO (A)” field in Airtable = FALSE.\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b5ef9066-d96b-4e04-92d6-388f6616795b",
      "name": "스티키 노트3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        224
      ],
      "parameters": {
        "width": 294,
        "height": 416,
        "content": "## Get Customer Details\n\n--Retrieve customer info linked to this order.\n\n--Customer record must have fields like (Q) Customer Name, (Q) Email Address, etc.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "56e27b01-813d-45d5-8c2d-83d512350867",
      "name": "스티키 노트4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        224
      ],
      "parameters": {
        "width": 278,
        "height": 416,
        "content": "## QuickBooks - Find Customer\n\n--Search customer in QuickBooks using DisplayName.\n\n--Ensures no duplicate customer creation in QBO.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "58bad121-7a39-4259-997e-47970f90f4d9",
      "name": "스티키 노트5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        704
      ],
      "parameters": {
        "width": 310,
        "height": 432,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Customer doesn’t Exist?\n\n--Checks if customer was found in QBO.\n\n\n--True (Yes): Go to “Create a customer.”\n\n--False (No): Continue to next step.\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7b1b9432-76b1-47fb-9126-c93666dbbff4",
      "name": "스티키 노트6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1040,
        112
      ],
      "parameters": {
        "width": 278,
        "height": 352,
        "content": "## Create a Customer\n\n--Creates new customer in QuickBooks if not found.\n\n--Pulls data from Airtable Customer table.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ab0b82c5-c617-4b3e-b85c-be8c6cd1b293",
      "name": "스티키 노트7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1280,
        704
      ],
      "parameters": {
        "width": 326,
        "height": 432,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Append Customers (Merge)\n\n--Combine both existing and newly created QBO customers for further mapping.\n\n\n--Merges both paths before processing invoices.\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0cefbcce-7473-456b-96d5-7af70e22f66f",
      "name": "스티키 노트8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        144
      ],
      "parameters": {
        "width": 230,
        "height": 368,
        "content": "## Get Products\n\n--Fetch order line items from “Order Lines” table.\n\n--Linked to Sales Order ID from “Confirmed Orders.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f664dd69-7b76-4aea-b61c-ad03d36dec13",
      "name": "스티키 노트9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1792,
        144
      ],
      "parameters": {
        "width": 230,
        "height": 368,
        "content": "## Search Product ID\n\n--Finds QBO Product/Service ID for each product line.\n\n--Uses “(Q) Product/Service Name” to match Airtable & QuickBooks.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "35215682-456e-47e1-93ea-67d96ea4fda2",
      "name": "데이터 준비",
      "type": "n8n-nodes-base.code",
      "position": [
        2144,
        368
      ],
      "parameters": {
        "jsCode": "// Input nodes\nconst salesOrders   = $items(\"Get Airtable Orders Records\");        // Sales Order data\nconst customers     = $items(\"Get Customer Details\");  // Customer details from Airtable\nconst products      = $items(\"Get Products\");          // Product line items\nconst qbCustomers   = $items(\"Append Customers\");      // QuickBooks customers\nconst searchProducts = $items(\"Search Product ID\");    // Product ID lookup data\n\nconst result = [];\n\n// Helper: find QuickBooks customer object by name\nfunction getQuickBooksCustomer(name) {\n  return qbCustomers.find(c => c.json.DisplayName === name);\n}\n\n// Helper: find Product ID by product/service name\nfunction getQuickBooksProductId(name) {\n  const match = searchProducts.find(p => p.json[\"(Q) Product/Service Name\"] === name);\n  return match ? match.json[\"(Q) Product ID\"] : null;\n}\n\nfor (const so of salesOrders) {\n  const soData = so.json;\n\n  // Ensure customer exists\n  if (!soData[\"(Q) Customer\"] || !Array.isArray(soData[\"(Q) Customer\"]) || soData[\"(Q) Customer\"].length === 0) {\n    continue;\n  }\n\n  const customerIdFromSO = soData[\"(Q) Customer\"][0];   // Airtable record id\n  const matchedCustomer = customers.find(c => c.json.id === customerIdFromSO);\n\n  if (matchedCustomer) {\n    const customerName = matchedCustomer.json[\"(Q) Customer Name\"];\n    const qbCustomer = getQuickBooksCustomer(customerName);\n\n    const quickBooksId = qbCustomer ? qbCustomer.json.Id : null;\n    const customerEmail = qbCustomer?.json?.PrimaryEmailAddr?.Address || null; // ✅ fetch email\n\n    // Find all products linked to this sales order\n    const productMatches = products.filter(p =>\n      p.json[\"Sales Order ID (A)\"] &&\n      p.json[\"Sales Order ID (A)\"].includes(soData[\"Sales Order ID\"])\n    );\n\n    const productDetails = productMatches.map(p => {\n      const productName = (p.json[\"(Q) Item Name (A)\"] && p.json[\"(Q) Item Name (A)\"][0]) || \"Unknown\";\n      return {\n        itemId: getQuickBooksProductId(productName),\n        itemName: productName,\n        qty: p.json[\"(Q) Qty\"] || 0,\n        rate: p.json[\"(Q) Rate\"] || 0,\n        amount: p.json[\"(Q) Amount (A)\"] || 0,\n        description: (p.json[\"(Q) Description\"] && p.json[\"(Q) Description\"][0]) || \"\"\n      };\n    });\n\n    result.push({\n      customerId: quickBooksId,\n      customerName: customerName,\n      customerEmail: customerEmail, // ✅ include email here\n      salesOrder: soData[\"Sales Order ID\"],\n      invoiceDate: soData[\"(Q) Invoice Date\"],\n      terms: soData[\"(Q) Terms\"],\n      dueDate: soData[\"(Q) Due Date (A)\"],\n      products: productDetails,\n      discount: soData[\"(Q) Discount\"]\n    });\n  }\n}\n\n// Return as items for n8n\nreturn result.map(r => ({ json: r }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "b9766711-fec2-45e0-a99f-4b5a748a2f91",
      "name": "스티키 노트10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2080,
        96
      ],
      "parameters": {
        "width": 214,
        "height": 416,
        "content": "## Data Preparation\n\n--Core logic — combines orders, customers, and products to prepare structured invoice payload.\n\n--Handles mapping of IDs, email, and discount logic.\n\n-- Modify this if your Airtable schema changes.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "179a4831-1293-4cfb-8fc9-40f9eab92ead",
      "name": "스티키 노트11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2352,
        96
      ],
      "parameters": {
        "width": 214,
        "height": 416,
        "content": "## Parse in HTTP\n\n--Converts JS objects into QuickBooks-compatible invoice JSON format.\n\n--Validate the payload before posting to QuickBooks.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "217fef97-8eb0-463a-b914-82d043de353a",
      "name": "스티키 노트12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2656,
        240
      ],
      "parameters": {
        "width": 214,
        "height": 384,
        "content": "## Split in Batches\n\n--Iterates through all prepared invoices to send one-by-one to QuickBooks API.\n\n--Keep batch size = 1 for better control and error handling.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "21ebba18-8bc2-456e-b856-75c9351ff269",
      "name": "스티키 노트13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2928,
        192
      ],
      "parameters": {
        "width": 230,
        "height": 464,
        "content": "## Create Invoice URL (QuickBooks API - HTTP)\n\n--Creates the invoice in QuickBooks Sandbox via HTTP POST.\n\n--Ensure Sandbox Company ID & version number (minorversion=75) are correct.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "356e57c9-8749-44e3-9200-b2b68f1df2b5",
      "name": "스티키 노트14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3200,
        224
      ],
      "parameters": {
        "width": 230,
        "height": 432,
        "content": "## Create Invoice Record\n\n--Logs created invoice details into “Invoices & Payments” table in Airtable.\n\n--Automatically captures Invoice Number, Amount, Due Date, etc.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a831625c-2a53-4b29-a03f-de8773778ee1",
      "name": "스티키 노트15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3504,
        224
      ],
      "parameters": {
        "width": 230,
        "height": 432,
        "content": "## Update Order Record\n\n--Updates “Confirmed Orders” table with QBO Invoice ID and Number.\n\n--Keeps Airtable and QuickBooks in sync.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7dfe52a2-7690-4351-b7d8-85b67d200dbe",
      "name": "스티키 노트16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3808,
        224
      ],
      "parameters": {
        "width": 230,
        "height": 432,
        "content": "## Update Customer Record\n\n--Updates existing Airtable Customer record with QBO Customer ID.\n\n--Ensures future syncs don’t recreate existing customers.\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "74257ded-c395-4861-8140-4d3d63ddaf0d",
      "name": "스티키 노트17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1184,
        128
      ],
      "parameters": {
        "width": 464,
        "height": 288,
        "content": "## Airtable Structure Requirements\n\n* [Airtable Streucture Requirement](https://drive.google.com/drive/folders/1dE4sXikesaTpLE-Pc-VU3mqg0fMZ8EDU)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a65334dc-af68-429c-960c-fff711cf5fe5",
  "connections": {
    "dac5c7fa-a488-4f97-b8f0-aa8a56ca23ec": {
      "main": [
        [
          {
            "node": "09a7dae1-3f7f-4b5f-87ed-dd7a5d0f7b0f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f83c8c16-ac6e-4f02-8db9-83befb18abf0": {
      "main": [
        [
          {
            "node": "10f6d569-a928-41f8-a768-2c6646a4072d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e56db207-580e-4ac9-affc-ed490d0674bb": {
      "main": [
        [
          {
            "node": "9b6f19f2-ac4c-4baa-af6b-730b18cb2186",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dba10e50-b393-43d7-91ec-eac513be2ab7": {
      "main": [
        [
          {
            "node": "f83c8c16-ac6e-4f02-8db9-83befb18abf0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "35215682-456e-47e1-93ea-67d96ea4fda2": {
      "main": [
        [
          {
            "node": "e56db207-580e-4ac9-affc-ed490d0674bb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9b6f19f2-ac4c-4baa-af6b-730b18cb2186": {
      "main": [
        [],
        [
          {
            "node": "d4090bb0-4d0a-430d-8a9e-bee8860fc136",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5299c75c-d158-42eb-b9a6-16291eb83efd": {
      "main": [
        [
          {
            "node": "dba10e50-b393-43d7-91ec-eac513be2ab7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "10f6d569-a928-41f8-a768-2c6646a4072d": {
      "main": [
        [
          {
            "node": "35215682-456e-47e1-93ea-67d96ea4fda2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d4090bb0-4d0a-430d-8a9e-bee8860fc136": {
      "main": [
        [
          {
            "node": "da33b092-a29d-4e07-8992-251c2e8d5cdd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "85f4579d-008c-469c-bfa0-085e17e33b80": {
      "main": [
        [
          {
            "node": "8b60a7d0-ecf8-4f7f-8c59-e40be0441b49",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "db74e2e3-bc33-4277-89de-1b62bce61d6c": {
      "main": [
        [
          {
            "node": "ec49c44f-54fe-4f02-860f-2f492e46be18",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "da33b092-a29d-4e07-8992-251c2e8d5cdd": {
      "main": [
        [
          {
            "node": "85f4579d-008c-469c-bfa0-085e17e33b80",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d8e97ca6-608d-456b-af0c-01563c747444": {
      "main": [
        [
          {
            "node": "db74e2e3-bc33-4277-89de-1b62bce61d6c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8b60a7d0-ecf8-4f7f-8c59-e40be0441b49": {
      "main": [
        [
          {
            "node": "9b6f19f2-ac4c-4baa-af6b-730b18cb2186",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ec49c44f-54fe-4f02-860f-2f492e46be18": {
      "main": [
        [
          {
            "node": "05c1e7bc-bc42-415a-8052-50a852ccf19a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "09a7dae1-3f7f-4b5f-87ed-dd7a5d0f7b0f": {
      "main": [
        [
          {
            "node": "d8e97ca6-608d-456b-af0c-01563c747444",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05c1e7bc-bc42-415a-8052-50a852ccf19a": {
      "main": [
        [
          {
            "node": "5299c75c-d158-42eb-b9a6-16291eb83efd",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "dba10e50-b393-43d7-91ec-eac513be2ab7",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

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

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

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

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

유료인가요?

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

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

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

저자
Intuz

Intuz

@intuz

Workflow automation can help automate your routine activities and help saves $$$, as well as hours of time. As a boutique tech consulting company, Intuz help businesses with custom AI/ML, AI Workflow Automations, and software development. Automate your business workflow for: Sales Marketing Accounting Finance Operations E-Commerce Customer Support Admin & Backoffice Logistics & Supply Chain

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34