Skip to main content

AI & assistant-friendly summary

This section provides structured content for AI assistants and search engines. You can cite or summarize it when referencing this page.

Summary

import PricingHeroStats from '~/components/blog/PricingHeroStats. astro'; import PricingDimensionTable from '~/components/blog/PricingDimensionTable. astro'; import BillSurpriseCallout from '~/components/blog/BillSurpriseCallout

Key Facts

  • DynamoDB on-demand bills $1
  • 25 per million writes and $0
  • 25 per million reads — pay-per-request convenience with no capacity planning
  • Provisioned at $0
  • 00065/WCU-hour wins on steady traffic above ~50% utilization

Entity Definitions

Lambda
Lambda is an AWS service discussed in this article.
S3
S3 is an AWS service discussed in this article.
RDS
RDS is an AWS service discussed in this article.
DynamoDB
DynamoDB is an AWS service discussed in this article.
Amazon DynamoDB
Amazon DynamoDB is an AWS service discussed in this article.
CloudWatch
CloudWatch is an AWS service discussed in this article.
cost optimization
cost optimization is a cloud computing concept discussed in this article.

Amazon DynamoDB Pricing: The On-Demand vs Provisioned Crossover and the GSI Multiplier

Quick summary: DynamoDB on-demand bills $1.25 per million writes and $0.25 per million reads — pay-per-request convenience with no capacity planning. Provisioned at $0.00065/WCU-hour wins on steady traffic above ~50% utilization. Every GSI doubles the write cost, IA tier cuts storage 60% but adds 25% to request fees, and Global Tables compound the bill per region.

Key Takeaways

  • DynamoDB on-demand bills $1
  • 25 per million writes and $0
  • 25 per million reads — pay-per-request convenience with no capacity planning
  • Provisioned at $0
  • 00065/WCU-hour wins on steady traffic above ~50% utilization
Amazon DynamoDB Pricing: The On-Demand vs Provisioned Crossover and the GSI Multiplier
Table of Contents

Amazon DynamoDB has the most flexible pricing model of any AWS database — on-demand for unpredictable traffic, provisioned for steady throughput, two storage classes, optional PITR, Global Tables for multi-region, DAX for caching, Streams for event-driven downstream. The flexibility is the problem. Every dimension represents a cost decision and the wrong default — on-demand for a steady workload, three GSIs when one would do, Standard storage for cold data, PITR on every table — compounds into a bill multiple times what the workload would cost with thoughtful configuration.

This post is the bill story. For DynamoDB single-table modeling and access pattern design, see our DynamoDB single-table design patterns guide. For the RDS-vs-DynamoDB architectural choice, the DynamoDB vs RDS comparison covers when each primitive is right.

The Nine DynamoDB Billing Dimensions

DynamoDB pricing breakdown — us-east-1, June 2026

Prices in us-east-1

Capacity mode, storage class, and replication topology are the dominant decisions. Streams, backup, and DAX are smaller but compound.

On-demand writes

$25

1 WRU = 1 KB write

Unit price
$1.25 / million WRU
Example workload
20M writes / month

On-demand reads

$50

1 RRU = 4 KB strongly-consistent read

Unit price
$0.25 / million RRU
Example workload
200M strongly-consistent reads

Provisioned WCU

$237

Pay for capacity whether used or not

Unit price
$0.00065 / WCU-hour
Example workload
500 WCU steady

Provisioned RCU

$95

Strongly-consistent uses 1 RCU per 4 KB

Unit price
$0.00013 / RCU-hour
Example workload
1000 RCU steady

Standard storage

$125

Includes 25 GB free

Unit price
$0.25 / GB-month
Example workload
500 GB table

Standard-IA storage

$50

Request units cost 25% more

Unit price
$0.10 / GB-month
Example workload
500 GB cold-tier table

PITR continuous backup

$40

35-day per-second recoverability

Unit price
$0.20 / GB-month of source data
Example workload
200 GB table

On-demand backup

~$20 + restores

Half the cost of PITR for snapshot-style backup

Unit price
$0.10 / GB-month + $0.15/GB restore
Example workload
Daily 200 GB snapshots

DynamoDB Streams reads

$1

First 100K per account per month free

Unit price
$0.02 / 100K reads
Example workload
5M Streams reads / month

Global Tables (per replica region)

~2× single-region cost

Plus inter-region transfer for replication

Unit price
Each region: full storage + rWCU writes
Example workload
2-region Global Table

DAX (caching layer)

~$100

