Skip to main content
Power BI

Power BI Incremental Refresh for Distributor Sales: Late Invoices and Historical Corrections

Incremental refresh makes a big sales model refresh in minutes — until a distributor posts an invoice backdated three weeks, and your dashboard never picks it up. The feature is right; the default configuration quietly loses late data.

Amit Kumar Singh - Technology Consulting Partner at MyData Insights

Technology Consulting Partner · MyData Insights

14+ years in industrial data · Former Accenture & EY · India, GCC, SEA

15 October 2026 · 10 min read

The bottom line

Power BI incremental refresh only reloads a recent window of data, which makes a large distributor-sales model refresh in minutes instead of hours. The trap in FMCG and distribution is that sales data is not well-behaved: distributors post invoices late, backdate them, and issue corrections to closed periods. A default incremental refresh that only reprocesses the last 7 days will never pick up an invoice dated three weeks ago, so the dashboard silently understates that period. The fixes: size the refresh window to how late your data realistically arrives, use the "detect data changes" option so only genuinely changed partitions reprocess, and for corrections to older closed periods, trigger a targeted refresh of those partitions rather than trusting the rolling window.

The Late-Invoice Trap

A distributor-sales model covering several years and millions of rows is a classic incremental-refresh candidate: full refreshes take too long, so you reprocess only recent data and leave history in place. Configured naïvely, the model refreshes the last week each night and the dashboard is fast. Then the understatement starts.

Distribution data does not arrive neatly. A distributor submits a batch of invoices days after the sale, backdated to the actual transaction date. A regional office posts last month’s secondary sales a fortnight late. A correction reclassifies a return against a period that closed three weeks ago. If the incremental window only reprocesses the last few days by transaction date, none of these are ever picked up — the rows exist in the source, but the partition that should hold them is never refreshed again.

The result is a dashboard that looks current and is quietly wrong for recent-but-not-latest periods — exactly the periods demand planners and sales leaders rely on. The feature is not at fault; the configuration assumed well-behaved data that distribution never provides.

How Incremental Refresh Partitions Data

Power BI incremental refresh splits a table into partitions by a date column — typically one partition per day or month — and on each refresh only reprocesses the partitions inside a defined recent window, leaving older partitions untouched. That is what makes it fast: history is loaded once and frozen, and only the active window is re-queried.

The mechanism depends entirely on the date column you partition by and the width of the active window. If you partition by invoice transaction date and refresh the last 7 days, an invoice whose transaction date is 20 days ago falls in a frozen partition — even though it only reached the source yesterday. The platform is doing exactly what you configured; the configuration just did not account for data arriving after its own date.

This is the crux: incremental refresh reasons about when the data says it happened, not when it arrived. For sources where those two diverge — which is most distribution data — the configuration has to bridge the gap.

Incremental refresh reasons about when the data says it happened, not when it arrived. For distributor sales, those two routinely diverge — and the default configuration loses the difference.

Sizing the Refresh Window to Reality

The first lever is the width of the refresh window, and it should be set to how late your data realistically arrives, not to a round number. If invoices routinely land up to three weeks after their transaction date, a refresh window of a few days is guaranteed to miss them; a window that reprocesses the last several weeks will catch them, at the cost of a little more refresh work.

Finding the right width is an empirical question: look at the gap between transaction date and load date across a few months of real data, and size the window to cover the bulk of the lateness — the 95th percentile of arrival lag, not the average. That keeps the refresh fast while catching almost all late invoices in the normal nightly run.

There is a genuine trade-off here. A wider window reprocesses more partitions every night, which costs time and capacity; a narrower one is faster but loses more late data. The right answer is the narrowest window that still covers how late your invoices actually arrive — which you can only know by measuring, not guessing.

Detect Data Changes, Not Just Dates

Power BI’s "detect data changes" option sharpens this. Instead of blindly reprocessing every partition in the window, it checks a column — a last-modified timestamp — and only reprocesses partitions that actually changed since the last refresh. This lets you widen the window safely: you can cover a three-week lateness horizon without paying to reprocess three weeks of unchanged partitions every night, because only the ones with new or corrected rows are touched.

This depends on having a reliable last-modified column in the source that updates whenever a row is inserted or corrected. Many distribution systems have one; where they do not, the source team may need to add it, and that small change unlocks a much more efficient refresh. Without it, you are back to reprocessing the whole window regardless.

Used together, a window sized to real lateness plus detect-data-changes gives the best of both: late invoices are caught, and the nightly cost stays close to a narrow window because unchanged history is skipped.

