Skip to main content
RapidDev - Software Development Agency
n8n-tutorial

How to Limit Workflow Triggers in n8n

To limit workflow triggers in n8n, use the Schedule Trigger node with a longer interval, add an IF node to deduplicate incoming data, or configure the Execution Settings to prevent overlapping runs. These techniques reduce unnecessary executions and keep your n8n instance responsive under load.

What you'll learn

  • How to configure trigger intervals and cron expressions to control frequency
  • How to deduplicate incoming items using static data and an IF node
  • How to enable execution concurrency limits to prevent overlapping runs
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner6 min read10-15 minutesn8n 1.20+ (self-hosted and Cloud)March 2026RapidDev Engineering Team
TL;DR

To limit workflow triggers in n8n, use the Schedule Trigger node with a longer interval, add an IF node to deduplicate incoming data, or configure the Execution Settings to prevent overlapping runs. These techniques reduce unnecessary executions and keep your n8n instance responsive under load.

Controlling How Often Workflows Fire in n8n

Workflows that trigger too frequently can overwhelm your n8n instance, burn through API quotas, and create duplicate data. Whether you are polling an inbox every few seconds or receiving bursts of webhook requests, you need strategies to throttle execution frequency. This tutorial covers three approaches: adjusting trigger intervals, deduplicating items with an IF node, and using n8n's built-in execution settings to prevent overlapping runs.

Prerequisites

  • A running n8n instance (v1.20 or later)
  • At least one active workflow with a trigger node
  • Basic familiarity with n8n expressions

Step-by-step guide

1

Adjust the trigger interval on your Schedule Trigger node

Open your workflow and click the Schedule Trigger node. Change the Trigger Interval from a short value (like every 1 minute) to a longer one that matches your actual needs. For most polling use cases, every 5 or 15 minutes is sufficient. If you use a Cron expression, update it accordingly. For example, change */1 * * * * to */15 * * * * to run every 15 minutes instead of every minute. Click Execute Workflow to test that the new interval works, then toggle the workflow active.

Expected result: The workflow now triggers at the longer interval, reducing total executions per day.

2

Deduplicate incoming items using static data and an IF node

When a trigger like the Gmail Trigger or RSS Feed returns items you have already processed, you waste executions. Add a Code node after the trigger that checks each item's unique ID against a stored list using n8n's static data. Items already in the list are filtered out. New items are added to the list and passed through. This prevents reprocessing the same email, record, or event twice. The static data persists across executions, so the list survives workflow restarts.

typescript
1// Code node — Run Once for All Items
2const staticData = $getWorkflowStaticData('global');
3if (!staticData.processedIds) {
4 staticData.processedIds = [];
5}
6
7const newItems = [];
8for (const item of $input.all()) {
9 const id = item.json.id || item.json.messageId || '';
10 if (id && !staticData.processedIds.includes(id)) {
11 staticData.processedIds.push(id);
12 newItems.push(item);
13 }
14}
15
16// Keep only last 500 IDs to prevent memory growth
17if (staticData.processedIds.length > 500) {
18 staticData.processedIds = staticData.processedIds.slice(-500);
19}
20
21return newItems.length > 0 ? newItems : [];

Expected result: Only new, unprocessed items pass through. Previously seen items are silently dropped.

3

Prevent overlapping executions with workflow settings

If a workflow takes longer than the trigger interval, multiple instances can run at the same time, causing race conditions and duplicate processing. To prevent this, click the gear icon on the workflow canvas to open Workflow Settings. Under the Error Handling section, find the Save Execution Progress toggle and enable it. For self-hosted n8n, you can also set the environment variable EXECUTIONS_MODE=queue and configure concurrency limits. On n8n Cloud, use the workflow-level timeout setting to stop runaway executions. Set Timeout Workflow After to a reasonable value like 120 seconds.

Expected result: Only one instance of the workflow runs at a time, and executions that exceed the timeout are stopped automatically.

4

Add rate limiting for webhook-triggered workflows

If your workflow uses a Webhook trigger and receives bursts of requests, add a Code node that enforces a minimum interval between processed requests. Use static data to store the timestamp of the last processed request. If the current request arrives within the cooldown period, respond immediately with a 429 status and skip further processing. This protects downstream API calls from being overwhelmed by rapid webhook fires.

typescript
1// Code node — Run Once for All Items
2const staticData = $getWorkflowStaticData('global');
3const COOLDOWN_MS = 5000; // 5 seconds between processed requests
4const now = Date.now();
5
6if (staticData.lastProcessed && (now - staticData.lastProcessed) < COOLDOWN_MS) {
7 // Too soon — skip this execution
8 return [];
9}
10
11staticData.lastProcessed = now;
12return $input.all();