Reduces RCU consumption when cache hit rate is high

Unit price
Per-node-hour by instance type
Example workload
3-node dax.t3.medium cluster

Storage cost includes 25 GB free per month per account. Request costs (WRU/RRU/WCU/RCU) start billing from the first unit.

The On-Demand vs Provisioned Crossover

The headline DynamoDB cost decision: capacity mode. On-demand is convenient — no capacity planning, no provisioned-throughput-exceeded errors, scales instantly. Provisioned is cheaper at steady utilization but requires sizing decisions and auto-scaling configuration.

The break-even math:

On-demand vs provisioned — break-even by utilization

Prices in us-east-1

Same workload throughput; different capacity mode. Provisioned wins when utilization stays above ~50% sustained.

On-demand 100 writes/sec

~$325/mo

$1.25/M baseline

Unit price
~260M writes/month
Example workload
100 WPS × 730 hours × 3600s

Provisioned 100 WCU (matches on-demand peak)

~$47/mo

85% cheaper at 100% utilization

Unit price
100 WCU × 730h × $0.00065
Example workload
Always-on capacity

Provisioned 100 WCU at 50% utilization

~$47/mo

Still cheaper than on-demand

Unit price
Same fixed cost
Example workload
Wasted half the capacity

Provisioned 100 WCU at 25% utilization

~$47/mo

Now equivalent to on-demand at 25M writes

Unit price
Same fixed cost
Example workload
Significantly over-provisioned

Provisioned 100 WCU at 10% utilization

~$47/mo

On-demand at $0.0325/mo (no waste) is cheaper

Unit price
Same fixed cost
Example workload
Bursty / idle workload

Auto-scaling on provisioned narrows the on-demand gap but lags traffic by minutes. For very bursty traffic, on-demand absorbs spikes provisioned cannot.

The decision tree:

  • Predictable, steady, high-utilization workload: provisioned with auto-scaling.
  • Variable, bursty, unpredictable workload: on-demand.
  • New workload with unknown traffic pattern: start on-demand; switch to provisioned once traffic stabilizes and the steady-state rate is known.
  • Mixed workload (steady base + occasional spikes): provisioned for the base + on-demand for spike absorption is not directly supported, but auto-scaling provisioned with conservative max-capacity acts similarly.

The GSI Multiplier

Every Global Secondary Index that includes the attributes of a write incurs an additional WRU/WCU at the same rate as the base table write. A table with 3 GSIs costs 4× the write capacity per write (base + 3 indexes).

The mitigations:

  1. Sparse GSIs. Only records with a non-null value in the GSI partition key are indexed. For predicates that match a small subset of rows, sparse GSIs dramatically reduce the multiplier.
  2. Single-table design. Group multiple entity types into one table with the same key structure; fewer GSIs serve the same access patterns. See our single-table design guide.
  3. GSI projection. GSIs can project all attributes, only key attributes, or a subset. Smaller projections cost less in storage; the write capacity is the same regardless.
  4. Eventually consistent reads on GSIs. GSIs only support eventually consistent reads by default, which cost half the RCU of strongly consistent.

Standard-IA Storage: Cheap When Cold

DynamoDB Standard-IA storage at $0.10/GB-month is 60% cheaper than Standard at $0.25/GB-month — but read and write request units cost 25% more. The crossover is access frequency: data accessed less than roughly 3% of the time benefits from IA; hotter data costs more on IA than Standard.

The common use cases for IA:

  • Audit logs with 7-year retention but rare query.
  • Historical session data archived after the session ends.
  • Time-series tables with hot/cold partitioning where old partitions are rarely read.
  • Tenant-archive tables for inactive customers in B2B SaaS.

The waste pattern: enabling IA on hot tables. The 25% request-unit premium on a high-traffic table exceeds the 60% storage saving when reads/writes dominate the bill.

Global Tables: Each Region Is Full Cost

Global Tables provide multi-region active-active replication for DynamoDB. The pricing model: each region bills its own storage, read/write capacity, and the replicated writes from other regions (rWCUs at the standard per-WCU rate).

A 2-region Global Table effectively doubles the write cost — every write applies in both regions. Add the inter-region replication data transfer at $0.02/GB and the bill grows further. A 3-region Global Table triples the write cost; a 5-region setup quintuples it.

PITR vs On-Demand Backup

PITR at $0.20/GB-month of source table data is roughly 2× the on-demand backup warm-storage rate ($0.10/GB-month). The premium pays for per-second recoverability over the last 35 days.

