AI and dataReal-Time Data

Your dashboard is lying by twelve hours

Most dashboards show last night's numbers. How to tell which decisions can live with that, which need fresher data, and what to do if someone already acted on a stale number.

Cohash Data Practice June 2026 updated October 2026 11 min read 6 chapters 3-question check
part 1 of 5 · Data and AI that hold up in production
Twelve hours stale Overnightbatch lands Decision made ETL done 3 a.m. Meeting 3 p.m.

the ideaA dashboard number is only as fresh as its last load, so show its age.

after reading, you can
  • Before acting on a dashboard number, ask how old it is, and whether that age matters for the decision you're making.
  • Write a freshness SLO per consumer and put the measured lag on the dashboard it serves.
  • Put each feed on streaming, micro-batch or daily batch, depending on what the decision behind it actually needs.

Every dashboard carries a timestamp nobody reads. The overnight ETLdefinitionShort for extract, transform, load. A job, usually run overnight, copies data out of your systems, reshapes it and drops it into a warehouse. Your dashboards often read that copy. finished at 3 a.m., the meeting is at 3 p.m., and the number on screen is a description of yesterday. So before anyone acts on it, the honest question is: how old is the number you're about to make a decision with? For some decisions, twelve hours is fine. For others, it's the whole error.

in plain wordsPractice guide

Most dashboards show the last time data was copied, and that was often last night

Most company dashboards don't read your systems live. A scheduled job, usually overnight, copies data out of the order system, the CRM or the payment platform into a warehouse, and the dashboard draws from that copy. So when someone looks at the screen in an afternoon meeting, they're looking at a picture taken hours earlier. For a quarterly revenue chart that's fine. When someone has to decide whether to hold a suspicious payment or move stock between stores, the age of the number can be the whole mistake.

think of it like this

Think of a departures board at a station that only updates once a night. If you're checking next month's timetable, nobody minds. If you're using it to pick which platform to run to, a twelve-hour-old board sends you to the wrong train, and nothing on the board tells you it's old. Putting the time of the last update on the board is the cheapest fix.

who should care
  • Leaders who act on dashboard numbers
  • Finance, sales and operations teams
  • Teams handling fraud, stock or pricing
  • Data and analytics leads
  • Data engineers running pipelines
chapter 01

Why it matters to you

Data freshness only matters relative to the decision it feeds. A quarterly revenue view barely changes if it's a day old. The decisions below get worse by the minute, so they're the ones to find first.

  • Fraud holds
  • Inventory rebalancing
  • Surge pricing
  • Incident response

The failure mode is treating freshness as something the whole platform has ("we're a batch shop") instead of asking, decision by decision, what a twelve-hour-old input actually costs when it's wrong.

Staleness works like a tax on those decisions. Nobody sees the bill, because the number on screen looks just as confident at 3 p.m. as it did when the load finished at 3 a.m. A payment that should have been held goes through, or stock moves to the store that didn't need it, and the dashboard was right about yesterday the whole time.

how it worksAn order comes in, then waits for the 3 a.m. load before anyone sees itEach step adds delay. The overnight copy usually adds the most, and the dashboard rarely shows any of it.
  1. 01 An order gets copied out overnight

    An overnight ETL job copies it to the warehouse, so it can wait hours before anyone sees it. A change data capture stream would move it in seconds.

  2. 02 The pipeline adds it up

    Totals get worked out per hour or per day. Events that turn up late, say from a phone that was offline, need a rule for whether they still count.

  3. 03 The dashboard shows the result

    The chart draws from the warehouse copy. Unless someone puts the data's age on screen, an old number looks exactly like a live one.

  4. 04 Someone makes a decision

    Someone in the meeting holds a payment, moves stock or changes a price off that number. If it was twelve hours old and the decision needed minutes, they got it wrong without knowing.

For engineers, the age a reader cares about is the gap between event time in the source and the moment the number is on screen. Job success says nothing about it. A nightly ETL can finish green every night while the dashboard is still twelve hours behind by the afternoon meeting, and a streaming job can report healthy while a lagging partition holds the totals back.

chapter 02

What changes when you move off overnight batch

If you move from batch to streaming, the main change is in what you'll promise about freshness. The technology matters less. You stop saying "the data is from last night" and start promising, per feed, how far behind the source it's allowed to be.

side by sideSame data, same dashboards. The difference is whether anyone knows how old the number is when they act on it.
Batch everywhere
  • Every feed loads overnight, including the one someone uses to place fraud holds
  • Someone asks for "real-time everything". With no targets written down, it turns into a fight about opinions
  • A load fails overnight. Often someone spots a strange number in a meeting before anyone gets an alert
