{
  "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": {
    "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."
}