Seven parts into this series, we've deployed apps, wired up identity, stored blobs, and provisioned VMs from C#. There's one question we've dodged the whole time, and it's the first one most developers actually ask: what does all this cost? Cloud pricing pages are famously evasive, so let's finish the series with real numbers for a small production ASP.NET Core app — and an honest comparison against the humble VPS.

How much does it cost to run a small ASP.NET Core app on Azure?
Roughly $20–30 per month for a small production setup: a B1 App Service plan (~$13), Azure SQL serverless with auto-pause ($5–15 depending on activity), and cents for storage and bandwidth. You can get that near zero with free tiers, but with limits that make them fine for demos and painful for anything real. All prices in this post are approximate 2026 USD, East US region, pay-as-you-go — check the Azure pricing calculator for your region before committing.
The itemized bill
Here's what a realistic "small but production" setup looks like, line by line:
App Service B1 (~$13/month). The cheapest tier we'd call production-ready: 1.75 GB RAM, always-on support, custom domains with free managed TLS certificates. Basic tier lacks deploy slots and autoscale, but for a blog, portfolio API, or side project, B1 is genuinely enough. One instance runs as many apps as fit in memory — we can host three or four small ASP.NET Core apps on a single B1 plan, which is where it starts looking like a bargain.
Azure SQL serverless (~$5–15/month). The serverless tier bills per vCore-second and auto-pauses after an hour of inactivity, dropping compute cost to zero while paused (storage still bills, around $0.12/GB). A low-traffic app that sleeps at night lands near the bottom of that range. The catch: the first request after a pause eats a cold-start delay of up to a minute while the database resumes. If that's unacceptable, the cheapest always-on option is Basic DTU at about $5/month for 2 GB — old model, still quietly excellent for hobby scale.
Storage (~$0.05–0.50/month). Blob storage at hobby scale is effectively free: ~$0.02/GB for hot LRS storage plus fractions of a cent per 10,000 operations. A few gigabytes of images and backups round to pocket change.
Bandwidth (usually $0). The first 100 GB of egress per month is free, and a small app rarely exceeds it. Egress only becomes a line item when we serve large files or video — more on that in the traps section.
Total: about $19–29/month for a setup with managed TLS, automated backups, and no servers to patch.
Azure vs a $12 VPS vs free tiers
| Azure (B1 + SQL serverless) | $12 VPS (DO droplet) | Azure free tiers (F1 + free SQL offer) | |
|---|---|---|---|
| Monthly cost | ~$20–30 | $12 flat | ~$0 |
| What you get | Managed platform, TLS, backups, slots at higher tiers | 2 GB RAM, full root, run anything | 60 CPU-min/day, 1 GB RAM, no always-on |
| Ops burden | Low: push code, Azure patches the rest | High: you patch, configure nginx, renew certs, back up | Low, but you fight the limits |
| Database | Managed, backed up, point-in-time restore | You run PostgreSQL/SQL yourself | Serverless SQL free offer (100k vCore-s/mo) |
| Scaling | Slider or autoscale (higher tiers) | Buy a bigger droplet, migrate | None |
| What you learn | Azure PaaS, managed identity, cloud patterns | Linux, nginx, systemd, real sysadmin skills | Azure basics |
| Surprise-bill risk | Real if unmanaged | Zero — price is the price | Low, but easy to "upgrade into" charges |
The VPS number deserves respect. A $12 DigitalOcean droplet gives us 2 GB of RAM, and Kestrel behind nginx with a PostgreSQL instance on the same box will comfortably serve tens of thousands of requests a day. The price never surprises us. The trade is that every piece of it — OS patches, certificate renewal, database backups, firewall rules — is our job forever.
Free tiers and student credits: a reality check
Azure's F1 App Service tier is genuinely free, but read the fine print: 60 CPU minutes per day, 1 GB RAM, no always-on (the app sleeps after idling and cold-starts on the next request), and no custom-domain TLS binding on the oldest configurations. It's perfect for "is my deploy pipeline working" and demos we show in a meeting. It's frustrating for anything a stranger might visit.
The 12-month new-account offers (750 hours of a B1s VM, 250 GB SQL, and a $200 30-day credit) are real but time-boxed — the classic failure mode is forgetting the anniversary and discovering the resources quietly converted to paid. Students get $100/year via Azure for Students without a credit card, which is the best deal on this page if you qualify. Our advice for everyone else: treat free tiers as a learning sandbox, and budget the $20 the moment real users show up.
The cost traps that actually catch beginners
Every horror-story Azure bill we've seen traces back to one of a short list of mistakes:
- Forgotten VMs. From Part 7: a VM stopped from inside the OS still bills. Only deallocated VMs stop the compute meter.
az vm deallocate, notshutdown -h now. - Premium defaults. Wizards love to preselect Premium SSD disks, S1 tiers, and zone redundancy. A default Windows VM with a Premium disk costs several times our entire target budget. Always check the SKU before clicking create.
- Orphaned disks and IPs. Deleting a VM does not delete its managed disk or static public IP. They linger at a few dollars a month each.
az disk list --query "[?diskState=='Unattached']"finds the disks; deleting whole resource groups (Part 7's habit) prevents the problem entirely. - Egress surprises. Serving video or large downloads directly from our app burns through the free 100 GB. Put big static assets in Blob Storage and, if traffic grows, behind a CDN.
- Log Analytics ingestion. Application Insights defaults to sampling, but verbose logging at scale can generate ingestion charges (~$2.30/GB) that dwarf the app itself. Set a daily cap.
None of these are scams; they're defaults tuned for enterprises, applied to hobby projects.
Set a budget before you deploy anything
The single highest-value cost action takes two minutes: create a budget with email alerts. Azure will not stop spending for us (budgets alert, they don't enforce), but an email at 80% of $30 turns a horror story into a mild Tuesday.
az consumption budget create \
--budget-name hobby-cap \
--amount 30 \
--time-grain Monthly \
--start-date 2026-08-01 \
--end-date 2027-08-01 \
--category cost
Then add an action group and alert rules in Cost Management for the 50/80/100% thresholds — the portal is honestly the easier path for the notification wiring. Pair this with a weekly glance at Cost Analysis grouped by resource, which is how unattached disks and forgotten experiments reveal themselves.
So which one should we pick?
The VPS wins when the goal is a fixed bill and full control, or when the project is the learning: running our own nginx and PostgreSQL teaches Linux skills that no PaaS ever will. Full disclosure — this very blog runs on a $12 droplet, and for a content site with predictable traffic, we've never regretted it. The price is the feature.
Azure wins when we value our evenings over our root access: managed TLS, automated database backups, deploy slots, and above all managed identity — the no-secrets authentication story from earlier in this series has no VPS equivalent. It also wins on the resume; "deployed and operated a production workload on Azure" is a sentence hiring managers act on. And for spiky or team projects, PaaS elasticity beats droplet migration every time.
That brings the Azure for .NET Developers series to a close — eight parts covering deployment, identity, storage, messaging, serverless, VMs, and now the bill at the end of the month. If you've followed along, you have a working app, a companion repo full of runnable samples at github.com/laxmikant-geek/azure-for-dotnet-examples, and hopefully a clear-eyed view of when the cloud is worth its price tag. Thanks for reading, and if you build something with what's here, we'd genuinely love to hear about it.
Comments (0)
No comments yet — be the first to share your thoughts.