Génération de factures et envoi de rappels aux clients avec Jotform, QuickBooks et Outlook

Avancé

Ceci est uncontenant 48 nœuds.Utilise principalement des nœuds comme If, Set, Code, Switch, Webhook. Automatiser la création de factures et les rappels intelligents avec Jotform, QuickBooks et Outlook AI

Prérequis
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Clé API OpenAI

Catégorie

-
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "mzi5wp1EIEjfi54m",
  "meta": {
    "instanceId": "3549451ca835035557d5dc1c3d9e6ba924e7314534a74c901f66b91f9ef6023e",
    "templateCredsSetupCompleted": true
  },
  "name": "Generate Invoices and Send Reminders for Customers with Jotform, QuickBooks and Outlook",
  "tags": [],
  "nodes": [
    {
      "id": "dfd3e6f4-25fd-4ae7-af50-6fe33f22792a",
      "name": "Recevoir la soumission du formulaire",
      "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": "Si",
      "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": "Obtenir le produit",
      "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": "Créer la facture",
      "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": "Envoyer la facture",
      "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": "Vérifier si le client existe",
      "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": "Note adhésive",
      "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": "6afb6f6c-d768-4e07-abef-7a60d8e2f6e8",
      "name": "Note adhésive1",
      "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": "80b25818-7cd7-4a9a-bd14-1bb8430a2621",
      "name": "Note adhésive2",
      "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": "0d3f189d-c6a1-46b2-bad6-1b4ad6bd97dd",
      "name": "Créer le client",
      "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": "Mettre à jour le client",
      "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": "Note adhésive3",
      "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": "713ab8c2-74ce-4d08-8304-a66e33255c27",
      "name": "Note adhésive4",
      "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": "f869fc37-46e9-4789-a9d9-aaaeb1bd9369",
      "name": "Note adhésive5",
      "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": "8122f6e9-788c-44c8-8c22-fe064574bc6d",
      "name": "Note adhésive6",
      "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": "218806fb-96e1-4ee9-97f5-069204d374d0",
      "name": "Note adhésive7",
      "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 Outlook\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 Outlook setup [here](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.microsoftoutlook)\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": "1e20f507-a921-421a-8779-d6a917bb24c0",
      "name": "Note adhésive8",
      "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": "5a98fa14-9c80-4f8b-a85f-da9a1cd7e199",
      "name": "Formater les données",
      "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": "Note adhésive9",
      "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": "Ajouter l'ID client",
      "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": "Note adhésive10",
      "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": "Ajouter l'ID article",
      "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": "Ajouter la configuration des rappels",
      "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": "Insérer l'ID facture dans la base de données",
      "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": "Obtenir les factures",
      "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": "Obtenir la facture",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        2368,
        1104
      ],
      "parameters": {
        "resource": "invoice",
        "invoiceId": "={{ $json.invoiceId }}"
      },
      "typeVersion": 1
    },
    {
      "id": "6221744a-f461-47c0-bec0-506a454fc239",
      "name": "Si2",
      "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": "Agent IA",
      "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 Modèle de chat",
      "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": "Commutateur",
      "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": "Déclencheur de planification des rappels",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        608,
        704
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e4fe254f-5cbe-4d92-9b90-b0cf9349324c",
      "name": "Note adhésive11",
      "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": "86b73b0c-74d8-4dd3-a10d-e15908c2ba0c",
      "name": "Note adhésive12",
      "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": "583bc83c-547c-4547-b4e5-675ea065cb5c",
      "name": "Note adhésive13",
      "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": "93d6d0b5-e865-429c-b88e-7864ee4ab317",
      "name": "Note adhésive14",
      "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": "a5978022-c0af-4351-b8c2-5cdcddd3b498",
      "name": "Note adhésive15",
      "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": "573bfa8e-b956-4e25-afdd-a945c5ad076a",
      "name": "Note adhésive16",
      "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": "5b2e5842-65e9-4c17-bcff-c516f5de0d26",
      "name": "Boucle sur les factures",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2016,
        880
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "15b5404b-10e7-4123-bdcb-ceb89a368bd7",
      "name": "Note adhésive17",
      "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": "c21c43a0-bd16-43e7-8b90-aef52d06017d",
      "name": "Note adhésive18",
      "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": "Obtenir les rappels envoyés aujourd'hui",
      "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": "Note adhésive19",
      "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": "210ad0cd-887c-4233-a3fe-03f852506712",
      "name": "Augmenter les rappels envoyés",
      "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": "Supprimer la facture",
      "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": "Si3",
      "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": "Note adhésive20",
      "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": "7240f3aa-3a81-46d5-abc5-4baf299921a0",
      "name": "Envoyer l'email de rappel",
      "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": "Envoyer le récapitulatif des rappels envoyés",
      "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
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds48
Catégorie-
Types de nœuds13
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34