8
n8n 中文网amn8n.com

使用 Jotform、QuickBooks 和 Outlook 生成发票并发送提醒给客户

高级

这是一个自动化工作流,包含 48 个节点。主要使用 If, Set, Code, Switch, Webhook 等节点。 通过 Jotform、QuickBooks 和 Outlook AI 实现发票创建与智能提醒的自动化

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
  • OpenAI API Key

分类

-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "mzi5wp1EIEjfi54m",
  "meta": {
    "instanceId": "3549451ca835035557d5dc1c3d9e6ba924e7314534a74c901f66b91f9ef6023e",
    "templateCredsSetupCompleted": true
  },
  "name": "使用 Jotform、QuickBooks 和 Outlook 生成发票并发送提醒给客户",
  "tags": [],
  "nodes": [
    {
      "id": "dfd3e6f4-25fd-4ae7-af50-6fe33f22792a",
      "name": "接收表单提交",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -464,
        0
      ],
      "webhookId": "497e4b6f-7d3d-4839-8acb-68719b65491c",
      "parameters": {
        "path": "497e4b6f-7d3d-4839-8acb-68719b65491c",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "4e11a957-5017-4e9a-84b8-11807bfb93e5",
      "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": "109ce30c-9aed-47db-b07d-6268ae7b06be",
      "name": "获取产品",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        1248,
        0
      ],
      "parameters": {
        "limit": 1,
        "filters": {
          "query": "=WHERE name = '{{ $json.item.name }}'"
        },
        "resource": "item",
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "4e94366d-4ad2-4fdf-9167-f06773b446dc",
      "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": {}
      },
      "typeVersion": 1
    },
    {
      "id": "ada8e07e-7416-409b-b576-71a598af44b6",
      "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"
      },
      "typeVersion": 1
    },
    {
      "id": "5861c8ac-5d8a-4fa4-8406-6f8f26d07a68",
      "name": "检查客户是否存在",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        112,
        0
      ],
      "parameters": {
        "limit": 1,
        "filters": {
          "query": "=Where PrimaryEmailAddr = '{{ $json.customer.email }}'"
        },
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "4bc24612-97d4-405a-96ca-d39659929e83",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 320,
        "content": "## 接收提交"
      },
      "typeVersion": 1
    },
    {
      "id": "6afb6f6c-d768-4e07-abef-7a60d8e2f6e8",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 320,
        "content": "## 检查客户是否存在"
      },
      "typeVersion": 1
    },
    {
      "id": "80b25818-7cd7-4a9a-bd14-1bb8430a2621",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -336
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 336,
        "content": "## 客户存在"
      },
      "typeVersion": 1
    },
    {
      "id": "0d3f189d-c6a1-46b2-bad6-1b4ad6bd97dd",
      "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 }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "29e5128b-ba7f-40f8-9989-6484a6bdc765",
      "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 }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5dceabf1-2723-44bc-aa11-b5d594402827",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 320,
        "content": "## 客户不存在"
      },
      "typeVersion": 1
    },
    {
      "id": "713ab8c2-74ce-4d08-8304-a66e33255c27",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 320,
        "content": "## 获取项目"
      },
      "typeVersion": 1
    },
    {
      "id": "f869fc37-46e9-4789-a9d9-aaaeb1bd9369",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1776,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 320,
        "content": "## 创建发票"
      },
      "typeVersion": 1
    },
    {
      "id": "8122f6e9-788c-44c8-8c22-fe064574bc6d",
      "name": "便签6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2080,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 320,
        "content": "## 发送发票"
      },
      "typeVersion": 1
    },
    {
      "id": "218806fb-96e1-4ee9-97f5-069204d374d0",
      "name": "便签7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1664,
        -416
      ],
      "parameters": {
        "width": 1072,
        "height": 1280,
        "content": "## 使用 Jotform、QuickBooks 和 Outlook 生成发票并发送提醒给客户"
      },
      "typeVersion": 1
    },
    {
      "id": "1e20f507-a921-421a-8779-d6a917bb24c0",
      "name": "便签8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -240,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 320,
        "content": "## 格式化数据"
      },
      "typeVersion": 1
    },
    {
      "id": "5a98fa14-9c80-4f8b-a85f-da9a1cd7e199",
      "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": "8f5cc73b-bc63-467c-84aa-d2e4f28a2174",
      "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": "0d92ccac-d3e6-4b8a-acf6-11b4cb9e6a9d",
      "name": "Add customer 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": "2c1951b2-350b-43c7-8851-07d85790c641",
      "name": "Sticky Note10",
      "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": "cedfacf7-2213-484b-8174-6dd73ce93949",
      "name": "Add item 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": "953beffa-e3b2-44f0-aaa2-5dc8c88245b1",
      "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": "e87fdf1d-716b-48a7-ab53-0c55f51c4039",
      "name": "将发票 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": "d403d5f1-09b4-47c0-97e6-c8a0f81d0445",
      "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": "33323ad8-be85-4fb5-921f-e36841fdcadc",
      "name": "获取发票",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        2368,
        1104
      ],
      "parameters": {
        "resource": "invoice",
        "invoiceId": "={{ $json.invoiceId }}"
      },
      "typeVersion": 1
    },
    {
      "id": "6221744a-f461-47c0-bec0-506a454fc239",
      "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": "6edd150f-3e91-4ca9-833d-d34ab1153859",
      "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": "60bf7601-9f99-492c-a097-48149628a7ed",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2736,
        752
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "293786e1-99ec-4e92-9717-3a899b04a590",
      "name": "Switch",
      "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": "9bbf8609-567a-4984-ae2d-024fc8539141",
      "name": "计划提醒触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        608,
        704
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e4fe254f-5cbe-4d92-9b90-b0cf9349324c",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        576
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 320,
        "content": "## 计划触发器"
      },
      "typeVersion": 1
    },
    {
      "id": "86b73b0c-74d8-4dd3-a10d-e15908c2ba0c",
      "name": "便签12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        528
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 368,
        "content": "## 添加提醒配置"
      },
      "typeVersion": 1
    },
    {
      "id": "583bc83c-547c-4547-b4e5-675ea065cb5c",
      "name": "便签13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        528
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 368,
        "content": "## 检查触发器"
      },
      "typeVersion": 1
    },
    {
      "id": "93d6d0b5-e865-429c-b88e-7864ee4ab317",
      "name": "便签14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1568,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 336,
        "content": "## 将发票插入数据库"
      },
      "typeVersion": 1
    },
    {
      "id": "a5978022-c0af-4351-b8c2-5cdcddd3b498",
      "name": "便签15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1568,
        736
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 336,
        "content": "## 获取所有发票"
      },
      "typeVersion": 1
    },
    {
      "id": "573bfa8e-b956-4e25-afdd-a945c5ad076a",
      "name": "便签16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1920,
        752
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 320,
        "content": "## 遍历发票"
      },
      "typeVersion": 1
    },
    {
      "id": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
      "name": "遍历发票",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2016,
        880
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "15b5404b-10e7-4123-bdcb-ceb89a368bd7",
      "name": "便签17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2272,
        544
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 352,
        "content": "## 获取已发送提醒"
      },
      "typeVersion": 1
    },
    {
      "id": "c21c43a0-bd16-43e7-8b90-aef52d06017d",
      "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": "b5e9319e-fcf5-4102-a0ea-9486fcf3d69f",
      "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": "99145c7b-e9ea-4e3f-af00-f6ecae22f2a1",
      "name": "便签19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2624,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 480,
        "content": "## 汇总已发送提醒并发送电子邮件"
      },
      "typeVersion": 1
    },
    {
      "id": "210ad0cd-887c-4233-a3fe-03f852506712",
      "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": "897493e1-e523-4432-bd88-4f35ee0e042f",
      "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": "0d86331a-93e1-4128-b97e-bc200940ea5a",
      "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": "7933de48-c237-48c5-9a5e-0a8b7e34fe3b",
      "name": "便签20",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2624,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 1184,
        "height": 480,
        "content": "## 发送提醒逻辑"
      },
      "typeVersion": 1
    },
    {
      "id": "7240f3aa-3a81-46d5-abc5-4baf299921a0",
      "name": "发送提醒邮件",
      "type": "n8n-nodes-base.microsoftOutlook",
      "position": [
        2912,
        1072
      ],
      "webhookId": "f8c9aa67-32c5-46ee-bbb4-477f9ea67e88",
      "parameters": {
        "subject": "=Friendly Reminder: Your Invoice is Due Soon – {{ $json.DocNumber }}",
        "bodyContent": "=<!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>&copy; {{ $now.year }} [Your Company Name]. All rights reserved.</p>\n    </div>\n  </div>\n</body>\n</html>",
        "toRecipients": "={{ $json.BillEmail.Address }}",
        "additionalFields": {}
      },
      "typeVersion": 2
    },
    {
      "id": "4c282175-e488-4663-9503-0c98bac9714a",
      "name": "发送已发送提醒摘要",
      "type": "n8n-nodes-base.microsoftOutlook",
      "position": [
        3008,
        544
      ],
      "webhookId": "8304fb19-f9d1-4028-afd7-223dd698f664",
      "parameters": {
        "subject": "=Summary of today's reminders sent",
        "bodyContent": "={{ $json.output }}",
        "toRecipients": "=sales@example.com",
        "additionalFields": {}
      },
      "typeVersion": 2
    }
  ],
  "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": "94067d3f-ce8b-4049-acda-9f5b3c880b3c",
  "connections": {
    "4e11a957-5017-4e9a-84b8-11807bfb93e5": {
      "main": [
        [
          {
            "node": "29e5128b-ba7f-40f8-9989-6484a6bdc765",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "0d3f189d-c6a1-46b2-bad6-1b4ad6bd97dd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6221744a-f461-47c0-bec0-506a454fc239": {
      "main": [
        [
          {
            "node": "e87fdf1d-716b-48a7-ab53-0c55f51c4039",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "d403d5f1-09b4-47c0-97e6-c8a0f81d0445",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0d86331a-93e1-4128-b97e-bc200940ea5a": {
      "main": [
        [
          {
            "node": "897493e1-e523-4432-bd88-4f35ee0e042f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "293786e1-99ec-4e92-9717-3a899b04a590": {
      "main": [
        [
          {
            "node": "7240f3aa-3a81-46d5-abc5-4baf299921a0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "897493e1-e523-4432-bd88-4f35ee0e042f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6edd150f-3e91-4ca9-833d-d34ab1153859": {
      "main": [
        [
          {
            "node": "4c282175-e488-4663-9503-0c98bac9714a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cedfacf7-2213-484b-8174-6dd73ce93949": {
      "main": [
        [
          {
            "node": "4e94366d-4ad2-4fdf-9167-f06773b446dc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5a98fa14-9c80-4f8b-a85f-da9a1cd7e199": {
      "main": [
        [
          {
            "node": "5861c8ac-5d8a-4fa4-8406-6f8f26d07a68",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d403d5f1-09b4-47c0-97e6-c8a0f81d0445": {
      "main": [
        [
          {
            "node": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "897493e1-e523-4432-bd88-4f35ee0e042f": {
      "main": [
        [
          {
            "node": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0d92ccac-d3e6-4b8a-acf6-11b4cb9e6a9d": {
      "main": [
        [
          {
            "node": "109ce30c-9aed-47db-b07d-6268ae7b06be",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "33323ad8-be85-4fb5-921f-e36841fdcadc": {
      "main": [
        [
          {
            "node": "293786e1-99ec-4e92-9717-3a899b04a590",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "109ce30c-9aed-47db-b07d-6268ae7b06be": {
      "main": [
        [
          {
            "node": "cedfacf7-2213-484b-8174-6dd73ce93949",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ada8e07e-7416-409b-b576-71a598af44b6": {
      "main": [
        [
          {
            "node": "953beffa-e3b2-44f0-aaa2-5dc8c88245b1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "60bf7601-9f99-492c-a097-48149628a7ed": {
      "ai_languageModel": [
        [
          {
            "node": "6edd150f-3e91-4ca9-833d-d34ab1153859",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "4e94366d-4ad2-4fdf-9167-f06773b446dc": {
      "main": [
        [
          {
            "node": "ada8e07e-7416-409b-b576-71a598af44b6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5b2e5842-65e9-4c17-bcff-c516f5de0d26": {
      "main": [
        [
          {
            "node": "b5e9319e-fcf5-4102-a0ea-9486fcf3d69f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "33323ad8-be85-4fb5-921f-e36841fdcadc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0d3f189d-c6a1-46b2-bad6-1b4ad6bd97dd": {
      "main": [
        [
          {
            "node": "0d92ccac-d3e6-4b8a-acf6-11b4cb9e6a9d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7240f3aa-3a81-46d5-abc5-4baf299921a0": {
      "main": [
        [
          {
            "node": "210ad0cd-887c-4233-a3fe-03f852506712",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "29e5128b-ba7f-40f8-9989-6484a6bdc765": {
      "main": [
        [
          {
            "node": "0d92ccac-d3e6-4b8a-acf6-11b4cb9e6a9d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "953beffa-e3b2-44f0-aaa2-5dc8c88245b1": {
      "main": [
        [
          {
            "node": "6221744a-f461-47c0-bec0-506a454fc239",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "210ad0cd-887c-4233-a3fe-03f852506712": {
      "main": [
        [
          {
            "node": "0d86331a-93e1-4128-b97e-bc200940ea5a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e87fdf1d-716b-48a7-ab53-0c55f51c4039": {
      "main": [
        []
      ]
    },
    "dfd3e6f4-25fd-4ae7-af50-6fe33f22792a": {
      "main": [
        [
          {
            "node": "5a98fa14-9c80-4f8b-a85f-da9a1cd7e199",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b5e9319e-fcf5-4102-a0ea-9486fcf3d69f": {
      "main": [
        [
          {
            "node": "6edd150f-3e91-4ca9-833d-d34ab1153859",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9bbf8609-567a-4984-ae2d-024fc8539141": {
      "main": [
        [
          {
            "node": "953beffa-e3b2-44f0-aaa2-5dc8c88245b1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5861c8ac-5d8a-4fa4-8406-6f8f26d07a68": {
      "main": [
        [
          {
            "node": "4e11a957-5017-4e9a-84b8-11807bfb93e5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量48
分类-
节点类型13
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

外部链接
在 n8n.io 查看

分享此工作流

分类

分类: 34