Self-Hosting vs SaaS in 2026: 37signals Saved $2M a Year. Should You?

Oct 20, 2026 · 13 min · Ajay Kumar

Every few months someone sends me DHH's latest cloud exit post with a one-line question: should we do this too? I build and run PandaStack, a Firecracker microVM cloud, on hardware I chose myself, so I have obvious sympathy for owning the box (that is my company, and it is the only time I will mention it). I also know what owning the box costs at 3 a.m. This post is the answer I usually give, written down: what 37signals actually published about its cloud exit, what the other repatriation data does and does not show, where self-hosted platforms like Coolify, Dokploy and Kamal fit, what the self-hosting vs SaaS decision costs in people rather than invoices, and a simple rule for when to rent and when to own.

What did 37signals actually save by leaving the cloud?

The numbers are unusually specific, which is why they get quoted so much. In October 2024 David Heinemeier Hansson wrote that 37signals' cloud bill had run at about $3.2 million a year, that seven applications left AWS in summer 2023, and that 2024 was the first clean year: the bill fell to $1.3 million, a saving of almost $2 million a year. The roughly $700,000 of Dell servers that replaced the compute had paid for themselves during 2023. The original estimate had been $7 million over five years; the revised one was "well over" $10 million, and he says the team running it all was still the same.

The remaining $1.3 million was S3: almost 10 petabytes stored twice across regions, on a four-year commitment ending in summer 2025. The plan was 18 petabytes of Pure Storage across two data centres, with initial hardware costing about one year of S3 and about $4 million saved over five years. When the migration started, DHH put the S3 bill at roughly $1.5 million a year and the post-migration yearly cost, hardware amortised, below $200,000, and AWS comped the quarter-million-dollar egress bill. The engineering write-up of how they moved billions of files without downtime is on dev.37signals.com, and it is worth reading for how much custom tooling "just copy it" required.

Two caveats. These are the company's own figures, not an audit. And 37signals is close to the ideal case: mature products, predictable load, a long-tenured ops team, and a founder who enjoys the argument.

37signals cloud exit, published figures (US$ millions) rented, per year owned Cloud run rate before exit 3.2 / yr AWS bill in 2024 (all S3) 1.3 / yr S3 bill quoted in 2025 1.5 / yr Storage after S3, amortised under 0.2 / yr Dell servers, one-time about 0.7 Pure Storage, one-time about 1.5 0123 Projected:over $10M saved across five years, same ops team; AWS waived a $250k egress bill for the S3 exit
Figures from DHH's October 2024 post and his 2025 statements reported by The Stack. The two S3 numbers (1.3 and 1.5) come from different dates and are not reconciled by the source.

Is cloud repatriation real, or just a few loud companies?

Both. The individual case studies are real and large. The survey data says many companies are moving something back, which is a much weaker claim than "the cloud is over".

Data point Number What it actually measures Source
37signals cloud exit $3.2M/yr bill to $1.3M; over $10M projected over 5 years One company's own accounting DHH, Oct 2024
Ahrefs Over $400M estimated saved in 3 years Cost of 850 colocated servers vs a modelled AWS equivalent; never actually ran there Ahrefs tech blog
Dropbox Nearly $75M over two years Moving most workloads off public cloud, as cited in 2021 a16z
a16z rule of thumb Repatriation costs one-third to one-half of cloud Expert consensus at scale, not a measurement a16z
Cloudian/Centiment, Feb 2026 75% moved some workloads back in 24 months; about 30% still expanding cloud 212 IT decision-makers; sponsor sells on-prem storage Cloudian
Flexera 2026 29% of IaaS/PaaS spend wasted; 73% run hybrid 750+ respondents; waste rose for the first time in five years Flexera

Read the Cloudian line carefully. "Moved at least some workloads back" includes one batch job. The same survey found 76 percent still have more than half their workloads in public cloud. The pattern I see in the data is broad but shallow movement: storage-heavy and steady workloads come home, elastic and managed-service-heavy ones stay.

The Ahrefs number is also often misquoted. It is a counterfactual: Ahrefs priced its own servers against the closest EC2 configuration in Singapore and concluded the cloud would have cost more than its revenue. That is a strong argument for its workload (dense, constant, compute-bound crawling), and close to irrelevant for a 20-person SaaS on a managed Postgres.

Why is leaving the cloud easier in 2026 than in 2023?

Egress used to be the trap. Two things changed. AWS announced free data transfer out for customers leaving in March 2024, and the page was updated on 8 October 2026: eligible customers moving all data off AWS, or all data off one service across their eligible accounts, get free transfer, with 180 days to finish outside the EU. That last clause matters: you no longer need to close the whole account to exit S3.

