- March 27, 2025
Not enough time? Get the key points instantly.
A fleet of 5,000 sensors reports every 30 seconds. Nobody planned it that way - it just defaulted to the SDK's example code. Six months in, the AWS IoT Core bill is three times the compute cost, and nobody on the team can say why until someone finally checks the message count.
This is the version of cloud overspend that generic cost-optimization advice misses entirely. Right-sizing VMs and killing idle instances matters, but it doesn't touch the cost structure unique to IoT: per-message ingestion fees, telemetry storage that grows every second a device is alive, and protocol choices made in firmware that show up as a line item on the cloud bill months later.
By the end of this post, you'll know how cloud cost optimization for IoT actually works - where message frequency, protocol overhead, storage tiering, and backend architecture drive the bill and which of these to fix first.
Standard cloud cost optimization targets compute, storage, and networking as if every workload behaves the same way. IoT workloads don't. A device fleet doesn't run a handful of large jobs - it runs millions of tiny, constant transactions, and the cost structure follows that shape.
Three things make IoT cloud cost different from a typical web application's cloud bill:
Volume, not size. A single IoT message might cost fractions of a cent, but multiplied across thousands of devices reporting every few seconds, that becomes the dominant line item not the backend compute processing the data.
The cost decision often happens in firmware, not cloud config. How often a device reports, and over what protocol, is set in firmware long before anyone looks at a cloud bill. By the time cost becomes visible, the decision that caused it shipped months earlier.
Storage grows continuously, not in bursts. A web app's storage grows with user activity. A device fleet's storage grows every second every device is powered on, whether anyone ever looks at that data again or not.
Fixing IoT cloud cost means fixing these three, not applying a generic VM right-sizing checklist to a workload that was never VM-shaped to begin with.
Every IoT platform charges per message, per connection-minute, or both. A device reporting every 30 seconds generates 2,880 messages a day. The same device reporting every 5 minutes generates 288 - a 90% reduction in ingestion volume for most sensor use cases where nothing changes that fast anyway.
The fix starts with a simple question: does the application actually need this reporting interval, or did it default to whatever the SDK example used? For most environmental and industrial sensors, values change slowly enough that a 5-minute interval loses nothing meaningful while cutting ingestion cost by an order of magnitude.
Where faster reporting genuinely matters - safety-critical alerts, real-time control loops — keep it. The point isn't reporting less everywhere. It's reporting at the frequency the use case actually requires, because every unnecessary message is a permanent, compounding cost that scales with fleet size.
Protocol choice affects cost because it changes how much overhead rides along with every message. MQTT and HTTP solve the same basic problem differently, and the difference shows up directly in cloud spend at scale.
HTTP opens a new connection for every request, carrying full header overhead each time. MQTT keeps a persistent connection open and sends much smaller messages over it. For a device reporting frequently, that overhead difference compounds across millions of messages a month.
Factor | HTTP | MQTT |
|---|---|---|
Connection model | New connection per request | Persistent connection |
Message overhead | High - full headers each time | Low - lightweight after connection |
Best for | Infrequent, request - response calls | Frequent, streaming telemetry |
Cost impact at scale | Higher ingestion and connection cost | Lower per-message cost |
For a fleet reporting more than a few times an hour, MQTT is almost always the cheaper choice at scale, because the connection overhead HTTP pays for every single message becomes the dominant cost once message volume gets high enough.
A device that's been live for two years has generated two years of readings, most of which nobody has queried since the week they were recorded. Storing all of it in the same high-performance tier the application uses for recent, active queries is the single most common source of IoT storage overspend.
Tiering telemetry by age solves this directly:
Hot tier for recent data actively queried by dashboards and alerts - typically the last 30 to 90 days.
Warm tier for data still occasionally needed for trend analysis, at a lower cost per gigabyte.
Cold or archive tier for historical data kept for compliance or rare lookback, at the lowest cost, accepted with slower retrieval time.
A time-series database with built-in downsampling helps further keeping full-resolution data for the recent hot window, then automatically compressing older data into hourly or daily aggregates instead of raw per-second readings. Most historical analysis doesn't need per-second granularity from two years ago; it needs the trend.
The backend processing incoming device data is the other place architecture directly drives cost. An always-on server processing telemetry costs the same at 3am with no devices reporting as it does at peak traffic. A serverless ingestion function costs nothing during those idle gaps and scales automatically during bursts.
Approach | Cost behavior | Best for |
|---|---|---|
Always on backend | Fixed cost regardless of traffic | Consistent, high, predictable message volume |
Serverless ingestion | Scales with actual traffic , near zero at idle | Variable or bursty device reporting patterns |
Fleets with steady, predictable, high-volume traffic sometimes see always-on infrastructure come out cheaper once volume is high enough that serverless per-invocation pricing exceeds a reserved instance's flat cost - this crossover point depends on actual message volume and needs to be checked against current provider pricing rather than assumed either way. For most fleets with variable reporting patterns, though, serverless avoids paying for idle capacity that a fixed-size backend can't avoid.
Do you know your actual message-per-device-per-day rate, or is it still whatever the SDK defaulted to? This is usually the single most impactful number to check first.
Is your protocol choice matched to your reporting frequency, or was it chosen for development convenience? HTTP is fine for infrequent calls; it gets expensive fast at high message volume.
Does your telemetry storage tier by age, or does two-year-old data sit in the same tier as this week's readings? This is usually the largest unexamined storage cost.
Does your ingestion backend cost scale with actual device traffic, or does it cost the same at 3am as it does at peak?
The most common cause is message volume - a fleet reporting more frequently than the use case requires generates ingestion costs that compound with every added device. Check your actual messages-per-device-per-day rate against what the application genuinely needs before assuming the platform's base pricing is the issue.
For devices reporting more than a few times per hour, generally yes - MQTT's persistent connection avoids the header overhead HTTP pays on every request, and that overhead compounds significantly across high message volumes. For infrequent, request-response style calls, the difference matters less.
Savings depend on how much historical data exists and how rarely it's accessed, but moving data older than 90 days from a hot tier to a cold or archive tier commonly cuts storage cost substantially, since archive-tier pricing is typically a fraction of hot-tier pricing per gigabyte.
Not always - it depends on traffic pattern and volume. Serverless generally wins for variable or bursty reporting since it avoids paying for idle capacity, but very high, consistent message volume can sometimes make a reserved always-on instance cheaper past a certain scale. This needs to be checked against actual traffic data, not assumed.
A team that understands both the cloud platform's pricing model and the firmware-level decisions (reporting interval, protocol choice) that drive it - since the two are connected, and optimizing one without the other only catches part of the problem.
Cloud cost optimization for IoT deployments starts with the decisions that generic cost checklists never touch: message frequency, protocol overhead, and storage tiering by data age. Fixing VM sizing and killing idle instances still matters, but for a device fleet, the real budget drain is almost always upstream of the backend - in how often devices report and what protocol carries that data.
If you're seeing IoT cloud costs grow faster than your device fleet and want a real breakdown of where that spend is actually coming from, CoreFragment's team can review your device reporting patterns and backend architecture together - not just your cloud bill in isolation.