Revenue numbers in Dynamic Content are based on real episode downloads from Springcast's analytics, attributed to the campaigns that were live when each download happened.
Where the numbers come from
Two systems feed the Revenue dashboard:
- Springcast Analytics - the same microservice that powers your podcast statistics. It knows when each episode was downloaded, by how many listeners, and where. This is real download data, not estimates.
- Your campaign records - for each download, Springcast looks up which campaigns were assembled into that episode at that time. Both campaign and download data are stamped with timestamps, so historical attribution stays accurate even if you change campaigns later.
This is post-attribution - the numbers reflect actual listening, not just "your audio was assembled". A campaign whose audio was stitched into an episode but never downloaded by anyone contributes zero impressions and zero spend.
How impressions are counted
One impression = one download of an episode the campaign was assembled into.
That's the only definition. A few clarifications:
- It's per download, not per listen. Springcast counts a download once per listener per episode per day (the standard IAB-aligned approach also used by your regular stats).
- The campaign must have been assembled into the episode at the time of the download. If you added a campaign yesterday, downloads from the day before don't count.
- Re-downloads of the same episode by the same listener within the IAB window don't double-count.
How spend is calculated
Spend has two components, summed:
CPM (cost per thousand):
spend_cpm = (impressions / 1000) × cpm_rate
Fixed per episode:
spend_fixed = episodes_with_at_least_one_insertion × fixed_per_episode_rate
Total spend = spend_cpm + spend_fixed.
A campaign can have both set, only CPM, only fixed-per-episode, or neither (free / house ads).
Decimal precision: CPM is calculated to 4 decimal places internally (sub-cent math matters for thousands of impressions); fixed-per-episode is 2 decimals; the dashboard rounds display to 2 decimals.
Worked example
A campaign with €0.50 per-episode fixed + €8.00 CPM runs across 12 episodes for two weeks. During that window:
- 9 of the 12 episodes received at least one download → 9 episodes with an insertion.
- Total downloads across those episodes = 3,400 impressions.
spend_fixed = 9 × €0.50 = €4.50 spend_cpm = (3,400 / 1000) × €8.00 = €27.20 total = €31.70
That's what the dashboard would show for that campaign in that window.
Attribution windows: MTD / Quarter / Custom
The Revenue dashboard's range picker controls the window over which impressions are summed and spend is calculated:
- MTD (month-to-date) - first of this month through yesterday.
- This quarter - first day of the current quarter through yesterday.
- This year - Jan 1 through yesterday.
- Last 30 days - rolling.
- Custom range - any start/end you pick.
The window doesn't filter which campaigns are shown - it controls what period the numbers represent for each shown campaign. A campaign that ran in January will show its January numbers when you pick "This year" and zero when you pick "This quarter" (if the current quarter starts in April).
Why "through yesterday"? Today's downloads are still being aggregated by the analytics rollup, which runs nightly. Including today would give you partial, drifting numbers. Including only complete days gives you stable, reproducible reporting.
Cross-show and cross-advertiser breakdowns
The Revenue dashboard shows revenue split by advertiser and by show for the picked window. Per advertiser, the contribution is split across shows (so you can see that Bol.com generated 60% from Show A and 40% from Show B). Per show, you can see which advertisers contributed.
The per-campaign detail page has an "Impressions over time" chart with adaptive bucketing - daily for short windows, weekly for medium, monthly for long.
Listener identity & frequency caps
Frequency caps ("at most 1 play per listener per week") use the same listener-identity logic the Analytics microservice already uses to distinguish new vs. returning listeners - no new fingerprinting was added for Dynamic Content. Two downloads by the same listener within the cap window count as one toward the frequency cap.
This means frequency caps are best-effort, not guaranteed: if the same person listens from two different devices, the system treats them as two listeners. Set caps with that in mind - they're a tool for spreading reach, not a hard cap on a specific human.
Budget cap → auto-pause
If a campaign has a budget cap, the daily revenue rollup checks whether spend has crossed it. If yes, the campaign flips to Paused with auto_paused_reason = budget_cap and a timestamp on auto_paused_at. Because detection happens during the nightly rollup, there can be up to a day of overshoot tolerance. If a single day's spend would blow past the cap by a lot, consider setting the cap a bit lower than your hard limit.
A manually-resumed budget-paused campaign clears the auto-pause reason and runs normally again - until the next cap check, if it overshoots again.
When numbers update
- Episode downloads → captured continuously by the Analytics microservice.
- Daily attribution rollup → overnight, building "yesterday's" complete numbers.
- Revenue dashboard → reflects the latest completed rollup. The KPIs update as soon as you pick a new window.
If you're checking revenue mid-day and the numbers don't match what you expect, give it until tomorrow morning - today's numbers aren't final yet.
Multi-currency
Each workspace picks a default currency. Campaigns store the currency they were booked in (e.g. EUR) and do not auto-convert if the workspace currency changes later - historical bookings keep their original currency. The dashboard displays totals per currency rather than mixing them.
If you book international advertisers in their local currency, expect to see separate totals per currency on the dashboard - that's intentional. Converting historical bookings to one display currency would require picking an exchange-rate strategy (rate at booking? at insertion? at report time?) and each is wrong some of the time.
Common questions
- "Why don't I see Easy-mode insertions in the dashboard?" - Direct-insertion markers (an asset pinned directly to a marker, no campaign) don't generate campaign attribution rows. They don't show up in Revenue. That's by design - there's no advertiser to attribute spend to.
- "Can I export this?" - A per-period export of attribution rows is on the roadmap; for now the dashboard is browser-only.
- "My impression target says 4,500 but the chart says 4,065 - which is right?" - Both. The target is what you set when creating the campaign; the chart is actual attribution. The gap is unsold inventory remaining in your window.
Related
- Campaigns - pricing setup is part of the campaign create flow.
- Tags & the waterfall - what determines whether a given download counts toward a given campaign.