Commandes Airtable vers factures Stripe (B2B/réception manuelle)
Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 19 nœuds.Utilise principalement des nœuds comme If, Code, Stripe, Airtable, HttpRequest. Créer des factures Stripe à partir des commandes Airtable et les enregistrer avec Google Sheets
- •Clé API Stripe
- •Clé API Airtable
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Informations d'identification Google Sheets API
Nœuds utilisés (19)
Catégorie
{
"id": "2ko7gxYzw5Uy6lFh",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "Airtable Order to Stripe Invoice (B2B/Manual Capture)",
"tags": [],
"nodes": [
{
"id": "7e7fd28b-de0f-4be1-806f-ff05fe0d383d",
"name": "Description du Workflow",
"type": "n8n-nodes-base.stickyNote",
"position": [
-528,
80
],
"parameters": {
"width": 320,
"height": 708,
"content": "## 🚀 B2B Invoice Automation Workflow\n\nThis workflow automatically creates Stripe invoices for B2B paid orders and logs them to Google Sheets.\n\n### What it does:\n- Triggers every hour to check for new B2B orders\n- Filters for paid B2B orders only\n- Creates Stripe customers and invoices\n- Logs invoice data to Google Sheets for tracking\n\n### Requirements:\n- Airtable with Orders table\n- Stripe account with API access\n- Google Sheets for logging\n\n### Setup Instructions:\n1. Configure your Airtable credentials\n2. Set up Stripe API credentials\n3. Connect Google Sheets with proper permissions\n4. Update the record ID in \"Fetch B2B Order\" node\n5. Update Google Sheets document ID\n"
},
"typeVersion": 1
},
{
"id": "ff6b94d0-1292-4413-a374-72c9304d2bb2",
"name": "Guide de Configuration de la Planification",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
-160
],
"parameters": {
"width": 280,
"height": 340,
"content": "## ⏰ Schedule Setup\n\n**Purpose:** Triggers the workflow every hour to check for new orders\n\n**Configuration:**\n- Interval: 1 hour\n- Can be changed based on your needs\n\n**Tips:**\n- For testing, use manual trigger first\n- Consider timezone settings for your business hours"
},
"typeVersion": 1
},
{
"id": "9d95e100-66c2-4bad-b3a3-9aafcdc6ea52",
"name": "Déclencheur Horaire",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
80,
208
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "1e771a28-cf1d-4f20-bb4a-5f212bc5ef81",
"name": "Guide de Configuration Airtable",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
368
],
"parameters": {
"width": 300,
"height": 376,
"content": "## 📋 Airtable Setup\n\n**Purpose:** Fetch order data from your Airtable\n\n**Required Steps:**\n1. Replace the hardcoded record ID with your actual record ID\n2. Update base ID and table ID to match your setup\n3. Ensure your Airtable has these fields:\n - Customer Name\n - Email\n - Phone Number\n - financial_status\n - tags\n\n**Security:** Never commit your actual record IDs to public repos"
},
"typeVersion": 1
},
{
"id": "fdd91819-6baa-4c0c-bf05-2ef2ae931625",
"name": "Récupérer Commande B2B",
"type": "n8n-nodes-base.airtable",
"position": [
288,
208
],
"parameters": {
"id": "rec5GbGenP8Wurf4W",
"base": {
"__rl": true,
"mode": "list",
"value": "appxjEpOgye5YQG1J",
"cachedResultUrl": "https://airtable.com/appxjEpOgye5YQG1J",
"cachedResultName": "Lead Manager"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbl56YM9iZKaIhAB3",
"cachedResultUrl": "https://airtable.com/appxjEpOgye5YQG1J/tbl56YM9iZKaIhAB3",
"cachedResultName": "Orders"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"id": "nWc9JHR6t25WPWVV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "87e76054-5d3e-4f98-b565-b2be586673ac",
"name": "Guide de Filtrage des Commandes",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-176
],
"parameters": {
"width": 280,
"height": 336,
"content": "## 🔍 Order Filtering\n\n**Purpose:** Only process B2B orders that are already paid\n\n**Filter Conditions:**\n- financial_status = \"paid\"\n- tags contains \"B2B\"\n- Both conditions must be true (AND logic)\n\n**Customization:**\n- Modify conditions based on your order structure\n- Add additional filters if needed"
},
"typeVersion": 1
},
{
"id": "72e1a601-e9c4-4e65-93db-f4dcb23d9530",
"name": "Filtrer Commandes B2B Payées",
"type": "n8n-nodes-base.if",
"position": [
512,
208
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.financial_status }}",
"rightValue": "paid"
},
{
"id": "condition2",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.tags }}",
"rightValue": "B2B"
}
]
}
},
"typeVersion": 2
},
{
"id": "aa6e2bc9-1e47-4a4a-9236-cd2066c8b1ac",
"name": "Guide Client Stripe",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
384
],
"parameters": {
"width": 300,
"height": 452,
"content": "## 👤 Stripe Customer Creation\n\n**Purpose:** Create or update customer in Stripe\n\n**Configuration:**\n- Maps customer data from Airtable\n- Uses continueOnFail to handle existing customers\n- Stores customer ID for invoice creation\n\n**Required Fields:**\n- Customer Name\n- Email\n- Phone Number (optional)\n\n**Note:** Stripe will return existing customer if email already exists"
},
"typeVersion": 1
},
{
"id": "162bda8f-8ab2-467b-a856-ee7796da8e81",
"name": "Créer Client Stripe",
"type": "n8n-nodes-base.stripe",
"position": [
736,
208
],
"parameters": {
"name": "={{ $json[\"Customer Name\"] }}",
"resource": "customer",
"operation": "create",
"additionalFields": {
"email": "={{ $json.Email }}",
"phone": "={{ $json[\"Phone Number\"] }}"
}
},
"credentials": {
"stripeApi": {
"id": "DV4tPpxjbOUkGfAx",
"name": "Stripe account"
}
},
"typeVersion": 1,
"continueOnFail": true
},
{
"id": "bc462aa9-f034-4e7f-8a07-5668b462396a",
"name": "Guide Articles Line",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-208
],
"parameters": {
"width": 280,
"height": 384,
"content": "## 📄 Line Item Processing\n\n**Purpose:** Split orders into individual line items for invoicing\n\n**What it does:**\n- Processes each product in the order separately\n- Formats data for Stripe invoice creation\n- Handles missing data gracefully\n- Creates test data if no order items found\n\n**Output:** One item per product for detailed invoicing"
},
"typeVersion": 1
},
{
"id": "8d23c8a5-9ca5-43ac-a69c-c0ae0e71d1f5",
"name": "Traiter Articles Line",
"type": "n8n-nodes-base.code",
"position": [
960,
208
],
"parameters": {
"jsCode": "// Get the current input (Stripe customer)\nconst stripeCustomer = $input.item.json;\n\n// Try to get Shopify order from various sources\nlet shopifyOrder = null;\n\n// Method 1: Try from execution data\ntry {\n const executionData = $workflow.data;\n console.log('Execution Data:', JSON.stringify(executionData, null, 2));\n} catch (e) {\n console.log('Cannot access execution data');\n}\n\n// Method 2: Try from items\ntry {\n const items = $items();\n console.log('Items:', JSON.stringify(items, null, 2));\n \n // Look for Shopify order in items\n for (const item of items) {\n if (item.line_items) {\n shopifyOrder = item;\n break;\n }\n }\n} catch (e) {\n console.log('Cannot access items');\n}\n\n// Method 3: Create a test line item if no Shopify data found\nif (!shopifyOrder || !shopifyOrder.line_items || shopifyOrder.line_items.length === 0) {\n console.log('No Shopify order found, creating test data');\n \n // Return test data to verify the node works\n return [\n {\n stripe_customer: stripeCustomer,\n line_item: {\n id: 'test_item_1',\n title: 'Test Product',\n price: '99.99',\n quantity: 1\n },\n price: 99.99,\n quantity: 1,\n title: 'Test Product',\n customer_id: stripeCustomer.id,\n currency: 'USD'\n }\n ];\n}\n\n// If we have Shopify order, process it\nconst lineItems = shopifyOrder.line_items || [];\nconsole.log('Processing line items:', lineItems);\n\n// Return processed line items\nreturn lineItems.map((item, index) => ({\n shopify_order: shopifyOrder,\n stripe_customer: stripeCustomer,\n line_item: item,\n price: parseFloat(item.price || '0'),\n quantity: parseInt(item.quantity || '1'),\n title: item.title || `Item ${index + 1}`,\n customer_id: stripeCustomer.id,\n currency: shopifyOrder.currency || 'USD'\n}));"
},
"typeVersion": 2
},
{
"id": "188a61b7-5c0f-4bab-a2e9-8c15ebf18d7b",
"name": "Guide de Création de Facture",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
384
],
"parameters": {
"width": 300,
"height": 372,
"content": "## 🧾 Invoice Creation\n\n**Purpose:** Create draft invoice in Stripe\n\n**Configuration:**\n- Creates invoice for the customer\n- Sets 30-day payment terms\n- Uses send_invoice collection method\n- Includes all pending invoice items\n\n**Parameters:**\n- customer: Stripe customer ID\n- currency: Order currency\n- days_until_due: 30 days\n- auto_advance: false (manual finalization)"
},
"typeVersion": 1
},
{
"id": "8e7661ce-e5e0-4011-96ad-c63f561ddfee",
"name": "Créer Facture Stripe",
"type": "n8n-nodes-base.httpRequest",
"position": [
1184,
208
],
"parameters": {
"url": "https://api.stripe.com/v1/invoices",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "customer",
"value": "={{ $json.customer_id }}"
},
{
"name": "currency",
"value": "={{ $json.currency }}"
},
{
"name": "auto_advance",
"value": "false"
},
{
"name": "collection_method",
"value": "send_invoice"
},
{
"name": "days_until_due",
"value": "30"
},
{
"name": "pending_invoice_items_behavior",
"value": "include"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/x-www-form-urlencoded"
}
]
},
"nodeCredentialType": "stripeApi"
},
"credentials": {
"stripeApi": {
"id": "DV4tPpxjbOUkGfAx",
"name": "Stripe account"
}
},
"typeVersion": 4.1
},
{
"id": "4f617671-ca7c-4da7-8d32-f15e5845431a",
"name": "Guide de Finalisation",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
-192
],
"parameters": {
"width": 280,
"height": 384,
"content": "## ✅ Invoice Finalization\n\n**Purpose:** Finalize the draft invoice to make it payable\n\n**What happens:**\n- Converts draft to final invoice\n- Generates invoice number\n- Makes invoice payable by customer\n- Triggers email sending (if configured)\n\n**Parameters:**\n- auto_advance: true (automatically send)\n- Invoice ID from previous step"
},
"typeVersion": 1
},
{
"id": "fdf51683-a973-4a01-9872-3df221a34526",
"name": "Finaliser la Facture",
"type": "n8n-nodes-base.httpRequest",
"position": [
1392,
208
],
"parameters": {
"url": "=https://api.stripe.com/v1/invoices/{{ $json.id }}/finalize ",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "auto_advance",
"value": "true"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/x-www-form-urlencoded"
}
]
},
"nodeCredentialType": "stripeApi"
},
"credentials": {
"stripeApi": {
"id": "DV4tPpxjbOUkGfAx",
"name": "Stripe account"
}
},
"typeVersion": 4.1
},
{
"id": "6811b3d3-4b24-4637-97be-d5d32b9576e8",
"name": "Guide de Formatage des Données",
"type": "n8n-nodes-base.stickyNote",
"position": [
1536,
400
],
"parameters": {
"width": 280,
"height": 368,
"content": "## 📊 Data Formatting\n\n**Purpose:** Format invoice data for Google Sheets logging\n\n**Data includes:**\n- Invoice details (ID, number, status)\n- Customer information\n- Financial amounts (converted from cents)\n- Important URLs (hosted invoice, PDF)\n- Timestamps for tracking\n\n**Output:** Clean, formatted data ready for spreadsheet"
},
"typeVersion": 1
},
{
"id": "60bf510e-5a75-4e55-af01-0ca305ddeee5",
"name": "Formater Données pour Sheets",
"type": "n8n-nodes-base.code",
"position": [
1584,
208
],
"parameters": {
"jsCode": "// Get the invoice data from the HTTP response\nconst invoice = $input.item.json;\n\n// Format the data for Google Sheets\nconst formattedData = {\n // Invoice Information\n stripe_invoice_id: invoice.id,\n invoice_number: invoice.number,\n invoice_status: invoice.status,\n \n // Customer Information\n customer_id: invoice.customer,\n customer_name: invoice.customer_name,\n customer_email: invoice.customer_email,\n customer_phone: invoice.customer_phone,\n \n // Financial Information\n currency: invoice.currency.toUpperCase(),\n amount_due: (invoice.amount_due / 100).toFixed(2), // Convert from cents to dollars\n amount_paid: (invoice.amount_paid / 100).toFixed(2),\n amount_remaining: (invoice.amount_remaining / 100).toFixed(2),\n subtotal: (invoice.subtotal / 100).toFixed(2),\n total: (invoice.total / 100).toFixed(2),\n \n // Invoice URLs\n hosted_invoice_url: invoice.hosted_invoice_url,\n invoice_pdf: invoice.invoice_pdf,\n \n // Dates (converted to readable format)\n created_date: new Date(invoice.created * 1000).toISOString(),\n due_date: invoice.due_date ? new Date(invoice.due_date * 1000).toISOString() : null,\n finalized_at: invoice.status_transitions.finalized_at ? new Date(invoice.status_transitions.finalized_at * 1000).toISOString() : null,\n paid_at: invoice.status_transitions.paid_at ? new Date(invoice.status_transitions.paid_at * 1000).toISOString() : null,\n \n // Additional Information\n collection_method: invoice.collection_method,\n billing_reason: invoice.billing_reason,\n line_items_count: invoice.lines.total_count,\n \n // Timestamp for when this record was processed\n processed_timestamp: new Date().toISOString(),\n \n // Original Shopify Order Reference (if available from previous nodes)\n shopify_order_id: null // This will be populated if you have Shopify data in workflow\n};\n\n// Try to get Shopify order ID from previous nodes if available\ntry {\n const shopifyData = $('Process Line Items').item.json.shopify_order;\n if (shopifyData && shopifyData.id) {\n formattedData.shopify_order_id = shopifyData.id;\n }\n} catch (e) {\n console.log('No Shopify order data found');\n}\n\n// Log the formatted data for debugging\nconsole.log('Formatted data for Google Sheets:', formattedData);\n\nreturn formattedData;"
},
"typeVersion": 2
},
{
"id": "57fcfb57-b703-4f89-baa9-d784b1f3dd48",
"name": "Guide d'Enregistrement dans Sheets",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
-304
],
"parameters": {
"width": 300,
"height": 488,
"content": "## 📋 Google Sheets Logging\n\n**Purpose:** Log invoice data to spreadsheet for tracking\n\n**Setup Required:**\n1. Replace YOUR_SPREADSHEET_ID with your actual Google Sheets ID\n2. Ensure proper column headers in your sheet\n3. Grant n8n access to your Google account\n\n**Logged Data:**\n- Invoice details, customer info, financial amounts\n- URLs for invoice access\n- Timestamps for tracking\n\n**Security:** Never commit your actual spreadsheet ID to public repos"
},
"typeVersion": 1
},
{
"id": "c36e89ac-03af-42c7-9c0e-6ca4c1780171",
"name": "Enregistrer dans Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1792,
208
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "stripe_invoice_id",
"type": "string",
"display": true,
"required": false,
"displayName": "stripe_invoice_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoice_number",
"type": "string",
"display": true,
"required": false,
"displayName": "invoice_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoice_status",
"type": "string",
"display": true,
"required": false,
"displayName": "invoice_status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "customer_id",
"type": "string",
"display": true,
"required": false,
"displayName": "customer_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "customer_name",
"type": "string",
"display": true,
"required": false,
"displayName": "customer_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "customer_email",
"type": "string",
"display": true,
"required": false,
"displayName": "customer_email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "customer_phone",
"type": "string",
"display": true,
"required": false,
"displayName": "customer_phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "currency",
"type": "string",
"display": true,
"required": false,
"displayName": "currency",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "amount_due",
"type": "string",
"display": true,
"required": false,
"displayName": "amount_due",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "amount_paid",
"type": "string",
"display": true,
"required": false,
"displayName": "amount_paid",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "amount_remaining",
"type": "string",
"display": true,
"required": false,
"displayName": "amount_remaining",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subtotal",
"type": "string",
"display": true,
"required": false,
"displayName": "subtotal",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "total",
"type": "string",
"display": true,
"required": false,
"displayName": "total",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "hosted_invoice_url",
"type": "string",
"display": true,
"required": false,
"displayName": "hosted_invoice_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoice_pdf",
"type": "string",
"display": true,
"required": false,
"displayName": "invoice_pdf",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "created_date",
"type": "string",
"display": true,
"required": false,
"displayName": "created_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "due_date",
"type": "string",
"display": true,
"required": false,
"displayName": "due_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "finalized_at",
"type": "string",
"display": true,
"required": false,
"displayName": "finalized_at",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "paid_at",
"type": "string",
"display": true,
"required": false,
"displayName": "paid_at",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "collection_method",
"type": "string",
"display": true,
"required": false,
"displayName": "collection_method",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "billing_reason",
"type": "string",
"display": true,
"required": false,
"displayName": "billing_reason",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "line_items_count",
"type": "string",
"display": true,
"required": false,
"displayName": "line_items_count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "processed_timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "processed_timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "shopify_order_id",
"type": "string",
"display": true,
"required": false,
"displayName": "shopify_order_id",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uc9oXoocsPsu5X0oDx6Q552389F28K8X_Yp75tAvhaU/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uc9oXoocsPsu5X0oDx6Q552389F28K8X_Yp75tAvhaU",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uc9oXoocsPsu5X0oDx6Q552389F28K8X_Yp75tAvhaU/edit?usp=drivesdk",
"cachedResultName": "Orders Invoices Data"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "9cba8243-00ab-42f0-a229-fcf7e559a4b3",
"connections": {
"9d95e100-66c2-4bad-b3a3-9aafcdc6ea52": {
"main": [
[
{
"node": "fdd91819-6baa-4c0c-bf05-2ef2ae931625",
"type": "main",
"index": 0
}
]
]
},
"fdd91819-6baa-4c0c-bf05-2ef2ae931625": {
"main": [
[
{
"node": "72e1a601-e9c4-4e65-93db-f4dcb23d9530",
"type": "main",
"index": 0
}
]
]
},
"fdf51683-a973-4a01-9872-3df221a34526": {
"main": [
[
{
"node": "60bf510e-5a75-4e55-af01-0ca305ddeee5",
"type": "main",
"index": 0
}
]
]
},
"8d23c8a5-9ca5-43ac-a69c-c0ae0e71d1f5": {
"main": [
[
{
"node": "8e7661ce-e5e0-4011-96ad-c63f561ddfee",
"type": "main",
"index": 0
}
]
]
},
"8e7661ce-e5e0-4011-96ad-c63f561ddfee": {
"main": [
[
{
"node": "fdf51683-a973-4a01-9872-3df221a34526",
"type": "main",
"index": 0
}
]
]
},
"162bda8f-8ab2-467b-a856-ee7796da8e81": {
"main": [
[
{
"node": "8d23c8a5-9ca5-43ac-a69c-c0ae0e71d1f5",
"type": "main",
"index": 0
}
]
]
},
"72e1a601-e9c4-4e65-93db-f4dcb23d9530": {
"main": [
[
{
"node": "162bda8f-8ab2-467b-a856-ee7796da8e81",
"type": "main",
"index": 0
}
]
]
},
"60bf510e-5a75-4e55-af01-0ca305ddeee5": {
"main": [
[
{
"node": "c36e89ac-03af-42c7-9c0e-6ca4c1780171",
"type": "main",
"index": 0
}
]
]
}
}
}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é - Création de contenu, IA Multimodale
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.
Workflows recommandés
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
Partager ce workflow