Tiered, with freshness SLOs
  • Each feed has a written lag target
  • Whoever reads the number sees its measured lag next to it. Nobody has to guess
  • Every fresher tier names the decision that pays for it
  • Lag breaches alert before the meeting

The practical tool is a freshness SLOdefinitionA written target for how far a data feed may fall behind its source, say a few minutes at most. You measure it continuously. per consumer: this feed will be no more than N minutes behind the source, measured continuously and displayed on the dashboard it serves. Writing those SLOs down does two things. It exposes which decisions are quietly running on stale inputs, and it kills the vague demand for "real-time everything" by attaching each freshness target to a consumer who has to justify it.

Standing up Kafka is the easy week. The engineering is in the semantics. Event time and processing time diverge the moment a mobile client goes offline or a partition lags, so every aggregation needs a watermarkdefinitionA streaming job's marker for how far event time has got, which decides when a time window closes and hands out a result. Late events after that are dropped or sent as corrections, depending on the policy. policy: how long to wait for late events, and what to do with the ones that arrive after the window closed (drop them, or emit a correction downstream consumers must handle). A dashboard that silently ignores late data is just wrong faster.

Delivery guarantees deserve the same scrutiny. Exactly-once within a Flink or Kafka Streams topology is real. End-to-end exactly-once across your CDC source, broker and warehouse sink is a design you build yourself, out of idempotent writesdefinitionWrites you can run once or several times and get the same result. They're why replaying events is safe: duplicates don't double-count., transactional sinks and keys that make replays safe.

Change data capturedefinitionStreaming every insert, update and delete out of a database's log as events, so other systems see changes as they happen. with Debezium is the right front door for operational databases, but plan for schema evolution and for backfill from day one. The first production incident will be replaying three hours of events, and replay safety is either designed in or it isn't.

Real-time is a promise about how stale a decision is allowed to be. It isn't a refresh rate.
freshness-sloexample output
# freshness is measured, not assumed
$ pipeline status --feed orders-live
source: postgres · debezium cdc
watermark lag: 42s  slo: < 120s
late events: 0.3% → corrections emitted downstream
✓ slo met · ✓ replay-safe · ✓ lag on the dashboard it serves

That terminal is example output, and the shape is what matters. The feed reports its watermark lag against its SLO, says what happens to late events, and confirms the lag is visible where people read the number. If your pipeline can't print those lines, nobody can tell you how old the dashboard is.

tableThree tiers and what each is for
TierHow freshFits decisions likeWhat it costs to run
True streamingSecondsFraud holds, incident responseA 24/7 distributed system with on-call, backpressure, state migrations and consumer-lag alerting
Incremental micro-batch or materialized viewsFive to fifteen minutesFeeds where a few minutes is indistinguishable from liveSmall, frequent batches that are simpler to operate than streaming
Honest daily batchOvernightThe quarterly revenue view and most reportingThe least. Show the data's age anyway.
chapter 03

What to do now

What to do now, by who you are

Business leaderthis week
  • List the decisions your team makes most often from a dashboard. Next to each, write how old the number can be before acting on it goes wrong.
  • Ask your data team how old each of those numbers is right now. If nobody can answer, that's your first finding.
  • Ask which decision pays for each request to make a feed real-time. Streaming runs around the clock, so someone on your team gets paged for it at night.
Data and analytics leadthis month
  • Write a freshness SLO for each dashboard that feeds a decision: no more than N minutes behind the source.
  • Put the measured lag on the dashboard itself, next to the number. Then its age is part of the number.
  • Pick a tier for each feed from its SLO, and write down which consumer asked for it.
Data engineersthis quarter
  • Give every streaming aggregation a watermark and a late-data policy. Decide how long to wait, then drop late events or emit corrections.
  • Make every sink safe to replay, with idempotent writes or transactional commits and keys that dedupe repeats.
  • If you run Debezium CDC, plan schema evolution and backfill now. The first production incident will be a replay.
Platform and on-callbefore go-live
  • Alert on consumer lag and on freshness SLO breaches. A job that finished can still leave the dashboard hours behind.
  • Put every streaming pipeline on an on-call rota. Backpressure and state migrations don't wait for office hours.
chapter 04

Harden so the next one hurts less

Streaming everything is how a data platform doubles its operational surface for the handful of feeds anyone needed fresh. That cost only pays off where the freshness SLO demands it. The architectures that hold up are tiered, and the tier for each feed follows from its written SLO.

before

Before: one overnight load feeds every dashboard

