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
IllustrativeWhy 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| Lag | Cadence | |
|---|---|---|
| What it is | Numbers describe an earlier date | Numbers only update every few days |
| Fingerprint in your snapshots | Changes most days, but late | Changes on one weekday, flat between |
| Fix | Shift the series by a per-source offset | Bucket into the reporting period |
| Applying the wrong fix | Bucketing a lagged source loses real daily detail | Shifting a coarse source moves a spike without removing it |
| Where the constant lives | One shared map, imported everywhere | One 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
- 1Spotify for Artists, Reviewed August 2026. Data in Spotify for Artists
- 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.
Keep reading
Data engineering
Cumulative counters, daily deltas, and the data you can lose forever
Music data arrives as a running total, so daily numbers have to be derived. The three bugs that derivation produces, one of which destroys data permanently.
Danny Starr · 3 min read
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

