April 4, 2026 · Tim Fraser, Cloud Operations Lead
Understanding AWS Hosting Costs Per Client
Most digital agencies running client sites on AWS can't answer a simple question: how much does it cost to host Client X? They know the total AWS bill. They might know the rough cost of the largest instance. But the per-client breakdown — which is what you need to price hosting profitably — is usually a guess.
This matters because hosting is often bundled into a retainer, and if the actual cost is higher than what you're charging, you're subsidising infrastructure from project revenue. That's fine for one client. It's a problem when it's ten.
Why per-client costs are hard to track
AWS bills by service, not by customer. If each client has dedicated resources, you can manually add up individual costs. But if clients share an ALB, CloudFront distribution, or S3 bucket, the costs are blended. Data transfer makes it worse — a single NAT Gateway serves all VPC traffic, and CloudFront data transfer is aggregated across distributions.
Step one: tag everything
Resource tags are the foundation of per-client cost tracking. The convention is simple:
- Tag key:
Client - Tag value: client name (e.g.,
acme-corp)
Tag every resource: EC2, RDS, ALBs, S3 buckets, EBS volumes, Elastic IPs, CloudFront distributions. Shared resources get tagged shared and split proportionally later.
Then activate the Client tag in Cost Explorer (Billing → Cost Allocation Tags → Activate). This takes 24-48 hours and only works going forward — you can't retroactively tag historical costs.
Step two: track monthly spend
With tagging in place, check per-client costs monthly. Filter Cost Explorer by the Client tag. Look for:
db.r6g.large. A db.t4g.micro costs 90% less and handles that load.
Storage accumulation. S3 backups and logs grow over time. A client with five years of daily backups and no lifecycle policy is storing 1,800+ snapshots. Set retention policies: 30 days of dailies, 12 monthly, done.
Step three: set budgets
AWS Budgets lets you set cost thresholds per tag value. Create one per client at their expected monthly cost plus 20% headroom. Budgets cost $0.02/day each — even 20 clients is under $15/month. Cheap insurance against costs quietly doubling without anyone noticing.
Pricing hosting correctly
The minimum hosting fee should cover:
- AWS resource costs (compute, database, storage, data transfer)
- Shared infrastructure (ALB, NAT Gateway, Route 53 — split across clients)
- Management time (monitoring, patching, troubleshooting)
- Margin
A common mistake is pricing based on resource costs alone. If you spend 30 minutes per month per client on ops work, that's real cost. Price it in. Another mistake is flat pricing without periodic review — a client whose traffic tripled since launch costs more than the original estimate.
Pass-through vs. fixed-fee
Pass-through: client pays actual AWS costs plus a management fee. Transparent, scales naturally, but invites questions about every line item. Fixed fee: client pays a flat monthly rate. Simpler to administer, but you absorb cost increases. Review costs annually and adjust.Most agencies use fixed-fee. Just make sure the fee is based on actual data, not a guess from the kickoff meeting two years ago.
How plainfra gives cost visibility
plainfra queries Cost Explorer through your read-only access. Ask "what does it cost to run resources tagged Client=acme-corp?" and get a breakdown by service for any time period.
The weekly report surfaces cost trends automatically. Rather than logging into Cost Explorer monthly and remembering to check each client, the report flags costs that are moving in the wrong direction.
For agencies managing multiple client environments, this is the difference between knowing your hosting margins and guessing at them.
Try plainfra free → 50K tokens, 7 days, no charge. Or see the interactive demo →.