Gestion automatisée des stocks
Ceci est unDocument Extractionworkflow d'automatisation du domainecontenant 15 nœuds.Utilise principalement des nœuds comme Code, Airtable, SendInBlue, ScheduleTrigger. Gestion automatisée des stocks à partir de la création de commandes Airtable et des e-mails aux fournisseurs
- •Clé API Airtable
Nœuds utilisés (15)
Catégorie
{
"meta": {
"instanceId": "b6731f6e46273cffeac6b5188a5b3bcb0840c00108e73b48ae2b799ac6e8e081",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "fe401179-5a8b-4232-b148-9bf4d96ceb9b",
"name": "Obtenir les produits en faible stock",
"type": "n8n-nodes-base.airtable",
"position": [
-2340,
-540
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblLQxA3XuieqUIja",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tblLQxA3XuieqUIja",
"cachedResultName": "Products Table"
},
"options": {},
"operation": "search",
"filterByFormula": "{stock_level} <= {reorder_threshold}"
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "46bfdc76-b244-41a9-a686-09c8eb140968",
"name": "Obtenir les détails des fournisseurs pour ces produits",
"type": "n8n-nodes-base.airtable",
"position": [
-2120,
-540
],
"parameters": {
"id": "={{ $json.supplier_id }}",
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbl7LUCS0MYq0Fjq6",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tbl7LUCS0MYq0Fjq6",
"cachedResultName": "Supplier"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "836a5efb-0cad-4508-8703-911241f0b847",
"name": "Calculer la quantité dynamique de réapprovisionnement",
"type": "n8n-nodes-base.code",
"position": [
-1900,
-540
],
"parameters": {
"jsCode": "const safetyMargin = 1.2;\n// Process all input items\nconst outputItems = [];\nfor (const item of $input.all()) {\n const avgDaily = item.json.average_daily_sales || 1;\n const leadTime = item.json.lead_time_days || 7;\n \n // Updated logic: 2x lead time for better production inventory management\n // First lead time: stock to last until delivery arrives\n // Second lead time: buffer stock for next reorder cycle\n const reorderQty = Math.ceil(avgDaily * (leadTime * 1.5) * safetyMargin);\n \n outputItems.push({\n json: {\n ...item.json,\n reorder_qty: reorderQty\n }\n });\n}\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "7d04d71d-3d40-4575-b567-6e6bb8712e3a",
"name": "Exécuter chaque nuit à minuit",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2520,
-540
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 0 * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "50c4223b-83d7-4204-a2ad-75b390b9298b",
"name": "Créer des enregistrements d'achat dans la table",
"type": "n8n-nodes-base.airtable",
"position": [
-2160,
-280
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbloIflYm8aNOy10m",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tbloIflYm8aNOy10m",
"cachedResultName": "Purchase Orders"
},
"columns": {
"value": {
"status": "Pending",
"quantity": "={{ $json.reorder_qty }}",
"product_id": "={{ $json.product_id }}",
"supplier_id": "={{ $json.supplier_id }}",
"Product Name": "={{ $json.product_name }}",
"Supplier Email": "={{ $json.supplier_email }}"
},
"schema": [
{
"id": "po_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "po_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "quantity",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "supplier_id",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "supplier_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier Email",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Supplier Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Sent",
"value": "Sent"
},
{
"name": "Delivered",
"value": "Delivered"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "date",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product_id",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "product_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Product Name",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "87965ea3-6e2a-495d-a040-fcf15ba8bb2a",
"name": "Rechercher des enregistrements",
"type": "n8n-nodes-base.airtable",
"position": [
-2500,
-280
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbloIflYm8aNOy10m",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tbloIflYm8aNOy10m",
"cachedResultName": "Purchase Orders"
},
"options": {},
"operation": "search",
"filterByFormula": "=AND({product_id} = '{{ $('Get Products with low stock').item.json.product_id }}', OR({status} = 'Pending', {status} = 'Sent'))"
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "18390f14-6622-4f6c-8c24-ec123c4a807e",
"name": "Supprimer les commandes de produits en double",
"type": "n8n-nodes-base.code",
"position": [
-2340,
-280
],
"parameters": {
"jsCode": "// Step 1: Get all low stock products with complete data\nconst lowStockProducts = $('Get Products with low stock').all();\nconst allProductIds = lowStockProducts.map(p => p.json.product_id);\n\n// Step 2: Get calculated reorder quantities from the first code node\nconst reorderData = $('Calculate Dynamic Re-order Quantity').all();\n\n// Step 3: Get supplier details (this should have the actual supplier info)\nconst supplierDetails = $('Get supplier Details for those low stock products').all();\n\n// Step 4: Get existing purchase orders from input\nconst existingPOs = $input.all();\nconst existingProductIds = existingPOs.map(po => po.json.product_id);\n\n// Step 5: Filter out products that already have active POs\nconst newProductIds = allProductIds.filter(pid => !existingProductIds.includes(pid));\n\n// Step 6: Build complete result with all required fields\nconst result = newProductIds.map(productId => {\n // Find the original product data\n const originalProduct = lowStockProducts.find(p => p.json.product_id === productId);\n \n // Find the calculated reorder quantity and supplier info from the first code node\n let reorderQty = 0;\n let supplierId = '';\n const reorderInfo = reorderData.find(r => r.json.product_id === productId);\n if (reorderInfo) {\n reorderQty = reorderInfo.json.reorder_qty;\n supplierId = reorderInfo.json.supplier_id;\n } else {\n // Fallback: try to match by index if product_id isn't available in reorder data\n const productIndex = lowStockProducts.findIndex(p => p.json.product_id === productId);\n if (productIndex >= 0 && reorderData[productIndex]) {\n reorderQty = reorderData[productIndex].json.reorder_qty;\n supplierId = reorderData[productIndex].json.supplier_id;\n }\n }\n \n // For supplier details, we need to match by supplier_id from the reorder data\n // The supplier_id might be an array (linked record) or a string\n const supplierRecordId = Array.isArray(supplierId) ? supplierId[0] : supplierId;\n \n // Find supplier details by matching the record ID or by product_id\n // Try multiple ways to match supplier data\n const supplierData = supplierDetails.find(s => \n s.json.id === supplierRecordId || \n s.json.supplier_id === supplierRecordId ||\n s.json.product_id === productId\n );\n \n return {\n json: {\n product_id: productId,\n product_name: originalProduct?.json?.product_name || '',\n reorder_qty: reorderQty,\n supplier_id: supplierRecordId || '',\n supplier_email: supplierData?.json?.email || \n supplierData?.json?.supplier_email || \n supplierData?.json?.contact_email ||\n supplierData?.json?.Email || ''\n }\n };\n});\n\nreturn result;"
},
"typeVersion": 2
},
{
"id": "cc7b13bc-d8f8-4c26-b503-5d9a8fcfd010",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2600,
-980
],
"parameters": {
"width": 940,
"height": 920,
"content": "### 📦 **Automated Purchase Order Creation – n8n Workflow**\n\nThis n8n automation checks products with low stock every night, calculates smart reorder quantities, avoids duplicate POs, and creates fresh purchase orders automatically.\n\n**✅ Steps:**\n\n1. **Run Every Midnight** – Scheduled daily trigger.\n2. **Get Products with Low Stock** – Fetch products below reorder threshold from Airtable.\n3. **Get Supplier Details** – Fetch related supplier info.\n4. **Calculate Dynamic Reorder Quantity** – Uses average daily sales × lead time × safety margin.\n5. **Search Existing POs** – Checks if there are active pending/sent orders.\n6. **Remove Duplicate Product Orders** – Filters out products already covered by existing POs.\n7. **Create Purchase Records** – Generates new purchase order records in Airtable with supplier email, product name, reorder quantity, etc.\n\n⚙ **Fully automated daily process** — keeps your stock healthy and your suppliers notified."
},
"typeVersion": 1
},
{
"id": "790b9e2e-63fb-4d15-b0e9-47d1ab6dfdd2",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1360,
-520
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 1 * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "93b3ea8a-5b0a-41b6-863c-1c78bc6ec59d",
"name": "Obtenir les bons de commande en attente",
"type": "n8n-nodes-base.airtable",
"position": [
-1120,
-520
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbloIflYm8aNOy10m",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tbloIflYm8aNOy10m",
"cachedResultName": "Purchase Orders"
},
"options": {},
"operation": "search",
"filterByFormula": "={status} = 'Pending'"
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "4ba6d12d-cbe6-418e-a9bb-102f54451b03",
"name": "Grouper les produits par fournisseur",
"type": "n8n-nodes-base.code",
"position": [
-900,
-520
],
"parameters": {
"jsCode": "// Group purchase orders by supplier\nconst groupedOrders = {};\n\nfor (const item of $input.all()) {\n const supplierId = item.json.supplier_id;\n const supplierEmail = item.json[\"Supplier Email\"];\n const airtableRecordId = item.json.id; // capture Airtable record ID\n\n if (!groupedOrders[supplierId]) {\n groupedOrders[supplierId] = {\n supplier_id: supplierId,\n supplier_email: supplierEmail,\n orders: [],\n total_items: 0,\n po_summary: [],\n record_ids: [] // store PO record IDs to update later\n };\n }\n\n const productName = item.json.product_name || item.json[\"Product Name\"] || item.json.product_id || \"Unknown Product\";\n\n groupedOrders[supplierId].orders.push({\n product_name: productName,\n quantity: item.json.quantity,\n product_id: item.json.product_id,\n airtable_record_id: airtableRecordId\n });\n\n groupedOrders[supplierId].record_ids.push(airtableRecordId);\n groupedOrders[supplierId].total_items += item.json.quantity;\n groupedOrders[supplierId].po_summary.push(`${productName} (Qty: ${item.json.quantity})`);\n}\n\n// Helper function to create single-line HTML email body\nconst createHTMLBody = (supplier) => {\n const tableRows = supplier.orders.map(order =>\n `<tr><td style=\"padding:8px;border-bottom:1px solid #ddd;\">${order.product_name}</td><td style=\"padding:8px;border-bottom:1px solid #ddd;text-align:center;\">${order.product_id}</td><td style=\"padding:8px;border-bottom:1px solid #ddd;text-align:center;\">${order.quantity}</td></tr>`\n ).join('');\n\n return `<html><body style=\"font-family:Arial,sans-serif;line-height:1.6;color:#333;\"><div style=\"max-width:600px;margin:0 auto;padding:20px;\"><h2 style=\"color:#2c3e50;border-bottom:2px solid #3498db;padding-bottom:10px;\">Purchase Order Request</h2><p>Dear Supplier,</p><p>We hope this email finds you well. Please prepare the following items for delivery:</p><table style=\"width:100%;border-collapse:collapse;margin:20px 0;box-shadow:0 2px 4px rgba(0,0,0,0.1);\"><thead><tr style=\"background-color:#3498db;color:white;\"><th style=\"padding:12px;text-align:left;\">Product Name</th><th style=\"padding:12px;text-align:center;\">Product ID</th><th style=\"padding:12px;text-align:center;\">Quantity</th></tr></thead><tbody>${tableRows}</tbody></table><div style=\"background-color:#f8f9fa;padding:15px;border-radius:5px;margin:20px 0;\"><p style=\"margin:5px 0;\"><strong>📦 Total Products:</strong> ${supplier.orders.length}</p><p style=\"margin:5px 0;\"><strong>📊 Total Quantity:</strong> ${supplier.total_items}</p><p style=\"margin:5px 0;\"><strong>🏷️ Supplier ID:</strong> ${supplier.supplier_id}</p></div><p>Please confirm receipt of this order and provide an estimated delivery date.</p><p style=\"margin-top:30px;\">Thank you for your prompt attention to this order.<br><strong>Inventory Management Team</strong></p><hr style=\"border:none;border-top:1px solid #ddd;margin:30px 0;\"><p style=\"font-size:12px;color:#666;text-align:center;\">This is an automated message. Please do not reply to this email.</p></div></body></html>`;\n};\n\nreturn Object.values(groupedOrders).map(supplier => ({\n json: {\n supplier_id: supplier.supplier_id,\n supplier_email: supplier.supplier_email,\n total_products: supplier.orders.length,\n total_quantity: supplier.total_items,\n order_details: supplier.orders,\n po_summary: supplier.po_summary,\n record_ids: supplier.record_ids, // include record IDs for updating status later\n email_subject: `🛒 Purchase Order - ${supplier.orders.length} Product${supplier.orders.length > 1 ? 's' : ''} (${supplier.total_items} items) - ${supplier.supplier_id}`,\n email_body_html: createHTMLBody(supplier),\n email_body_text: `Dear Supplier,\\n\\nPlease prepare the following items:\\n\\n${supplier.po_summary.join('\\n')}\\n\\nTotal Products: ${supplier.orders.length}\\nTotal Items: ${supplier.total_items}\\nSupplier ID: ${supplier.supplier_id}\\n\\nThank you!\\n\\nInventory Management Team`\n }\n}));\n"
},
"typeVersion": 2
},
{
"id": "ce853473-aa77-4215-a7e2-4b584f6b5986",
"name": "Obtenir les ID d'enregistrement des PO",
"type": "n8n-nodes-base.code",
"position": [
-720,
-400
],
"parameters": {
"jsCode": "const items = $input.all();\nconst updates = [];\n\nfor (const item of items) {\n const recordIds = item.json.record_ids || [];\n for (const id of recordIds) {\n updates.push({\n json: {\n id,\n status: 'Sent'\n }\n });\n }\n}\n\nreturn updates;\n"
},
"typeVersion": 2
},
{
"id": "275e3674-127b-4acf-92cd-c554b61239f9",
"name": "Mettre à jour le statut du PO à 'envoyé'",
"type": "n8n-nodes-base.airtable",
"position": [
-500,
-540
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apprZl1I4LgjwhSVf",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf",
"cachedResultName": "Products Tables"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbloIflYm8aNOy10m",
"cachedResultUrl": "https://airtable.com/apprZl1I4LgjwhSVf/tbloIflYm8aNOy10m",
"cachedResultName": "Purchase Orders"
},
"columns": {
"value": {
"id": "={{ $json.id }}",
"status": "Sent"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "po_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "po_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "quantity",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "supplier_id",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "supplier_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier Email",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Supplier Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Sent",
"value": "Sent"
},
{
"name": "Delivered",
"value": "Delivered"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "date",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product_id",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "product_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Product Name",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "upsert"
},
"credentials": {
"airtableTokenApi": {
"id": "j2v4SdOKrSSYQlXT",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "fd03a9df-1892-465b-9dc5-6c13cb2c1f16",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1420,
-980
],
"parameters": {
"width": 1140,
"height": 920,
"content": "## 📦 n8n Automation: Daily PO Email & Status Sync\n\n- **Runs at:** 01:00 AM every day (`0 1 * * *`)\n- **Step 1:** Fetches all `Pending` purchase orders from Airtable\n- **Step 2:** Groups orders by supplier, builds HTML emails summarizing products and quantities\n- **Step 3:** Sends emails to suppliers via Brevo (SendInBlue)\n- **Step 4:** Updates each purchase order’s status to `Sent` in Airtable\n\nKeeps your suppliers updated daily and automates your purchase order workflow.\n"
},
"typeVersion": 1
},
{
"id": "e725f7f0-85a1-4cec-af79-fee429ff2667",
"name": "Envoyer les PO aux fournisseurs par e-mail",
"type": "n8n-nodes-base.sendInBlue",
"position": [
-700,
-700
],
"parameters": {
"sender": "abhiram.bvb@gmail.com",
"subject": "={{ $json.email_subject }}",
"sendHTML": true,
"htmlContent": "={{ $json.email_body_html }}",
"receipients": "={{ $json.supplier_email }}",
"requestOptions": {},
"additionalFields": {}
},
"credentials": {
"sendInBlueApi": {
"id": "ysEmyjdU0adBBOqN",
"name": "Brevo account"
}
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"87965ea3-6e2a-495d-a040-fcf15ba8bb2a": {
"main": [
[
{
"node": "18390f14-6622-4f6c-8c24-ec123c4a807e",
"type": "main",
"index": 0
}
]
]
},
"790b9e2e-63fb-4d15-b0e9-47d1ab6dfdd2": {
"main": [
[
{
"node": "93b3ea8a-5b0a-41b6-863c-1c78bc6ec59d",
"type": "main",
"index": 0
}
]
]
},
"7d04d71d-3d40-4575-b567-6e6bb8712e3a": {
"main": [
[
{
"node": "fe401179-5a8b-4232-b148-9bf4d96ceb9b",
"type": "main",
"index": 0
}
]
]
},
"ce853473-aa77-4215-a7e2-4b584f6b5986": {
"main": [
[
{
"node": "275e3674-127b-4acf-92cd-c554b61239f9",
"type": "main",
"index": 0
}
]
]
},
"fe401179-5a8b-4232-b148-9bf4d96ceb9b": {
"main": [
[
{
"node": "46bfdc76-b244-41a9-a686-09c8eb140968",
"type": "main",
"index": 0
}
]
]
},
"4ba6d12d-cbe6-418e-a9bb-102f54451b03": {
"main": [
[
{
"node": "e725f7f0-85a1-4cec-af79-fee429ff2667",
"type": "main",
"index": 0
},
{
"node": "ce853473-aa77-4215-a7e2-4b584f6b5986",
"type": "main",
"index": 0
}
]
]
},
"e725f7f0-85a1-4cec-af79-fee429ff2667": {
"main": [
[]
]
},
"18390f14-6622-4f6c-8c24-ec123c4a807e": {
"main": [
[
{
"node": "50c4223b-83d7-4204-a2ad-75b390b9298b",
"type": "main",
"index": 0
}
]
]
},
"50c4223b-83d7-4204-a2ad-75b390b9298b": {
"main": [
[]
]
},
"836a5efb-0cad-4508-8703-911241f0b847": {
"main": [
[
{
"node": "87965ea3-6e2a-495d-a040-fcf15ba8bb2a",
"type": "main",
"index": 0
}
]
]
},
"93b3ea8a-5b0a-41b6-863c-1c78bc6ec59d": {
"main": [
[
{
"node": "4ba6d12d-cbe6-418e-a9bb-102f54451b03",
"type": "main",
"index": 0
}
]
]
},
"46bfdc76-b244-41a9-a686-09c8eb140968": {
"main": [
[
{
"node": "836a5efb-0cad-4508-8703-911241f0b847",
"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é ?
Intermédiaire - Extraction de documents
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
iamvaar
@iamvaarPartager ce workflow