Nuberio
  • Pricing
  • Blog
  • Tools
  • Security
  • About
Run free audit →
Nuberio

Free AWS health audit.

Run free audit →

Product

  • Pricing

Resources

  • Blog
  • Free Tools
  • CloudWatch Alarms

Company

  • Security
  • About

Connect

  • X (Twitter)
  • LinkedIn

© 2026 Nuberio. All rights reserved.

Built at 2am, for a 2am.

← All posts

The $0.30 metric: what CloudWatch custom metrics actually cost

August 6, 2026·8 min read

$0.30 per metric per month sounds like a rounding error. It stays a rounding error right up until someone adds a customer_id or request_id dimension to a metric that's already being published every minute from every instance — and the bill jumps from single digits to hundreds of dollars with no code change anyone remembers making. Here's exactly how CloudWatch custom metric pricing works, and which pattern actually causes the surprise.

  • What does a CloudWatch custom metric actually cost?
  • What counts as one metric, exactly?
  • Where the bill actually grows: cardinality, not metric count
  • Standard vs high-resolution metrics
  • The PutMetricData charge nobody budgets for
  • When a custom metric is worth $0.30/month — and when it isn't

What does a CloudWatch custom metric actually cost?

CloudWatch bills custom metrics in three tiers per account per month: $0.30 per metric for the first 10,000, $0.10 per metric from 10,001 to 250,000, and $0.05 per metric above that. Metrics are prorated by the hour — you're only charged for hours in which a data point was actually published, not a flat monthly rate.

Custom metrics per monthPrice per metric1,000 metrics costs
First 10,000$0.30$300/month
10,001 – 250,000$0.10$100/month
250,001+$0.05$50/month

Note the tiers apply cumulatively across your whole account, not per metric type — publishing 12,000 custom metrics means the first 10,000 are billed at $0.30 and only the remaining 2,000 drop to the $0.10 tier.

What counts as one metric, exactly?

A CloudWatch metric identity is the combination of namespace, metric name, and the full set of dimension name/value pairs attached to it. Change any dimension value and CloudWatch treats it as a distinct metric for billing purposes — even if the metric name and namespace are identical.

That's the part that catches teams off guard. Publishing `OrderLatency` with a dimension of `Service=checkout` is one metric. Publishing the same `OrderLatency` metric with a dimension of `CustomerId=<uuid>` creates one metric per unique customer ID that has ever sent a data point — potentially thousands, all counted separately against the tiered pricing above.

Where the bill actually grows: cardinality, not metric count

Teams rarely get surprised by adding metrics deliberately — three or four custom metrics per service, even across fifty instances, stays in the low hundreds of dollars. The bill grows from high-cardinality dimensions: a dimension whose value set is effectively unbounded, like a user ID, session ID, request ID, or IP address.

As an illustrative example: a single custom metric with a low-cardinality dimension like `Environment` (production, staging) stays at 2 billed metrics forever, regardless of traffic. The same metric with a `CustomerId` dimension across 5,000 active customers becomes 5,000 billed metrics — at the $0.30 tier, that's $1,500/month for what started as "just one metric." This is the single most common cause of an unexplained CloudWatch cost jump.

If you need per-customer or per-request granularity, that's usually a job for structured logs and CloudWatch Logs Insights (or an APM tool), not a CloudWatch custom metric dimension. Metrics are built for low-cardinality aggregates; logs are built for high-cardinality detail.

Standard vs high-resolution metrics

CloudWatch also supports high-resolution (sub-minute, down to 1-second) custom metrics, priced separately from the standard 60-second resolution tier above — check the current CloudWatch pricing page for the exact rate, since AWS has adjusted this tier before. The operational point that doesn't change: a metric published every 10 seconds generates 6x the data points of one published every 60 seconds, and storage/processing cost scales with publish frequency, not just metric count. Default to standard resolution unless you have a specific sub-minute alerting need — most alarm use cases don't.

The PutMetricData charge nobody budgets for

Publishing custom metrics happens through the PutMetricData API, which carries its own per-request charge separate from the per-metric storage cost above. Each PutMetricData call is limited to 1,000 distinct metrics and 1MB of request size — so the fix for both API cost and CloudWatch's 400 throttling error is the same: batch data points into fewer, larger calls instead of calling PutMetricData once per metric per instance.