Expected result: Webhook requests arriving within the cooldown period are dropped. Only one request per interval is processed.

Complete working example

deduplication-with-rate-limit.js
1// Code node: Combined Deduplication + Rate Limiting
2// Mode: Run Once for All Items
3// Place immediately after any trigger node
4
5const staticData = $getWorkflowStaticData('global');
6
7// Initialize storage
8if (!staticData.processedIds) {
9 staticData.processedIds = [];
10}
11if (!staticData.lastProcessed) {
12 staticData.lastProcessed = 0;
13}
14
15// Rate limiting — minimum interval between executions
16const COOLDOWN_MS = 5000;
17const now = Date.now();
18
19if ((now - staticData.lastProcessed) < COOLDOWN_MS) {
20 return [];
21}
22
23// Deduplication — filter out already-seen items
24const newItems = [];
25for (const item of $input.all()) {
26 const id = item.json.id
27 || item.json.messageId
28 || item.json.uid
29 || JSON.stringify(item.json).substring(0, 100);
30
31 if (!staticData.processedIds.includes(id)) {
32 staticData.processedIds.push(id);
33 newItems.push(item);
34 }
35}
36
37// Prune old IDs to prevent unbounded growth
38const MAX_IDS = 1000;
39if (staticData.processedIds.length > MAX_IDS) {
40 staticData.processedIds = staticData.processedIds.slice(-MAX_IDS);
41}
42
43// Update last-processed timestamp only if we have new items
44if (newItems.length > 0) {
45 staticData.lastProcessed = now;
46}
47
48return newItems;

Common mistakes when limiting Workflow Triggers in n8n

Why it's a problem: Setting the trigger interval to every second for near-real-time processing

How to avoid: Use a Webhook trigger instead of polling for real-time needs. Polling every second creates unnecessary load.

Why it's a problem: Not pruning the deduplication ID list, causing memory to grow indefinitely

How to avoid: Add a slice operation to keep only the last 500-2000 IDs in static data.

Why it's a problem: Using workflow-level variables instead of static data for deduplication

How to avoid: Workflow-level variables reset each execution. Use $getWorkflowStaticData('global') which persists across runs.

Why it's a problem: Forgetting that deactivating and reactivating a workflow resets some triggers

How to avoid: After reactivation, triggers like the Gmail Trigger may re-fetch recent items. Always keep deduplication logic in place.

Best practices

  • Set trigger intervals based on actual business needs — polling every minute is rarely necessary
  • Always deduplicate incoming items when using email, RSS, or database polling triggers
  • Use n8n's static data to persist deduplication lists across workflow executions
  • Prune your stored ID list periodically to prevent unbounded memory growth
  • Set workflow timeouts to stop runaway executions from blocking the queue
  • Use environment variable N8N_CONCURRENCY_PRODUCTION_LIMIT on self-hosted instances to cap parallel executions
  • Monitor execution counts in the Executions tab to verify your limits are working

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I have an n8n workflow that triggers too often and creates duplicate processing. How do I limit the trigger frequency to every 15 minutes and filter out items I have already processed using static data?

n8n Prompt

Add a Code node after my Gmail Trigger that uses $getWorkflowStaticData to track processed email IDs and filter out duplicates. Keep only the last 500 IDs to prevent memory issues.

Frequently asked questions

Can I limit how many times a webhook-triggered workflow runs per minute?

Yes. Add a Code node after the Webhook trigger that uses static data to track the last execution timestamp and drops requests arriving within a cooldown period. You can also set N8N_CONCURRENCY_PRODUCTION_LIMIT as an environment variable on self-hosted instances.

Does n8n have built-in rate limiting for triggers?

n8n does not have a built-in per-workflow rate limiter, but you can use execution concurrency settings and workflow timeouts to control how many workflows run simultaneously. For per-item deduplication, use a Code node with static data.

What happens if my workflow takes longer than the trigger interval?

By default, n8n starts a new execution even if the previous one is still running. This can cause race conditions. Use queue mode with concurrency limits or add deduplication logic to prevent overlapping executions from processing the same data.

How do I check how many times a workflow has been triggered today?

Open the Executions tab from the left sidebar in n8n. Filter by the specific workflow and the current date range. The list shows every execution with its start time, status, and duration.

Will static data survive an n8n restart?

Yes, static data is persisted in the n8n database. It survives restarts, updates, and workflow deactivation/reactivation. It is only lost if you manually clear it or delete the workflow.

Can RapidDev help me optimize my n8n workflow execution frequency?

Yes, RapidDev's engineering team can audit your n8n workflows and implement proper trigger management, deduplication, and concurrency controls to reduce unnecessary executions and prevent duplicate processing.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.