# Revenue Records

**Revenue Records** is the ledger behind every metric in the workspace. It shows the unified revenue records that Fours normalizes from each channel, alongside the raw source records they were built from.

---

## Overview

Open **Revenue → Revenue Records**. The page has a trend chart, two tabs, and a wide, exportable table — there are no summary cards here; the totals live on the [Overview](/revenue/overview/) lifecycle cards.

![Revenue Records: trend chart with Invoice/Collectable/Disburse series, the Lifecycle column, and the Columns control circled](images/revenue-records.png)

The chart series are circled in red — **① Invoice Amount**, **② Collectable Amount**, **③ Disburse Amount** — and in orange, **①** the per-row **Lifecycle** stage column (Billing, Cash Collected, Disbursed) and **②** the **Columns** control for customizing the table.

Two tabs switch between the normalized and source views:

- **All Records** — one normalized row per revenue event, with a consistent set of columns across every channel.
- **Raw Records** — the source-level records exactly as each channel reported them.

### Scope the page

1. Set the **date range** (defaults to the last 90 days).
2. Choose a **currency** — the table and chart show only records in that currency, and amounts are never converted.
3. Optionally narrow to one channel with the workspace **Channel** filter at the top.

The chart above the table plots **Invoice Amount**, **Collectable Amount**, and **Disburse Amount** for the current scope — the channel, date range, currency, and the **Lifecycle** column filter; search does not narrow the chart. It groups by day when the date range spans seven days or less, and by month otherwise. Use its menu to **Download SVG**, **PNG**, or **CSV** of the charted series.

## All Records

The **All Records** table has one normalized row per revenue event. Columns include the product and entitlement, CRM opportunity, buyer and country, **lifecycle** stage (Billing, Cash Collected, Disbursed), invoice date and amount, partner fee (amount and percent), collectable amount, due date and payment term, disburse date and amount, payout currency, tax, refund details, category, channel, sales motion, reseller, and the payment, earning, invoice, bank-trace, and disbursement reference identifiers.

To work with the table:

1. Type in **search** to narrow the list. Search runs on the server across the whole result set, not just the rows on screen.
2. Select **Columns** to show or hide columns and focus on what you need.
3. Select the **expand** control at the end of a row to open its full normalized detail.
4. Select **CSV** to export the current view.

If the service refuses a page or an export — for example a date range wider than the service window — the page shows a red banner with the reason (*Could not load revenue records: …* or *Could not export revenue records: …*) and hides the total, so a refusal looks different from a genuinely empty period.

Search is a **case-insensitive substring match** — a fragment matches anywhere in the value, so `acme` finds *Acme Corp*. It covers seven fields: the **record ID**, **buyer name**, **invoice ID**, **buyer ID**, **entitlement ID**, **disbursement reference**, and **offer external ID**. A term that matches none of those returns nothing, even if it appears in another column. Search terms are capped at **256 characters**.

Several columns carry an in-product tooltip explaining what the value is — hover the column header. Two are worth reading before you reconcile:

- **Tax Amount** — for AWS this is tax AWS collected from the buyer and remits itself. It is informational, never disbursed, and excluded from your collectable amount. A negative value is tax returned to the buyer on a refund.
- **Disburse Date** — GCP records fall back to their **expected** payout date here, because Google never reports an actual one. See [GCP Revenue](/gcp-marketplace/revenue/).

:::info
**CSV export covers the whole filtered result set, not just the rows on screen.** There is no row cap. Fours pages through the matching records **500 at a time** until it has fetched every row the current filters return, so a large export simply takes longer to assemble rather than being truncated. Narrow the channel, date range, or currency filters first if you only need part of the ledger.

The export carries an **Is Estimated** column. It flags a GCP row that has an expected payout date but no actual one — Google never reports one — so the row is dated against its expected payout.
:::

