How much does it cost to run a SaaS app with 100,000 users?
A multi-tenant SaaS at 100,000 users, 250 million API requests a month and a 2 TB database costs roughly 6,540 dollars a month on AWS. Here is the full breakdown, and why observability turns out to cost more than the application tier.
Quick answer
A multi-tenant SaaS serving 100,000 users (about 250 million API requests, a 2 TB Aurora database, 20 TB of object storage, 12 TB of CDN egress per month) costs roughly 6,540 dollars a month on AWS, or about 0.065 dollars per user per month. The largest lines are the database cluster at 1,214 dollars, the CDN at 1,184 dollars, and observability at 1,060 dollars. The surprise for most teams is that log and metric ingestion costs more than the entire application tier, and that unit cost per user has fallen to about a third of what it was at 1,000 users.
At 1,000 users a SaaS bill is a flat spread of small components. At 100,000 users it is a different animal: a few lines dominate, the fixed plumbing becomes a rounding error, and categories that were invisible at small scale (observability, cross-AZ traffic, request fees) turn into four-figure monthly charges. Here is what the bill actually looks like.
The workload we are pricing
Assume a multi-tenant B2B SaaS in us-east-1 with 100,000 users, about 8,000 concurrent at weekday peak. Traffic is roughly 250 million API requests a month, bursty with a 4x peak-to-trough ratio. The primary database is a 2 TB Aurora PostgreSQL cluster with one writer and one reader. There is 20 TB of tenant documents in object storage, 12 TB of CDN egress a month, a search index over tenant data, and an asynchronous worker tier handling exports, webhooks, and scheduled jobs. Everything spans three availability zones.
The monthly breakdown
| Component | Specification | Monthly cost |
|---|---|---|
| App tier | 12 x m5.large average, 1-year Compute Savings Plan (about 28% off) | $605 |
| Load balancers | 2 ALBs plus about 60 LCU average at 0.008/LCU-hr | $383 |
| Database | Aurora PostgreSQL 2 x db.r6g.xlarge, 2 TB storage, I/O | $1,214 |
| Cache | 3 x cache.r6g.large at 0.163/hr | $357 |
| Object storage | 20 TB S3 Standard at 0.023/GB plus requests | $531 |
| CDN | CloudFront 12 TB tiered plus 200M requests | $1,184 |
| NAT gateways | 3 gateways plus 3 TB processed at 0.045/GB | $237 |
| Search | OpenSearch 3 x r6g.large.search plus 1 TB storage | $457 |
| Async workers | SQS 500M requests plus 200M Lambda invocations | $307 |
| Observability | 2 TB log ingest at 0.50/GB plus retention | $1,060 |
| DNS, WAF, misc | Route 53, web ACL, per-request WAF charges | $205 |
| Total | $6,540 |
Observability costs more than the application
The line that stops people is 1,060 dollars for logs and metrics, against 605 dollars for the compute running the product. Two terabytes of ingestion a month sounds like a lot until you do the arithmetic: 250 million requests emitting a single structured access log of roughly 1.5 KB is 375 GB before anyone writes a debug statement. Add application logs, load balancer logs, VPC flow logs, and database logs, and 2 TB is conservative rather than extravagant.
The fix is not to log less in an emergency but to decide up front what tier each log stream belongs to. Sample successful request logs at 5 percent and keep errors at 100 percent, ship VPC flow logs to object storage rather than the log service, and set retention to 7 days for hot logs with an archive tier behind it. That routinely cuts the line by 60 to 70 percent, worth 600 to 700 dollars a month here.
The CDN tiering effect
Twelve terabytes of CDN egress is not billed at one rate. The first 10 TB bills at 0.085 per gigabyte (870.40 dollars) and the next 2 TB at 0.080 (163.84 dollars), plus about 150 dollars of HTTPS request charges. This tiering is why egress cost per user falls as you grow, and why moving egress from direct object-storage transfer at 0.09 per gigabyte to a CDN is worth doing even for API responses. The detail is inCloudFront cost optimization anddata transfer out explained.
Unit economics against the small-scale case
| Scale | Monthly total | Cost per user |
|---|---|---|
| 1,000 users | $195 | $0.195 |
| 10,000 users | about $1,150 | $0.115 |
| 100,000 users | $6,540 | $0.065 |
Cost per user falls by two thirds between 1,000 and 100,000 users. The reason is that the components that scale linearly (object storage, CDN egress, request fees) are only about 40 percent of the bill, while the rest scales in steps or barely at all. A load balancer serving 8,000 concurrent users costs little more than one serving 150. This is the mechanical reason gross margin improves with scale in SaaS, and it is worth measuring as cost per tenant rather than a company-wide average, because a handful of heavy tenants usually distort the mean.
The three levers worth pulling
First, commitment discounts. The app tier, database, cache, and search cluster are all steady, and a one-year Savings Plan or reserved instance coverage on all four is worth roughly 900 dollars a month against the on-demand equivalent. Second, storage lifecycle. Twenty terabytes of tenant documents at 0.023 per gigabyte includes plenty of data nobody has opened in a year; moving cold objects to an infrequent-access or archive tier via a lifecycle policy can halve that 531 dollar line. Third, observability discipline, as above.
Together those take the bill from 6,540 to roughly 4,700 dollars a month without touching the architecture, which is about 0.047 dollars per user. Price the whole stack from Terraform against theresource catalog before the next capacity increase, and the growth curve stops being a surprise.
FAQ
How much does it cost to run a SaaS app with 100,000 users?
Roughly 6,540 dollars a month on AWS for a multi-tenant architecture handling 250 million API requests, a 2 TB Aurora cluster, 20 TB of object storage, 12 TB of CDN egress, a search cluster, and an async worker tier across three availability zones. That is about 0.065 dollars per user per month. With commitment discounts, storage lifecycle policies, and log sampling, the same stack runs near 4,700 dollars.
Why does observability cost so much at SaaS scale?
Because ingestion is billed per gigabyte and request volume multiplies it. At 250 million requests a month, a single 1.5 KB structured access log per request is 375 GB before any application logging. Adding app logs, load balancer logs, VPC flow logs, and database logs reaches 2 TB, which at 0.50 per gigabyte is over 1,000 dollars a month, more than the compute running the product itself.
How does SaaS cost per user change with scale?
It falls substantially. The same architecture style costs about 0.195 dollars per user at 1,000 users, 0.115 at 10,000, and 0.065 at 100,000. Only about 40 percent of the bill (object storage, CDN egress, per-request fees) scales linearly with users. Load balancers, NAT gateways, DNS, and database baselines scale in steps or stay flat, so they amortize across a growing user base.
What are the biggest cost lines in a large SaaS bill?
In this breakdown, the Aurora database cluster at 1,214 dollars, CDN egress at 1,184 dollars, observability at 1,060 dollars, the application tier at 605 dollars, and load balancers at 383 dollars. Together those five are 68 percent of the bill. The fixed plumbing that dominated at small scale (NAT gateways, DNS) has shrunk to under 7 percent of the total.
How much can commitment discounts save a SaaS at this scale?
About 900 dollars a month here. The application tier, Aurora cluster, cache nodes, and search cluster are all steady-state workloads with predictable baselines, which makes them ideal for one-year Savings Plans or reserved instances at roughly 28 to 35 percent off on-demand. The variable components (CDN, object storage, request fees) are not covered by commitments and need different levers.
How does C3X help a SaaS control cost at scale?
C3X prices infrastructure from Terraform against a live catalog, so a capacity increase, a new database node, or an additional load balancer shows its monthly cost in the pull request. At 100,000 users the bill moves in thousand-dollar steps, and seeing that step before it is applied is the difference between a planned expansion and a month-end surprise.
What to do next
Forecast your SaaS bill before it grows. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.
Share this post
Try C3X on your own Terraform
Free and open source. No API key required. One command to install, one command to estimate.