In the EU the Data Act forces the issue. Its cloud switching rules have applied since 12 September 2025, providers may only charge their direct costs for a switch until 12 January 2027, and after that switching charges are prohibited, including the data transfer the switch needs. Ongoing egress for normal traffic is still billable, and early-termination fees on committed contracts are not covered, so read your commitments before you plan a date.

Meanwhile owning got more expensive. Hetzner raised prices for new and existing products from 1 April 2026, citing sharply higher RAM and NVMe costs. Anyone whose business case for colocation assumed 2023 memory prices should redo the spreadsheet.

Coolify vs Dokploy vs Kamal: what do self-hosted platforms give you?

The other reason self-hosting looks easier is a new layer of tools that try to give you the Heroku experience on your own servers. They are good, and they are also software you now operate.

Tool What it is Latest release Licence GitHub security advisories in 2026
Coolify Web UI PaaS, 360+ one-click services v4.4.6 (9 Oct 2026) Apache-2.0 61 (16 critical)
Dokploy Web UI PaaS on Docker and Swarm v0.30.8 (29 Sep 2026) Apache-2.0 outside a proprietary directory 56 (33 critical)
Kamal CLI that deploys containers over SSH, with kamal-proxy v2.12.0 (18 Jun 2026) MIT 0 published

Release dates and counts are from the GitHub API on 20 October 2026. The advisory counts are not a quality ranking. A web dashboard that holds SSH keys to every server, registry credentials and database passwords has a big attack surface by design, and projects that publish advisories are doing the right thing. But the July batches for both PaaS tools were mostly command injection and cross-tenant disclosure, and if you expose the dashboard to the internet you have to patch it as fast as you would patch your VPN.

Kamal, which 37signals built and uses for its own exit, takes the opposite approach: no control plane, just a config file and SSH. Here is roughly the whole thing for a single-server app with automatic TLS:

# config/deploy.yml for Kamal 2.12.0 (gem install kamal -v 2.12.0)
service: invoices
image: acme/invoices
servers:
  web:
    - 203.0.113.10          # one host: Let's Encrypt via kamal-proxy needs a single server
proxy:
  ssl: true
  host: invoices.example.com   # must resolve to the host above, port 443 open
  app_port: 3000
  healthcheck:
    path: /up
registry:
  username: acme
  password:
    - KAMAL_REGISTRY_PASSWORD  # read from .kamal/secrets, never committed
builder:
  arch: amd64
env:
  secret:
    - DATABASE_URL

The trade is that Kamal deploys your app and nothing else. Backups, monitoring, OS patching and the database are yours. Coolify and Dokploy try to cover more of that, which is why they need a privileged dashboard. Kamal's proxy docs are explicit that automatic certificates need a single-server deployment; for anything bigger you bring your own.

What is the hidden cost of self-hosting?

The cost that never shows up on an invoice is attention. A SaaS subscription buys you a team that patches, backs up, upgrades and gets paged. Self-host the same thing and those tasks do not vanish; they move into somebody's week, usually the person who least wants them.

n8n is a good example because it is the most popular thing people self-host to avoid a per-task bill. Its repository has published 211 GitHub security advisories in 2026 so far, 19 of them critical, including CVE-2026-21858, an unauthenticated file read through form workflows, after which Shadowserver still counted 59,558 exposed instances weeks after the fix. n8n Cloud does those upgrades for you; its Starter plan is EUR 20 a month for 2,500 executions on annual billing, per the pricing page. I covered that record in detail in the workflow automation post, and if you do decide to run it yourself, my n8n queue-mode guide walks through the production setup and upgrade routine.

The way I put a number on it is a break-even in hours. Take what the SaaS costs per month, subtract what the infrastructure costs you, and divide by a loaded hourly rate for whoever does the ops. That is how many hours a month the self-hosted version can consume before it is more expensive.

#!/usr/bin/env python3
# breakeven.py: how many hours of ops work per month before self-hosting costs
# more than renting. Python 3.9+, no dependencies.
# usage: python3 breakeven.py SAAS_PER_MONTH INFRA_PER_MONTH LOADED_HOURLY_RATE
import sys

saas, infra, rate = (float(x) for x in sys.argv[1:4])
margin = saas - infra                      # what you save before counting people
hours = margin / rate if margin > 0 else 0.0
print(f"SaaS {saas:,.0f}/mo vs infra {infra:,.0f}/mo at {rate:,.0f}/h")
print(f"break-even: {hours:.1f} ops hours per month "
      f"({hours * 12:.0f} per year)")
if hours < 4:
    print("verdict: one bad upgrade eats the saving; rent it")