Every source is copied once a night into the warehouse. Fraud, stock and revenue dashboards all read the same twelve-hour-old copy, and none of them shows its age.

Before: one overnight load feeds every dashboard Every source is copied once a night into the warehouse. Fraud, stock and revenue dashboards all read the same twelve-hour-old copy, and none of them shows its age. 01 · SOURCES 02 · PIPELINE 03 · CONSUMERS nightly copy nightly copy 12 hours stale Orders database Postgres Payments platform Overnight ETL done by 3 a.m. Warehouse Every dashboard no age shown © Cohash · cohash.com
01 · SOURCES02 · PIPELINE03 · CONSUMERS Orders database: Postgres Orders database Postgres Payments platform Paymentsplatform Overnight ETL: done by 3 a.m. Overnight ETL done by 3 a.m. Warehouse Warehouse Every dashboard: no age shown Every dashboard no age shown nightly copy nightly copy © Cohash · cohash.com
after

After: each feed gets the tier its decision needs

Debezium streams database changes into Kafka. Seconds-level decisions read a streaming job, minutes-level feeds use micro-batch, and the rest stays on daily batch. Every dashboard shows its measured lag.

After: each feed gets the tier its decision needs Debezium streams database changes into Kafka. Seconds-level decisions read a streaming job, minutes-level feeds use micro-batch, and the rest stays on daily batch. Every dashboard shows its measured lag. 01 · SOURCES 02 · PIPELINE 03 · CONSUMERS change log seconds minutes overnight nightly copy Orders database Postgres Debezium CDC Kafka Streaming job watermarks, corrections Micro-batch every 5 to 15 minutes Daily batch Fraud holds lag under 120s Warehouse idempotent sinks Dashboards lag shown on screen © Cohash · cohash.com
01 · SOURCES02 · PIPELINE03 · CONSUMERS Orders database: Postgres Orders database Postgres Debezium CDC Debezium CDC Kafka Kafka Streaming job: watermarks, corrections Streaming job watermarks,corrections Micro-batch: every 5 to 15 minutes Micro-batch every 5 to 15minutes Daily batch Daily batch Fraud holds: lag under 120s Fraud holds lag under 120s Warehouse: idempotent sinks Warehouse idempotentsinks Dashboards: lag shown on screen Dashboards lag shown onscreen seconds minutes overnight nightly copy © Cohash · cohash.com

The durable fixes, in the order we'd do them

  1. 01
    Write the SLO before you pick the tier

    Start from the decision and how old its input may be. True streaming goes to decisions measured in seconds, micro-batch or materialized views to feeds where five to fifteen minutes is as good as live, and honest daily batch handles the rest.

  2. 02
    Make every tier upgrade name its decision

    The discipline is refusing to let "real-time" become a prestige label. Any request to move a feed up a tier has to name the decision that pays for it, and the person who owns that decision.

  3. 03
    Ship the lag metric with the dashboard

    Put the measured age next to the number on the dashboard it serves. The next time someone acts on a number, its age is part of the number, and they can see it was chosen.

  4. 04
    Design replay safety in from day one

    Use idempotent writes, transactional sinks and keys that make replays safe. Then rehearse a replay of a few hours of events, so the first real one isn't also the first test.

  5. 05
    Alert on staleness as well as on failure

    A job can finish successfully while its source stopped sending. Alert when lag breaks the SLO, so someone hears about it before the meeting, and not from the person reading the chart.

That's the fix for the twelve-hour lie. Staleness becomes something you can see, and something someone chose, where before it was invisible and inherited. Everything doesn't have to be instant.

chapter 05

If it goes wrong

If a decision was made on stale data

Sooner or later someone acts on a number that turns out to be hours old, or a pipeline quietly stops and the dashboard keeps showing the last good load. Work through these phases in order, and don't fix the pipeline before you know which decisions it touched.

  1. 01Confirmfirst hour
    • Find the last successful load for the feed behind the decision, and compare it with what the source system holds now.
    • Work out how old the number was at the moment the decision was made. That gap is what you're dealing with.
  2. 02Containsame day
    • Put a visible "data delayed" note on the affected dashboard, so nobody else acts on it.
    • Switch automated actions that read the same feed, like pricing rules or holds, to a safe fallback or manual review until it's current again.
  3. 03Correct the datadays 1 to 3
    • If the sinks aren't idempotent, clear or dedupe that window first so the replay doesn't count anything twice.
    • Reprocess late events the pipeline dropped, publish the corrected numbers, and tell downstream owners which ones changed.
  4. 04Revisit the decisionfirst week
    • Rerun the decision on current data. If the answer changes, reverse it where that's still worth doing, for example by releasing the hold or fixing the price.
    • Let the people affected know, customers too if they got a wrong price or a hold. Explain plainly what went wrong and what you've changed.
  5. 05Learnafter the fix
    • Write a freshness SLO for that feed if it didn't have one, and put its lag on the dashboard.
    • If an auditor or regulator relies on that report, write down what happened and what you changed. You may well be asked.
