TL;DR. AWS IoT Core pricing for a hypothetical fleet of 500 trucks sending a GPS ping every 10 seconds comes to $71.93 a month. The rule that writes each ping to S3 costs $270.00 more in PUT requests, so the downstream action is 79% of a $341.93 bill. Batching 30 pings into one message every 5 minutes cuts the total to $13.07, and the bill stops depending on the report interval.

AWS IoT Core pricing is cheap per message and expensive per habit. The meter that grows a fleet's bill is the number of messages, and every message a truck sends is multiplied again by whatever the rule does with it. The report interval and the rule action decide the bill; the device count barely does.

The model below takes its N. Virginia list rates from the AWS IoT price list, read November 5, 2026, and its metering rules from the AWS IoT Core pricing page. It is a worked model: no fleet ran.

What 500 trucks cost at 10, 30 and 60 seconds

Consider a hypothetical fleet of 500 trucks. Each telematics unit stays connected 24/7 and sends one GPS ping while the truck drives, 10 hours a day, 30 days a month. One IoT rule writes each ping to S3 with one action.

Report intervalMessages a monthIoT CoreIoT Core per truckS3 PUTs from the ruleTotalTotal per truck
10 s54,000,000$71.93$0.14$270.00$341.93$0.68
30 s18,000,000$25.13$0.05$90.00$115.13$0.23
60 s9,000,000$13.43$0.03$45.00$58.43$0.12
10 s, batched every 5 minutes1,800,000$4.07$0.01$9.00$13.07$0.03

Messages are 500 trucks x 30 days x 36,000 driving seconds / interval. IoT Core is connectivity ($1.73 for 500 trucks connected 24/7), messages at $1.00 per million, and $0.30 per million for one rule and one action. S3 PUTs are $0.005 per 1,000 in the S3 price list. The AWS free tier (500,000 messages for 12 months) is left out: it covers less than 1% of the 10-second fleet.

A line chart of the monthly cost for a hypothetical fleet of 500 trucks by GPS report interval, US East list prices. With one ping per message and a rule writing each ping to S3, the cost is $682 at 5 seconds, $342 at 10 seconds and $58 at 60 seconds. IoT Core charges alone are $72 at 10 seconds. Batching pings into one message every 5 minutes keeps the cost at $13 to $15 at every interval.

How AWS IoT Core bills a message: per publish, rounded up to 5 KB

Messaging is $54.00 of the $71.93 at 10 seconds. The pricing page says "Messages are metered in 5 KB increments. For example, an 8 KB message is metered as two messages." The rate is $1.00 per million for the first billion messages a month, $0.80 for the next 4 billion and $0.70 above, per the price list.

The tiers do not matter at fleet scale. A truck pinging every 10 seconds for 10 hours a day sends 108,000 messages a month, so a fleet reaches the first billion at about 9,259 trucks.

The other meters are small for a GPS feed:

MeterUS East list priceWhat counts
Connectivity$0.08 per million connection-minutesTime connected, in one-minute increments
Messaging$1.00 per million (first billion a month)Each publish in or delivery out, per 5 KB
Device Shadow and registry$1.25 per million operationsEach operation, per 1 KB of record
Rules engine$0.15 per million rules triggered, $0.15 per million actionsEach rule evaluation and action, per 5 KB

Connectivity is $0.042 per device per year for a 24/7 connection, in AWS's own example, and keep-alive pings "from 20 minutes to every 30 seconds" cost nothing extra. A parked truck that stays connected costs almost nothing; a moving truck that reports often costs messages.

Two habits multiply messages without anyone noticing:

  • A live map subscribed to every ping. AWS's pricing example bills a message delivered to five other devices as five more messages. One dashboard subscribed to the fleet's GPS topic doubles messaging: $54.00 more at 10 seconds.
  • A Device Shadow update per ping. With nine reported fields plus the timestamps AWS keeps for each, the shadow record stays under 1 KB, so each update is one shadow operation at $1.25 per million: updating the shadow on every 10-second ping adds $67.50 a month in shadow operations alone, almost as much as the $71.93 of IoT Core charges in the table.

What the report interval does to the bill: linear, and so does what it buys

Going from 60 seconds to 10 seconds multiplies the IoT Core charges by 5.4 ($13.43 to $71.93) and the total with S3 by 5.9 ($58.43 to $341.93). Everything except the $1.73 of connectivity scales with the message count, so halving the interval doubles nearly the whole bill.

The case for short intervals is real. At 100 km/h a truck covers about 278 meters between 10-second pings, 833 meters between 30-second pings and 1.67 km between 60-second pings. A dispatcher matching a truck to a dock door, or an ETA model that needs to see the truck leave the highway, may need the 10-second track. A daily route report or a mileage tax filing does not. Pick the interval for the most demanding reader, then batch for everyone else.

