AutomationFlowsGeneral › n8n Rate Limiting & External Event Wait

n8n Rate Limiting & External Event Wait

Original n8n title: Rate Limiting and Waiting for External Events

Rate Limiting And Waiting For External Events. Uses manualTrigger, stickyNote, noOp, n8nTrainingCustomerDatastore. Event-driven trigger; 13 nodes.

Event trigger★★★★☆ complexity13 nodesN8N Training Customer DatastoreN8N Training Customer Messenger
General Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "name": "On clicking 'execute'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        400,
        520
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "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
    },
    {
      "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
    },
    {
      "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
    },
    {
      "name": "Wait for external approval",
      "type": "n8n-nodes-base.wait",
      "position": [
        1940,
        520
      ],
      "parameters": {
        "resume": "webhook",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "name": "Rest of the workflow placeholder",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2140,
        520
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "name": "Customer Datastore",
      "type": "n8n-nodes-base.n8nTrainingCustomerDatastore",
      "position": [
        580,
        520
      ],
      "parameters": {
        "operation": "getAllPeople",
        "returnAll": true
      },
      "typeVersion": 1
    },
    {
      "name": "SplitInBatches",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        760,
        520
      ],
      "parameters": {
        "options": {},
        "batchSize": 1
      },
      "typeVersion": 1
    },
    {
      "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
    },
    {
      "name": "Wait for time interval",
      "type": "n8n-nodes-base.wait",
      "position": [
        920,
        520
      ],
      "parameters": {
        "unit": "seconds",
        "amount": 2
      },
      "typeVersion": 1
    },
    {
      "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
    },
    {
      "name": "Customer Messenger - Send URL to merchant",
      "type": "n8n-nodes-base.n8nTrainingCustomerMessenger",
      "position": [
        1740,
        520
      ],
      "parameters": {
        "message": "={{$json[\"URL\"]}}",
        "customerId": "1"
      },
      "typeVersion": 1
    },
    {
      "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
    }
  ],
  "connections": {
    "SplitInBatches": {
      "main": [
        [
          {
            "node": "Wait for time interval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customer Datastore": {
      "main": [
        [
          {
            "node": "SplitInBatches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create approval URL": {
      "main": [
        [
          {
            "node": "Customer Messenger - Send URL to merchant",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If - Are we Finished?": {
      "main": [
        [
          {
            "node": "Create approval URL",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "SplitInBatches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Customer Datastore",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for time interval": {
      "main": [
        [
          {
            "node": "Customer Messenger - Send message to client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for external approval": {
      "main": [
        [
          {
            "node": "Rest of the workflow placeholder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customer Messenger - Send URL to merchant": {
      "main": [
        [
          {
            "node": "Wait for external approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customer Messenger - Send message to client": {
      "main": [
        [
          {
            "node": "If - Are we Finished?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow enables you to pause automation until external approval is received, preventing rushed decisions and ensuring compliance in sensitive processes like financial transactions or content publishing. It suits teams managing approvals across distributed systems, such as marketing or operations groups needing human oversight before proceeding. The key step involves generating an approval URL and using the Wait node to halt execution until a response arrives via the n8nTrainingCustomerMessenger integration, seamlessly integrating with the n8nTrainingCustomerDatastore for secure data handling.

Use this when external events, like user confirmations, are essential to avoid errors in multi-step automations, particularly for workflows exceeding API rate limits with the SplitInBatches node. Avoid it for fully automated, high-speed tasks where delays are unacceptable, such as real-time data syncing. Common variations include adding conditional branching post-approval or chaining multiple waits for sequential reviews.

About this workflow

Rate Limiting And Waiting For External Events. Uses manualTrigger, stickyNote, noOp, n8nTrainingCustomerDatastore. Event-driven trigger; 13 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Workflow 1749. Uses n8nTrainingCustomerDatastore, n8nTrainingCustomerMessenger. Event-driven trigger; 13 nodes.

N8N Training Customer Datastore, N8N Training Customer Messenger
General

1749. Uses n8nTrainingCustomerDatastore, n8nTrainingCustomerMessenger. Event-driven trigger; 13 nodes.

N8N Training Customer Datastore, N8N Training Customer Messenger
General

Items length test. Uses stopAndError, n8nTrainingCustomerDatastore. Event-driven trigger; 26 nodes.

Stop And Error, N8N Training Customer Datastore
General

Merge multiple runs into one. Uses manualTrigger, n8nTrainingCustomerDatastore, noOp, splitInBatches. Event-driven trigger; 7 nodes.

N8N Training Customer Datastore
General

Avoid Rate Limiting By Batching Http Requests. Uses manualTrigger, n8nTrainingCustomerDatastore, splitInBatches, httpRequest. Event-driven trigger; 6 nodes.

N8N Training Customer Datastore, HTTP Request