This page explains what Hermetry writes when a flow saves a reading, and why. Knowing this helps you predict what a chart or the API returns, and why some values appear in one place but not in another.
Only flows store data
A device message is stored because a flow says so. Every organisation starts with a Default root flow that receives every device message and saves telemetry and client attributes. The Save telemetry block is the only way telemetry is written:
- Remove the block (or the branch that leads to it) and the readings are no longer stored. The device still shows as online, because the connection is tracked separately.
- Only
msg.payloadis stored. The message’s metadata (the topic, the transport, the device name) is never stored. - A test run of a flow never stores anything.
See Hosts, the root flow and profile root flows.
One row per message
When the Save telemetry block writes a record, the store adds one row for the whole record, not one row per key:
| Part of the row | Holds |
|---|---|
| Device and time | The device’s id and the record’s timestamp (milliseconds, UTC) |
| Numbers | Every numeric value, stored by key id |
| Other values | Booleans, text and JSON values, stored by key name |
| Message fingerprint | A hash of the values, used to recognise the same message delivered twice |
A record with 8 keys is one row. This keeps storage compact and lets the API return a whole message at once.
The key dictionary
Each key your organisation uses gets a small number in a per-organisation dictionary the first time it is stored. The dictionary is shared by all your devices: temperature is one key whether one device or ten thousand send it.
- Keys are never renamed or reused. A key stays in the dictionary after the devices that sent it are deleted.
- Your plan may cap the number of distinct keys. A new key over the cap is not stored, while the other keys of the same record are. See Telemetry keys.
Latest values
Next to the history, the store keeps one latest value per device and key, with its timestamp. Dashboards’ value cards, the device’s Telemetry tab and the Latest values flow block read it.
The latest value moves only to a strictly newer timestamp:
- A reading with an older timestamp (a buffered backlog arriving after a newer one) is stored in the history but does not replace the latest value.
- A corrected re-send with the same timestamp is stored as its own message if its values differ, but the latest value keeps the first one.
This way history, latest values and the live view always agree.
Aggregates and rollups
Numbers are also summarised so that long time windows read quickly:
| Level | Content | Filled by |
|---|---|---|
| 1-minute aggregates | Per numeric key and minute: sum, count, min, max and the last value | A job that runs every minute |
| Hour rollups | The same five figures per hour | Derived from the minute aggregates |
| Day rollups | The same five figures per day (UTC) | Derived from the minute aggregates |
Text, booleans and JSON values are not aggregated. A reading that arrives late for a minute that was already summarised marks that minute for another pass, so late data is folded in. See Aggregates and rollups.
Which source a read uses
| Time window | Read from |
|---|---|
| Up to 24 hours | The raw message rows (every reading) |
| Longer | The finest rollup that stays under 10,000 buckets: minutes, then hours, then days |
You can also ask for a specific resolution in the API. See The history API.
Retention
Each level is kept for its own time. Raw rows are kept for at most 90 days, minute aggregates for at most 31 days, and hour and day rollups for the full retention class of your plan. See How long data is kept.
Live values
After a save is committed, the new values are pushed to open dashboards and device pages that watch the device. A value that was not saved (for example a key the root flow filters out) never appears live. Live delivery is at most four updates a second per key; in-between values are still stored.
When a device is deleted
Deleting a device removes its readings, minute aggregates, rollups and latest values in the background, one day of data at a time. The keys it used stay in the dictionary.
Counting
| Counter | Meaning |
|---|---|
| IoT messages | Telemetry and attribute messages accepted from devices, counted when they arrive, whether or not a flow stores them |
| IoT data points stored | The values the store actually inserted. A duplicate dropped by the store is not counted. No quota. |

