You're running a handful of scheduled n8n workflows and the Cloud bill looks small, or the VPS looks tiny, depending on who you ask. The honest answer is a break-even point: self-hosting n8n beats n8n Cloud on cash almost always, and loses once you count the hours you spend keeping it alive. The script below computes where that line sits for your numbers.
Everything priced here was read on 2026-10-09 from n8n's pricing page and Hostinger's VPS page. Prices change, so the script keeps them in two clearly marked lists at the top.
What does n8n Cloud cost, and what counts as an execution?
n8n bills on workflow executions: one full run of a workflow, regardless of steps or data size. The page says this directly, and contrasts it with tools that charge per step.
| Plan | Price on the page | Included executions | Hosted by |
|---|---|---|---|
| Starter | 20 EUR/mo, billed annually | 2.5K | n8n |
| Pro (10K tier) | 50 EUR/mo, billed annually | 10K | n8n |
| Business | 667 EUR/mo, billed annually | 40K | Self-hosted only |
| Enterprise | Contact sales | Custom | Either |
Three details that change the decision:
- Pro appears in more than one size. The FAQ mentions Assistant credits of "4,000 or 9,600 on Pro, depending on your plan size", but only the 10K tier carried a price when I read it. Larger volumes have no row in my script.
- Starter allows 5 concurrent executions and a 5 minute maximum execution duration. Pro's table shows 40 minutes. A slow LLM chain can hit the Starter limit before it hits the quota.
- Hitting a saved-execution limit does not stop workflows. It only trims history.
Prices are shown in euros. I converted with the ECB reference rate published on 2026-10-08 (1 EUR = 1.1186 USD, 108.2635 INR). Your card or invoice rate will differ.
How many executions will my workflows use?
n8n's own advice is to count schedule runs per month. Do the same:
- Hourly: 24 x 30 = 720
- Every 15 minutes: 96 x 30 = 2,880
- Every 5 minutes: 288 x 30 = 8,640
- Webhook workflows: the number of events per day times 30
- Chatbots: conversations times average messages, since each incoming message triggers one run
The trap is the polling workflow. One 5-minute check-the-inbox flow uses about 86% of a 10K tier by itself, even if nothing arrives. Prefer webhooks or a longer interval where you can. Our webhook-driven agents post covers the trigger side.
What does self-hosting actually cost?
The n8n Community Edition is, per the pricing page, "a standard, self-hosted version of n8n ... available on GitHub". The cash cost is the server. Hostinger's page lists these for the KVM line (promo price first, then the renewal price shown for a 2 year term):
| Plan | Promo | Renews at |
|---|---|---|
| KVM 1 | 6.49 USD/mo | 11.99 USD/mo |
| KVM 2 | 8.99 USD/mo | 14.99 USD/mo |
| KVM 4 | 12.99 USD/mo | 28.99 USD/mo |
The same page describes KVM 2 as two vCPU cores, 8 GB RAM and 100 GB NVMe, and names n8n as an example workload. I'd pick KVM 2 for a small production instance. Our Hostinger VPS n8n walkthrough shows the Docker setup, and the VPS hardening checklist is the minimum before exposing it.
Some links on this page are affiliate links; they cost you nothing and I only link tools I'd mention anyway. If you want the plan priced above, Hostinger KVM 2 is the one. Downsides: the promo price rises at renewal, you own backups and updates, and a VPS from another provider or a spare home machine works just as well for the maths.
The hidden cost is time. Updates, backups, certificate renewals and the occasional 2 a.m. "why did it stop" are real hours. The script lets you price them.
The calculator
This is the script, saved as n8n_calc.py. It uses only the standard library.
"""n8n Cloud vs self-hosted (Community Edition) on a VPS: monthly cost and break-even hours.
Prices were read on 2026-10-09 (see the post). Change them if the vendor pages changed.
Usage: python3 n8n_calc.py [--rate 25] [--setup-hours 4] [--executions 700 2000 8000 9500]
"""
import argparse
EUR_USD = 1.1186 # ECB reference rate, published 2026-10-08
EUR_INR = 108.2635
# n8n Cloud list prices, EUR per month, billed annually (n8n.io/pricing, 2026-10-09)
CLOUD = [("Starter", 20, 2_500), ("Pro", 50, 10_000)]
BUSINESS_SELF_HOSTED_EUR = 667 # per month annual billing, 40K executions, self-hosted licence
# Hostinger VPS, USD per month: (name, promo, renewal, RAM GB)
VPS = [("KVM 1", 6.49, 11.99, 4), ("KVM 2", 8.99, 14.99, 8), ("KVM 4", 12.99, 28.99, 16)]
def cloud_tier(execs):
"""Cheapest priced Cloud tier that includes `execs` executions per month, in USD."""
for name, eur, cap in CLOUD:
if execs <= cap:
return name, eur * EUR_USD
return None, None
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--rate", type=float, default=25.0, help="USD value of one hour of your time")
ap.add_argument("--setup-hours", type=float, default=4.0, help="one-off hours to set up, spread over 12 months")
ap.add_argument("--executions", type=int, nargs="+", default=[700, 2000, 2900, 8000, 9500])
a = ap.parse_args()
print(f"FX (ECB, 2026-10-08): 1 EUR = {EUR_USD} USD = {EUR_INR} INR")
print("\nCloud list prices (annual billing):")
for n, eur, cap in CLOUD:
print(f" {n:<9} {eur:>4} EUR = {eur * EUR_USD:6.2f} USD = {eur * EUR_INR:5.0f} INR {cap:>6,} executions")
b = BUSINESS_SELF_HOSTED_EUR
print(f" Business {b:>4} EUR = {b * EUR_USD:6.2f} USD = {b * EUR_INR:5.0f} INR 40,000 executions (self-hosted licence only)")
print("\nExecutions per 30-day month for a schedule:")
for label, per_day in [("every 60 min", 24), ("every 15 min", 96), ("every 5 min", 288)]:
print(f" {label:<13} {per_day * 30:>6,}")
print(f"\nBreak-even: admin hours per month at which self-hosting on KVM 2 costs the same as Cloud")
print(f"(your time valued at {a.rate:g} USD/h, {a.setup_hours:g} h setup spread over 12 months)")
print(f"{'executions':>10} {'cloud tier':<9} {'cloud USD':>9} | {'KVM 2 plan':<10} {'VPS USD':>7} {'break-even h/mo':>16}")
for e in a.executions:
tier, cloud_usd = cloud_tier(e)
for plan, vps_usd in (("promo", VPS[1][1]), ("renewal", VPS[1][2])):
setup = a.setup_hours * a.rate / 12
h = (cloud_usd - vps_usd - setup) / a.rate
shown = f"{h:16.2f}" if h > 0 else f"{'cloud cheaper':>16}"
print(f"{e:>10,} {tier:<9} {cloud_usd:>9.2f} | {plan:<10} {vps_usd:>7.2f} {shown}")
print("\nSame calculation at different values of your time (KVM 2 renewal price, setup hours as above):")
rates = (10, 25, 50, 100)
print(f"{'executions':>10} {'tier':<8} " + " ".join(f"{r:>7}$/h" for r in rates))
for e in a.executions:
tier, cloud_usd = cloud_tier(e)
row = []
for r in rates:
h = (cloud_usd - VPS[1][2] - a.setup_hours * r / 12) / r
row.append(f"{h:9.2f}" if h > 0 else f"{'cloud':>9}")
print(f"{e:>10,} {tier:<8} " + " ".join(row))
print("\nWhat the Business licence adds on top of a VPS if you self-host it (USD/month):")
for vname, promo, renew, ram in VPS:
print(f" {vname}: {b * EUR_USD + renew:7.2f} (licence + renewal VPS price)")
if __name__ == "__main__":
main()
I ran it on 2026-10-09 with python3 n8n_calc.py and the defaults (25 USD per hour, 4 setup hours). Real output:
FX (ECB, 2026-10-08): 1 EUR = 1.1186 USD = 108.2635 INR
Cloud list prices (annual billing):
Starter 20 EUR = 22.37 USD = 2165 INR 2,500 executions
Pro 50 EUR = 55.93 USD = 5413 INR 10,000 executions
Business 667 EUR = 746.11 USD = 72212 INR 40,000 executions (self-hosted licence only)
Executions per 30-day month for a schedule:
every 60 min 720
every 15 min 2,880
every 5 min 8,640
Break-even: admin hours per month at which self-hosting on KVM 2 costs the same as Cloud
(your time valued at 25 USD/h, 4 h setup spread over 12 months)
executions cloud tier cloud USD | KVM 2 plan VPS USD break-even h/mo
700 Starter 22.37 | promo 8.99 0.20
700 Starter 22.37 | renewal 14.99 cloud cheaper
2,000 Starter 22.37 | promo 8.99 0.20
2,000 Starter 22.37 | renewal 14.99 cloud cheaper
2,900 Pro 55.93 | promo 8.99 1.54
2,900 Pro 55.93 | renewal 14.99 1.30
8,000 Pro 55.93 | promo 8.99 1.54
8,000 Pro 55.93 | renewal 14.99 1.30
9,500 Pro 55.93 | promo 8.99 1.54
9,500 Pro 55.93 | renewal 14.99 1.30
Same calculation at different values of your time (KVM 2 renewal price, setup hours as above):
executions tier 10$/h 25$/h 50$/h 100$/h
700 Starter 0.40 cloud cloud cloud
2,000 Starter 0.40 cloud cloud cloud
2,900 Pro 3.76 1.30 0.49 0.08
8,000 Pro 3.76 1.30 0.49 0.08
9,500 Pro 3.76 1.30 0.49 0.08
What the Business licence adds on top of a VPS if you self-host it (USD/month):
KVM 1: 758.10 (licence + renewal VPS price)
KVM 2: 761.10 (licence + renewal VPS price)
KVM 4: 775.10 (licence + renewal VPS price)
How do I read the break-even column?
The column answers one question: how many hours a month of admin work can you spend before the VPS stops being cheaper? Read it like this.
- Under about 2,500 executions (Starter). At the promo price you have 0.2 hours, which is twelve minutes a month. At the renewal price Cloud is cheaper once you count four setup hours. Unless your time is free, stay on Starter.
- 2,500 to 10,000 executions (Pro). You have 1.3 to 1.5 hours a month at 25 USD per hour. That is enough for monthly updates and a backup check, but not for a bad month. At 10 USD per hour it is 3.8 hours, at 100 USD per hour it is 5 minutes.
- Needs SSO, Git version control or queue mode. Those are listed under Business, which is self-hosted only at 667 EUR (about 746 USD) a month plus the server. Cloud is not an option for them, so the comparison changes: the real question is whether you need those features at all.
Change the inputs and rerun:
python3 n8n_calc.py --rate 40 --setup-hours 8 --executions 1500 6000
I did not run that exact command, but it uses the same flags as the default run.
What the calculator leaves out
Be honest about what the model does not price:
- Your time is a guess. The tool turns it into dollars only because a break-even needs one number.
- Backups. A self-hosted instance needs them. The restic backup guide covers the setup and the restore test.
- Uptime. Cloud is run by n8n. On a VPS, you need monitoring; the Uptime Kuma and Vaultwarden stack is one way.
- Data location. The page says hosted data is stored in Frankfurt, Germany. Self-hosted data lives wherever you put the server. If a client contract names a region, that can decide the question before cost does.
- Prices move. Cloud prices here are the "billed annually" ones. I did not capture the monthly-billing prices from the page toggle, so a month-to-month comparison needs a rerun with those numbers.
- Licensing. I did not read the n8n licence text. Check it before hosting n8n for clients; our n8n vs Make vs Zapier comparison is about features, not licence terms.
A decision rule you can copy
- Count monthly executions from your schedules and webhooks.
- Under 2,500: Cloud Starter. Skip the VPS unless you want one for other reasons.
- 2,500 to 10,000: run the script with your own hourly rate. If break-even hours are more than you will spend, self-host on a KVM 2 class server.
- Over 10,000 or needing Business features: you are outside the rows I could price. Get the numbers from the pricing page and add them to the
CLOUDlist. - Whatever you pick, put the executions number in a calendar reminder every quarter. Workflows grow quietly.



