What problem are you trying to solve?
I’m trying to operate a multi-tenant, self-hosted n8n instance where workflow builders own their own schedules. Today, any user can create a Schedule Trigger or Cron node that fires every second (or every few seconds) — there’s no built-in guardrail an admin can set to enforce a sensible minimum interval.
This impacts self-hosted and enterprise operators because a single misconfigured schedule (e.g., “every 1 second” instead of “every 1 minute”) can:
- Saturate the executions queue and starve other workflows
- Hammer downstream APIs and trigger rate-limits / bans for the whole org
- Inflate execution storage and database growth
- Run up cloud/compute costs unexpectedly
Right now operators have no declarative way to say “no schedule on this instance may fire more often than every N seconds.”
Proposed solution
Add a new environment variable, N8N_MIN_SCHEDULE_INTERVAL_SECONDS, that enforces a minimum interval (in seconds) for every schedule-driven trigger on the instance.
Ideally it would work like this:
-
New env var
N8N_MIN_SCHEDULE_INTERVAL_SECONDS, default300(5 minutes). Set to0to disable. -
Enforcement happens at the cron-registration choke-point (
ScheduledTaskManager.registerCron) so it covers all schedule-driven triggers uniformly — Schedule Trigger, Cron node, every rule shape (seconds / minutes / weeks-with-multiple-days / raw cron expression). -
The minimum is computed by taking two consecutive next-fire times from the canonical cron expression, so any rule shape collapses to the same check.
-
If a workflow’s schedule would fire more frequently than the configured minimum, activation fails with a clear
UserError:Schedule interval too short: minimum allowed is 300s, requested ~5s
-
The check runs both at workflow activation and when workflows are loaded from the DB at startup, so legacy workflows are validated too.
Example use case
- A platform team runs a shared self-hosted n8n for ~50 internal builders.
- They set
N8N_MIN_SCHEDULE_INTERVAL_SECONDS=60in their deployment. - A builder accidentally configures a Schedule Trigger for “every 1 second” while testing.
- On save / activation, n8n rejects the trigger with a clear error explaining the instance-wide minimum, preventing accidental abuse before it hits production.
- The platform team can raise/lower the limit globally without touching individual workflows.
Current workaround
Today we have to:
- Manually audit Schedule Triggers and Cron nodes across all workflows.
- Add custom middleware / wrappers around the executor to short-circuit too-frequent triggers (brittle and version-dependent).
- Educate users repeatedly and rely on social enforcement.
None of these scale, and none of them catch a misconfiguration before it starts firing in production.
Why this should be added
This would help every self-hosted operator who shares an instance across multiple users or teams — exactly the audience growing fastest as n8n moves into enterprise deployments. It:
- Is off-by-default-safe (defaults to a sensible 5 minutes, set
0to disable entirely). - Adds no friction for community/single-user setups — they keep the same defaults or set
0. - Centralizes the check in one place so it works for every existing and future schedule-driven trigger.
- Surfaces a clear, actionable error instead of silent overload.
Additional context
- n8n environment: Self-hosted (queue mode), with some single-instance setups too.
- Relevant nodes: Schedule Trigger, Cron (and any future schedule-driven trigger that registers via
ScheduledTaskManager.registerCron). - Related config surface: would live under
WorkflowsConfig(packages/@n8n/config/src/configs/workflows.config.ts) asminScheduleIntervalSeconds. - I have a draft implementation up as a PR for reference: feat(core): Enforce instance-wide minimum schedule interval (N8N_MIN_SCHEDULE_INTERVAL_SECONDS) by erol-guney · Pull Request #30686 · n8n-io/n8n · GitHub