# Revenue Analytics and Reports

The analytics pages turn your normalized revenue into decision-ready metrics: **SaaS Metrics** for recurring-revenue quality, **Channel Performance** for unit economics by channel, and **Financial Reports** for the standard finance report library.

---

## Overview

Under **Analytics** in the sidebar:

- **SaaS Metrics** — ARR, MRR, retention, and the ARR waterfall.
- **Channel Performance** — revenue, mix, and margin by channel.
- **Financial Reports** — a library of billing reports you can run and export.

## SaaS Metrics

The **SaaS Metrics** dashboard summarizes recurring-revenue health across the selected channel and date range. One exception: retention (NRR, GRR, Churn) is measured over the **trailing twelve months** ending at the selected end date, so the selected start date does not move it.

![SaaS Metrics: ARR/MRR/NRR/GRR/ARPU cards, ARR waterfall, and NRR by channel](images/saas-metrics.png)

### Metric cards

| Card | Meaning |
|------|---------|
| **ARR** | Annual Recurring Revenue — a point-in-time snapshot of active recurring revenue as of the end of the period. |
| **MRR** | Monthly Recurring Revenue for the same active recurring base. |
| **NRR** | Net Revenue Retention — expansion and contraction of your existing base. |
| **GRR** | Gross Revenue Retention — retention before expansion. |
| **ARPU** | Average Revenue Per User (per month). |

![SaaS metric cards with ARR, MRR, NRR, GRR, and ARPU each circled](images/saas-metrics-cards.png)

The five metric cards, circled left to right: **① ARR**, **② MRR**, **③ NRR**, **④ GRR**, and **⑤ ARPU**. ARR/MRR/ARPU carry an *As of &lt;date&gt;* snapshot label; NRR/GRR show the retention basis. **DSO is not a SaaS Metrics card** — it lives only on [Invoices](/revenue/invoices/), with your accounts receivable.

Charts include the **ARR waterfall** (opening → new → expansion → contraction → churn → closing), **NRR by channel**, an **MRR trend** by cohort, and **ARPU by channel**. Use **Export** to download the underlying data. Cohort and channel trend charts appear once there is enough history in scope; until then they read *No data to display.*

![ARR waterfall from Opening through New, Expansion, Contraction, and Churn to Closing](images/saas-arr-waterfall.png)

The waterfall reads left to right — **Opening ARR** plus **New business** and **Expansion**, minus **Contraction** and **Churn**, equals **Closing ARR** — with the running reconciliation listed beneath the bars.

:::info
**What SaaS Metrics is computed from.** These metrics are built **primarily** from **recurring entitlement-term snapshots** — the contract terms behind your active recurring entitlements — evaluated over a **trailing twelve-month** window, rather than from a roll-up of the revenue records that drive the rest of the workspace.

Revenue records are not excluded outright, though: they remain a **guarded legacy fallback** for organizations whose history predates entitlement-term snapshots. A record only qualifies if it carries an explicit recurring classification *and* an explicit service or billing window — missing term dates are never guessed.

The practical consequence: ARR and MRR here will not tie out to Bookings or Billings on the [Overview](/revenue/overview/), and they should not be expected to. Contract terms are the primary authority for recurring revenue.
:::

## Channel Performance

The **Channel Performance** page compares revenue and unit economics across channels for the selected date range.

![Channel Performance: metric cards, revenue-by-channel chart, channel mix, and unit-economics table](images/channel-performance.png)

### Metric cards

| Card | Meaning |
|------|---------|
| **Total revenue** | Total revenue across all channels in scope. |
| **Top channel** | The highest-revenue channel and its share. |
| **Marketplace vs. Stripe** | Split of revenue between marketplace channels and Stripe. |
| **Avg net margin** | Average net margin after platform fees. |

![Channel Performance metric cards with each value circled](images/channel-performance-cards.png)

Circled left to right: **① Total revenue**, **② Top channel** and its share, **③ Marketplace vs. Stripe** split, and **④ Avg net margin** after platform fees.

A **revenue by channel** bar chart and a **channel mix** donut visualize the split, and the **channel unit economics** table lists each channel's revenue, platform fee, net revenue, net margin, and average days to payout. Use **Export** on the page header or above the table to download the data to CSV.

![Channel unit-economics table: revenue, platform fee, net revenue, net margin, and days to payout per channel](images/channel-unit-economics.png)

Each row is one channel; compare **net margin** and **avg days to payout** across AWS, Azure, GCP, and Stripe to see which channel keeps the most of every dollar and pays out fastest.

### How the channel figures are built

Every column on this page is derived from the revenue records in scope, per channel:

