A Power BI refresh reports success but the dashboard still shows yesterday's numbers — how do you diagnose it?
answer
- a green job is not a fresh number
- which model did the schedule actually touch
- the clock does not know when the load finished
- only part of a table may be reprocessed
- a tile and a report page are not the same surface
basics
~20 sCheck what actually refreshed and when the source was ready. Common causes: you refreshed a different semantic model, incremental refresh touched only recent partitions, the upstream load finished after the schedule fired, or a cached dashboard tile lags the report.
solid answer
~50 sStart by proving *which* model refreshed and *what data* it read. Put a `MAX` of the fact date and a load-timestamp measure on the report itself, so freshness is data you can see rather than a refresh log you have to trust. Then work the list: the report may be bound to a second, duplicated semantic model that nobody schedules; **incremental refresh** may have reprocessed only the recent partitions while the change was historical; the upstream ETL may have finished *after* the schedule fired, so refresh succeeded against yesterday's source; a **dashboard tile** is a cached snapshot that updates after the model refresh and can briefly trail the report page; and on dedicated capacity, query result caching can serve an older result. Refresh success only means the job completed — it says nothing about the source's contents.
code
dax · 6 linesData as of = MAX ( 'Sales'[OrderDate] )
Source loaded = MAX ( 'Load Log'[LoadedAtUtc] )
-- surfaced on the report page, freshness becomes visible to users
-- instead of hidden in the model's refresh historygo deeper
Be ready to say that refresh success means the job ran, not that the source had new data, and to name the report-versus-dashboard-tile difference.
Explain the mechanics: schedule timing versus upstream load, incremental refresh partitions, tile caching, and how DirectQuery changes the picture entirely.
Demonstrate a systematic diagnosis and a durable fix — instrument freshness as a measure, trigger refresh from the pipeline, alert on data age rather than job status.
Own the freshness contract across teams: who guarantees what latency, how it is measured and alerted, and where the boundary sits between the platform team and the BI team.
## "Success" is a statement about the job, not the data A green refresh in the Power BI Service means the semantic model's queries ran and the model was reloaded without error. It does not mean the source held new rows, that the model you are looking at is the one that refreshed, or that the visual in front of you is showing the model's current state. Every stale-data incident is one of those three gaps. ## Step 1 — make freshness visible Before debugging anything, instrument. Add measures like `Data as of = MAX('Sales'[OrderDate])` and, if your warehouse stamps loads, `Source loaded = MAX('Load Log'[LoadedAt])`, and put them on the report page. Now "is it stale" is answered by the report itself rather than by cross-referencing a refresh history. This is also the artifact that ends the argument with the data engineering team about whose side is late. ## Step 2 — confirm which model you refreshed The most common cause in a mature tenant is duplication. Someone republished a full `.pbix` and created a second semantic model; the report you are viewing is bound to that copy, while the schedule you are proudly pointing at belongs to the original. Check the report's lineage and the refresh history of the model the report actually uses, not the one with the familiar name. The durable fix is one governed model with live-connected reports. ## Step 3 — check the timing against upstream Scheduled refresh fires on a clock; your ETL finishes when it finishes. If the warehouse load slipped past the refresh window, the refresh read yesterday's table and succeeded. Symptoms: the model is exactly one cycle behind, every day, or intermittently on heavy days. Fixes: trigger refresh *from* the pipeline when the load completes (via the REST API, or the XMLA endpoint on dedicated capacity) instead of guessing a time; or schedule with real slack and alert on the freshness measure rather than on refresh failure. Also beware time zones: refresh schedules and the timestamps shown in the Service are governed by configured/UTC time, so an apparently recent "last refreshed" reading can be misread by several hours. ## Step 4 — check the refresh scope **Incremental refresh** partitions a fact table by a date range and reprocesses only the recent partitions on each run. That is exactly what you want for performance — and exactly why a late-arriving or back-dated correction in an older period never appears. The data is not stale in the "nothing ran" sense; the changed rows were outside the refreshed window. Confirm the policy's refresh window, and remember that fixing history requires a full refresh of those partitions, not another scheduled run. A related scope issue: if the model's Power Query steps filter to a hard-coded date or read a file whose name embeds a date, refresh cheerfully reloads the same rows forever. ## Step 5 — check the presentation layer Distinguish the three surfaces: - **Report visual (import model):** queries the loaded model, so after refresh it is current — but a browser session opened before the refresh keeps its rendered results until reloaded. - **Dashboard tile:** a cached snapshot. Tiles update after the underlying model refreshes, and the cache update is not instantaneous, so a tile trailing the report page for a short window is expected behaviour, not a bug. If a tile is stale for hours, suspect the model, not the tile. - **Dedicated-capacity query caching:** where enabled, repeated report queries can be served from cache; the cache is invalidated on refresh, but this is worth ruling out explicitly when only some users see old numbers. And the mirror-image case: with **DirectQuery**, there is nothing to refresh at all — data comes from the source per query — so a "scheduled refresh" on such a model refreshes only its cached elements and tiles. Someone insisting DirectQuery data is stale because refresh did not run has misdiagnosed the architecture; the staleness is in the source or in a cache. ## Step 6 — check for a silently partial success Some sources return an empty result rather than an error when a permission or filter goes wrong: a service account loses access to one table, the query returns zero rows, and refresh "succeeds" with an empty or unchanged table. Row-count checks per table, compared against the previous run, catch this class before users do. ## What a strong answer sounds like "I'd first make freshness a measure on the page. Then: which model actually refreshed — is the report on a duplicate? Did the ETL land before the schedule? Is incremental refresh only touching recent partitions while the change is historical? Is this a cached dashboard tile trailing the report? Long term I'd stop scheduling on a guessed clock, trigger refresh from the pipeline, and alert on the freshness measure rather than on refresh status — refresh success and data correctness are different signals."
- How would you stop the refresh-before-ETL-lands race for good?Stop scheduling on a clock. Have the pipeline trigger the semantic model refresh as its final step — the Power BI REST API, or the XMLA endpoint on dedicated capacity — so refresh runs because the data is ready rather than because it is 06:00. Keep a fallback schedule and alert on a freshness measure so a missed trigger is visible.
- Why does incremental refresh produce this symptom specifically?The policy reprocesses only partitions inside its refresh window and leaves older ones untouched, so any back-dated correction, late-arriving fact or restated period stays as originally loaded. Refresh genuinely succeeded; the changed rows were simply out of scope. Correcting history needs a targeted or full reprocess of those partitions, not another scheduled run.
- A DirectQuery report shows old numbers. What does refresh have to do with it?Almost nothing. DirectQuery issues a query to the source per interaction, so there is no imported copy to refresh; a scheduled refresh on such a model updates cached tiles and any imported tables in a composite model. Old numbers point at the source, at a caching layer in front of it, or at a materialised view or extract upstream.
- What monitoring would you add so users are not the ones who notice?Alert on data freshness, not on job status: compare the model's max fact date or load timestamp against expected latency and raise when it drifts. Add per-table row-count checks against the previous run to catch silent empty loads, and track refresh duration trend so a job creeping toward its window is caught before it starts failing.
saying these in an interview costs you the question
- Treats a green refresh as proof the data is current
- Never checks which semantic model the report is bound to
- Forgets incremental refresh leaves old partitions untouched
- Says a DirectQuery model needs a scheduled refresh to be current
- Confuses a cached dashboard tile with the report page