Projected Billing Report
The Projected Billing Report forecasts upcoming subscription revenue by combining the base amount of every scheduled rebill and recycle (retry) attempt with per-attempt approval rates that you supply.
Use it to plan cash flow, evaluate the revenue impact of different retry strategies, and identify which billing cycles or retry attempts contribute the most expected revenue.
Open the report
In the Odus Dashboard, navigate to Insights → Projected billing. The page shows a chart of projected revenue over time, projection-rate inputs, and a breakdown table below.
Date range and timezone
The date range selector filters scheduled attempts by their billing date — the next scheduled charge date of each active subscription. Only today and future dates are valid; past ranges are rejected.
Switch between UTC and your merchant timezone to align daily boundaries with your business hours.
Grouping
Use the Group by tabs to organize rows by currency, gateway profile, or product. The report always groups secondarily by billing date at day granularity, so the chart and table show one data point per group per day.
What counts as a scheduled attempt
A subscription contributes one row to the report when all of the following are true:
- The subscription is active.
- It has an upcoming invoice amount set (i.e. a next scheduled charge exists).
- It is either:
- Auto-billing enabled with no disabled-reason — a normal rebill; or
- Currently recycling (auto-billing was disabled because the latest invoice is being retried) and has a payment with
retry_next_atpopulated — a recycle.
- The scheduled date (
upcoming_invoice_period_startfor rebills,retry_next_atfor recycles) falls inside the selected window.
Cancelled subscriptions, paused subscriptions with no active retry, and subscriptions without an upcoming invoice are excluded.
Projection horizon: one cycle per subscription
Each active subscription contributes at most one scheduled date to this report — its very next charge. The next billing date is set only after the current cycle settles (the system bills, and on success schedules the following cycle), so there is never more than one cycle scheduled ahead per subscription.
In practice this means:
- The report is intended to project the next billing cycle. For monthly billing that's roughly the next 30 days; for annual billing it's up to a year out.
- A subscription that bills this month and rebills again next month will show up in a combined report covering both months (its current scheduled date falls in month 1), but it will not appear in a report covering only month 2 — its second cycle isn't scheduled yet.
- Widening the date window beyond one billing cycle does not add more projected attempts per subscription; it only catches subscriptions whose next single scheduled date falls further out.
To compare windows over longer horizons, run the report repeatedly as cycles complete and new ones get scheduled.
Rebills vs. recycles
Every scheduled attempt is classified as either a rebill or a recycle:
- Rebill — the subscription's next scheduled billing cycle. The amount used is the upcoming invoice amount.
- Recycle — a retry of the most recent failed invoice. The amount used is the payment's next retry amount (which can differ from the upcoming invoice amount if a retry policy adjusts it).
A subscription that is currently recycling is always reported as a recycle, never as a rebill, regardless of its current billing cycle.
Buckets
Each attempt is placed into one of four buckets — #1, #2, #3, or #4+ — based on attempt position. Buckets exist independently for rebills and recycles.
- Rebill #1 is the customer's first rebill (the second total charge, after the initial purchase). Rebill #2 is the second rebill, and so on. Rebill #4+ collapses every rebill from the 4th onward.
- Recycle #1 is the first retry of a failed invoice (no prior attempts). Recycle #2 is the second retry, and so on. Recycle #4+ collapses every retry from the 4th onward.
Projection rates
For each bucket you supply an approval rate between 0% and 100%. The report multiplies each attempt's base amount by the rate of its bucket and sums the result into Projected Revenue:
Projected Revenue = Σ (base amount × rate of attempt's bucket)
Rebill and recycle rates are picked independently per row — a single subscription contributes to exactly one bucket (either a rebill bucket or a recycle bucket) and uses that bucket's rate.
Changing a rate updates the chart and table immediately (with a short debounce). Rates default to 0% if omitted, which produces a Projected Revenue of zero across the board.
Metrics
| Metric | Definition |
|---|---|
| Total Attempts | Total number of scheduled attempts in the row (rebills + recycles combined). |
| Projected Revenue | Sum of base amounts weighted by the per-bucket approval rate, in your display currency. |
| Rebill #N Count | Number of rebill attempts in bucket N. |
| Rebill #N Amount | Sum of base amounts (upcoming invoice amounts) for rebill bucket N. |
| Recycle #N Count | Number of recycle attempts in bucket N. |
| Recycle #N Amount | Sum of base amounts (next retry amounts) for recycle bucket N. |
Monetary metrics are converted to your display currency (set in Settings → Merchant Configuration) using current exchange rates.
The Total row aggregates each metric across all groups.
Same-day aggregation
Multiple subscriptions billing on the same day collapse into a single row per group per day. Rebill and recycle metrics remain independent within that row — a day can contain any mix of rebills across the four rebill buckets and recycles across the four recycle buckets.
Example
Say you sell a single Pro Plan at $50/mo and on 2026-06-02 four active subscriptions are scheduled to charge:
| Subscription | Status | Scheduled type | Bucket | Amount |
|---|---|---|---|---|
| sub_A | Active, auto-bill on | Rebill | Rebill #1 | $50 |
| sub_B | Active, auto-bill on | Rebill | Rebill #1 | $50 |
| sub_C | Active, auto-bill on | Rebill | Rebill #2 | $50 |
| sub_D | Recycling (last failed) | Recycle | Recycle #1 | $50 |
With projection rates set to Rebill #1 = 80%, Rebill #2 = 70%, Recycle #1 = 40% (others irrelevant), the row for Pro Plan → 2026-06-02 shows:
| Total Attempts | Rebill #1 Count | Rebill #1 Amount | Rebill #2 Count | Rebill #2 Amount | Recycle #1 Count | Recycle #1 Amount | Projected Revenue |
|---|---|---|---|---|---|---|---|
| 4 | 2 | $100 | 1 | $50 | 1 | $50 | $135 |
How each number is derived:
- Total Attempts = 4 — all scheduled attempts that day (3 rebills + 1 recycle).
- Rebill #1 Amount = $100 — sub_A + sub_B at $50 each.
- Recycle #1 Amount = $50 — sub_D, the only retry that day.
- Projected Revenue = $135 —
($100 × 80%) + ($50 × 70%) + ($50 × 40%) = $80 + $35 + $20.
If you raise the Recycle #1 rate to 60%, only that bucket's contribution changes: $80 + $35 + ($50 × 60%) = $145.
Export to CSV
Click Export CSV in the top-right of the table to download the current view. The file contains one row per group plus a Total row, with monetary values in your display currency.
API access
The same data is available via GET /reports/projected-billing. Projection rates are passed as comma-separated lists of percentages (0–100).
Example
GET /reports/projected-billing?groupBy=product.name&secondaryGroupBy=billingDate&secondaryGranularity=day&billingDate[gte]=2026-06-01T00:00:00Z&billingDate[lte]=2026-06-30T23:59:59Z&rebillProjections=85,70,60,50&recycleProjections=40,25,15,10
The response contains a data array (one entry per group/day) and a total object with the aggregate across all groups.