- **Net revenue** = gross revenue − channel fees − refunds.
- **Net margin** (the table's margin column) = net revenue ÷ gross revenue × 100.
- **Average settlement days** = the mean of (disburse date − invoice date) across records that have both dates. A record whose disburse date falls *before* its invoice date is **excluded from the average entirely** — it is dropped from both the total and the count, not counted as zero.

:::info
**Why "Avg net margin" can be empty for a non-GCP channel.** Margin is only trustworthy once platform fees have actually been ingested, and a stored fee of zero is ambiguous: it can mean *this channel charged nothing* or *the fee data hasn't arrived yet*.

**GCP** derives its fee from every usage row, so a zero there is authoritative and counts as a real fee. For **every other channel**, a zero fee is treated as *not yet ingested* and is not counted. If a channel has no records with a non-zero fee, the card shows **Run a full sync to load platform fees** instead of a margin. Run a full sync for that channel and the margin appears once the fee data lands.
:::

## Financial Reports

The **Financial Reports** page is a library of standard billing reports you can run on demand.

![Financial Reports library with the six billing reports circled](images/financial-reports.png)

The **Billing reports** library covers day-to-day receivables, billing, and collections — the six reports are circled above (**① Invoice Aging**, **② Invoice Detail**, **③ Stripe Payout Report**, **④ Disbursement Summary**, **⑤ Disbursement Detail**, **⑥ Credit Memo**):

- **Invoice Aging** — outstanding invoices bucketed by aging tier, segmented by channel and counterparty.
- **Invoice Detail** — full invoice list with status, amounts, payment terms, and payment history.
- **Stripe Payout Report** — Stripe payouts with method, date, amount, status, and linked invoice.
- **Disbursement Summary** — marketplace payout summary: expected vs. actual date, amount, and variance.
- **Disbursement Detail** — invoice-level breakdown of each marketplace payout, mapping every received dollar.
- **Credit Memo** — issued credits and refunds with linked invoices, reason codes, and cash dates.

### Run and export a report

1. Select **Run report** on the report you want (for example, **Disbursement Detail**).
2. In the report modal, adjust the **date range** and **channel** in the header to scope the preview.
3. Review the preview table and the generated row count.
4. Select **CSV** or **PDF** to export, or **Cancel**/**Close** to dismiss.

![Disbursement Detail report modal with the row count and CSV/PDF export buttons circled](images/report-export.png)

The modal footer shows the **① generated row count** for the current scope, with **② CSV** and **③ PDF** export beside it.

## KPI calculation formulas

The two analytics pages do **not** share a basis. **SaaS Metrics** is computed primarily from recurring entitlement-term snapshots over a trailing twelve-month window, with qualifying revenue records as a guarded legacy fallback; **Channel Performance** is computed from the unified revenue records. Read them as two different lenses on the business, not as two views of one number.

| KPI | Applies to | Formula | Calculation details |
|-----|------------|---------|---------------------|
| ARR | AWS, Azure, GCP, Stripe | `Σ annualized value of active recurring entitlements` | Primarily from entitlement-term snapshots as of the period end — the contract terms rather than the invoices — plus any legacy revenue records that qualify for the fallback. |
| MRR | AWS, Azure, GCP, Stripe | `ARR ÷ 12` | Derived from the same active recurring base. |
| NRR | AWS, Azure, GCP, Stripe | `(base + expansion − contraction − churn) ÷ base × 100` | Base = the recurring base twelve months before the selected end date. The selected start date does not shift this base. |
| GRR | AWS, Azure, GCP, Stripe | `(base − contraction − churn) ÷ base × 100` | Retention before expansion, on the same trailing-twelve-month base. |
| Churn | AWS, Azure, GCP, Stripe | `churned ÷ base × 100` | Recurring revenue lost from that trailing-twelve-month base. |
| ARPU | AWS, Azure, GCP, Stripe | `MRR ÷ distinct active buyers` | Per month. |
| Total revenue | AWS, Azure, GCP, Stripe | `Σ revenue across channels in scope` | From revenue records. |
| Top channel share | AWS, Azure, GCP, Stripe | `channel revenue ÷ total revenue` | Highest-revenue channel. |
| Marketplace vs. Stripe | AWS, Azure, GCP, Stripe | `marketplace revenue ÷ total revenue` and `Stripe revenue ÷ total revenue` | Two percentages of the same total: the marketplace channels combined, then Stripe. |
| Net revenue | AWS, Azure, GCP, Stripe | `gross revenue − channel fees − refunds` | (**Platform fee** is this page's label for the channel fee.) |
| Net margin | AWS, Azure, GCP, Stripe | `net revenue ÷ gross revenue × 100` | The per-channel **Net margin** column in the unit-economics table. Despite the column name, the ratio is net revenue over *gross* revenue. |
| Avg net margin | AWS, Azure, GCP, Stripe | `Σ net revenue ÷ Σ revenue (over channels with a usable platform fee)` | A channel counts only once it has records with a platform fee. |
| Avg net margin — fee availability | GCP | a stored fee of zero counts as a real fee | GCP derives its fee from every usage row, so zero is authoritative. |
| Avg net margin — fee availability | AWS, Azure, Stripe | a stored fee of zero does **not** count | Treated as "fee data not yet ingested", which is why the card can read *Run a full sync to load platform fees*. |
| Avg days to payout | AWS, Azure, GCP, Stripe | `mean(disburse date − invoice date)` | Across records that have both dates. A record whose disburse date precedes its invoice date is excluded from both the total and the count — it is not floored to zero. |

The **Financial Reports** page has no summary KPIs of its own.
