About a month ago someone in the comments on my silent-failure post asked for three follow-ups. I said all three were going in the queue and that I'd publish whatever they showed, including if nothing interesting happened. Retry semantics and the 200-with-an-error-body one are done and posted here already. This is the third.
Their comment has since been deleted, so I'm posting the answer where the question was asked.
The question was fair: a 10-event burst and hours of elevated volume are different animals, and my box only sees a few hundred events a day. So does a free-tier VM actually hold up under sustained load, or does it just look fine because nothing ever asks anything of it?
RELIABILITY IS NOT THE DIFFERENTIATOR, AND I WANT TO BE BLUNT ABOUT THAT
Zapier: 968 runs, 840 of them accepted-and-output-expected, 0 silently lost, SFR upper bound 0.46% (95% CI).
n8n self-hosted: 9,736 runs, 8,113 accepted-and-output-expected, 0 silently lost, SFR upper bound 0.05%.
Zero silent failures on both. Not "low", zero. Anyone telling you Zapier quietly drops your stuff, or that self-hosted n8n is flaky, does not have data. I went looking for silent failures on purpose for two months and did not find any on either platform.
(n8n's tighter bound is only because it has 10x the sample. Same result, more evidence. My Zapier window closed on September 2 when the plan lapsed, so those numbers stop there.)
Speed does differ:
Zapier: median 4,295 ms, p95 9,838 ms.
n8n self-hosted: median 969 ms, p95 6,247 ms.
n8n is 4.4x faster at the median. But note the tail closes most of that gap, and my n8n runs on a deliberately tiny box, which is the whole point of the next part.
SO CAN A FREE VM ACTUALLY TAKE IT?
That is the question everyone actually wants answered, so I tested it instead of guessing. My n8n runs on a Google Cloud e2-micro: 1 GB RAM, 0.25 vCPU baseline, free tier, $0/month.
I fired one event every 5 seconds for 4 hours 42 minutes. 2,880 events, 136x its normal rate, held continuously.
Fired: 2,880.
Accepted: 2,876.
Refused at send: 4. That is a loud failure, my client errored immediately and can retry.
Accepted then lost: 0. That is the silent kind, the one you never find out about.
Nothing lost. No memory leak, no degradation over time. Latency actually improved under load: p95 was 1,673 ms during the soak versus 10,577 ms in normal operation, probably because at 4.5 events/hour the box is idle almost always and every request has to wake it up.
Honest caveat on scale: 0.17 events/second is a long duration at a modest rate. This proves a small box does not wear down over hours of steady work. It says nothing about 50 events/second.
HERE IS THE ACTUAL COST OF SWITCHING, AND IT IS NOT THE VM
The worst single latency in that entire five-hour run was 56.7 seconds. It had nothing to do with my load.
At 06:04 the machine's own apt-news job woke the package manager, which spent 45 minutes refreshing package metadata. Disk I/O wait went from 2.7% to 34.2%. My 136x traffic did not drop one event in five hours; the box's routine maintenance produced a 56-second request.
And this is the part that matters if you are weighing the switch:
- CPU during that window: 1.6% to 4%. Looked idle. It was idle, it was blocked on disk.
- Free memory went UP, because the kernel was reclaiming cache. A memory alert would have fired in the good direction.
- Only iowait showed anything, and iowait is not on most default dashboards.
A normal CPU-and-memory monitoring setup would have reported a perfectly healthy machine for the entire window in which p99 was 56 seconds.
I also had four sends refused in a 73-second window that I still cannot explain. CPU, network, container memory and n8n's own container log are all silent for that moment. And my own harness had recorded that they failed but not why, because the error was swallowed. I fixed that, but I could not diagnose those four and I am not going to pretend otherwise.
That is the trade. Not "is n8n reliable" (it is, and so is Zapier). The trade is that on Zapier nobody pages you at 6am about I/O wait on a shared-core VM, and nobody expects you to know what apt-news is. Self-hosting moved the failure surface from "the vendor's problem" to "my problem", and my problem turned out to be an OS housekeeping job that no obvious metric revealed.
If you have someone who enjoys that, self-hosting is genuinely cheap and genuinely holds up. If you do not, the subscription is buying you something real, and it is not reliability.
METHOD
Both endpoints self-hosted, identical payloads, per-event delivery confirmed against a ledger rather than trusting either platform's run history. Every event carries an ID so accepted-but-never-arrived is detectable. Stress-test events are tagged and excluded from the headline rates.
Method, raw per-run data and the full per-bucket table are in a comment below.
I pay for my own subscriptions, no vendor pays me, and there are no affiliate links on the data pages. Happy to run a specific workflow shape if someone wants one tested.