The right choice depends on RPO:

  • PITR: applications requiring per-second recovery (financial transactions, ordered event sourcing).
  • On-demand backup with daily schedule: most other workloads. The point-in-time precision of 24-hour granularity is acceptable for most operational restore use cases.

Enabling PITR by default on every table is the most common DynamoDB backup waste pattern. Be deliberate about which tables require per-second recovery.

When to Use Each Capacity / Storage Configuration

On-demand for bursty / new workloads; provisioned for predictable steady traffic; IA for cold data; PITR only when RPO requires per-second precision.

Use when

  • On-demand: bursty traffic, unpredictable load, new workloads with unknown shape, dev / test environments
  • Provisioned with auto-scaling: steady production traffic above ~50% utilization, well-understood workload
  • Reserved Capacity: very predictable, very-high-volume legacy workloads (uncommon for new development)
  • Standard-IA storage: audit logs, archived sessions, cold partitions of time-series, inactive tenants
  • PITR: financial transactions, state-machine workflows requiring per-second recovery, regulated workloads
  • Global Tables: multi-region active-active applications, low-RPO cross-region DR
  • DAX: read-heavy workloads with high cache-hit potential (top-N queries, hot keys)

Avoid when

  • On-demand for steady high-utilization workloads — provisioned is dramatically cheaper
  • GSIs without explicit access-pattern justification — each one multiplies write cost
  • IA storage on hot tables — the request-unit premium exceeds the storage saving
  • PITR enabled by default — only enable where per-second recovery is required
  • Global Tables for read-only multi-region — DAX or app-side cache is cheaper
  • Reserved Capacity on tables with traffic uncertainty — auto-scaling provisioned is more flexible

DynamoDB cost optimization is largely capacity-mode and index-strategy decisions, not run-time tuning. Get them right at design time.

A 30-Day DynamoDB Bill Cleanup Plan

Week 1 — Capacity mode audit. For each table, check the CloudWatch ConsumedReadCapacityUnits and ConsumedWriteCapacityUnits against the on-demand vs provisioned crossover. Switch over-provisioned-on-demand tables to provisioned, and switch under-utilized-provisioned tables to on-demand (or right-size the provisioned capacity).

Week 2 — GSI audit. For each table, list GSIs and verify each one serves a high-value query pattern. Drop unused GSIs. For GSIs with low predicate match rates, evaluate converting to sparse GSIs.

Week 3 — Storage class evaluation. Identify tables with cold-tier characteristics (low access frequency, large size, retention-focused). Migrate eligible tables to Standard-IA.

Week 4 — PITR and Global Tables scope. Review PITR-enabled tables; disable on tables where daily on-demand backup would suffice. Review Global Tables setup; evaluate whether read-only secondary regions could be served by DAX instead.

What This Post Doesn’t Cover

  • DynamoDB Streams + Lambda design patterns — covered in our event-driven architecture content.
  • DAX deployment patterns and sizing — covered in our caching architecture content.
  • Migration from DynamoDB to RDS or vice versa — covered in the DynamoDB vs RDS comparison.
  • DynamoDB Exports to S3 — useful pattern for analytics; bills at $0.10/GB exported plus standard S3 storage.

If You Only Do One Thing This Week

Audit your largest table’s capacity mode against actual utilization. Run a CloudWatch query for ConsumedReadCapacityUnits and ConsumedWriteCapacityUnits over the last 30 days, calculate the average and 95th percentile. If you are on on-demand with sustained utilization that would translate to >50% of a provisioned setup, switch to provisioned with auto-scaling — typical savings 50–70% on the request cost. If you are on provisioned with utilization consistently below 30%, switch to on-demand. The change is a single API call (update-table --billing-mode) and applies immediately.

For the broader data-modeling decisions that affect cost — single-table design, access patterns, key strategy — the DynamoDB single-table design patterns guide covers the design side.

PP
Palaniappan P

AWS Cloud Architect & AI Expert

AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.

AWS ArchitectureCloud MigrationGenAI on AWSCost OptimizationDevOps

Recommended Reading

Explore All Articles »
4 min

Amazon MQ Pricing: $700/Month Before Your First Message

Amazon MQ bills per broker instance hour — an mq.m5.large active/standby HA pair is ~$440/month before storage. Add EFS or EBS for the broker, and a typical production HA deployment lands at $700+/month with zero messages flowing. Use MQ only when AMQP, JMS, STOMP, MQTT, or OpenWire protocol compatibility is non-negotiable.