← All posts

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$/monthRAMCompute
Eco$50.5 GB1x–4x
Basic$70.5 GB1x–4x
Standard-1X$250.5 GB1x–4x
Standard-2X$501 GB2x–8x
Performance-M$2502.5 GB12x

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:

TierStorage$/month
Essential 01 GB$5
Essential 110 GB$9
Essential 232 GB$20
Standard 064 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

HerokuAzure App ServiceVPS + DotDeployer
App computeBasic $7/moBasic B1 $12.41/moHetzner CX22 ~$4.50/mo + DotDeployer $12/mo
DatabaseEssential 0 $5/moPostgres Flexible Burstable ~$16/moIncluded — runs on the same box
Total~$12/mo~$28.41/mo~$16.50/mo
Always-onYes (Basic and above)Needs “Always On,” Basic tier+Yes — a systemd service, no idle model
Root/shell accessNoNoYes
What happens if you leaveNothing portable — redeploy elsewhereNothing portable — redeploy elsewhereServer, 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