What self-hosting actually costs, and when it is worth it
37signals, the company behind Basecamp and HEY, published its numbers after leaving AWS. The annual cloud bill went from $3.2 million to $1.3 million. The hardware that replaced it cost $700,000 and paid for itself inside the first year. Over five years they expect the saving to pass $10 million, and the remaining $1.3 million is a storage contract they intend to move as soon as it expires.
Figma disclosed the opposite case in its 2025 IPO filing. It spends roughly $300,000 a day on AWS, about $100 million a year, and has just committed to a minimum of $545 million over the next five. Nobody at Figma is confused about this. Their product is a real-time collaborative editor with unpredictable global load, and the cloud is the right tool for it.
Both companies are making a rational decision. The interesting question is which one you are.
View as table
| Item | On AWS | After the exit |
|---|---|---|
| Annual bill | $3.2M | $1.3M |
The bill is not the price on the pricing page
Managed platforms quote a monthly figure that assumes a steady, modest workload. The costs that hurt are the ones that scale with usage and only show up once you have it.
Per-page crawling fees. Per-seat analytics. Function invocations. Bandwidth past the included allowance. Log retention and observability add-ons that bill every event with no free tier. We have watched a single observability product become 41% of a Vercel bill across two of our own projects before we noticed it was on. It was switched off in an afternoon and nothing broke.
None of this is hidden, exactly. The meter just runs where nobody looks until the invoice arrives, and the invoice lands after the traffic that caused it.
Where we moved workloads off the meter
PlexWyn, one of our own products, maps the AI industry and needs to crawl a lot of pages to do it. The hosted crawling service it started on was fine at launch volume. As the crawl grew, the per-page fee grew with it until the projection stopped making sense for a freemium product.
We moved the job onto self-hosted Crawl4AI in Docker on an Oracle Cloud instance we already ran. Same crawler, same output, fixed monthly cost, no meter. The migration took a few days, because the workload was already containerised and had no dependency on anything specific to the hosted platform.
We did the same with Supabase for three of the products on our projects page. The managed service is excellent and we still use it where it fits. But Postgres, auth and storage on a box we control costs the same whether the database has ten thousand rows or ten million, and for a product that is growing that predictability is worth more than the convenience.
What you take on when you take it in-house
The saving is real. So is the work, and the work is the part every cloud-exit blog post underweights.
Backups are yours now, and the bar is “we restored from one this quarter and it worked”. Having them doesn’t count. We learned that lesson when a database dump tool wrote empty files for months because of a username mismatch, and nothing complained until somebody checked.
Disk fills up. Logs rotate only if you configured rotation. Scheduled jobs stop running when a permission bit changes and nobody notices for weeks, because a cron job that silently does nothing looks identical to one that succeeded.
Security patches, certificate renewals, kernel updates, the occasional reboot. Monitoring so that you find out the site is down from a dashboard rather than from a customer.
None of it is hard. All of it is time, and it is time that has to be scheduled rather than assumed, because the whole point of the managed platform was that somebody else was doing this.
The break-even is usually a headcount question
Here is the calculation that decides it.
Take your managed platform bill, projected twelve months out at your expected growth. Subtract the cost of equivalent capacity on a VPS or dedicated hardware. The difference is what you save per year.
Now estimate the hours per month someone competent spends on the operational work above, price them honestly, and subtract that too. If the number is still comfortably positive, self-hosting wins. If it is close to zero, the managed platform is buying you focus, and focus is worth paying for. If your team has nobody who would enjoy the operational side, treat the hours as expensive, because reluctant sysadmin work gets skipped, and skipped backup checks are how you lose a database.
For a small stable product with steady traffic, the maths usually favours owning the box. For anything with spiky, unpredictable or genuinely global load, it favours the cloud, and it is not close.
The middle path most businesses should take
The choice is rarely all or nothing. Our own stack is deliberately mixed.
Static marketing sites, this one included, live on Vercel, because a static Astro build costs almost nothing to host and the deploy pipeline is worth more than the saving. We wrote about that choice in why Astro is a great framework for simple content sites.
Databases and long-running workers that have predictable load sit on our own Oracle Cloud instances, monitored by an inspection agent we built to check disk, containers and uptime across every box.
Anything bursty or customer-facing where downtime costs money stays managed until the bill makes the argument on its own.
Build so the pieces can move. Containerise workloads, keep configuration out of code, avoid platform-specific features when a portable equivalent exists. The teams that got stuck on an expensive platform are mostly the ones who let the platform’s conveniences leak into the architecture, so that leaving meant rewriting.
Start with the invoice
Pull the last three months of every hosting and infrastructure bill and sort the line items by size. The top three are the decision. For each one, ask whether the cost scales with your success, whether the workload is portable, and whether anyone on the team wants to own it.
That exercise takes an afternoon and usually surfaces one line that should move and two that should stay exactly where they are.
Infrastructure is development work we do alongside the builds, and we will tell you when the managed service is the right answer. Get in touch if you want a straight read on your own bill.
References
- 37signals claims it saved almost $2m last year from cloud repatriation, Data Center Dynamics
- This software company says ditching the cloud was worth $10 million in savings, IT Pro
- Figma spends $300,000 on AWS daily, Data Center Dynamics, from Figma’s S-1 filing
- Figma’s $300k daily AWS bill, InfoQ, July 2025
