Backline

Reporting lag: the two days nobody accounts for

Third-party streaming totals describe a day that already passed. Uncorrected, every chart and every correlation is offset, and the error is invisible.

Danny Starr

Co-founder, Backline · 1 August 2026 · 3 min read

In short

  • The number a third-party API returns today typically describes activity from a couple of days ago, and nothing in the response says so.
  • Uncorrected, release-day spikes land mid-week and correlations between spend and streams compare the wrong days.
  • There is no as-of field to derive this from, so the correction is a manually maintained per-source offset, which has to be documented as such.
  • The offset has to be applied everywhere the series is built, from one shared constant. Two copies drift and produce charts that disagree by exactly the lag.
  • Stamp every emitted point with the lag applied so a future reader can tell what was corrected and by how much.

Ask a third-party music data API for a track's stream total today, and you get a number. What you do not get is the date that number describes.

Comparing those totals against a platform's own reporting shows the gap. For Spotify specifically, the totals reaching third parties have been running about two days behind ground truth in our checks. A total read on the 10th is closer to the true position on the 8th.

This is invisible in every way that matters, because the response looks current.

What it breaks

Release day lands late. A Friday release's surge appears on the chart on Sunday. Everyone notices and someone invents an explanation for why the weekend was strong.

Correlations compare the wrong days. Line up same-day ad spend against a two day lagged streaming series and each comparison is offset by 48 hours. On a two week campaign that is enough to reverse the finding, while producing a confident-looking coefficient.

Windows are off by the lag at both ends. A 30 day window ending today actually ends two days ago, so its baseline should also be shifted or the window is 30 days of the wrong 30 days.

Two systems disagree. If one place in a codebase corrects and another does not, the same project shows two different daily figures, offset by exactly the lag. We shipped that too, and it was mystifying until we noticed the difference was always the same number of days.

The same release, corrected and uncorrected

Illustrative
960release dayThuFriSatSunMonTueWedThu
Corrected: activity dated when it happenedUncorrected: activity dated when it arrived
Illustrative. Both lines carry identical totals. Uncorrected, release day looks flat and Sunday looks like a triumph, and any campaign comparison built on it is offset by two days.

Why it has to be a manual constant

We looked for a way to derive it. There is no as-of or data-through field in the responses we work with, and we probed for dated history endpoints across several likely shapes without finding one. Without a stated reference date, the lag can only be established by comparing against a platform's own reporting, by hand, per source.

So it lives as a named constant: a map from source to a number of days. Currently that is two days for Spotify and zero for the others, which reflects what we have been able to verify rather than what is true everywhere.

Two obligations come with that.

Document it as a manual correction. Someone reading the code in a year needs to know this is a measured constant, not a computed one, and that it needs revisiting if the upstream pipeline changes.

Verify it periodically. A correction that was right in March and wrong in September is worse than no correction, because it is confidently wrong.

Apply it once, from one place

The rule that matters operationally: every consumer that builds a dated series imports the same constant.

Ours is applied in two places, the sync that emits dated events and the route that builds the chart series. Those originally had separate implementations and drifted, which is exactly the bug above. One shared constant, imported, never copied.

Lag or cadence, and what fixes each

Illustrative
LagCadence
What it isNumbers describe an earlier dateNumbers only update every few days
Fingerprint in your snapshotsChanges most days, but lateChanges on one weekday, flat between
FixShift the series by a per-source offsetBucket into the reporting period
Applying the wrong fixBucketing a lagged source loses real daily detailShifting a coarse source moves a spike without removing it
Where the constant livesOne shared map, imported everywhereOne shared set of source names

Stamp the output

Every emitted point carries the lag that was applied to it. Two reasons.

Auditability. When somebody queries a number in six months, the answer to "was this corrected" is in the data rather than in someone's memory of what the code did at the time.

Change safety. If the constant changes, you can tell which stored points were produced under the old value, which turns a data migration question into a query.

Lag against cadence

Worth separating, because they get confused.

Lag is the offset between when activity happened and when the number describing it becomes available. It shifts a series along the time axis and is fixed with an offset.

Cadence is how often the number updates at all. A source that only advances once a week is not lagged, it is coarse, and shifting it does nothing useful. That needs weekly bucketing instead, which is a different problem.

Applying a lag correction to a weekly source, or weekly bucketing to a lagged daily one, makes both worse. Work out which you have by looking at the change dates in your own stored snapshots: a lagged source changes most days but describes an earlier date, and a coarse source only changes on one weekday.

Common questions

Why is third-party Spotify data a couple of days behind?
Because the totals available to third parties reflect an earlier processing point than the platform's own reporting, and nothing in the response states the date the number describes. Comparing against a platform's own figures is the only way to establish the size of the gap, which in our checks has been around two days for Spotify.
How do you correct for reporting lag?
With a per-source offset in days, applied to shift the dated series, imported from one shared constant by every consumer that builds a series. It cannot be derived automatically because responses carry no as-of date, so it must be documented as a manual correction and re-verified periodically.
Is reporting lag the same as a source that updates weekly?
No. Lag means the number describes an earlier date and is fixed by shifting the series. A weekly cadence means the number only changes once a week and is fixed by bucketing into weekly periods. Applying either fix to the other problem makes the chart worse.

Sources

  1. 1Spotify for Artists, Reviewed August 2026. Data in Spotify for Artists
  2. 2Google, Reviewed August 2026. Search Console API: Search Analytics query reference

Danny Starr

Co-founder, Backline

Danny Starr is a co-founder of Backline and builds the platform. He writes about the data engineering behind music analytics: ingestion, identity, honesty in charts, and the AI layer on top of it.

Backline does this for the projects you run

Streaming, audience, social, advertising, website, search, ticketing and press data in one dashboard per project, with an AI assistant that answers questions about your own connected data. Invite-only.

What Backline does

Data engineering

Weekly reporting sources and the phantom spike

Some music data only moves once a week. Charted daily it produces a spike every seventh day that looks like a marketing win. How to detect the pattern and what to do about it.

Danny Starr · 3 min read

Analytics foundations

Correlation is the honest answer in music marketing

There is no passback linking a stream to the advert that caused it. What you can measure is whether signals move together, and how to report that without overclaiming.

Danny Starr · 3 min read

Ask Backline AI
Ask Backline AI
Backline

Ask anything about your project: suggestions, strategy, next steps.

Select a project to start chatting

Enter to send · Shift+Enter for new line

Backline

Booting up your Backline session…