Batching pings under 5 KB: 30 pings, one message, 30 times fewer messages

One ping in the model is a 134-byte JSON object:

{"truck":"TRK-0412","ts":1762358400,"lat":43.65321,"lon":-79.38318,"spd_kmh":88.4,"hdg":271,"odo_km":412345.6,"ign":1,"fuel_pct":62.5}

Thirty of them in one JSON object, {"truck":"TRK-0412","pings":[...]}, come to 4,080 bytes: under the 5 KB increment, so one message, one rule and one action. The device still samples every 10 seconds and keeps the full 10-second track; it sends the batch every 5 minutes. Messages fall from 54 million to 1.8 million and the total from $341.93 to $13.07.

The batch has to stay under 5 KB. At 5-second sampling, 60 pings in the same object come to 8,130 bytes, which AWS meters as two messages, two rules and two actions; the total rises only to $15.41 because the S3 action still writes one object. With batching, the sampling rate stops setting the bill; the send interval does.

The cost of batching is latency: the cloud sees a position up to 5 minutes late. A fleet that needs both can send the batch every 5 minutes and one live ping a minute for the dispatch map, or send immediately on events such as a geofence exit.

Rules and Basic Ingest: drop the $54 of messaging when nothing subscribes

Basic Ingest publishes straight to a rule on the reserved topic $aws/rules/<rule_name>, and AWS's Basic Ingest guide says this sends data "without incurring messaging costs". At 10 seconds, IoT Core falls from $71.93 to $17.93: connectivity plus the rule and action.

The limit is in the same guide: "Your devices and rules can't subscribe to Basic Ingest reserved topics." A live map that subscribes to positions cannot read them there. Use Basic Ingest for the archive path and keep a broker topic only for what a subscriber reads.

The rules engine itself is cheap at $0.15 per million rules and $0.15 per million actions. AWS's pricing page meters "a rule that processes an 8 KB message and applies two actions" as "two rules and four actions", so each extra action on a rule and each extra 5 KB adds to the count.

What happens after IoT Core: the S3 action costs more than IoT Core

The S3 rule action "writes the data from an MQTT message to an Amazon Simple Storage Service (Amazon S3) bucket", and AWS recommends a key with "the message timestamp or another unique message identifier so that a new file is saved in Amazon S3 for each message received." One ping, one object, one PUT. At 10 seconds that is 54 million PUTs: $270.00 a month, 3.8 times the IoT Core charges. Storing the 54 million objects, about 7 GB of JSON, costs under $0.20 a month. The bill is in the requests, not the bytes.

Two fixes, priced on the same 10-second fleet:

  1. Batch on the device. Thirty pings per message mean 1.8 million objects and $9.00 of PUTs.
  2. Route the rule to Amazon Data Firehose instead. Firehose pricing bills Direct PUT ingestion "per GB ingested in 5KB increments", at $0.029 per GB for the first 500 TB in the Firehose price list. Fifty-four million pings billed at 5 KB each are about 257 GB, or $7.47 a month, using the 1,048,576 KB per GB that AWS's own Firehose example divides by.

Watch one setting if you combine the two. The Firehose rule action has a batchMode option, and when the rule's SQL returns an array, "each Array element forms one record". Unpacking 30 pings into 30 records brings back 54 million records billed at 5 KB each. Send the 4 KB batch as one record.

S3 is one destination. A team writing to Timestream should price it on its own meters, as in our AWS Timestream pricing model, and note that AWS has closed Timestream for LiveAnalytics to new customers. A lake of small objects nobody reads has a cost of its own, which our S3 storage cost measurement covers.

Where this model stops

The model counts list prices in US East for a fleet that drives 10 hours a day. A fleet running 24 hours a day, sending larger payloads such as engine fault codes, or using a Region with other rates will get other numbers; the structure holds. It leaves out the cellular data plans that telematics fleets pay to their carrier.

For devices on Azure, the same arithmetic on Microsoft's meters is in our plant sensor data cost on Azure post. And IoT Core is one line of a larger bill. Each stream also feeds pipelines and a warehouse downstream, which our guide to data pipeline cost prices per pipeline.

The question that settles the fleet's bill is who reads each stream, and how often. Datapace is building one map of your data estate (databases, warehouses, pipelines and what consumes them) with usage and cost attached, and agents that propose changes as pull requests your team reviews and merges. To price your own fleet's streams against who reads them, book a call.

Sources

  1. AWS, AWS IoT Core pricing, read November 5, 2026. AWS Price List API, US East: AWS IoT, Amazon S3, Amazon Data Firehose, read November 5, 2026.
  2. AWS IoT Core Developer Guide, Reducing messaging costs with Basic Ingest, S3 rule action and Firehose rule action.
  3. AWS, Amazon Data Firehose pricing, read November 5, 2026.