8
n8n 한국어amn8n.com

Airtable에서 QuickBooks로의 경비 보고서 자동화

고급

이것은Invoice Processing, Multimodal AI분야의자동화 워크플로우로, 20개의 노드를 포함합니다.주로 If, Merge, Airtable, HttpRequest, AirtableTrigger 등의 노드를 사용하며. Airtable에서 QuickBooks로의 비용 보고서 자동화

사전 요구사항
  • Airtable API Key
  • 대상 API의 인증 정보가 필요할 수 있음
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "id": "WCAyzxSt6yCROjq8",
  "meta": {
    "instanceId": "1a54c41d9050a8f1fa6f74ca858828ad9fb97b9fafa3e9760e576171c531a787"
  },
  "name": "Automate Expense Reporting from Airtable to QuickBooks",
  "tags": [],
  "nodes": [
    {
      "id": "92e68aed-1a03-478b-89d4-5d94e98b3db0",
      "name": "Airtable 트리거",
      "type": "n8n-nodes-base.airtableTrigger",
      "position": [
        -120,
        1120
      ],
      "parameters": {
        "baseId": {
          "__rl": true,
          "mode": "id",
          "value": "appT0dprL0zCSuG45"
        },
        "tableId": {
          "__rl": true,
          "mode": "id",
          "value": "{YOUR_AIRTABLE_TABLE_ID}"
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerField": "Created",
        "authentication": "airtableTokenApi",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "0b1822e8-1fcf-4ef0-872d-ec3b50d0ef9d",
      "name": "레코드 검색",
      "type": "n8n-nodes-base.airtable",
      "position": [
        240,
        1120
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "{YOUR_AIRTABLE_BASE_ID}",
          "cachedResultUrl": "https://airtable.com/{YOUR_AIRTABLE_BASE_ID}",
          "cachedResultName": "airtable_expenses_dummy.csv"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "{YOUR_AIRTABLE_TABLE_ID}",
          "cachedResultUrl": "https://airtable.com/{YOUR_AIRTABLE_BASE_ID}/{YOUR_AIRTABLE_TABLE_ID}",
          "cachedResultName": "expense management"
        },
        "options": {},
        "operation": "search"
      },
      "typeVersion": 2.1
    },
    {
      "id": "6bd50650-7226-48ad-afe3-c2493e6c50f8",
      "name": "조건문",
      "type": "n8n-nodes-base.if",
      "position": [
        700,
        1120
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "dd2d7985-b436-4213-a3b9-56916c8f59b4",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.Status }}",
              "rightValue": "Approved"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2d50d1e9-8c4c-4dff-91cb-d39d0c1d0237",
      "name": "작업 없음, 아무것도 하지 않음",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1580,
        1580
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5edab364-f81e-47e3-8da4-601b84b3ac19",
      "name": "파일 다운로드",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1560,
        780
      ],
      "parameters": {
        "url": "={{ $json['Receipt URL'] }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "=Receipt"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "84784657-8fad-4e60-aa32-bdf75255ac2f",
      "name": "병합",
      "type": "n8n-nodes-base.merge",
      "position": [
        2800,
        760
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "02450b3c-81fa-4159-a910-730365a05dfd",
      "name": "레코드 업데이트",
      "type": "n8n-nodes-base.airtable",
      "position": [
        3840,
        760
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "{YOUR_AIRTABLE_BASE_ID}",
          "cachedResultUrl": "https://airtable.com/{YOUR_AIRTABLE_BASE_ID}",
          "cachedResultName": "airtable_expenses_dummy.csv"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "{YOUR_AIRTABLE_TABLE_ID}",
          "cachedResultUrl": "https://airtable.com/{YOUR_AIRTABLE_BASE_ID}/{YOUR_AIRTABLE_TABLE_ID}",
          "cachedResultName": "expense management"
        },
        "columns": {
          "value": {
            "id": "={{ $('Search records').item.json.id }}",
            "Status": "Done"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Receipt URL",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Receipt URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Amount",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Amount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Memo",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Memo",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QBO Vendor ID",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "QBO Vendor ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QBO Expense Account ID",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "QBO Expense Account ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QBO Payment Account ID",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "QBO Payment Account ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Category",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Category",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Created",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Receipt Type",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Receipt Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Customer",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "typeVersion": 2.1
    },
    {
      "id": "cb4a1747-f86b-427a-8325-113315392775",
      "name": "스티커 메모",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        1300
      ],
      "parameters": {
        "color": 3,
        "width": 500,
        "height": 300,
        "content": "### Step 1: Airtable Trigger 🚦📋\n\nThis node triggers the workflow whenever there is a change in the **Created** column, effectively activating when new data is added.\n\nWhy this step is important:\n\n- ⏰ Automatically starts the workflow on new entries.\n- 📈 Monitors real-time changes for timely processing.\n- 🔄 Ensures your automation responds instantly to new Airtable data.\n\nIt’s the step that keeps your workflow synced with your Airtable updates. 🔔✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d3c122f4-ce1a-4968-b57a-f8fa3ad261eb",
      "name": "스티커 메모1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        60,
        780
      ],
      "parameters": {
        "width": 460,
        "height": 300,
        "content": "### Step 2: Airtable Search Records 🔍📋\n\nThis node searches and retrieves all records from a specific Airtable table.\n\nWhy this step is important:\n\n- 🔎 Gathers complete data from the table for processing.\n- 📊 Enables further filtering, updating, or analysis within the workflow.\n- 🗂️ Provides a snapshot of all relevant records at once.\n\nIt’s the step that collects your data foundation for the automation ahead. 🧱✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2bc54880-2d88-41e6-9327-37dd97da3689",
      "name": "스티커 메모2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        500,
        1280
      ],
      "parameters": {
        "color": 4,
        "width": 500,
        "height": 340,
        "content": "### Step 3: Status Check (If Node) ✅❌\n\nThis node checks whether the **Status** field is set to **Approved**.\n\n- **True:** Status is Approved; workflow continues.\n- **False:** Status is not Approved; workflow can exit or take alternate action.\n\nWhy this step is important:\n\n- ✔️ Ensures only approved items proceed in the workflow.\n- 🛑 Prevents processing of unapproved or incomplete records.\n- 🔄 Maintains workflow accuracy and efficiency.\n\nIt’s the decision point that filters records based on their approval status. 🚦✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "111d0402-84f5-4f09-b78d-b5b9ead43713",
      "name": "스티커 메모3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1420,
        1260
      ],
      "parameters": {
        "width": 440,
        "height": 300,
        "content": "### Graceful Exit (No-Op Node) 🛑✨\n\nThis **No Operation** node acts as a graceful exit for items whose **Status** is not Approved.\n\nWhy this step is important:\n\n- 🛡️ Prevents further processing of unapproved records.\n- 🔄 Ensures the workflow ends cleanly without errors.\n- 🧹 Maintains clear and organized workflow logic.\n\nIt’s the safe stopping point that quietly ends the flow when no action is needed. 🚪✅\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b9847915-663e-4ec6-b815-71b09d28e687",
      "name": "스티커 메모4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        440
      ],
      "parameters": {
        "color": 6,
        "width": 480,
        "height": 300,
        "content": "### Step 4: Download File from Receipt URL (HTTP Request) 📥💻\n\nThis node sends an **HTTP Request** to download the file from the provided **Receipt URL**.\n\nWhy this step is important:\n\n- 📄 Retrieves the actual file (e.g., invoice, receipt) for further processing.\n- 🔗 Ensures the workflow has access to the necessary document.\n- ⚡ Enables downstream nodes to work with the downloaded file.\n\nIt’s the step that pulls the file into your workflow for processing or storage. 🗂️✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6c6f6ede-b978-4351-abe3-cc6226ebc746",
      "name": "QBO-비용 생성",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2220,
        460
      ],
      "parameters": {
        "url": "https://sandbox-quickbooks.api.intuit.com/v3/company/{YOUR_QUICKBOOKS_COMPANY_ID}/purchase",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"PaymentType\": \"Cash\",\n  \"TxnDate\": \"{{$json['Date']}}\",\n  \"PrivateNote\": \"{{$json['Memo']}}\",\n  \"AccountRef\": { \"value\": \"{{$json['QBO Payment Account ID']}}\" },\n  \"EntityRef\": { \"type\": \"Vendor\", \"value\": \"{{$json['QBO Vendor ID']}}\" },\n  \"Line\": [\n    {\n      \"Amount\": {{$json['Amount']}},\n      \"DetailType\": \"AccountBasedExpenseLineDetail\",\n      \"AccountBasedExpenseLineDetail\": {\n        \"AccountRef\": { \"value\": \"{{$json['QBO Expense Account ID']}}\" }\n      }\n    }\n  ]\n}\n",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "quickBooksOAuth2Api"
      },
      "typeVersion": 4.2
    },
    {
      "id": "d6f91071-2044-4c56-b940-962a63765b60",
      "name": "QBO-파일 업로드",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3320,
        760
      ],
      "parameters": {
        "url": "https://sandbox-quickbooks.api.intuit.com/v3/company/{YOUR_QUICKBOOKS_COMPANY_ID}/upload?minorversion=65",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file_content_01",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "Receipt"
            }
          ]
        },
        "nodeCredentialType": "quickBooksOAuth2Api"
      },
      "typeVersion": 4.2
    },
    {
      "id": "b12dc68f-ef24-42a7-801c-54d03e729b67",
      "name": "스티커 메모5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2060,
        100
      ],
      "parameters": {
        "color": 5,
        "width": 440,
        "height": 300,
        "content": "**Step 5 - Create Expense in QuickBooks (QBO) 💸🧾**\n\nThis node uses the **Create Expense** operation to add an expense in QuickBooks based on data from Airtable.\n\nWhy this step is important:\n\n- 📊 Automatically records expenses from your Airtable data.\n- 🔗 Links expenses to the correct accounts and vendors in QuickBooks.\n- ⚡ Streamlines bookkeeping and financial tracking.\n\nIt’s the step that turns raw expense data into an official QuickBooks record. ✅✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e0617428-57bd-4fd6-b4cd-afec5931f363",
      "name": "스티커 메모6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2640,
        920
      ],
      "parameters": {
        "width": 480,
        "height": 340,
        "content": "### Step 6: Merge Expense and File Data Node 🔗📂\n\nThis node merges data from the **Create Expense** node and the **Download File** node.\n\nWhy this step is important:\n\n- 🔄 Combines expense details with the corresponding file (receipt or invoice).\n- 📊 Ensures all relevant information is packaged together for the next steps.\n- ⚙️ Maintains data integrity and prepares a unified dataset for further processing.\n\nIt’s the step that consolidates expense and file data for smooth workflow continuation. 🤝✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "21f9dc2b-852c-43eb-9600-beb33c567bf7",
      "name": "스티커 메모7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3120,
        500
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 240,
        "content": "### Step 7: Upload File to QuickBooks (QBO Upload) 📤🧾\n\nThis node uses the **Upload File** operation to attach the downloaded file (e.g., receipt or invoice) to QuickBooks.\n\nWhy this step is important:\n- 🔗 Ensures proper documentation for bookkeeping and auditing.\n- ⚡ Automates file management within QuickBooks, saving time and reducing errors.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5e7976bb-8812-407b-b79e-a67f2462e07c",
      "name": "스티커 메모8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3680,
        940
      ],
      "parameters": {
        "color": 4,
        "width": 480,
        "height": 300,
        "content": "### Step 8: Update Airtable Record Status ✏️✅\n\nThis node updates the **Status** column of the Airtable records to **Done**.\n\nWhy this step is important:\n\n- 🔄 Marks the completion of the workflow for each record.\n- 📋 Provides clear visibility on processed items.\n- ⚡ Ensures Airtable reflects the latest workflow status.\n\nIt’s the step that closes the loop by updating the record’s status to indicate successful processing. 🏁✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f270dc7e-492a-4f23-9f65-f4658c3aedde",
      "name": "스티커 메모9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -180,
        20
      ],
      "parameters": {
        "color": 3,
        "width": 600,
        "height": 440,
        "content": "### Prerequisites ⚙️🔗\n\n- Create and connect your **Airtable** account using a **Personal Access Token**.\n- Create a table with the following columns:\n  - **Status**\n  - **Receipt URL**\n  - **Amount**\n  - **Date**\n  - **Memo**\n  - **QBO Vendor ID**\n  - **QBO Expense Account ID**\n  - **QBO Payment Account ID**\n  - **Category**\n  - **Receipt Type**\n  - **Customer**\n- Connect your oauth2 Quickbooks credentials\n- Add your company id in the QBO nodes\nThese configurations ensure your Airtable is ready for seamless integration with QuickBooks and the workflow. ✅✨\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a356ca74-915c-4349-9d68-c1a03cdc58f8",
      "name": "스티커 메모10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1500,
        1800
      ],
      "parameters": {
        "width": 440,
        "height": 300,
        "content": "### Get in Touch\n\nPlease feel free to reachout to us, if you need any help in settin up this workflow.\n\nWe can also help customize workflow pet the use-case. \n\nReach out us at: getstarted@intuz.com\n\nWebsite: https://www.intuz.com/\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "71973fac-b373-4884-b5d0-f70497f5c2cb",
  "connections": {
    "6bd50650-7226-48ad-afe3-c2493e6c50f8": {
      "main": [
        [
          {
            "node": "5edab364-f81e-47e3-8da4-601b84b3ac19",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "2d50d1e9-8c4c-4dff-91cb-d39d0c1d0237",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "84784657-8fad-4e60-aa32-bdf75255ac2f": {
      "main": [
        [
          {
            "node": "d6f91071-2044-4c56-b940-962a63765b60",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5edab364-f81e-47e3-8da4-601b84b3ac19": {
      "main": [
        [
          {
            "node": "6c6f6ede-b978-4351-abe3-cc6226ebc746",
            "type": "main",
            "index": 0
          },
          {
            "node": "84784657-8fad-4e60-aa32-bdf75255ac2f",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "0b1822e8-1fcf-4ef0-872d-ec3b50d0ef9d": {
      "main": [
        [
          {
            "node": "6bd50650-7226-48ad-afe3-c2493e6c50f8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d6f91071-2044-4c56-b940-962a63765b60": {
      "main": [
        [
          {
            "node": "02450b3c-81fa-4159-a910-730365a05dfd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "92e68aed-1a03-478b-89d4-5d94e98b3db0": {
      "main": [
        [
          {
            "node": "0b1822e8-1fcf-4ef0-872d-ec3b50d0ef9d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6c6f6ede-b978-4351-abe3-cc6226ebc746": {
      "main": [
        [
          {
            "node": "84784657-8fad-4e60-aa32-bdf75255ac2f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

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

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

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

고급 - 청구서 처리, 멀티모달 AI

유료인가요?

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

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

고급 사용자를 위한 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