고객용 청구서 생성 및 알림 전송
고급
이것은자동화 워크플로우로, 48개의 노드를 포함합니다.주로 If, Set, Code, Gmail, Switch 등의 노드를 사용하며. QuickBooks, Jotform, GPT-4o를 사용한 인voice 및 결제 알림 자동 생성
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •OpenAI API Key
사용된 노드 (48)
카테고리
-
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "iwPkwhyyDLOePuom",
"meta": {
"instanceId": "3549451ca835035557d5dc1c3d9e6ba924e7314534a74c901f66b91f9ef6023e",
"templateCredsSetupCompleted": true
},
"name": "Generate Invoices and Send Reminders for Customers with Jotform, QuickBooks and Gmail",
"tags": [],
"nodes": [
{
"id": "9c594f0d-b9d7-4329-8017-90bbc445cc43",
"name": "양식 제출 수신",
"type": "n8n-nodes-base.webhook",
"position": [
-464,
0
],
"webhookId": "ebee0263-fc61-414f-a9cc-faf3269ce30d",
"parameters": {
"path": "ebee0263-fc61-414f-a9cc-faf3269ce30d",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "20ea495b-ef6e-4bb4-a3a4-8fa95b17a77d",
"name": "조건문",
"type": "n8n-nodes-base.if",
"position": [
320,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "bfa24559-7702-4ebf-909d-c5c2a60ad817",
"operator": {
"type": "object",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": 0
},
{
"id": "b4301cfe-a22a-490f-a72b-50d266bc1c5e",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.Id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "16ccee04-eefb-4e38-a5d4-3c65e26f779f",
"name": "제품 정보 가져오기",
"type": "n8n-nodes-base.quickbooks",
"position": [
1248,
0
],
"parameters": {
"limit": 1,
"filters": {
"query": "=WHERE name = '{{ $json.item.name }}'"
},
"resource": "item",
"operation": "getAll"
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "51fda0e5-2c6e-40cc-a967-76426f4bcf36",
"name": "송장 생성",
"type": "n8n-nodes-base.quickbooks",
"position": [
1856,
0
],
"parameters": {
"Line": [
{
"Amount": 1,
"itemId": "={{ $json.item.id }}",
"DetailType": "SalesItemLineDetail",
"Description": "Jotform submission"
}
],
"resource": "invoice",
"operation": "create",
"CustomerRef": "={{ $json.customer.id }}",
"additionalFields": {}
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "2e729c72-459b-4448-892c-4f7b14af1eb6",
"name": "송장 발송",
"type": "n8n-nodes-base.quickbooks",
"position": [
2160,
0
],
"parameters": {
"email": "={{ $('Add item id').item.json.customer.email }}",
"resource": "invoice",
"invoiceId": "={{ $json.Id }}",
"operation": "send"
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "9fb60975-4ab2-465d-b0c3-27669702b49f",
"name": "고객 존재 여부 확인",
"type": "n8n-nodes-base.quickbooks",
"position": [
112,
0
],
"parameters": {
"limit": 1,
"filters": {
"query": "=Where PrimaryEmailAddr = '{{ $json.customer.email }}'"
},
"operation": "getAll"
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "465941dd-9b14-4651-bff1-d5c62a6b52aa",
"name": "메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-544,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Receive Submission\nReceives the product/service form submission from Jotform"
},
"typeVersion": 1
},
{
"id": "fd542ca6-d362-4d9d-8469-0a0493d8092e",
"name": "메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
-112
],
"parameters": {
"color": 7,
"width": 400,
"height": 320,
"content": "## Check If Customer exists \nChecks if the customer exists in QBO or not"
},
"typeVersion": 1
},
{
"id": "10412197-c39a-4b71-a8ae-f025c30c6a88",
"name": "메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-336
],
"parameters": {
"color": 7,
"width": 304,
"height": 336,
"content": "## Customer Exists\nNow since the customer exists we will update the customer details like updating the billing details with the new one"
},
"typeVersion": 1
},
{
"id": "77b8565e-bd0a-4fd7-a23c-7bdd2c94cd42",
"name": "고객 생성",
"type": "n8n-nodes-base.quickbooks",
"position": [
608,
176
],
"parameters": {
"operation": "create",
"displayName": "=",
"additionalFields": {
"BillAddr": {
"details": {
"City": "={{ $('Format data').item.json.address.city }}",
"Line1": "={{ $('Format data').item.json.address.line1 }}",
"PostalCode": "={{ $('Format data').item.json.address.postalZipCode }}"
}
},
"GivenName": "={{ $('Format data').item.json.customer.name }}",
"PrimaryPhone": "={{ $('Format data').item.json.customer.phone }}",
"PrimaryEmailAddr": "={{ $('Format data').item.json.customer.email }}"
}
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "aa96c6e2-418b-45d1-848d-cef54e891550",
"name": "고객 정보 업데이트",
"type": "n8n-nodes-base.quickbooks",
"position": [
608,
-192
],
"parameters": {
"operation": "update",
"customerId": "={{ $json.Id }}",
"updateFields": {
"BillAddr": {
"details": {
"City": "={{ $('Format data').item.json.address.city }}",
"Line1": "={{ $('Format data').item.json.address.line1 }}",
"PostalCode": "={{ $('Format data').item.json.address.postalZipCode }}"
}
},
"GivenName": "={{ $('Format data').item.json.customer.name }}",
"PrimaryPhone": "={{ $('Format data').item.json.customer.phone }}"
}
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "a27bb89f-7797-4e4e-b104-0b739d05ee0d",
"name": "메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
48
],
"parameters": {
"color": 7,
"width": 304,
"height": 320,
"content": "## Customer Doesn't Exist\nNow since the customer doesn't exist we will create new customer"
},
"typeVersion": 1
},
{
"id": "3c029901-edd6-4085-a4b9-578adecf5164",
"name": "메모4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Get The Item\nGets the selected product/service from QBO"
},
"typeVersion": 1
},
{
"id": "4c978dba-767e-4327-a1b2-2626fac272a7",
"name": "메모5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1776,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Create The Invoice\nCreates a new invoice for that customer"
},
"typeVersion": 1
},
{
"id": "7eb0c556-eeb0-47ff-bc78-8050056f6dbe",
"name": "메모6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2080,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Send The Invoice\nSends the newly created invoice for that customer(via email)"
},
"typeVersion": 1
},
{
"id": "cb13f312-4f56-45ad-b462-fe120cd79c62",
"name": "메모7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1664,
-416
],
"parameters": {
"width": 1072,
"height": 1280,
"content": "## Generate Invoices and Send Reminders for Customers with Jotform, QuickBooks and Gmail\nThis workflow automates the entire process of receiving a product/service order, checking or creating a customer in **QuickBooks Online (QBO)**, generating an invoice, emailing it — all triggered by a form submission (via **Jotform**), and sending invoice reminders.\n\n## How It Works\n### 1- Receive Submission\n* Triggered when a user submits a form.\n* Collects data like customer details, selected product/service, etc.\n\n### 2- Check If Customer Exists\n* Searches QBO to determine if the customer already exists.\n* ✅ **If Customer Exists:** **Update** customer details (e.g., billing address).\n* ❌ **If Customer Doesn’t Exist:** **Create** a new customer in QBO.\n\n### 3- Get The Item\n* Retrieves the selected product or service from QBO.\n\n### 4- Create The Invoice\n* Generates a new invoice for the customer using the item selected.\n\n### 5- Send The Invoice\n* Automatically sends the invoice via email to the customer.\n\n### 6- Store The Invoice In DB\n* Stores the needed invoice details in the DB.\n\n### 7- Send Reminders\n* Every day at 8 AM, the automation checks each invoice to decide whether to:\n * send a reminder email,\n * skip and send it later, or\n * delete the invoice from the DB (if it's paid or all reminders have been sent).\n\n## Who Can Benefit from This Workflow?\n* **Freelancers**\n* **Service Providers**\n* **Consultants & Coaches**\n* **Small Businesses**\n* **E-commerce or Custom Product Sellers**\n\n## Requirements\n- Jotform webhook setup, more info [here](https://www.jotform.com/help/245-how-to-setup-a-webhook-with-jotform/)\n- QuickBooks Online credentials, more info [here](https://developer.intuit.com/app/developer/qbo/docs/get-started/get-client-id-and-client-secret)\n- Email setup, update email nodes (`Send reminder email` & `Send reminders sent summary`), more info about Gmail setup [here](https://docs.n8n.io/integrations/builtin/credentials/google)\n- Create data table with the following columns:\n * invoiceId (string)\n * remainingAmount (number)\n * currency (string)\n * remindersSent (number)\n * lastSentAt (date time)\n- Update `Add reminders config` node so update the data table id and intervals in days (default is after 2 days, then after 3 days and finally after 5 days )\n- LLM model credentials"
},
"typeVersion": 1
},
{
"id": "f4d77f45-9142-4c1c-b125-e8e5f24ed59d",
"name": "메모8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Format Data\nFormats the data thus making it easier to be used in other nodes"
},
"typeVersion": 1
},
{
"id": "b66c8925-e5af-4ad3-83bf-8b8db88fa5bc",
"name": "데이터 형식 지정",
"type": "n8n-nodes-base.code",
"position": [
-160,
0
],
"parameters": {
"jsCode": "function extractAddressData(text) {\n const regex = /Street Address:\\s*([^<]+)<br>Street Address Line 2:\\s*([^<]+)<br>City:\\s*([^<]+)<br>State \\/ Province:\\s*([^<]+)<br>Postal \\/ Zip Code:\\s*([^<]+)<br>Country:\\s*([^<]+)<br>/;\n const matches = text.match(regex);\n \n if (matches) {\n return {\n line1: matches[1].trim(),\n line2: matches[2].trim(),\n city: matches[3].trim(),\n stateProvince: matches[4].trim(),\n postalZipCode: matches[5].trim(),\n country: matches[6].trim()\n };\n }\n \n return {\n line1: null,\n line2: null,\n city: null,\n stateProvince: null,\n postalZipCode: null,\n country: null\n }\n}\n\nreturn {\n address: extractAddressData($input.first().json.body.billingAddress),\n customer: {\n name: $input.first().json.body.name,\n email: $input.first().json.body.email,\n phone: $input.first().json.body.phone\n },\n item: {\n name: $input.first().json.body.itemName\n }\n}"
},
"typeVersion": 2
},
{
"id": "3ef848b5-f0c9-4e48-994a-1ec16d130c27",
"name": "메모9",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Add Customer Id\nAdds customer id to the data"
},
"typeVersion": 1
},
{
"id": "a475fc3d-1d1b-406e-92ae-f8d982232b33",
"name": "고객 ID 추가",
"type": "n8n-nodes-base.code",
"position": [
944,
0
],
"parameters": {
"jsCode": "return {\n ...$('Format data').first().json,\n customer: {\n ...$('Format data').first().json.customer,\n id: $input.first().json.Id\n }\n}"
},
"typeVersion": 2
},
{
"id": "d521cb5a-a497-4b2b-be64-0b2b0a755696",
"name": "메모10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1472,
-112
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Add Item Id\nAdds item (service/product) id to the data"
},
"typeVersion": 1
},
{
"id": "e5bdb990-3b56-4f97-beba-499d3e063961",
"name": "항목 ID 추가",
"type": "n8n-nodes-base.code",
"position": [
1552,
0
],
"parameters": {
"jsCode": "return {\n ...$('Add customer id').first().json,\n item: {\n ...$('Add customer id').first().json.item,\n id: $input.first().json.Id\n }\n}"
},
"typeVersion": 2
},
{
"id": "9370f28d-d910-4e28-8001-414529a51f18",
"name": "알림 설정 추가",
"type": "n8n-nodes-base.set",
"position": [
960,
704
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={\n \"dataTableId\": \"\",\n \"reminderIntervalsInDays\": [2, 3, 5],\n isInvoiceTrigger: {{ $json[\"Day of week\"] ? false : true }}\n}\n "
},
"typeVersion": 3.4
},
{
"id": "f1e1bc2a-c99e-461d-88fd-d87bfcff3a34",
"name": "DB에 송장 ID 삽입",
"type": "n8n-nodes-base.dataTable",
"position": [
1664,
512
],
"parameters": {
"columns": {
"value": {
"currency": "={{ $('Send the invoice').item.json.CurrencyRef.value }}",
"invoiceId": "={{ $('Send the invoice').item.json.Id }}",
"remindersSent": 0,
"remainingAmount": "={{ $('Send the invoice').item.json.Balance }}"
},
"schema": [
{
"id": "invoiceId",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "invoiceId",
"defaultMatch": false
},
{
"id": "remainingAmount",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "remainingAmount",
"defaultMatch": false
},
{
"id": "currency",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "currency",
"defaultMatch": false
},
{
"id": "remindersSent",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "remindersSent",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"optimizeBulk": false
},
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Add reminders config').item.json.dataTableId }}"
}
},
"typeVersion": 1
},
{
"id": "aabb6827-0dd5-4332-a36c-cc35f150956a",
"name": "송장 목록 가져오기",
"type": "n8n-nodes-base.dataTable",
"position": [
1664,
880
],
"parameters": {
"operation": "get",
"returnAll": true,
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Add reminders config').item.json.dataTableId }}"
}
},
"typeVersion": 1
},
{
"id": "15f3089c-ebc8-4cad-85c0-67fc5bbf2802",
"name": "송장 정보 가져오기",
"type": "n8n-nodes-base.quickbooks",
"position": [
2368,
1104
],
"parameters": {
"resource": "invoice",
"invoiceId": "={{ $json.invoiceId }}"
},
"credentials": {
"quickBooksOAuth2Api": {
"id": "E1S8XZZk9iMCPDSN",
"name": "QuickBooks Online account"
}
},
"typeVersion": 1
},
{
"id": "0f498328-0b7b-41d9-8f7a-edc45f92438a",
"name": "조건문2",
"type": "n8n-nodes-base.if",
"position": [
1312,
704
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "82853a4e-d488-49cd-8e36-ba1a737c519b",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.isInvoiceTrigger }}",
"rightValue": "0"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e84c641c-5316-47fa-bd3c-827487d437a9",
"name": "AI 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2736,
544
],
"parameters": {
"text": "={{ $('Get today's sent reminders').all() }}",
"options": {
"systemMessage": "=You are an AI assistant that generates a daily reminder summary for invoices. You will receive a list of invoice data and your task is to summarize how many reminders have been sent for each invoice today.\n\nInput Data:\nThe input data is a list of invoices with the following fields:\n- remainingAmount: The remaining amount the customer still needs to pay.\n- currency: The currency of the remaining amount (e.g., USD, EUR).\n- remindersSent: The total number of reminders that have been sent for this invoice.\n\nGoal:\n1- Summarize the reminders sent today:\n- Count how many reminders have been sent for all invoices provided in the input.\n\n2- Generate a professional HTML email summary:\n- Use the information from the invoices to create a summary in HTML format.\n- Include a greeting for the team (e.g., \"Sales Team\", \"Finance Team\").\n- Display a total count of reminders sent today.\n- Include invoice-level details such as invoiceId, remainingAmount, currency, and remindersSent.\n\nFormatting Guidelines:\n1- The summary should always be structured as an HTML email.\n2- The summary should be clear, readable, and professional.\n3- You may choose the layout that feels most appropriate, but always include:\n - A greeting (e.g., \"Dear Team,\").\n - A total number of reminders sent today.\n - A list of invoices with invoiceId, remainingAmount, currency, and remindersSent.\n4- Closing with generic sign-off.\n\nExample input:\n[\n {\n \"id\": 70,\n \"createdAt\": \"2025-10-10T16:50:54.851Z\",\n \"updatedAt\": \"2025-10-15T16:50:54.851Z\",\n \"invoiceId\": \"158\",\n \"remainingAmount\": 10,\n \"currency\": \"USD\",\n \"remindersSent\": 5\n },\n {\n \"id\": 80,\n \"createdAt\": \"2025-10-12T17:50:54.851Z\",\n \"updatedAt\": \"2025-10-15T16:50:54.851Z\",\n \"invoiceId\": \"160\",\n \"remainingAmount\": 30,\n \"currency\": \"EUR\",\n \"remindersSent\": 3\n }\n]\n\nExample of Expected Output:\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Reminder Summary for Today</title>\n <style>\n body { font-family: Arial, sans-serif; color: #333; line-height: 1.6; }\n .table { width: 100%; margin-top: 20px; border-collapse: collapse; }\n .table th, .table td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n .table th { background-color: #f2f2f2; }\n .summary { font-size: 16px; margin-top: 20px; }\n </style>\n</head>\n<body>\n <div class=\"content\">\n <p>Dear Sales Team,</p>\n \n <p>Here is a summary of the reminders sent today:</p>\n \n <div class=\"summary\">\n <strong>Total reminders sent today: 2</strong>\n </div>\n\n <table class=\"table\">\n <thead>\n <tr>\n <th>Invoice ID</th>\n <th>Remaining Amount</th>\n <th>Currency</th>\n <th>Total Reminders Sent</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>158</td>\n <td>$10.00</td>\n <td>USD</td>\n <td>5</td>\n </tr>\n <tr>\n <td>160</td>\n <td>€30.00</td>\n <td>EUR</td>\n <td>3</td>\n </tr>\n </tbody>\n </table>\n\n <p>If you need further details, feel free to reach out!</p>\n\n <p>Best regards,<br>AI Assistant</p>\n </div>\n</body>\n</html>"
},
"promptType": "define"
},
"executeOnce": true,
"typeVersion": 2.2
},
{
"id": "93a4aa27-13ca-4989-a617-5211f3856ed9",
"name": "OpenAI 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2736,
752
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "ns8LVe1zpSS3Kw9p",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "06381d7b-8067-4216-8ecb-a84876693bf3",
"name": "스위치",
"type": "n8n-nodes-base.switch",
"position": [
2672,
1120
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "send now",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "df179cc3-60b8-4b49-9fb7-0adabcc3e394",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.Balance > 0 && DateTime.fromISO($('Loop over invoices').item.json.updatedAt).plus($('Add reminders config').item.json.reminderIntervalsInDays[$('Loop over invoices').item.json.remindersSent], 'days').format('yyyy-MM-dd') == $now.format('yyyy-MM-dd') }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "already paid ",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cf03d75d-6560-42ed-8293-3d5e9399b9e3",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.Balance == 0 }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "send later",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "81cb838e-79c8-4c92-964f-f7f5cd44a498",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": true,
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "242fe315-78c9-4bb5-8a53-2d6485574d54",
"name": "알림 일정 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
608,
704
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "add99766-9f1f-4309-96b7-6e26d5503185",
"name": "메모11",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
576
],
"parameters": {
"color": 7,
"width": 304,
"height": 320,
"content": "## Schedule Trigger\nSchedules reminders trigger daily at 8 AM"
},
"typeVersion": 1
},
{
"id": "fb8287f4-0b04-4adc-914d-875c5ff04e7c",
"name": "메모12",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
528
],
"parameters": {
"color": 7,
"width": 304,
"height": 368,
"content": "## Add Reminders Config\nAdds reminders config details like `intervals in days` so first reminder will be sent after 2 days, second one after 3 days and final one after 5 days"
},
"typeVersion": 1
},
{
"id": "c07d8400-4ef0-40e4-bff2-22555692077d",
"name": "메모13",
"type": "n8n-nodes-base.stickyNote",
"position": [
1216,
528
],
"parameters": {
"color": 7,
"width": 304,
"height": 368,
"content": "## Check Trigger\nChecks if the previous node has been executed by the above workflow or by the schedule trigger"
},
"typeVersion": 1
},
{
"id": "2c40665a-11db-454b-951f-e28890b633bd",
"name": "메모14",
"type": "n8n-nodes-base.stickyNote",
"position": [
1568,
352
],
"parameters": {
"color": 7,
"width": 304,
"height": 336,
"content": "## Insert Invoice To DB\nInserts newly created invoice needed details to DB so customer will be notified later on about the invoice"
},
"typeVersion": 1
},
{
"id": "397c3156-6843-4596-8b1e-ac2dbe795b2e",
"name": "메모15",
"type": "n8n-nodes-base.stickyNote",
"position": [
1568,
736
],
"parameters": {
"color": 7,
"width": 304,
"height": 336,
"content": "## Get All Invoices\nGets all the invoices from DB"
},
"typeVersion": 1
},
{
"id": "d23e89a3-885d-4251-8f24-9baece741836",
"name": "메모16",
"type": "n8n-nodes-base.stickyNote",
"position": [
1920,
752
],
"parameters": {
"color": 7,
"width": 304,
"height": 320,
"content": "## Loop Over Invoices\nLoops over invoices one by one"
},
"typeVersion": 1
},
{
"id": "8621a71b-9813-4232-9a44-15c62332e75a",
"name": "송장 목록 반복 처리",
"type": "n8n-nodes-base.splitInBatches",
"position": [
2016,
880
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "4c21d69d-5111-45bf-b76f-b5834379c1cc",
"name": "메모17",
"type": "n8n-nodes-base.stickyNote",
"position": [
2272,
544
],
"parameters": {
"color": 7,
"width": 304,
"height": 352,
"content": "## Get Sent Reminders\nGets today's sent reminders from DB"
},
"typeVersion": 1
},
{
"id": "3270e7c4-c153-4341-a9f9-2f2c299264a6",
"name": "메모18",
"type": "n8n-nodes-base.stickyNote",
"position": [
2272,
944
],
"parameters": {
"color": 7,
"width": 304,
"height": 368,
"content": "## Get Invoice Details\nGets the invoice details from QBO so we know whether or not any changes have been made or not"
},
"typeVersion": 1
},
{
"id": "c12c85f8-ea33-471b-80ff-491db349e784",
"name": "오늘 발송된 알림 가져오기",
"type": "n8n-nodes-base.dataTable",
"position": [
2368,
688
],
"parameters": {
"filters": {
"conditions": [
{
"keyName": "lastSentAt",
"keyValue": "={{ $now.startOf('day').toUTC().toString() }}",
"condition": "gte"
}
]
},
"matchType": "allConditions",
"operation": "get",
"returnAll": true,
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Add reminders config').item.json.dataTableId }}"
}
},
"executeOnce": true,
"typeVersion": 1
},
{
"id": "2139421b-bd22-47a6-98d7-7ad641207c7f",
"name": "메모19",
"type": "n8n-nodes-base.stickyNote",
"position": [
2624,
416
],
"parameters": {
"color": 7,
"width": 592,
"height": 480,
"content": "## Summarize Sent Reminders & Send An Email\nSummarizes today's sent reminders using AI and send a summery email to the team like sales team or finance team"
},
"typeVersion": 1
},
{
"id": "11869e18-01a0-4e33-906e-3d6b7b59d40c",
"name": "발송 알림 횟수 증가",
"type": "n8n-nodes-base.dataTable",
"position": [
3136,
1072
],
"parameters": {
"columns": {
"value": {
"lastSentAt": "={{ $now.toISO() }}",
"remindersSent": "={{ $('Loop over invoices').item.json.remindersSent + 1 }} "
},
"schema": [
{
"id": "invoiceId",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "invoiceId",
"defaultMatch": false
},
{
"id": "remainingAmount",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "remainingAmount",
"defaultMatch": false
},
{
"id": "currency",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "currency",
"defaultMatch": false
},
{
"id": "remindersSent",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "remindersSent",
"defaultMatch": false
},
{
"id": "lastSentAt",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "lastSentAt",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"filters": {
"conditions": [
{
"keyName": "invoiceId",
"keyValue": "={{ $('Loop over invoices').item.json.invoiceId }}"
}
]
},
"options": {},
"matchType": "allConditions",
"operation": "update",
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Add reminders config').item.json.dataTableId }}"
}
},
"typeVersion": 1
},
{
"id": "17e76636-622c-49c1-8993-cbb15022b41a",
"name": "송장 삭제",
"type": "n8n-nodes-base.dataTable",
"position": [
3616,
1232
],
"parameters": {
"filters": {
"conditions": [
{
"keyValue": "={{ $('Loop over invoices').item.json.id }}"
}
]
},
"options": {},
"matchType": "allConditions",
"operation": "deleteRows",
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Add reminders config').item.json.dataTableId }}"
}
},
"typeVersion": 1
},
{
"id": "34b07269-37f5-4946-8af7-83b200f31c81",
"name": "조건문3",
"type": "n8n-nodes-base.if",
"position": [
3344,
1072
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f7c9422b-bfd2-4006-9d81-d2332e95532a",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.remindersSent >= $('Add reminders config').item.json.reminderIntervalsInDays.length }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "32b570e6-b5fb-46bd-96f0-6815e30cf4b2",
"name": "메모20",
"type": "n8n-nodes-base.stickyNote",
"position": [
2624,
944
],
"parameters": {
"color": 7,
"width": 1184,
"height": 480,
"content": "## Send Reminders Logic\nThe logic that decides whether or not to send a reminder email now, skip it and send it later or delete the invoice/s from DB (because all the reminders have been sent or the invoice has been paid)"
},
"typeVersion": 1
},
{
"id": "c358be7d-4f13-406c-b713-189474fa8583",
"name": "알림 이메일 발송",
"type": "n8n-nodes-base.gmail",
"position": [
2928,
1072
],
"webhookId": "fff430fe-d43b-41f0-852f-1330051cc148",
"parameters": {
"sendTo": "={{ $json.BillEmail.Address }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body {\n font-family: Arial, sans-serif;\n color: #333;\n line-height: 1.6;\n }\n .container {\n width: 100%;\n max-width: 600px;\n margin: 0 auto;\n padding: 20px;\n border: 1px solid #f1f1f1;\n border-radius: 5px;\n background-color: #f9f9f9;\n }\n .header {\n text-align: center;\n background-color: #007bff;\n color: white;\n padding: 10px;\n border-radius: 5px;\n }\n .footer {\n text-align: center;\n color: #777;\n font-size: 0.8em;\n margin-top: 20px;\n }\n .button {\n background-color: #28a745;\n color: white;\n text-decoration: none;\n padding: 10px 20px;\n border-radius: 5px;\n display: inline-block;\n margin-top: 20px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h2>Invoice Reminder: {{ $json.DocNumber }}</h2>\n </div>\n \n <p>Dear,</p>\n \n <p>This is a friendly reminder that your invoice with us is due soon. We kindly ask you to review and complete the payment as soon as possible to avoid any delays.</p>\n \n <p><strong>Invoice Number:</strong> {{ $json.DocNumber }}</p>\n <p><strong>Due Date:</strong> {{ $json.DueDate }}</p>\n \n <p>Please click the button below to view and pay your invoice:</p>\n \n <a href=\"{{ $json.InvoiceLink }}\" class=\"button\">View & Pay Invoice</a>\n \n <p>Thank you for your prompt attention to this matter. If you have any questions or need assistance, feel free to contact us.</p>\n \n <p>Best regards, <br>\n [Your Company Name] <br>\n [Your Contact Information]</p>\n \n <div class=\"footer\">\n <p>© {{ $now.year }} [Your Company Name]. All rights reserved.</p>\n </div>\n </div>\n</body>\n</html>\n",
"options": {},
"subject": "=Friendly Reminder: Your Invoice is Due Soon – {{ $json.DocNumber }}"
},
"typeVersion": 2.1
},
{
"id": "91131646-c435-4151-b683-6de0053e4d43",
"name": "발송된 알림 요약 전송",
"type": "n8n-nodes-base.gmail",
"position": [
3008,
544
],
"webhookId": "fff430fe-d43b-41f0-852f-1330051cc148",
"parameters": {
"sendTo": "sales@example.com",
"message": "={{ $json.output }}",
"options": {},
"subject": "=Summary of today's reminders sent"
},
"typeVersion": 2.1
}
],
"active": false,
"pinData": {
"Receive form submission": [
{
"json": {
"body": {
"name": "Adrian Mathews",
"email": "gexupariq@mailinator.com",
"phone": "(116) 777-9916",
"itemName": "Design",
"billingAddress": "Street Address: Nulla quia debitis est quam facilis amet enim cupidatat officia autem consequatur qui quis dolorem<br>Street Address Line 2: Possimus perferendis ad veritatis quia animi<br>City: Voluptatibus eveniet harum unde dolor doloremque cumque dol<br>State / Province: Reprehenderit rerum voluptas magni ut minim ad deleniti eni<br>Postal / Zip Code: 17167<br>Country: Seychelles<br>"
},
"query": {},
"params": {},
"headers": {
"host": "d1e9c8896723.ngrok-free.app",
"accept": "*/*",
"referer": "https://submit.jotform.com",
"newrelic": "eyJ2IjpbMCwxXSwiZCI6eyJ0eSI6IkFwcCIsImFjIjoiNjkxNjIwIiwiYXAiOiIyMzAwNjE1MDQiLCJpZCI6IjA4ZDNjNWMxYzllOTFjOTUiLCJ0ciI6ImJlYjVkMjFhZGM5NDg0YzQiLCJ0eCI6ImJlYjVkMjFhZGM5NDg0YzQiLCJwciI6MS4zODg2NCwic2EiOnRydWUsInRpIjoxNzYwNTI5MDQ3NjY5fX0=",
"tracestate": "691620@nr=0-0-691620-230061504-08d3c5c1c9e91c95-beb5d21adc9484c4-1-1.388638-1760529047669",
"user-agent": "Mozilla/5.0 (api.jotform.com; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13",
"traceparent": "00-0000000000000000beb5d21adc9484c4-08d3c5c1c9e91c95-01",
"content-type": "application/json",
"content-length": "517",
"accept-encoding": "deflate, gzip, br, zstd",
"x-forwarded-for": "35.222.57.81",
"x-forwarded-host": "d1e9c8896723.ngrok-free.app",
"x-forwarded-proto": "https",
"jf-trace-parent-id": "bd412a79ce24cd1e"
},
"webhookUrl": "http://localhost:5678/webhook-test/requests",
"executionMode": "test"
}
}
]
},
"settings": {
"executionOrder": "v1"
},
"versionId": "43348de3-c2ce-4b0c-b6f3-49341f180347",
"connections": {
"20ea495b-ef6e-4bb4-a3a4-8fa95b17a77d": {
"main": [
[
{
"node": "aa96c6e2-418b-45d1-848d-cef54e891550",
"type": "main",
"index": 0
}
],
[
{
"node": "77b8565e-bd0a-4fd7-a23c-7bdd2c94cd42",
"type": "main",
"index": 0
}
]
]
},
"0f498328-0b7b-41d9-8f7a-edc45f92438a": {
"main": [
[
{
"node": "f1e1bc2a-c99e-461d-88fd-d87bfcff3a34",
"type": "main",
"index": 0
}
],
[
{
"node": "aabb6827-0dd5-4332-a36c-cc35f150956a",
"type": "main",
"index": 0
}
]
]
},
"34b07269-37f5-4946-8af7-83b200f31c81": {
"main": [
[
{
"node": "17e76636-622c-49c1-8993-cbb15022b41a",
"type": "main",
"index": 0
}
],
[
{
"node": "8621a71b-9813-4232-9a44-15c62332e75a",
"type": "main",
"index": 0
}
]
]
},
"06381d7b-8067-4216-8ecb-a84876693bf3": {
"main": [
[
{
"node": "c358be7d-4f13-406c-b713-189474fa8583",
"type": "main",
"index": 0
}
],
[
{
"node": "17e76636-622c-49c1-8993-cbb15022b41a",
"type": "main",
"index": 0
}
],
[
{
"node": "8621a71b-9813-4232-9a44-15c62332e75a",
"type": "main",
"index": 0
}
]
]
},
"e84c641c-5316-47fa-bd3c-827487d437a9": {
"main": [
[
{
"node": "91131646-c435-4151-b683-6de0053e4d43",
"type": "main",
"index": 0
}
]
]
},
"e5bdb990-3b56-4f97-beba-499d3e063961": {
"main": [
[
{
"node": "51fda0e5-2c6e-40cc-a967-76426f4bcf36",
"type": "main",
"index": 0
}
]
]
},
"b66c8925-e5af-4ad3-83bf-8b8db88fa5bc": {
"main": [
[
{
"node": "9fb60975-4ab2-465d-b0c3-27669702b49f",
"type": "main",
"index": 0
}
]
]
},
"aabb6827-0dd5-4332-a36c-cc35f150956a": {
"main": [
[
{
"node": "8621a71b-9813-4232-9a44-15c62332e75a",
"type": "main",
"index": 0
}
]
]
},
"17e76636-622c-49c1-8993-cbb15022b41a": {
"main": [
[
{
"node": "8621a71b-9813-4232-9a44-15c62332e75a",
"type": "main",
"index": 0
}
]
]
},
"a475fc3d-1d1b-406e-92ae-f8d982232b33": {
"main": [
[
{
"node": "16ccee04-eefb-4e38-a5d4-3c65e26f779f",
"type": "main",
"index": 0
}
]
]
},
"15f3089c-ebc8-4cad-85c0-67fc5bbf2802": {
"main": [
[
{
"node": "06381d7b-8067-4216-8ecb-a84876693bf3",
"type": "main",
"index": 0
}
]
]
},
"16ccee04-eefb-4e38-a5d4-3c65e26f779f": {
"main": [
[
{
"node": "e5bdb990-3b56-4f97-beba-499d3e063961",
"type": "main",
"index": 0
}
]
]
},
"2e729c72-459b-4448-892c-4f7b14af1eb6": {
"main": [
[
{
"node": "9370f28d-d910-4e28-8001-414529a51f18",
"type": "main",
"index": 0
}
]
]
},
"93a4aa27-13ca-4989-a617-5211f3856ed9": {
"ai_languageModel": [
[
{
"node": "e84c641c-5316-47fa-bd3c-827487d437a9",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"51fda0e5-2c6e-40cc-a967-76426f4bcf36": {
"main": [
[
{
"node": "2e729c72-459b-4448-892c-4f7b14af1eb6",
"type": "main",
"index": 0
}
]
]
},
"8621a71b-9813-4232-9a44-15c62332e75a": {
"main": [
[
{
"node": "c12c85f8-ea33-471b-80ff-491db349e784",
"type": "main",
"index": 0
}
],
[
{
"node": "15f3089c-ebc8-4cad-85c0-67fc5bbf2802",
"type": "main",
"index": 0
}
]
]
},
"77b8565e-bd0a-4fd7-a23c-7bdd2c94cd42": {
"main": [
[
{
"node": "a475fc3d-1d1b-406e-92ae-f8d982232b33",
"type": "main",
"index": 0
}
]
]
},
"c358be7d-4f13-406c-b713-189474fa8583": {
"main": [
[
{
"node": "11869e18-01a0-4e33-906e-3d6b7b59d40c",
"type": "main",
"index": 0
}
]
]
},
"aa96c6e2-418b-45d1-848d-cef54e891550": {
"main": [
[
{
"node": "a475fc3d-1d1b-406e-92ae-f8d982232b33",
"type": "main",
"index": 0
}
]
]
},
"9370f28d-d910-4e28-8001-414529a51f18": {
"main": [
[
{
"node": "0f498328-0b7b-41d9-8f7a-edc45f92438a",
"type": "main",
"index": 0
}
]
]
},
"11869e18-01a0-4e33-906e-3d6b7b59d40c": {
"main": [
[
{
"node": "34b07269-37f5-4946-8af7-83b200f31c81",
"type": "main",
"index": 0
}
]
]
},
"f1e1bc2a-c99e-461d-88fd-d87bfcff3a34": {
"main": [
[]
]
},
"9c594f0d-b9d7-4329-8017-90bbc445cc43": {
"main": [
[
{
"node": "b66c8925-e5af-4ad3-83bf-8b8db88fa5bc",
"type": "main",
"index": 0
}
]
]
},
"c12c85f8-ea33-471b-80ff-491db349e784": {
"main": [
[
{
"node": "e84c641c-5316-47fa-bd3c-827487d437a9",
"type": "main",
"index": 0
}
]
]
},
"242fe315-78c9-4bb5-8a53-2d6485574d54": {
"main": [
[
{
"node": "9370f28d-d910-4e28-8001-414529a51f18",
"type": "main",
"index": 0
}
]
]
},
"9fb60975-4ab2-465d-b0c3-27669702b49f": {
"main": [
[
{
"node": "20ea495b-ef6e-4bb4-a3a4-8fa95b17a77d",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Jotform, QuickBooks 및 Outlook으로 청구서 생성 및 고객에게 알림 전송
Jotform, QuickBooks 및 Outlook AI를 통한 인보이스 생성 및 지능형 알림 자동화
If
Set
Code
+
If
Set
Code
48 노드AppUnits AI
Jotform과 QuickBooks를 사용하여 고객에게 발행서를 생성하고 알림을 보내기
Jotform과 QuickBooks를 사용하여 인보이스 생성并发송 AI 요약 알림
If
Set
Code
+
If
Set
Code
48 노드AppUnits AI
Jotform과 Xero를 사용하여 고객에게 발행서를 생성하고 알림을 보내기
Jotform과 Xero를 사용하여 인보이스 생성并发송 AI 유도 알림
If
Set
Code
+
If
Set
Code
39 노드AppUnits AI
GPT-4o, WordPress, LinkedIn을 사용한 RSS 콘텐츠 자동 블로그 게시
GPT-4o, WordPress 및 LinkedIn을 사용한 RSS 콘텐츠 블로그 게시물 자동 발행
If
Set
Code
+
If
Set
Code
40 노드Immanuel
인공지능
基于AI의MIS에이전트
基于AI의관리信息系统에이전트
If
Set
Code
+
If
Set
Code
129 노드Kumar Shivam
지원
리드 생성 및 이메일 워크플로
Google 지도, SendGrid 및 AI를 사용한 B2B 잠재 고객 개발 및 이메일 마케팅 자동화
If
Set
Code
+
If
Set
Code
141 노드Ezema Kingsley Chibuzo
리드 생성