chapter 06

How this can play out

How this can play out

01 Store sales morning rush 02 Overnight ETL 3 a.m. load 03 Stockdashboard 12 hours old 04 Wrongtransfer
scenario 01Medium risk
A retailer moves stock using yesterday's numbers
the setup
A regional retailer's stock dashboard loads from an overnight batch. Store managers agree transfers in an afternoon meeting, reading straight off that dashboard.
what happens
A promotion empties one store by mid-morning. The dashboard still shows yesterday's stock, so the transfer goes to a store that didn't need it, and the empty shelf stays empty until the next load.
what to do
Give the stock feed a freshness SLO in minutes and move it to micro-batch. Show its lag on the dashboard. Leave the monthly sales report on daily batch, where it's fine.
01 Late events offline terminals 02 Flink window partition lag 03 Watermarkpolicy emit corrections 04 Silent drop
scenario 02Low risk
A payments team with a streaming fraud feed
the setup
A payments company streams card transactions through Kafka and Flink, so fraud holds go on within seconds. The team wrote a watermark and late-data policy before go-live.
what happens
A partition lags and some terminals and wallet apps send events late after being offline. The watermark waits for them, and the few that miss the window go downstream as corrections. Nothing gets dropped silently.
what to do
Keep alerting on consumer lag against the SLO, and make sure the fraud rules can handle a correction. Test it with a replay of a few hours of events.
01 Brokerincident 02 Replay three hours 03 Finance sink not idempotent 04 Revenue view double counted
scenario 03Medium risk
A company that moved every pipeline to streaming
the setup
A manufacturer converted every pipeline to streaming in one programme. Quarterly views, stock and orders all run as 24/7 jobs, and the on-call rota covers all of them.
what happens
After a broker incident the team replays three hours of events. The finance sink isn't idempotent, so orders are counted twice, and the revenue view is wrong until someone rebuilds it by hand.
what to do
Tier the pipelines by written SLO. Move the quarterly views back to daily batch, and make the remaining streaming sinks idempotent with keys that make replays safe.

Freshness is a big part of our data integration work. Where a decision needs fresher data we replace the overnight batch, and where it doesn't we leave it alone. The SLOs get written with the people who read each dashboard, and the lag goes on screen. If you'd like to know how old your own numbers are, start with an assessment.

key takeaways

What to take from this

  1. 01

    Give each decision its own freshness SLO and show the data's age right on the dashboard that serves it.

  2. 02

    Do the semantic work: watermarks and late-data policy, replay-safe idempotent sinks, CDC with schema evolution and backfill planned from day one.

  3. 03

    Tier the pipeline. Streaming is for places where seconds matter and micro-batch for where minutes do. Everything else can be honest batch.

  4. 04

    If someone acted on stale data, confirm the gap, warn readers, correct the data, then rerun the decision and reverse it if the answer changes.

fact-checked October 2026 against vendor and official documentation · where to go next
  1. Data integration
  2. Book a 30-minute working session with a senior engineer
01Our team decides things off a dashboard every morning. How do I find out how old its numbers are?

Ask whoever runs your data platform when the feed behind it last loaded from the source. A "last refreshed" time on the dashboard can be the moment it reloaded its copy, which doesn't tell you how old the copy is. The real fix is a measured lag shown next to the number.

02Do we need real-time data?

For some decisions, yes. Fraud holds, inventory rebalancing, surge pricing and incident response get worse by the minute. A quarterly revenue view doesn't. Write down how old each number may be before acting on it goes wrong, and only pay for streaming where that limit is seconds.

03Is streaming more expensive than overnight batch?

Usually. Part of it is compute that never switches off, and a lot of it is people's time. A streaming pipeline runs around the clock, so somebody is on call for it and it needs lag alerts and careful state migrations. Micro-batch every five to fifteen minutes covers a lot of feeds with far less work.

next step

Tell us what you're running. We'll tell you what we'd do first.

A 30-minute working session with a senior engineer. No slides.

useful to bring
  • The platform and the version you're on
  • Where you need to get to, and by when
  • What's custom: rules, plugins, integrations
  • Any audit finding or deadline driving it