Envoyer une enquête de feedback aux abonnements annulés de Stripe

Avancé

Ceci est unMarket Researchworkflow d'automatisation du domainecontenant 17 nœuds.Utilise principalement des nœuds comme Stripe, Switch, Webhook, EmailSend, GoogleSheets. Automatisation de la collecte de retours d'annulation avec Stripe et Google Sheets

Prérequis
  • Clé API Stripe
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Informations d'identification Google Sheets API
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": "uqNyk0asIuKnQMXk",
  "meta": {
    "instanceId": "062f0e1ec3617ffb26cbc1b3c3518f28f3e57f08ddc210c471f532bb0bd6cf07",
    "templateCredsSetupCompleted": true
  },
  "name": "Send feedback survey to canceled Stripe subscriptions",
  "tags": [],
  "nodes": [
    {
      "id": "52bde91d-175a-49dd-8a41-7d35b8fcbc58",
      "name": "Aperçu du workflow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1104,
        0
      ],
      "parameters": {
        "width": 640,
        "height": 1340,
        "content": "## 📋 Automated Feedback Survey on Stripe Cancellation\n\n**What this workflow does:**\n\nWhen a customer cancels their Stripe subscription, this workflow automatically:\n\n1. ✅ Detects the cancellation event via Stripe webhook\n2. ✅ Fetches customer email and name from Stripe API\n3. ✅ Sends a personalized feedback survey email with embedded customer data\n4. ✅ Logs cancellation details to Google Sheets\n5. ✅ Receives survey responses via webhook\n6. ✅ Routes feedback to different sheets based on reason (Price/Features/Other)\n\n**Why it matters:**\n\nUnderstanding why customers leave is critical for reducing churn. This workflow ensures you never miss collecting valuable cancellation feedback and organizes it automatically for actionable insights.\n\n**Setup time:** ~20 minutes\n\n**Compatible survey tools:** Tally, Typeform, or any tool with webhook support\n\n---\n\n## 🔧 Setup Steps\n\n### 1. Connect Your Stripe Account\n- Use test mode for initial setup\n- Copy the webhook URL from the \"Stripe Subscription Canceled\" node\n- Add it to your Stripe Dashboard → Webhooks\n- Select event: `customer.subscription.deleted`\n\n### 2. Configure Email Credentials\n- Set up Gmail, Outlook, or SMTP credentials\n- Update the \"from\" email address in the send email node\n\n### 3. Create Your Survey Form\nYour survey form needs these fields:\n- **Hidden fields** (populated from URL parameters):\n  - email\n  - customer_id\n  - name\n  - plan\n- **Visible fields:**\n  - Reason dropdown (\"Too Expensive\", \"Missing Features\", \"Other\")\n  - Comments textarea\n\n### 4. Configure Survey Webhook\n- Get the webhook URL from the \"Survey Response Webhook\" node\n- Configure your survey tool to POST responses to this URL\n- Ensure the payload includes: email, customer_id, name, plan, reason, comments\n\n### 5. Set Up Google Sheets\nCreate a Google Sheets document with 4 sheets:\n- **Cancellations** (main log of all cancellations)\n- **Price Concerns** (for price-related feedback)\n- **Feature Requests** (for feature-related feedback)\n- **Other Feedback** (for everything else)\n\n### 6. Update Survey URL\nReplace `[SURVEY_URL]` in the email template with your actual survey link\n\n---\n\n## 💡 Customization Ideas\n\n- Add **Slack notification** for real-time alerts on price concerns\n- Use **IF node** to send different surveys based on subscription tier\n- Add **Wait node** to delay email by 24 hours\n- Add **urgent flag** for high-value customer cancellations\n- Integrate with your CRM for follow-up workflows\n\n---\n\n## 📊 What Gets Logged\n\n**Cancellations sheet:**\n- Cancellation timestamp\n- Customer ID, email, name\n- Plan name\n- Email send status\n\n**Feedback sheets (organized by reason):**\n- Response timestamp\n- Customer details\n- Cancellation reason\n- Additional comments\n\n---\n\n## 🎯 Benefits\n\n- **Reduce churn** by understanding why customers leave\n- **Prioritize** product improvements based on organized feedback\n- **Automate** the entire feedback collection process\n- **Track** which plans have the highest cancellation rates"
      },
      "typeVersion": 1
    },
    {
      "id": "fd82e2f9-248f-409f-a790-ec00ca02ca1c",
      "name": "Étape 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 360,
        "height": 280,
        "content": "## Step 1: Detect Cancellation\n\nListens for `customer.subscription.deleted` webhook event from Stripe.\n\n**Setup:**\n- Connect your Stripe account\n- Copy the webhook URL from this node\n- Add it to Stripe Dashboard → Webhooks\n- Select event: customer.subscription.deleted"
      },
      "typeVersion": 1
    },
    {
      "id": "c4b72f4a-32e3-4736-9a8b-896b775ffbc7",
      "name": "Étape 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 340,
        "height": 240,
        "content": "## Step 2: Get Customer Info\n\nFetches customer email and name from Stripe API.\n\n**Why needed:**\nThe webhook event doesn't include email directly - we must fetch it separately for the survey email and URL parameters."
      },
      "typeVersion": 1
    },
    {
      "id": "4e99664a-7ba0-43d2-8f70-d6d4be8ac7fe",
      "name": "Étape 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        368,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 560,
        "content": "## Step 3: Send Survey Email\n\n**IMPORTANT: Survey URL Setup**\n\nThe survey URL includes customer data as parameters:\n`[SURVEY_URL]?email={email}&customer_id={id}&name={name}&plan={plan}`\n\n**Required setup:**\n1. Enter your **From Email** address\n2. Configure email credentials (Gmail/Outlook/SMTP)\n3. Replace `[SURVEY_URL]` with your actual survey link\n4. Configure your survey form to:\n   - Accept URL parameters (email, customer_id, name, plan)\n   - Store them as hidden fields\n   - Send data to webhook when submitted\n\n**Supported survey tools:**\n- Tally (has webhook)\n- Typeform (has webhook)\n- Custom form with webhook"
      },
      "typeVersion": 1
    },
    {
      "id": "0862a1bf-a237-4516-bccc-7eecdda7cf0f",
      "name": "Étape 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 360,
        "height": 400,
        "content": "## Step 4: Log Cancellation\n\n**Setup:**\n- Select your Google Sheets document\n- Sheet name: \"Cancellations\"\n- Headers created automatically on first run\n\n**Columns logged:**\n- Cancellation timestamp\n- Customer ID, email, name\n- Plan name\n- Email send status\n\nThis logs every cancellation regardless of survey response."
      },
      "typeVersion": 1
    },
    {
      "id": "4ed549f9-81e1-4f84-978e-2aba193ca509",
      "name": "Étape 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 460,
        "content": "## Step 5: Receive Survey Response\n\n**SEPARATE WORKFLOW TRIGGER**\n\nThis webhook activates when a customer submits the survey.\n\n**Survey form webhook setup:**\n- Configure webhook to POST to this URL\n- Include these fields in webhook payload:\n  - email\n  - customer_id\n  - name\n  - plan\n  - reason (\"Too Expensive\", \"Missing Features\", \"Other\")\n  - comments\n\n**Test webhook:**\nUse the \"Listen for Test Event\" feature to test with sample data"
      },
      "typeVersion": 1
    },
    {
      "id": "adbd2373-0271-4f10-bb73-a343510ab646",
      "name": "Étape 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 460,
        "content": "## Step 6: Route by Reason\n\nSorts feedback into 3 categories based on the \"reason\" field:\n\n**Output 0:** reason contains \"expensive\" or \"price\" or \"cost\"\n→ Goes to \"Price Concerns\" sheet\n\n**Output 1:** reason contains \"feature\" or \"functionality\" or \"missing\"\n→ Goes to \"Feature Requests\" sheet\n\n**Output 2:** Everything else\n→ Goes to \"Other Feedback\" sheet\n\n**Customize:**\nEdit the Switch node conditions to match your survey options"
      },
      "typeVersion": 1
    },
    {
      "id": "2f712d4a-b1fb-403a-9818-cdedbfce2500",
      "name": "Étape 7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 440,
        "height": 500,
        "content": "## Step 7: Log to Category Sheets\n\n**Create 3 sheets in your Google Sheets:**\n\n1. **Price Concerns** - for pricing issues\n2. **Feature Requests** - for missing features\n3. **Other Feedback** - for everything else\n\n**Each logs:**\n- Response timestamp\n- Customer email, name\n- Plan name\n- Cancellation reason\n- Additional comments\n\nThis organization helps you:\n- Prioritize pricing adjustments\n- Plan product roadmap\n- Understand other churn factors"
      },
      "typeVersion": 1
    },
    {
      "id": "24749ad3-95c9-4d7d-a8a5-1e39c5257909",
      "name": "Stripe Subscription Canceled",
      "type": "n8n-nodes-base.stripeTrigger",
      "position": [
        -240,
        320
      ],
      "webhookId": "stripe-cancellation-webhook",
      "parameters": {
        "events": [
          "customer.subscription.deleted"
        ]
      },
      "typeVersion": 1
    },
    {
      "id": "c553c09e-5f4c-44d0-979b-344191c6c3b4",
      "name": "Obtenir les détails du client",
      "type": "n8n-nodes-base.stripe",
      "position": [
        112,
        320
      ],
      "parameters": {
        "resource": "customer",
        "customerId": "={{ $json.data.object.customer }}"
      },
      "typeVersion": 1
    },
    {
      "id": "a4f93441-e29b-494d-a69c-d3bfd5695448",
      "name": "Envoyer l'e-mail d'enquête de feedback",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        480,
        320
      ],
      "webhookId": "email-send-webhook",
      "parameters": {
        "html": "=<p>Hi {{ $json.name || \"there\" }},</p>\n\n<p>Thank you for being a customer. We're sorry to see you go.</p>\n\n<p>To help us improve our service, would you mind sharing why you decided to cancel? It only takes 1 minute:</p>\n\n<p><a href=\"[SURVEY_URL]?email={{ $json.email }}&customer_id={{ $json.id }}&name={{ $json.name || 'Customer' }}&plan={{ $('Stripe Subscription Canceled').item.json.data.object.items.data[0].plan.nickname || $('Stripe Subscription Canceled').item.json.data.object.items.data[0].plan.id }}\" style=\"background-color: #4CAF50; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px; display: inline-block; margin: 16px 0;\">Share Your Feedback</a></p>\n\n<p><small>You were subscribed to: {{ $('Stripe Subscription Canceled').item.json.data.object.items.data[0].plan.nickname || 'Your Plan' }}</small></p>\n\n<p>Your feedback means the world to us and will help us serve our customers better.</p>\n\n<p>Thank you,<br>[Your Company Name]</p>\n\n<p><small>If you have any questions, feel free to reply to this email.</small></p>",
        "options": {},
        "subject": "We're sorry to see you go — Quick 1-min survey",
        "toEmail": "={{ $json.email }}",
        "fromEmail": "your-email@example.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "cc898a60-e1af-4a6c-b26a-fbd53a88cba3",
      "name": "Enregistrer dans la feuille des annulations",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        832,
        320
      ],
      "parameters": {
        "columns": {
          "value": {
            "Plan Name": "={{ $('Stripe Subscription Canceled').item.json.data.object.items.data[0].plan.nickname || $('Stripe Subscription Canceled').item.json.data.object.items.data[0].plan.id }}",
            "Email Sent": "={{ $('Send Feedback Survey Email').item.json.accepted ? 'Success' : 'Failed' }}",
            "Customer ID": "={{ $('Stripe Subscription Canceled').item.json.data.object.customer }}",
            "Customer Name": "={{ $('Get Customer Details').item.json.name || 'N/A' }}",
            "Customer Email": "={{ $('Get Customer Details').item.json.email }}",
            "Cancellation Date": "={{ new Date().toISOString() }}"
          },
          "schema": [
            {
              "id": "Cancellation Date",
              "required": false,
              "displayName": "Cancellation Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer ID",
              "required": false,
              "displayName": "Customer ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Email",
              "required": false,
              "displayName": "Customer Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Name",
              "required": false,
              "displayName": "Customer Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Plan Name",
              "required": false,
              "displayName": "Plan Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Sent",
              "required": false,
              "displayName": "Email Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d4ad096a-addf-48c7-a693-fc07e30f1ed6",
      "name": "Survey Response Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -240,
        640
      ],
      "webhookId": "survey-response-webhook",
      "parameters": {
        "path": "survey-response",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "3077ceaa-38d5-4b20-b3f3-96c9c9587121",
      "name": "Router par type de feedback",
      "type": "n8n-nodes-base.switch",
      "position": [
        112,
        624
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Price Concerns",
              "conditions": {
                "options": {
                  "caseSensitive": false
                },
                "combinator": "or",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    },
                    "leftValue": "={{ $json.reason }}",
                    "rightValue": "expensive"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Feature Requests",
              "conditions": {
                "options": {
                  "caseSensitive": false
                },
                "combinator": "or",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    },
                    "leftValue": "={{ $json.reason }}",
                    "rightValue": "feature"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "5d3befc8-8831-42a2-9d83-0a81df2ab1f9",
      "name": "Enregistrer les préoccupations tarifaires",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        480,
        512
      ],
      "parameters": {
        "columns": {
          "value": {
            "Plan Name": "={{ $json.plan }}",
            "Customer Name": "={{ $json.name }}",
            "Response Date": "={{ new Date().toISOString() }}",
            "Customer Email": "={{ $json.email }}",
            "Additional Comments": "={{ $json.comments || 'N/A' }}",
            "Cancellation Reason": "={{ $json.reason }}"
          },
          "schema": [
            {
              "id": "Response Date",
              "required": false,
              "displayName": "Response Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Email",
              "required": false,
              "displayName": "Customer Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Name",
              "required": false,
              "displayName": "Customer Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Plan Name",
              "required": false,
              "displayName": "Plan Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cancellation Reason",
              "required": false,
              "displayName": "Cancellation Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Additional Comments",
              "required": false,
              "displayName": "Additional Comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Price Concerns"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3c180c3d-c5e1-4a34-894b-973ac7cfe246",
      "name": "Enregistrer les demandes de fonctionnalités",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        480,
        640
      ],
      "parameters": {
        "columns": {
          "value": {
            "Plan Name": "={{ $json.plan }}",
            "Customer Name": "={{ $json.name }}",
            "Response Date": "={{ new Date().toISOString() }}",
            "Customer Email": "={{ $json.email }}",
            "Additional Comments": "={{ $json.comments || 'N/A' }}",
            "Cancellation Reason": "={{ $json.reason }}"
          },
          "schema": [
            {
              "id": "Response Date",
              "required": false,
              "displayName": "Response Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Email",
              "required": false,
              "displayName": "Customer Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Name",
              "required": false,
              "displayName": "Customer Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Plan Name",
              "required": false,
              "displayName": "Plan Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cancellation Reason",
              "required": false,
              "displayName": "Cancellation Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Additional Comments",
              "required": false,
              "displayName": "Additional Comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Feature Requests"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b09a3969-8253-4bac-94e7-b053a8fd48f1",
      "name": "Enregistrer les autres feedbacks",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        480,
        784
      ],
      "parameters": {
        "columns": {
          "value": {
            "Plan Name": "={{ $json.plan }}",
            "Customer Name": "={{ $json.name }}",
            "Response Date": "={{ new Date().toISOString() }}",
            "Customer Email": "={{ $json.email }}",
            "Additional Comments": "={{ $json.comments || 'N/A' }}",
            "Cancellation Reason": "={{ $json.reason }}"
          },
          "schema": [
            {
              "id": "Response Date",
              "required": false,
              "displayName": "Response Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Email",
              "required": false,
              "displayName": "Customer Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Customer Name",
              "required": false,
              "displayName": "Customer Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Plan Name",
              "required": false,
              "displayName": "Plan Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cancellation Reason",
              "required": false,
              "displayName": "Cancellation Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Additional Comments",
              "required": false,
              "displayName": "Additional Comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Other Feedback"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "36c00a3a-e28b-4d7b-9d2b-b1ae647da3ce",
  "connections": {
    "c553c09e-5f4c-44d0-979b-344191c6c3b4": {
      "main": [
        [
          {
            "node": "a4f93441-e29b-494d-a69c-d3bfd5695448",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3077ceaa-38d5-4b20-b3f3-96c9c9587121": {
      "main": [
        [
          {
            "node": "5d3befc8-8831-42a2-9d83-0a81df2ab1f9",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "3c180c3d-c5e1-4a34-894b-973ac7cfe246",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "b09a3969-8253-4bac-94e7-b053a8fd48f1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d4ad096a-addf-48c7-a693-fc07e30f1ed6": {
      "main": [
        [
          {
            "node": "3077ceaa-38d5-4b20-b3f3-96c9c9587121",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a4f93441-e29b-494d-a69c-d3bfd5695448": {
      "main": [
        [
          {
            "node": "cc898a60-e1af-4a6c-b26a-fbd53a88cba3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "24749ad3-95c9-4d7d-a8a5-1e39c5257909": {
      "main": [
        [
          {
            "node": "c553c09e-5f4c-44d0-979b-344191c6c3b4",
            "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é - Étude de marché

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œuds17
Catégorie1
Types de nœuds7
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