# One call, three metrics batched — not three separate PutMetricData calls
aws cloudwatch put-metric-data \
  --namespace "MyApp/Checkout" \
  --metric-data \
    MetricName=OrderLatency,Value=142,Unit=Milliseconds,Dimensions=[{Name=Environment,Value=production}] \
    MetricName=OrderErrors,Value=0,Unit=Count,Dimensions=[{Name=Environment,Value=production}] \
    MetricName=OrderCount,Value=1,Unit=Count,Dimensions=[{Name=Environment,Value=production}]

If your metric volume is high enough that per-metric-series pricing itself becomes the bottleneck — not just the API call count — AWS's newer OpenTelemetry metrics option for CloudWatch bills at $0.50/GB ingested (including 15 months of storage) instead of per metric series, with no separate PutMetricData-style API charge. It's a different pricing model, not a strictly cheaper one — it's worth comparing against your actual metric volume rather than assuming either model wins by default.

When a custom metric is worth $0.30/month — and when it isn't

Worth publishing as a custom metricNot worth it — use logs or an APM tool instead
Business KPI you'll alarm on (checkout success rate, queue backlog)Anything with a customer ID, user ID, or request ID as a dimension
Low-cardinality dimension set (environment, region, service name)High-frequency debug data you'll only look at during an incident
A gap CloudWatch's built-in AWS/* metrics don't coverA value you could derive from an existing metric with metric math
Something you genuinely want an alarm onSomething you're publishing "just in case" with no alarm plan

The test that filters out most unnecessary custom metrics: if you can't name the alarm you'd attach to it, it's probably not worth $0.30/month times however many dimension combinations it generates.

Related reading

  • → What CloudWatch alarms actually cost — and the three levers that reduce the bill
  • → CloudWatch metric math: how to build alarms no static threshold can match
  • → Run a free Nuberio Audit — see what's actually being monitored

Frequently asked questions

How much does a CloudWatch custom metric cost?

$0.30 per metric per month for the first 10,000 custom metrics in an account, $0.10 per metric from 10,001 to 250,000, and $0.05 per metric above 250,000. Metrics are prorated hourly — you're billed only for hours in which a data point was published.

Why did my CloudWatch custom metrics bill jump without adding new metrics?

The most common cause is a high-cardinality dimension — a dimension value like customer ID, user ID, session ID, or request ID that generates a new billable metric identity for every unique value. A metric with a CustomerId dimension across 5,000 customers is billed as 5,000 separate metrics, not one.

What counts as a separate CloudWatch metric for billing?

The combination of namespace, metric name, and the complete set of dimension name/value pairs. Changing any dimension value creates a distinct billable metric identity, even when the metric name and namespace stay the same.

Is there a separate charge for the PutMetricData API besides per-metric storage?

Yes — publishing custom metrics via the PutMetricData API incurs its own per-request charge, separate from the per-metric monthly storage cost. Each PutMetricData call supports up to 1,000 distinct metrics and 1MB of request size, so batching data points into fewer calls reduces both API cost and the risk of CloudWatch's 400 throttling error.

Should I use CloudWatch custom metrics or logs for high-cardinality data?

Use logs and CloudWatch Logs Insights (or an APM tool) for high-cardinality data like per-customer or per-request detail. CloudWatch custom metrics are priced and designed for low-cardinality aggregates you'll alarm on — dimensions like environment, region, or service name, not unique identifiers.

Related reading

  • → What CloudWatch alarms actually cost — and the three levers that reduce the bill
  • → CloudWatch metric math: how to build alarms no static threshold can match
  • → CloudWatch Logs Insights queries: the practical library
  • → Run a free Nuberio Audit — see what's actually being monitored

Not sure your alarm coverage is actually solid?

Run a free Nuberio Audit — hygiene score, missing alarms, and security findings in about 5 minutes.

Run free audit →
N

Nitesh Bhavsar

Founder, Nuberio

Published

August 2026

Updated

August 2026

Have feedback? nitesh@nuberio.com