← Blog

Tooling

Coolify, Hetzner, or Vercel: scoring an internal stack

Friday 19:00. The kantoor-glasvezel drops. Eleven devs go offline. The hosting choice you made six months ago is now standing in your inbox asking who owns the runbook.

Jacob Molkenboer· Founder · A Brand New Company· 17 Jun 2026· 8 min
Brass three-way valve with green ribbon, cream index card with forest ink stamp, brass weight on ivory paper.

It is Friday, 19:00. The glasvezel link into the kantoor goes dead. The ops lead's phone lights up like a Christmas tree. Three Linear boards, the internal time tracker, the staging environment for Monday's client demo, all unreachable. Eleven engineers, scattered between Amsterdam, Den Bosch, and one of them on a Sprinter train near Eindhoven, are looking at the same red dot. Six months earlier somebody had to pick between three hosting options for the internal stack: a Coolify homelab in the office, a Hetzner box in Falkenstein, or a Vercel plus Supabase cloud setup. Now you find out which one you picked.

This is the moment that retrospectively grades the hosting decision a Dutch agency made about its internal tooling. By 19:04 you find out whether you made the right call, and more importantly, whether anyone on the team can do anything about it before Monday.

We work with agencies in this exact band: sub-€15M revenue, between 8 and 25 engineers, and a stack of internal tools that is just heavy enough to matter and just light enough to feel optional. The scoring method below is how we decide between the three options when one of them asks us. It is deliberately boring.

The three candidates

In 2026 there are three serious options for an internal stack at this scale.

  • A homelab in the office. Two or three mini-PCs (Beelink SER, Minisforum, or a refurbished Dell OptiPlex) running Coolify or Dokploy on top of Docker, sitting on a rack with a UPS and a business glasvezel line.
  • A single dedicated box at Hetzner. Typically an AX52 or AX102 in Falkenstein or Helsinki, around €60 to €140 per month, running Coolify or plain Docker Compose.
  • A managed cloud stack. Vercel for frontends, Supabase for Postgres plus auth plus storage, and Cloudflare Workers for cron and queue glue.

All three can host the same shape of internal stack: a Next.js dashboard, a Postgres database, a few cron jobs, an always-on queue worker, an email parser. The differences only become visible under stress.

Cost per engineer across eleven devs

The first axis. We add up the total monthly cost (hardware amortized over three years, licences, bandwidth, backups, electricity, ISP, anything that bills) and divide by the number of engineers who depend on the stack. For an 11-dev shop running a representative internal load (one frontend, one admin app, 50 GB of Postgres, 10 GB of object storage, a worker, two crons), our honest numbers for 2026 look like this:

Option       Capex (3yr)  Monthly      €/dev/month
Homelab      €2,800       €60          €13
Hetzner      €0           €200         €18
Cloud        €0           €450         €41

(Homelab monthly: ~€40 electricity + €20 offsite backup at Backblaze B2.
 Hetzner monthly: AX102 + IPv4 + 100GB Storage Box + bandwidth.
 Cloud monthly: Vercel Pro for 5 seats + Supabase Pro + add-on DB + Workers.)

The homelab wins on cash flow, but only after you amortize €2,800 of hardware over three years, and only if you ignore your own time. The Hetzner box is the obvious middle. The cloud stack is the most expensive on paper and takes effectively zero capex.

Per engineer, you land somewhere between €10 and €40 per month. None of these are expensive at sub-€15M revenue. The question is not which is cheapest. It is which flavour of pain you have bought.

Recovery time when the office glasvezel drops at 19:00

The second axis. We measure: from the moment the office line drops, how long until a dev at home can use the tool again?

  • Homelab: indefinite by default. The services keep running on the office network, but nobody outside the building can reach them. With a 4G/5G failover on the office router and a Tailscale or WireGuard mesh into the rack, recovery is roughly 30 seconds. Without those two pieces, recovery is "Monday morning when somebody drives to the office."
  • Hetzner box: zero. The box is in Germany. Engineers' home internet brings them back the moment they refresh.
  • Cloud: zero. It is somebody else's PoP, somebody else's pager.

This is the axis where the homelab looks scary on paper and is fine in practice, if and only if you have spent €120 on a Teltonika RUTX11 (or any decent 4G failover router) and an afternoon on a Tailscale subnet router. We have watched two agencies skip those steps, and on the third blackout the CTO quietly migrated everything to Hetzner over a long weekend.

Warning

A homelab without 4G failover and a VPN is one building outage away from looking like a hosting outage to everyone on Slack. Budget the router and the afternoon, or do not homelab.

Runbook ownership when the UPS battery dies on a Friday

This is the question every agency underweights. It is not "what do we do when something breaks?" It is "who, by name, has the procedure, and are they reachable on a Friday at 19:00?"

  • Homelab: someone on your team. Likely the person who set it up. If that person is in Phuket for two weeks, the runbook needs to live in the wiki, with photos of the rack, the part number of the UPS battery, and the closest Conrad branch where a junior can drive on Saturday morning.
  • Hetzner: shared. Hetzner handles power, cooling, network, and physical disk replacements. You handle the OS, Docker, Coolify, and your applications. Their support is fast on hardware tickets and slow on anything else. The runbook is short, but it must exist.
  • Cloud: them. You have a status page subscription and a credit card. The runbook reads "wait." That sounds passive until you sit through a real outage and realise it is the right answer.