A window sized to real arrival lag plus detect-data-changes gives both: late invoices are caught, and the nightly cost stays close to a narrow window because unchanged history is skipped.

Corrections to Closed Periods

Some corrections fall outside any reasonable rolling window — a reclassification against a quarter that closed two months ago, a restated prior year. No incremental window should be wide enough to cover those routinely; that would defeat the purpose. These need a targeted refresh instead: reprocess the specific historical partitions affected by the correction, on demand, rather than widening the standard window.

In practice this is a controlled operation — triggered when finance signals a restatement, refreshing the named partitions — so the historical figure updates without the nightly refresh carrying the cost of covering all of history every day. The XMLA endpoint and scripted partition refresh make this possible on Premium and Fabric capacities.

The discipline is to separate the two cases: normal lateness is handled by a correctly-sized rolling window with change detection, and exceptional corrections to closed periods are handled by targeted on-demand partition refreshes. Trying to make one rolling window cover both leads either to lost corrections or to a refresh that is no longer incremental.

Separate the cases: normal lateness → a window sized to real arrival lag with change detection; corrections to closed periods → targeted on-demand partition refreshes. One rolling window cannot do both well.

So What — Configured to the Data

Incremental refresh is the right tool for large distributor-sales models — it is the configuration that usually lets them down. Size the refresh window to the 95th-percentile arrival lag of your invoices rather than a round number, enable detect-data-changes so a wide window stays cheap, and handle restatements to closed periods with targeted partition refreshes rather than an ever-wider window. Do that and the dashboard stays both fast and correct for the recent periods planners actually use.

The diagnostic question is blunt: if a distributor posted an invoice today dated three weeks ago, would your model show it tomorrow? If you are not sure, your refresh window is probably narrower than your data is late — and the understatement is already happening quietly.

If a distributor posted an invoice today dated three weeks ago, would your model show it tomorrow? If you are not sure, the window is narrower than the data is late.

If your distributor-sales dashboard is fast but quietly understating recent periods, the incremental refresh configuration is the likely cause. 30 minutes with Amit on refresh windows, change detection and late-invoice handling for your sales model. No slides, no pitch deck, no obligation to proceed.

Free Assessment

Where does your operation sit on the data maturity curve?

8 questions. 3 minutes. You get a scored breakdown across data infrastructure, analytics readiness, and automation potential — with a specific next step for your industry.

Power BIMicrosoft FabricFMCGDemand ForecastingData Quality

Your Data · Our Technology · Our Automation

Get practical insights every fortnight

Amit writes about Microsoft Fabric, Power BI, AI in operations, and digital transformation for manufacturing and supply chain leaders. Practitioner perspective - no fluff, no vendor spin.

No spam. Unsubscribe any time. Also on Substack.

FAQ

Common questions

Why does Power BI incremental refresh miss late-arriving invoices?

Because incremental refresh reasons about the date the data says it happened, not when it arrived. It partitions by a date column and only reprocesses partitions inside a recent window, freezing older ones. An invoice backdated three weeks but loaded today falls in a frozen partition, so it is never picked up. The fix is to size the refresh window to how late your invoices realistically arrive and enable detect-data-changes so a wider window stays efficient.

How wide should the incremental refresh window be for distribution data?

Set it to the real arrival lag of your invoices — around the 95th percentile of the gap between transaction date and load date, not a round number or the average. Measure that gap across a few months of actual data. The right window is the narrowest one that still covers how late your invoices actually arrive, which keeps the nightly refresh fast while catching almost all late data in the normal run.

What does the "detect data changes" option do in Power BI?

It checks a last-modified timestamp column and only reprocesses partitions that genuinely changed since the last refresh, instead of blindly reprocessing every partition in the window. This lets you widen the refresh window to cover late-arriving data without paying to reprocess weeks of unchanged partitions each night — only the ones with new or corrected rows are touched. It requires a reliable last-modified column in the source.

How do you handle corrections to a closed period in Power BI?

With a targeted, on-demand refresh of the specific historical partitions affected, not by widening the standard rolling window. Restatements to a quarter that closed months ago fall outside any reasonable incremental window, so you refresh the named partitions when finance signals the correction — using the XMLA endpoint or scripted partition refresh on Premium or Fabric capacity. Keep normal lateness and exceptional corrections as two separate mechanisms.

Related FAQs

Questions operations leaders ask

Recognise this pattern in your operation?

A short call, no obligation. Tell us what you’re trying to fix and we’ll tell you plainly if and how it’s solvable.