DynamoDB pricing is a price per million read and write requests in on-demand mode or per hour of provisioned read and write capacity units in provisioned mode, per GB-month of stored data by table class, per GB-month for backups and point-in-time recovery, plus a price per replicated write unit for global tables, per request for streams and per GB for export, import and restore. On the bill, write units dominate on tables with traffic, because a write unit costs five times a read unit in Frankfurt, and storage dominates on tables that keep history.
Pricing dimensions
DynamoDB prices throughput and storage separately, and throughput has two modes with units of their own: on-demand counts requests, provisioned counts provisioned units per hour, used or not. The unit is the same work in both cases, a read of up to 4 KB or a write of up to 1 KB, and the table class shifts the price between storage and throughput. Every dimension carries its own usage type.
| Dimension | Unit | What drives it | Optional |
|---|---|---|---|
| Read and write requests (on-demand) | Million read request units and write request units | Every request: 1 RRU per 4 KB for a strongly consistent read, half for eventual consistency, double for transactions; 1 WRU per 1 KB, double for transactions | Yes, instead of provisioned |
| Provisioned capacity | Hour per read capacity unit and write capacity unit | The configured capacity per second, used or not; auto scaling moves it between minimum and maximum | Yes, instead of on-demand |
| Storage | GB-month of raw data plus 100 bytes per item, the first 25 GB free | Items, local secondary indexes and global secondary indexes, which count as tables of their own | No |
| Table class Standard-IA | Storage at 40 percent and throughput at 125 percent of the Standard price | Tables where storage dominates the cost | Yes |
| Global tables | Replicated write request units or replicated write capacity units per replica region | Every write, once into every replica region; reads and storage per region as on a single table | Yes |
| Backups | GB-month for on-demand backups; GB-month of the table size for point-in-time recovery; GB per restore | Table size with local secondary indexes, retention up to 35 days for PITR | Yes |
| Streams and change data capture | Streams read request units per GetRecords call, the first 2.5 million a month free; change data capture units per write up to 1 KB for Kinesis Data Streams | Every consumer of the stream; Lambda triggers read free of charge | Yes |
| Export and import | GB exported to S3, GB imported from S3 | Full and incremental exports, imports into new tables | Yes |
| Data transfer | GB to other regions; within the region and inbound free | Access from other regions, replication | Yes (data transfer pricing) |
| Purchase option | Reserved provisioned capacity in blocks of 100 units, one or three years, with an upfront payment | Provisioned only, Standard class only, one region only | Yes (reserved capacity for managed services) |
The unit is what both modes share: a strongly consistent read of an item up to 4 KB costs one unit, an eventually consistent read half a unit and a transactional read two; a write of an item up to 1 KB costs one unit, a transactional write two. Larger items are rounded up to the next boundary, so a 10 KB item needs ten write units and, for a strongly consistent read, three read units. Global secondary indexes consume units of their own for every write that changes them, and storage of their own.
In on-demand mode you pay per million of these units for what the table actually consumes, and DynamoDB scales without configuration; in provisioned mode you set units per second and pay them per hour whether the traffic comes or not, with auto scaling adjusting the figure within a range to the utilisation, with a delay of minutes. The price list shows the difference: a million on-demand write units costs USD 0.7625 in Frankfurt, a provisioned write capacity unit USD 0.000793 per hour; one unit per second for a month equals 2.63 million requests, so provisioned is cheaper as soon as the provisioned capacity is more than about 29 percent utilised. The free allowance of 25 units per direction, 25 GB of storage and 2.5 million stream requests a month applies only to provisioned capacity in the Standard class and does not expire.
The Standard-IA table class trades storage for throughput: storage costs 40 percent of the Standard price, requests and capacity 125 percent. It pays off for tables whose storage costs more than their throughput, such as logs and histories, and not for tables that are written constantly. Global tables charge every write once in every replica region as a replicated write unit, at a price above the plain write unit; reads and storage accrue per region as on a single table, and adding a replica costs a restore per GB.
How it appears in your billing data
In the Cost and Usage Report the lines carry the product code AmazonDynamoDB, lineItem/ResourceId the table's ARN and the usage type the dimension; the prefix is the region code, EUC1 for Frankfurt. On-demand appears as EUC1-ReadRequestUnits and EUC1-WriteRequestUnits with lineItem/Operation PayPerRequestThroughput, provisioned as EUC1-ReadCapacityUnit-Hrs and EUC1-WriteCapacityUnit-Hrs with the operation CommittedThroughput; the Standard-IA class carries IA- after the region code, such as EUC1-IA-WriteRequestUnits, and global tables replace Write with ReplWrite, such as EUC1-ReplWriteCapacityUnit-Hrs. The free allowance appears as a line of the same usage type at a price of 0 for the first 18,600 unit-hours a month, which is 25 units over 744 hours.
Storage appears as EUC1-TimedStorage-ByteHrs and EUC1-IA-TimedStorage-ByteHrs in GB-months, backups as EUC1-TimedBackupStorage-ByteHrs for on-demand backups and EUC1-TimedPITRStorage-ByteHrs for point-in-time recovery, restores as EUC1-RestoreDataSize-Bytes, export and import as EUC1-ExportDataSize-Bytes, EUC1-IncrementalExportDataSize-Bytes and EUC1-ImportDataSize-Bytes per GB. Streams appear as EUC1-Streams-Requests with the operation GetRecords, change data capture to Kinesis as EUC1-ChangeDataCaptureUnits-Kinesis. The lines of a global secondary index merge into the table; a split per index comes only from CloudWatch with ConsumedReadCapacityUnits and ConsumedWriteCapacityUnits per index.
What the report does not show is utilisation: a WriteCapacityUnit-Hrs line names the provisioned hours, not the consumed ones, and only the comparison with ConsumedWriteCapacityUnits in CloudWatch says how much of it was work. The report's structure is described in the AWS Cost and Usage Report. In the FOCUS export, ServiceName carries Amazon DynamoDB and x_ServiceCode AmazonDynamoDB; requests, capacity, storage and backups are ChargeCategory Usage, reserved capacity PricingCategory Committed and its upfront payment ChargeCategory Purchase (FOCUS columns).
Levers
Configuration: the capacity mode is the first lever: on-demand for irregular or unknown traffic and for tables that mostly rest; provisioned with auto scaling for steady load where utilisation stays above the break-even point; the switch is possible up to four times in a rolling 24 hours. Item size is the second, because every started kilobyte costs a write unit: attributes that are never read, large blobs and long attribute names belong in S3 or shortened. The third is the read pattern: eventually consistent reads halve the read units, transactions double both, and a scan reads the whole table. The method is in database optimisation.
Purchase option: for provisioned capacity in the Standard class, reserved capacity lowers the hourly price against an upfront payment over one or three years, in blocks of 100 units per region; it does not apply to on-demand, Standard-IA and replicated write units. What gets reserved is the baseline that auto scaling never goes below (commitment strategy).
Architecture: the Standard-IA class for tables whose storage dominates the cost; TTL for items that expire, because deletion through TTL costs no write units; global secondary indexes with only the projected attributes the query needs, because every index doubles storage and write units. Global tables only for regions that are read from, because every replica region pays all the writes. The dimensions across all three providers are set side by side in managed databases.
Where it goes wrong
- Provisioned pays hours, not work. A table with 1,000 provisioned write units that consumes 50 per second pays 1,000 per hour.
ConsumedWriteCapacityUnitsagainstProvisionedWriteCapacityUnitsin CloudWatch shows the gap; auto scaling or on-demand closes it. - On-demand under steady load. An evenly loaded table in on-demand mode pays about three and a half times per million requests what provisioned units cost at full utilisation. Tables whose consumption barely varies through the day belong in provisioned mode.
- The index doubles the write cost. Every global secondary index consumes write units of its own for every write that changes a projected attribute, and storage of its own. Indexes with
ALLprojection on tables with many writes are the usual candidates. - Transactions cost double.
TransactWriteItemsandTransactGetItemspay two units per item. Where a conditional write suffices, it halves the line. - PITR costs by table size, not by change. Point-in-time recovery charges the whole table per GB-month, even when almost nothing changes. On large, quiet tables a weekly on-demand backup is the cheaper form.
- Nobody reads the stream. Change data capture to Kinesis costs per write whether a consumer reads or not. Streams without consumers are switched off.
- Standard-IA under write load. A table with constant writes pays 125 percent of throughput in Standard-IA to save 60 percent of storage. The class pays off only when the storage line is larger than the throughput line.
Example
List prices in USD for Frankfurt (eu-central-1), read on 2026-10-21 from the AWS price list: on-demand costs USD 0.1525 per million read units and USD 0.7625 per million write units, provisioned USD 0.0001586 per read unit and USD 0.000793 per write unit and hour above the free allowance; storage costs USD 0.306 per GB-month above 25 GB, in Standard-IA USD 0.1224; replicated write units for global tables USD 0.7625 per million or USD 0.000793 per hour; on-demand backups USD 0.1224 and point-in-time recovery USD 0.2448 per GB-month, restores USD 0.1836 per GB, export USD 0.1224 per GB; streams USD 0.2448 per million read requests above 2.5 million, change data capture to Kinesis USD 0.122 per million units.
A table of 50 GB that receives 100 million writes and 300 million eventually consistent reads of items under 1 KB a month costs on-demand USD 76.25 for the write units, USD 22.88 for the 150 million read units and USD 7.65 for 25 GB of storage above the allowance, USD 106.78 in all. Spread evenly that is 38 writes and 57 read units per second; with 50 provisioned write units and 75 read units as a margin, provisioned costs (50 minus 25 free) × 730 × 0.000793 = USD 14.47 plus (75 minus 25) × 730 × 0.0001586 = USD 5.79 plus USD 7.65 of storage, USD 27.91 in all. The same table in Standard-IA costs on-demand USD 95.50 for the write units, USD 28.58 for the read units and USD 6.12 for 50 GB of storage without an allowance, USD 130.20 in all. Point-in-time recovery adds USD 12.24 a month for the 50 GB. The figures show that steady load in provisioned mode costs about a quarter of the on-demand price, that write units are the largest line in both modes, and that Standard-IA costs more on this table, because throughput exceeds storage.
Sources
Read on 2026-10-21. Prices: Amazon DynamoDB pricing, AWS Price List, offer AmazonDynamoDB for eu-central-1. Billing data: understanding DynamoDB billing, Cost and Usage Report columns: lineItem, FOCUS 1.0 with AWS columns. Service: read and write operations, provisioned throughput, table classes, global tables.