# $ python3 breakeven.py 50 25 100
# break-even: 0.2 ops hours per month (3 per year)
# verdict: one bad upgrade eats the saving; rent it
#
# $ python3 breakeven.py 125000 16667 120    # DHH's S3 vs owned storage figures
# break-even: 902.8 ops hours per month (10833 per year)

The first run is a small team comparing a EUR 50 SaaS tier with a EUR 25 VM (illustrative inputs, not anyone's real bill): self-hosting pays for twelve minutes of work a month. The second uses DHH's storage numbers, $1.5 million a year against under $200,000, with a made-up $120 hourly rate: the owned version can absorb about 900 hours of work a month, five or six full-time people, before it loses. Same arithmetic, opposite answers. Scale decides, not ideology.

What the formula leaves out is risk. A SaaS outage is a status page you refresh; a self-hosted outage is your incident, with your postmortem. If you are not already running on-call, adding self-hosted services is how you start, whether you meant to or not. The 2025 and 2026 cloud outages are a reminder that renting does not remove that risk either, it just changes who fixes it.

When should you rent, and when should you own?

My rough rules, after fourteen years of doing both:

  • Rent when load is spiky or unknown, when the team is small and has no on-call rotation, when the product depends on managed services you would have to rebuild (queues, managed Postgres with point-in-time recovery, identity), and when the SaaS bill is smaller than one engineer-week a month.
  • Own when load is steady and predictable, when data volume makes storage and egress the dominant cost, when you already run on-call and have someone who likes hardware, when sovereignty or the AI-data rules your customers impose make a provider a liability, and when the break-even hours are in the hundreds, not the single digits.
  • Do both in most real companies: own the boring, heavy, steady parts (object storage, CI runners, batch compute) and rent the elastic edges and the services that would take a team to replicate. Flexera's 73 percent hybrid figure says most organisations already landed here.

The AI wave cuts both ways. GPU and inference workloads are steady and expensive, which favours owning, and the Cloudian survey found 85 percent of respondents say AI requirements are pushing them toward on-premises. But AI agents also write more of your configuration, and the discipline that makes self-hosting safe (pinned versions, tested backups, reviewed changes, patch windows) does not come free with the model. If you want the cost side of that in more detail, the FinOps for AI post covers how teams are measuring it.

FAQ

Is cloud repatriation cheaper?

At steady, large scale it often is: 37signals reports saving almost $2 million a year and a16z's experts put owned infrastructure at one-third to one-half of cloud cost. At small scale it usually is not, because a few hours of engineering time a month costs more than the infrastructure saving. Run the break-even in hours before you decide.

How much did 37signals save leaving AWS?

Its cloud bill fell from about $3.2 million a year to $1.3 million in 2024, with roughly $700,000 of Dell servers paid back in 2023. Including the 2025 move off S3 to Pure Storage, DHH projects more than $10 million in savings over five years. These are the company's own figures.

Is Coolify or Dokploy safe to expose to the internet?

Both projects published dozens of security advisories in 2026, many critical, so treat the dashboard like an admin panel: keep it behind a VPN or an authenticating proxy, patch quickly and subscribe to the repository's advisories. Kamal avoids the issue by having no dashboard, at the cost of doing less for you.

Should I self-host n8n or use n8n Cloud?

If you run a few thousand executions a month, n8n Cloud's EUR 20 Starter plan is almost certainly cheaper than the time you would spend upgrading a self-hosted instance through 2026's advisory volume. Self-host when you need data residency, custom nodes, high volume, or already operate Postgres and Redis.

This quarter I would do three things. Pull the last twelve months of cloud bills and split them into steady and spiky lines, because only the steady ones are repatriation candidates. Check whether your provider's free egress rules or the EU Data Act deadline make a storage exit cheaper than it was when you last looked. And for every self-hosted tool you already run, write down who patches it and how fast; if the answer is nobody, that is the first cost to fix, whichever side of the rent-or-own line you are on.

Related: Workflow Automation in 2026: n8n Published 196 Advisories in Nine Months, 59,558 Hosts Sat Exposed, and the Code Alternative Raised at $12.55B, Seats Are Dying. What the 2026 SaaS Repricing Looks Like From the Compute Layer and GPU Clouds in 2026: H100s at $2.59 an Hour, $104B of CoreWeave Backlog on $35B of Debt, and a Six-Year Bet on Silicon.

I'm Ajay Kumar — I build and operate PandaStack, an open-source Firecracker microVM cloud for AI agents, and write about the infrastructure and tooling around it.

Need this kind of infrastructure work? See what I do or email hello@ajayk.sh.


Related