September 20, 2026
Heroku vs Azure App Service vs a VPS for ASP.NET Core: cost and lock-in in 2026
Heroku and Azure App Service both promise to make deploying an app someone else’s problem. For ASP.NET Core specifically, the honest comparison also has to include what each one actually supports and what it costs once the database is in the picture — not just the “starting at” number on the pricing page.
Heroku’s .NET support
Heroku ships an official .NET buildpack that auto-detects a
solution or project file and runs dotnet publish during the build. It supports current LTS and
STS .NET releases (.NET 8 and higher) on Heroku’s Linux-based Cedar and Fir dynos, with ASP.NET
Core web APIs, MVC, and Blazor all called out as supported. The one hard limitation: no legacy
.NET Framework support — only cross-platform, Linux-runnable .NET, which every current ASP.NET
Core app already is, so this only bites teams still carrying a Framework-era app.
Heroku dyno pricing
| Tier | $/month | RAM | Compute |
|---|---|---|---|
| Eco | $5 | 0.5 GB | 1x–4x |
| Basic | $7 | 0.5 GB | 1x–4x |
| Standard-1X | $25 | 0.5 GB | 1x–4x |
| Standard-2X | $50 | 1 GB | 2x–8x |
| Performance-M | $250 | 2.5 GB | 12x |
Figures are Heroku’s current Cedar dyno pricing, checked September 20, 2026 from heroku.com/pricing; Heroku’s newer Kubernetes-backed Fir dynos run $25–$2,400/month across their own set of CPU/memory tiers. Eco dynos sleep after 30 minutes of inactivity across the whole app, not per-dyno — fine for a demo, not for anything expected to respond instantly to the first request of the day. Basic and above stay running.
The database is a separate bill — again
Heroku Postgres is billed as its own add-on, independent of the dyno:
| Tier | Storage | $/month |
|---|---|---|
| Essential 0 | 1 GB | $5 |
| Essential 1 | 10 GB | $9 |
| Essential 2 | 32 GB | $20 |
| Standard 0 | 64 GB (4 GB memory, 120 connections) | $50 |
Figures from Heroku’s Postgres add-on page, checked September 20, 2026. A small production app on a Standard tier — the first tier with a meaningful connection limit and no hard storage ceiling most apps will hit — is already $50/month for the database alone, on top of whatever dyno tier runs the app. This is the same pattern as Azure App Service: compute and database are two separate line items that both scale up independently.
Putting all three side by side
| Heroku | Azure App Service | VPS + DotDeployer | |
|---|---|---|---|
| App compute | Basic $7/mo | Basic B1 $12.41/mo | Hetzner CX22 ~$4.50/mo + DotDeployer $12/mo |
| Database | Essential 0 $5/mo | Postgres Flexible Burstable ~$16/mo | Included — runs on the same box |
| Total | ~$12/mo | ~$28.41/mo | ~$16.50/mo |
| Always-on | Yes (Basic and above) | Needs “Always On,” Basic tier+ | Yes — a systemd service, no idle model |
| Root/shell access | No | No | Yes |
| What happens if you leave | Nothing portable — redeploy elsewhere | Nothing portable — redeploy elsewhere | Server, app and database are still yours, unchanged |
Azure’s figures are from the Azure App Service vs VPS cost breakdown. At the smallest tier that stays running and has a real database, Heroku is actually the cheapest of the three here — the tradeoff is the same one Azure App Service makes: a managed sandbox with no shell, and nothing on disk that’s still yours if you stop paying.
Lock-in, concretely
Both Heroku and Azure App Service run your app inside their own platform abstraction — a dyno, a slot — with no server underneath you can inspect or take with you. A VPS provisioned through DotDeployer is a real Ubuntu box: SSH into it, and the app, its systemd unit, nginx config, and database are all sitting there in the ordinary Linux way. Stopping DotDeployer doesn’t delete anything; it stops managing a server that keeps existing.
When Heroku or Azure App Service is still the right call
Heroku’s simplicity (git push heroku main, no server to think about at all) is worth it for a
prototype or a low-traffic side project where $12/month total and zero ops is the whole
requirement. Azure App Service earns its price when a team already depends on the rest of Azure
— Entra ID, VNet peering, an existing compliance program. Neither is the wrong choice in general;
they’re the wrong choice specifically for a solo or small team running one ASP.NET Core app who’d
rather pay less and keep a real server than pay more for a sandbox.
Deploy it with DotDeployer
Point DotDeployer at a Hetzner or DigitalOcean server and get HTTPS, restarts, PostgreSQL or SQL Server on the same box, and one-click rollbacks -- without a Heroku dyno or an App Service bill.
Deploy to Hetzner with DotDeployer · DotDeployer vs Azure App Service