{ "nodes": [ { "name": "On clicking 'execute'", "type": "n8n-nodes-base.manualTrigger", "position": [ 400, 520 ], "parameters": {}, "typeVersion": 1, "id": "3df43e99-7bfa-404d-aadb-f73f21361e0b", "notes": "This manualTrigger node performs automated tasks as part of the workflow." }, { "name": "Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 1500, 360 ], "parameters": { "width": 780, "height": 360, "content": "## 2. Wait for an external event\nUse this operation when an external step is needed in order to continue with the rest of the workflow.\nFor example - a workflow sends a purchase approval link to the merchant (using Gmail, Slack etc..) and waits for the merchant to click on it before continuing with the rest of the steps.\n\nIn this example, the `Customer Messenger` node mimics the email or messaging node.\n" }, "typeVersion": 1, "id": "a0e5f7d8-b4b7-4f3f-b39d-1d2cbffae9b9", "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "name": "Note", "type": "n8n-nodes-base.stickyNote", "position": [ 200, 380 ], "parameters": { "width": 300, "height": 120, "content": "### Click the `Execute Workflow` button and double click on the nodes to see the input and output items." }, "typeVersion": 1, "id": "2e989507-f16c-43ee-a028-f36be7369ef9", "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "name": "Create approval URL", "type": "n8n-nodes-base.set", "position": [ 1540, 520 ], "parameters": { "values": { "string": [ { "name": "URL", "value": "={{$resumeWebhookUrl}}?name=nathan" } ] }, "options": {}, "keepOnlySet": true }, "typeVersion": 1, "id": "29d03913-63bc-401b-98e8-cbdd594ed7ad", "notes": "This set node performs automated tasks as part of the workflow." }, { "name": "Wait for external approval", "type": "n8n-nodes-base.wait", "position": [ 1940, 520 ], "webhookId": "0bcafff8-9fc1-4415-95b1-00746bb1304d", "parameters": { "resume": "webhook", "options": {} }, "typeVersion": 1, "id": "4addb2b3-9138-4da4-939c-76416783b42d", "notes": "This wait node performs automated tasks as part of the workflow." }, { "name": "Rest of the workflow placeholder", "type": "n8n-nodes-base.noOp", "position": [ 2140, 520 ], "parameters": {}, "typeVersion": 1, "id": "968ad78f-db0c-4d1c-a51f-09b086fcd4f0", "notes": "This noOp node performs automated tasks as part of the workflow." }, { "name": "Customer Datastore", "type": "n8n-nodes-base.n8nTrainingCustomerDatastore", "position": [ 580, 520 ], "parameters": { "operation": "getAllPeople", "returnAll": true }, "typeVersion": 1, "id": "27c4c20a-5e54-4eb3-8440-2b36fbb44eb7", "notes": "This n8nTrainingCustomerDatastore node performs automated tasks as part of the workflow." }, { "name": "SplitInBatches", "type": "n8n-nodes-base.splitInBatches", "position": [ 760, 520 ], "parameters": { "options": {}, "batchSize": 1 }, "typeVersion": 1, "id": "5f0724ee-89c2-4433-8995-d2b5169fb127", "notes": "This splitInBatches node performs automated tasks as part of the workflow." }, { "name": "Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 540, 360 ], "parameters": { "width": 900, "height": 360, "content": "## 1. Rate Limiting \nSometimes you need to slow down how often you are contacting a service.\n\nIn this example, `Customer Datastore` node simulates the big batches of requests coming at once, the `SplitInBatches` node handles each one individually in a loop, and the `Wait` node creates a 2 second delay between each message to a customer." }, "typeVersion": 1, "id": "c0b24e21-5509-4e22-a00c-8996dbf6da2a", "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "name": "Wait for time interval", "type": "n8n-nodes-base.wait", "position": [ 920, 520 ], "webhookId": "2b72e9d7-75b7-4ef5-87e7-2bfdfdbaa20f", "parameters": { "unit": "seconds", "amount": 2 }, "typeVersion": 1, "id": "2453b34f-df88-4189-806e-115896369fb6", "notes": "This wait node performs automated tasks as part of the workflow." }, { "name": "If - Are we Finished?", "type": "n8n-nodes-base.if", "position": [ 1280, 520 ], "parameters": { "conditions": { "boolean": [ { "value1": "={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"]}}", "value2": true } ] } }, "typeVersion": 1, "id": "2f87ab6d-0f00-414d-a456-99175e1c7509", "notes": "This if node performs automated tasks as part of the workflow." }, { "name": "Customer Messenger - Send URL to merchant", "type": "n8n-nodes-base.n8nTrainingCustomerMessenger", "position": [ 1740, 520 ], "parameters": { "message": "={{$json[\"URL\"]}}", "customerId": "1" }, "typeVersion": 1, "id": "8d38129d-efdb-49fe-ae1f-273e1dacbc2d", "notes": "This n8nTrainingCustomerMessenger node performs automated tasks as part of the workflow." }, { "name": "Customer Messenger - Send message to client", "type": "n8n-nodes-base.n8nTrainingCustomerMessenger", "position": [ 1100, 520 ], "parameters": { "message": "=\nHi {{$node[\"Customer Datastore\"].json[\"name\"]}}\nThis message was sent at {{$now.toLocaleString(DateTime.TIME_WITH_SECONDS)}}", "customerId": "={{$node[\"Customer Datastore\"].json[\"id\"]}}" }, "typeVersion": 1, "id": "161f4b6a-1f3e-4398-ac52-1e657604b114", "notes": "This n8nTrainingCustomerMessenger node performs automated tasks as part of the workflow." }, { "id": "error-0f3d2510", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "connections": {}, "name": "Manualtrigger Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "description": "Automated workflow: Manualtrigger Workflow. This workflow integrates 9 different services: stickyNote, wait, set, n8nTrainingCustomerMessenger, manualTrigger. It contains 13 nodes and follows best practices for error handling and security.", "meta": { "instanceId": "workflow-05fea20c", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:51.031446", "updatedAt": "2025-09-29T07:07:51.031464", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "notes": "Excellent quality workflow: Manualtrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }