MongoDB Atlas Cost Optimisation: Where the Waste Hides
MongoDB Atlas bills inflate through oversized clusters, backup accumulation, and Data Federation scans nobody watches. Here's where the real savings are.
By Andrii Votiakov on
MongoDB Atlas is one of those services that feels like a fixed cost until you actually look at the bill line by line. Cluster tier, backup storage, Data Federation, and Atlas Search all add up in ways that aren't obvious until you're spending $8k a month and wondering why.
Quick answer
Most Atlas bills carry 30-60% waste. The biggest sources: over-provisioned cluster tiers (teams bump up, never bump down), unnecessary dedicated clusters for dev/test workloads that could run on shared M10/M20 tiers, automated backup storage accumulation, and Data Federation queries that scan far more than they need to. A systematic review typically cuts 35-55%.
How Atlas bills you
Atlas charges for compute (cluster tier + hours running), storage, backup, and optional add-ons like Atlas Search, Data Federation, and Charts. The tiers matter more than most teams realise:
- M10: $0.09/hour — fine for dev, light staging
- M30: $0.54/hour — ~$390/month, 2 vCPU, 8 GB RAM
- M50: $1.04/hour — ~$750/month, 8 vCPU, 32 GB RAM
- M80: $2.00/hour — ~$1,440/month, 32 vCPU, 122 GB RAM
Each tier roughly doubles. Every tier you're too high costs you 2x on that cluster, every month.
Cluster right-sizing: the first thing I check
Atlas exposes per-cluster CPU, memory, and operation metrics. Pull them for 14 days — not 24 hours, not during a special event. Look at:
- Opcounters (reads, writes per second) — is the cluster processing anything meaningful?
- System CPU — if it's under 20% average with infrequent spikes, you're over-sized
- Memory used by mapped data — if WiredTiger page cache isn't even filling available RAM, you don't need the RAM
- Connections — 30 active connections on an M80 that supports thousands is a red flag
A common find: an M50 running at 8% CPU and 25% memory utilisation, provisioned when a customer pitch needed fast reads and never revisited. Downsize to M30, run for a week watching metrics — often perfectly fine.
Dedicated vs. serverless vs. flex clusters
Atlas Serverless is priced per operation and per storage GB. It's genuinely cheaper for sporadic workloads — dev environments, infrequent batch jobs, internal tools with unpredictable load patterns. At roughly $0.10 per million reads, a workload doing 50 million reads/month pays $5 in compute rather than $390 on a dedicated M30.
The crossover point is roughly 200-300 million read operations per month. Below that: serverless often wins. Above that: dedicated is cheaper. I've seen teams run full production on serverless when their traffic pattern was genuinely bursty — perfectly valid.
Flex clusters sit between shared (M0/M2/M5) and dedicated. Good for dev/test with occasional moderate load.
Don't run dedicated clusters for things that don't need dedicated clusters. That sounds obvious — it isn't in practice.
Atlas Online Archive and Data Federation
Online Archive moves infrequently accessed data to Atlas-managed object storage, billed at $0.023/GB rather than cluster-attached storage rates. The setup is a date-based or custom archiving rule, and queries can still access archived data through Data Federation.
The catch: Data Federation queries are billed per byte scanned. If you run large analytical queries against archived data without filters, that bill gets unpleasant fast. I've seen Data Federation charges spike to $1,200/month from what was meant to be cheap archiving because nobody partitioned queries correctly.
The pattern that works: archive aggressively, query sparingly, and always add date filters before any other predicate so the query engine can skip files.
Backup storage — the quiet accumulator
Atlas automated backups retain snapshots based on your configured policy. Default policies are often over-generous: hourly snapshots for 2 days, daily for 7 days, weekly for 4 weeks, monthly for 12 months. On a 500 GB database, that's hundreds of GB of snapshot storage.
Run this mental exercise: what's your actual RTO/RPO? Most teams I talk to need daily granularity for 7-14 days and nothing older. Monthly snapshots from 8 months ago are rarely useful for anything except compliance checkboxes.
Tighten the policy to match real requirements. On a client running Atlas backups at $800/month, trimming the policy to 7 daily and 4 weekly snapshots reduced backup storage costs to $180/month. No real risk added.
Atlas Search and the index cost
Atlas Search builds Lucene indexes on your Atlas cluster — or on a separate Search node if you're using the dedicated Search Nodes preview. Those indexes consume disk space. Unmanaged, they grow.
Check your index count and sizes in the Atlas UI under Search. I regularly find indexes built for one-time queries that never ran again, or indexes built on entire collections when only a subset of fields are ever searched. Each index is replicated across your replica set members, multiplying storage impact.
Delete unused indexes. Rebuild broad indexes as targeted ones. On a busy cluster, this sometimes also reduces replica sync lag.
Replica sets and region choices
Standard Atlas clusters run as 3-node replica sets. Multi-region deployments add nodes in additional regions. Each additional node is a full cluster instance hour. That's worth it for disaster recovery or read distribution — not for "just in case" thinking.
Audit your cluster topology:
- How many cross-region nodes do you have?
- When were they added and why?
- Are reads actually routed to secondary regions?
Also: Atlas prices vary by cloud provider and region. us-east-1 on AWS is Atlas's cheapest region for most tiers. Running in eu-west-2 is 10-15% more. Sometimes you need the region for latency or data residency — but sometimes the cluster lives there by accident.
Realistic numbers
Recent client on Atlas (~$11,000/month):
- 3 M80 production clusters right-sized to M50: $2,900/month
- 6 dedicated dev/staging clusters migrated to serverless or M10: $1,800/month
- Backup policy tightened across 9 clusters: $620/month
- Online Archive enabled on 2 large collections, Data Federation queries fixed: $700/month net (Archive savings minus corrected Data Federation queries)
- Unused Atlas Search indexes removed: $240/month
Total: $6,260/month saved, ~57% reduction. Took three weeks including testing.
If you're also running managed Postgres alongside Atlas, the same right-sizing and retention logic applies — see managed Postgres cost optimisation for the Aurora, Cloud SQL, and Azure equivalents.
If you want me to run the same review on your Atlas account on a pay-for-savings basis, book a call.