How much does it cost to run a self-hosted headless CMS?
A self-hosted headless CMS with 8,000 entries, 25 editors, and 30 million API requests costs about 1,025 dollars a month on AWS, or 41 dollars per editor seat. Here is the breakdown against the hosted alternative.
Quick answer
A self-hosted headless CMS with 8,000 content entries in 5 locales, 25 editors, 30 million content API requests, and 4 TB of media delivery costs roughly 1,025 dollars a month on AWS, or about 41 dollars per editor seat. The largest lines are the CDN at 371 dollars, the application containers at 180 dollars, and the Multi-AZ database at 111 dollars. Because nearly all read traffic is cached at the edge, the origin only serves about 1.5 million requests a month, which is why a modest container footprint handles 30 million requests.
A headless CMS has an unusual traffic profile: a handful of editors writing, and an enormous number of reads that are almost entirely cacheable. Content changes a hundred times a day and is read a million times. Get the caching right and the infrastructure is small; get it wrong and you are running a database-backed application at full read volume.
The workload we are pricing
Assume a self-hosted CMS in us-east-1 backing a marketing site and a mobile app. There are 8,000 content entries across 5 locales, roughly 40,000 localized documents. Twenty-five editors work in the admin UI during business hours, publishing about 400 changes a month. The content delivery API serves 30 million requests a month, and 1.2 TB of images and video in the media library generate 4 TB of CDN egress. There is a staging environment for content previews and a search index over entries.
The monthly breakdown
| Component | Specification | Monthly cost |
|---|---|---|
| CDN | CloudFront 4 TB plus 30M requests | $370.66 |
| Application containers | 3 API tasks plus 1 admin task on Fargate | $180.20 |
| Database | RDS Postgres db.t3.medium Multi-AZ plus 100 GB | $110.78 |
| Staging environment | Scaled-down replica of the stack | $85.00 |
| Content search | OpenSearch 2 x t3.small.search plus 100 GB | $64.76 |
| Load balancer | ALB plus about 6 LCU | $51.47 |
| Image transformation | 1M Lambda invocations, 1.5 GB, 2s | $50.20 |
| Logs and metrics | 80 GB ingest plus retention | $43.00 |
| Media storage | 1.2 TB S3 Standard plus requests | $36.27 |
| Response cache | ElastiCache cache.t4g.small | $23.36 |
| Edge functions | 30M CloudFront Function executions | $3.00 |
| Secrets | 10 secrets | $4.00 |
| Webhooks and build triggers | Publish events to downstream builds | $2.00 |
| Total | $1,024.70 |
Why 30 million requests only needs three containers
Content is immutable between publishes, so responses can carry long cache headers with invalidation on publish. At a 95 percent edge hit ratio, the origin sees 1.5 million requests a month, which is 0.58 requests per second. Three small Fargate tasks are running for redundancy and deployment headroom, not for throughput.
| Edge hit ratio | Origin requests/month | Required tasks | Compute cost |
|---|---|---|---|
| 95% | 1,500,000 | 3 | $108.12 |
| 80% | 6,000,000 | 4 | $144.16 |
| 50% | 15,000,000 | 8 | $288.32 |
| 0% (no edge cache) | 30,000,000 | 14 plus larger DB | about $720 |
The difference between a well-cached CMS and an uncached one is roughly 600 dollars a month of compute, plus a database two sizes larger. Since the content genuinely does not change between publishes, this is one of the cleanest caching wins available in any architecture: the cache is always correct as long as publishing triggers invalidation.
Self-hosted against a hosted CMS
| Option | Monthly cost | What you own |
|---|---|---|
| Self-hosted on AWS | $1,025 | Upgrades, backups, scaling, security patching |
| Hosted CMS, mid tier plus 25 seats | $700 to $2,000 typical | Configuration only |
| Self-hosted, minimal (no staging, no search) | about $600 | More manual work |
At 41 dollars per editor seat, self-hosting is competitive rather than dramatically cheaper. The reasons to do it are usually not cost: data residency, custom content models that vendor schemas do not express, API rate limits, and the ability to co-locate the CMS with the services that consume it. If the motivation is purely to save money at 25 seats, the arithmetic is unconvincing. At 200 seats, where hosted per-seat pricing compounds and the infrastructure barely changes, it becomes compelling.
Image transformation is the line that surprises
Fifty dollars for a million on-the-fly image transformations looks small until you realize it is 5 percent of the bill for a feature nobody thinks about. Each transformation runs at 1.5 GB for about 2 seconds, which is 0.00005 dollars per image. The fix is not to make transformations faster but to make them rarer: cache transformed variants in object storage keyed by source and parameters, so the second request for the same size is served from the CDN or the bucket rather than recomputed. That typically reduces transformations by 90 percent, to about 5 dollars.
The staging environment
Eighty-five dollars for a preview environment is reasonable and often cut first, which is a mistake: content preview is the feature editors use most. The better saving is to make staging genuinely small (one task, a t3.micro database, no search cluster) and to schedule it off outside business hours. A staging stack running 50 hours a week instead of 168 costs 25 dollars instead of 85.
Unit economics
At 1,025 dollars for 25 editors and 30 million API requests, the CMS costs 41 dollars per editor per month and 0.034 dollars per thousand content API requests. The per-request number falls to almost nothing at higher read volume because the edge absorbs it, while the per-editor number is essentially fixed. Price the stack from Terraform against the resource catalog and compare it honestly against per-seat hosted pricing at the seat count you expect in two years, not the one you have today.
FAQ
How much does a self-hosted headless CMS cost?
About 1,025 dollars a month on AWS for 8,000 entries in 5 locales, 25 editors, 30 million content API requests, 1.2 TB of media generating 4 TB of CDN egress, a search index, and a staging environment. That is roughly 41 dollars per editor seat per month, or 0.034 dollars per thousand content API requests.
Why does a CMS serving 30 million requests need so little compute?
Because content is immutable between publishes, so responses carry long cache headers with invalidation on publish. At a 95 percent edge hit ratio the origin sees only 1.5 million requests a month, or 0.58 per second. The three containers are there for redundancy and deployment headroom, not throughput. At a 50 percent hit ratio the same workload needs eight tasks and a bigger database.
Is self-hosting a headless CMS cheaper than a hosted one?
At 25 seats, not dramatically. Self-hosting costs about 1,025 dollars a month against a typical 700 to 2,000 dollars for a hosted mid tier with 25 seats, and you take on upgrades, backups, scaling, and patching. The usual reasons to self-host are data residency, custom content models, API rate limits, and co-location with consuming services. At 200 seats, where per-seat pricing compounds while infrastructure barely changes, the cost case becomes strong.
What does on-the-fly image transformation cost?
About 50 dollars a month for a million transformations at 1.5 GB of memory and 2 seconds each, or 0.00005 dollars per image, which is 5 percent of the bill. The fix is to make transformations rarer, not faster: caching transformed variants in object storage keyed by source and parameters means the second request for a given size is served from the CDN, typically cutting transformations by 90 percent to around 5 dollars.
Should I cut the CMS staging environment to save money?
No, since content preview is the feature editors use most. Better to make staging genuinely small, one task, a micro database, no search cluster, and schedule it off outside business hours. A staging stack running 50 hours a week instead of 168 costs about 25 dollars instead of 85, which keeps the capability while removing most of the cost.
How does C3X help price a CMS architecture?
C3X reads your Terraform and prices the containers, database, cache, search cluster, CDN distribution, and storage against a live catalog, including the staging stack. Because the compute footprint of a CMS depends almost entirely on caching configuration, seeing sizing changes costed in the pull request keeps the relationship between cache policy and monthly spend visible.
What to do next
Compare self-hosting honestly, with real numbers. 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.