# Revenue figures

**Summary:** Revenue estimates the value of active subscriptions on a monthly, quarterly or yearly basis. It does not show payments received.

- Role: [Technical Support](https://www.subrite.no/technical-support)
- Source: https://www.subrite.no/technical-support/insights-revenue
- Updated: 2026-09-28
- Markdown index: https://www.subrite.no/technical-support/llms.txt

Historical columns use snapshots; future columns project today’s active subscriptions. Neither shows accumulated income or invoice totals.

<a id="daily-value-and-estimate-basis"></a>
## 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](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/utils/daily-revenue-sql.ts#L44).

<a id="historical-values"></a>
## 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](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L111) and [historical selection](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/subscription-summary.repository.ts#L189).

<a id="forecast-calculation-and-boundaries"></a>
## 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 `recurringPrice` and 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](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats.services.ts#L445) and [forecast query](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/product/repositories/member-package.repository.ts#L936).

<a id="filters-and-display"></a>
## 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](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/subscription-summary.repository.ts#L292), [option caching](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/app/%28admin%29/admin/%28panel%29/analytics/statistics/current-revenue/page.tsx), and [chart aggregation](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/ui/StatsView/index.tsx#L337).

<a id="diagnose-a-revenue-difference"></a>
## 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.

<a id="verification-limits"></a>
## 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](https://www.subrite.no/administrators/insights-revenue?md=true) for graph interpretation and controls.

## Related pages

- [Revenue figures](https://www.subrite.no/administrators/insights-revenue?md=true): Revenue estimates the value of active subscriptions on a monthly, quarterly or yearly basis. It does not show payments received.
