On scaling n8n past 50 active workflows.
Most n8n tutorials stop at "here's how to build one workflow." At 50+ active flows in production, the math changes. Triggers fight each other for the same webhook URLs. Error handling becomes a full-time job. And the difference between a self-hosted instance that survives Black Friday and one that burns to the ground is roughly six configuration decisions made in the first week.
I learned this the hard way. The first time I crossed 50 flows my instance went down during the most important campaign of the year. The second time it happened I'd added monitoring but still missed the underlying issue. The third time I finally understood the actual failure modes — and they're not what the docs warn you about.
The six decisions that matter.
Decision one is the queue mode. The default "main" execution mode silently throttles you somewhere between 30 and 60 concurrent workflows depending on memory pressure, and the symptoms look exactly like a broken trigger. Switching to queue mode with a dedicated Redis instance turns that ceiling from "fragile and invisible" into "boring and measurable."
Decision two is whether your webhooks live behind the n8n process or in front of it. I put a tiny Cloudflare Worker in front of every public webhook URL after a bot flooded one of my flows for forty minutes and took down two unrelated automations. The Worker does nothing clever — it just validates a shared secret, drops anything that isn't a JSON body, and forwards the rest. It's saved me three times since.
Decision three is how you handle the workflows you can't afford to lose. Anything that issues refunds, sends paid email, or writes to a customer record goes through a "safe" sub-workflow with a manual approval node and a dead-letter queue. Everything else can fail loud. The mistake at 50 flows is treating them all equally — they're not.
What I'd do differently.
I'd version every workflow from day one. I didn't, and when I needed to roll one back six months in I had to reconstruct it from screenshots and memory. n8n has native versioning now; use it. If you're on an older version, dump the JSON to git on every save with a Cron flow. Twenty minutes of setup, hours of regret avoided.
And I'd write down what each workflow is supposed to do, in one sentence, in the workflow itself. The "Notes" node exists for a reason. Future-you, debugging a flow at 2am during a campaign, will not remember why past-you wrote that filter expression. I promise.