Revenue figures
Revenue estimates the value of active subscriptions on a monthly, quarterly or yearly basis. It does not show payments received.
Historical columns use snapshots; future columns project today’s active subscriptions. Neither shows accumulated income or invoice totals.
Daily value and estimate basis#
The shared daily-rate calculation divides subscription price by assumed billing days:
| Billing period | Divisor |
|---|---|
| Monthly or every 30 days | 30 |
| Quarterly | 90 |
| Half-yearly | 182.5 |
| Yearly | 365 |
| Custom | Frequency × 1 day, 7 days, 30 days or 365 days, according to unit. |
During an introductory period, the calculation uses currentPrice and the package’s billing period. Otherwise it uses currentPrice and the plan’s billing period.
The selected estimate multiplies the daily value by 30, 90 or 365. The horizontal time period is independent: quarterly bars with Monthly selected remain monthly equivalents.
For example, NOK 365 yearly gives NOK 1 daily and NOK 30 monthly. Twelve monthly estimates total NOK 360 because the conversion uses fixed day counts.
The calculation does not deduct VAT, subtract refunds or test payment success. Values use subscription-price currency; the chart does not display a currency symbol.
Source: daily-rate calculation.
Historical values#
SubscriptionSummary.dailyRevenue stores summed daily values from Active subscriptions, grouped by plan, package, provider, introductory-period flag and renewal flag.
For each plan and reporting period, getHistoricalCurrentRevenueData selects the latest snapshot timestamp within the requested range. Plan and package filters apply to both the latest-timestamp selection and the outer query.
The result sums dailyRevenue at those timestamps, then multiplies by the estimate basis. It separates Recurring (autoRenew = true) from Expiring (autoRenew = false). Free subscriptions contribute zero.
Stored daily rates have two decimal places. Rounding before normalization can produce small differences from calculations using unrounded subscription prices.
Sources: snapshot writer and historical selection.
Forecast calculation and boundaries#
The service keeps the current period in history and starts the forecast at the next period. Forecasts stop no later than 12 months after the current period’s start.
The forecast query selects currently Active, non-deleted subscriptions in the tenant. It applies the requested plan and package filters.
For each future period, the query compares nextRenewal with the start of the following period:
- Before that boundary, renewing subscriptions use
recurringPriceand the plan cadence. - At or after the boundary, they retain the current daily value for that bar.
- Non-renewing subscriptions are excluded if renewal falls before the boundary, including anywhere on the period’s last day.
- A missing renewal date retains the subscription and its current daily value.
A non-renewing subscription ending halfway through a future month contributes zero to that month’s end estimate. It does not contribute half a month’s receipts.
The query projects recorded renewal terms, not future sales, unrecorded cancellations, collection success or provider payment deadlines.
Sources: history/forecast split and forecast query.
Filters and display#
Plan/package lists use historically recorded combinations and latest recorded names, independent of the displayed range. Selecting either narrows the other. The page caches these options for one hour; a new option needs a snapshot first.
The axis supports Weekly, Monthly, Quarterly and Yearly. Preset range chips are hidden; arrows move one period or the displayed range. Changing period resets the range but retains estimate, plan and package choices.
Current and future periods carry *. Only wholly future columns are gray. Total is the default view and sums both returned segments.
In Details, hover amounts and percentages use visible segments and amounts round to whole units. Total includes hidden segments, but hiding Recurring can hide Total through the shared positional series ID.
Sources: filter combinations, option caching, and chart aggregation.
Diagnose a revenue difference#
| Symptom | Check and interpretation |
|---|---|
| Revenue differs from cash flow | Compare normalized subscription values with successful payment records; the reports measure different amounts. |
| Quarter seems too small | Check Select estimate separately from Select period. Monthly estimates remain monthly on a quarterly axis. |
| Introductory subscription looks overstated | Check isOnIntroPeriod, current price and package cadence before applying plan cadence. |
| Forecast falls sharply | Check renewal-off subscriptions with dates before the next period boundary. |
| Historical amount differs slightly | Compare stored daily-rate rounding before applying the 30/90/365 multiplier. |
| Old option has no bars | Check snapshot dates for that combination; filter options are not limited to the displayed range. |
The sidebar requires analytics/insights access; the report and filter endpoints require Dashboard READ. Request failure can render an empty graph.
Verification limits#
Source checked on 28 September 2026 at 6cd1850569be3b1702ca736a19320c7626efb7bc. Prior owner-session checks confirmed report labels and controls.
Production arithmetic, currency context, legend behavior, ordinary-role access and snapshot freshness remain unverified. Use Revenue figures in Administrators for graph interpretation and controls.