The honest version of this axis: the homelab is the option where you, the agency owner or technical partner, will get the phone call. Hetzner is the option where you get the call only if you skipped a backup. The cloud stack is the option where you do not get the call, but you do get a bigger invoice every month.

The scoring sheet

We score each option from 1 to 5 on each axis, then weight the axes by what the agency actually cares about. The defaults we use for a sub-€15M Dutch agency look like this:

Axis                Weight   Why
Cost per engineer   1        At this scale, hosting bills do not move the P&L.
Recovery time       2        One bad Friday hurts client trust hard.
Runbook ownership   3        Bus factor is the real risk. Always.

Scoring (1 = bad, 5 = good):

            Cost   Recovery   Runbook   Weighted
Homelab      5        2          2      5*1 + 2*2 + 2*3 = 15
Hetzner      4        5          4      4*1 + 5*2 + 4*3 = 26
Cloud        2        5          5      2*1 + 5*2 + 5*3 = 27

For the typical agency in our network the math lands here: Hetzner and cloud within a point of each other, homelab a long way behind. Cloud only pulls clearly ahead when the team is fully remote and has no office to homelab in. Homelab only wins when there is a partner who genuinely enjoys the hardware and is willing to be on call for it. Hetzner is the answer for the boring middle 70%.

The second-order costs nobody counts

The table above is the easy part. The numbers everyone forgets to put on the spreadsheet:

  • DevEx friction. Coolify on a Hetzner box gives you a near-Vercel deploy loop. A homelab with the same Coolify gives you a Vercel-equivalent loop until somebody trips over the rack cable. Plain Docker Compose on Hetzner gives you 30 extra seconds per deploy and 10 hours of yak-shaving per year.
  • Sovereignty. Vercel and Supabase both have EU regions and a DPA. Cloudflare Workers run at the edge. For most agency tooling this is fine. For Dutch healthcare, government, or client files under strict DPA, dedicated EU metal is the simpler conversation.
  • The next-engineer test. When you hire engineer twelve in October, how long until they can deploy a one-line change to the internal dashboard? On cloud, ten minutes. On Hetzner with Coolify, twenty. On homelab, an hour and a coffee with the partner who knows where the keys live.

When each option actually wins

Cloud wins when

You are remote-first, your data is not sovereignty-sensitive, and your partners' time is the most expensive line on the balance sheet. The Vercel + Supabase + Cloudflare combination buys the right to never think about a runbook. For an 11-dev studio billing €1.5M a year, €450 per month is a rounding error against one weekend of partner sanity.

Hetzner wins when

You want to own the OS, you want a predictable euro-denominated bill from a European company, and you can afford one hour per month of routine maintenance from a senior engineer. It is the boring answer and almost always the right one for an agency in this band. Backups go to a Hetzner Storage Box (different DC) and a cold copy to Backblaze B2. End-to-end recovery from backup should fit under 60 minutes. If it does not, your runbook is not done.

Homelab wins when

You have an office that is already paid for, a partner who reads r/homelab for fun, and a client base that genuinely cares about data being in the same room as the team. We have seen exactly one Dutch agency where all three were true. They are happy. Their rack has labels.

The five-minute audit

Before you change anything, score your current setup on the same three axes. Open a sheet, write three columns: cost per engineer, recovery time, runbook owner. Fill in honest numbers. If the runbook column contains a single name, your bus factor is one, and you are closer to a Friday-night incident than you think.

If the runbook column is empty, that is the first thing to fix regardless of which hosting option you are on. A one-page document with three sections (how to restore from backup, who to call at the hosting provider, where the backups actually live) is worth more than any migration.

When we built the internal-tooling stack for a Rotterdam agency last year, the thing we ran into was exactly this. They had a clean Hetzner box and a tidy Coolify install, but the recovery procedure lived in one person's head. We wrote a one-page runbook, recorded a five-minute Loom of the restore-from-backup flow, and put both in their shared vault. Two months later the disk filled, the box choked, and a junior engineer restored everything in 18 minutes. That is the kind of internal-tooling work that quietly saves a weekend.

Tomorrow morning, open the wiki and search for "runbook." If nothing comes back, that is your week.

Key takeaway

At sub-€15M scale, the hosting bill never breaks the budget. The runbook does. Weight ownership three times heavier than cost when you score.

FAQ

Can we run Coolify on Hetzner instead of bare Docker Compose?

Yes, and most agencies should. Coolify on Hetzner gives you a near-Vercel deploy UX with the predictability of European dedicated metal. Pin the Coolify version and read the changelog before upgrades.

What about Hetzner Cloud (the VPS) instead of the dedicated box?

Cloud VPS is fine for staging or low-traffic frontends. For the always-on internal stack at 11 devs, the dedicated AX-line box is cheaper per resource, faster on disk, and easier to back up.

How often do we actually use the runbook?

Once or twice a year. The runbook is not for daily use. It is for the one Friday someone is on holiday, the disk fills, and a junior dev has to fix it before Monday morning.

Is Vercel plus Supabase compliant for Dutch client data?

Both offer EU regions and a DPA, which covers most agency work. Sovereignty becomes a real constraint only when clients require Dutch-only hosting, typically in healthcare or government. Then dedicated EU metal is the simpler answer.

toolingarchitectureoperationsstrategybusiness

Building something?

Start a project