:::info
**One AWS invoice can produce several rows.** AWS reports revenue per buyer-transaction relationship, so a single AWS invoice that spans multiple contracts arrives as one revenue record per relationship. All of them keep the same invoice ID. That is why the record count here can exceed your invoice count for AWS, and why the same invoice ID can appear on more than one row.

The [Invoices](/revenue/invoices/) page aggregates those sibling rows back into a single invoice, matching on **invoice ID and currency**, so an AWS invoice is counted once there. Read Revenue Records as the event-level ledger and Invoices as the invoice-level view.
:::

### Reading the AWS partner fee

On AWS rows, the **partner fee amount** and the **partner fee percentage** are deliberately not the same calculation, so the percentage will not reproduce if you divide the dollar figure by the invoice amount:

| Figure | What it includes |
|--------|------------------|
| **Partner fee (amount)** | AWS's listing fee **plus** the VAT AWS charges you on that listing fee. |
| **Partner fee (%)** | The listing fee **without** its VAT, over a base that has the **seller-remitted tax removed**. |

The percentage is built this way on purpose: including a tax charged *to you* in a rate meant to describe *AWS's cut* inflates it. Read the dollar figure as what AWS actually kept, and the percentage as AWS's effective rate. The listing-fee VAT is a separate thing from the buyer tax on the invoice — see [Invoices](/revenue/invoices/) for the two AWS tax lines.

### Buyer payment term

The **Buyer Payment Term** column prefers the term the channel itself supplied. Only when the channel supplies none does Fours derive one, as *Net N days* from the gap between the invoice date and the payment due date. For AWS, that supplied term is the buyer net term snapshotted onto the record when the agreement was accepted, so it keeps reading correctly even if the buyer's terms change later. See [AWS Revenue](/aws-marketplace/revenue/).

## Raw Records

The **Raw Records** tab shows source-level records for the channels you've connected, so you can compare what a channel reported against Fours' normalized row. Cloud marketplace channels render a per-channel detail table; direct (Stripe) billing renders a payment-transactions view.

If a connected channel has no raw-record view, the tab reads *Raw records are not available for* followed by that channel's name. If no channels are connected, it shows *No connected channels are available for raw records.*

:::info
Opening a record shows its **current** normalized state, not a full change history. Fours keeps the latest synced values for each record; step-by-step source event history is not yet available in this view.
:::

## KPI calculation formulas

Revenue Records has no summary KPIs; its chart totals the records currently in scope (channel, date range, currency, and the Lifecycle filter), placed by invoice date in UTC — or, without one, by service start, billing-period start, provider update, or last update. Every series is net of refunds — though a refund that failed, was canceled, or is awaiting action is **not** subtracted here, unlike on the [Overview](/revenue/overview/#kpi-calculation-formulas) — and a voided, canceled, or written-off record counts as zero.

| Charted series | Applies to | Formula | Calculation details |
|----------------|------------|---------|---------------------|
| Invoice Amount | AWS, Azure, GCP, Stripe | `Σ invoice amount` | Common across channels. |
| Collectable Amount | AWS | `Σ collectable amount exactly as AWS reported it` | AWS is the one channel Fours does **not** recompute: it preserves the collectable amount AWS supplies. That amount is net of marketplace fees and **includes** seller-remitted tax — the tax AWS disburses to you, which you then remit onward. Tax AWS collects and remits itself is informational and never affects it. |
| Collectable Amount | Azure, GCP | `Σ (invoice amount − channel fee)` | Channel fee only; no tax deduction. |
| Collectable Amount | Stripe | `Σ invoice amount` | Direct billing treats the full invoice as collectable. |
| Disburse Amount | AWS, Azure, GCP, Stripe | `Σ disburse amount` | Common across channels. A GCP amount counts as soon as Google reports it, before its expected payout date. |

See [Overview](/revenue/overview/) for how these amounts roll up into the lifecycle stage cards, and [Revenue Settings](/revenue/revenue-settings/) for base-currency and FX handling.
