Skip to main content
Read this before you build an earnings or fan spend report on the insights endpoints. The field names alone don’t tell you what each payment source means, which figures are net of refunds and chargebacks, or how a reversal or deduction is recorded. Getting any of them wrong makes a report quietly disagree with the creator’s own earnings. Amounts throughout are integers in USD cents. The tables below cover each money field in turn. For the webhook side of each earning row, see Creator events: payments.

Payment sources

Every earning row on GET /insights/earnings carries a source, and the fan spend breakdown on GET /insights/fans/{userUuid} is keyed by the same names.

The renewal catch-all

renewal is not “subscription renewal”. It is every recurring charge after the first payment, whatever product started the subscription. Profile subscriptions, checkout-link subscriptions and recurring fan experiences all bill as renewal from their second charge onwards. appStore is the single exception. An app subscription’s recurring charges stay under appStore. A fan subscribes to a recurring fan experience priced at 500 USD cents per month: fanExperience therefore only ever holds first payments and one-off unlocks, and the same is true of subscription and checkoutLink. You can’t read a product’s full recurring revenue off one source, because renewal holds the ongoing money and doesn’t name the product that renewed. Fan experiences are the exception. Their rows carry experienceUuid on every charge, renewals included; see Attributing fan-experience revenue. For profile and checkout-link subscriptions, follow the fan’s subscription rather than the earning source.

Fan experiences and the App Store are different transactions

Both involve a third-party app, and the same app can produce both, but the parties differ:
  • fanExperience is the creator selling to a fan. An experience is a fan surface the creator publishes, backed by a third-party app. The money is fan-to-creator spend and belongs in fan spend metrics.
  • appStore is the app developer selling to the creator. The buyer is the creator who installs the app. A fan cannot see the App Store, so an appStore invoice is not fan spend on a creator.
Only paid experiences produce a payment. A free experience produces no invoice, so it never appears on any earnings or spend figure. Payments inside experiences covers how experience access and priced actions are charged.

Attributing fan-experience revenue

Two optional fields on every GET /insights/earnings row identify the fan experience a payment came from. They are the supported way to attribute experience revenue, because source on its own cannot. Both fields are absent on any row not tied to a fan experience.
Filter on experienceUuid, not on source. A fan-experience subscription reports source: "fanExperience" on its first charge only; every renewal reports source: "renewal". Code that selects source === "fanExperience" under-reports recurring experience revenue from the second charge onwards, and the shortfall grows with every renewal. Sum the rows where experienceUuid is present instead, and read source as the type of charge rather than the product that produced it.

A purchase and a renewal side by side

The same subscription, two months apart. Both rows carry the same experienceUuid; only the first reports source: "fanExperience". Amounts are USD cents.
Both rows also carry the fan’s user object, trimmed here. A one-off experience unlock looks like the fanExperience row and is never followed by a renewal row. Earnings rows record money that settled, not whether the fan still has access. A declined renewal writes no earning row, so an integration watching earnings alone never learns that the fan lost access. The subscription behind these rows has its own lifecycle events: creator.experience_subscription.activated and .deactivated report when a fan’s paid experience access starts and stops, keyed on the same experience UUID.

Gross, net, total and reversals

Three amounts describe one row, and a separate per-field rule decides whether reversed purchases are still counted. Think of them as two axes.
  • The fee axis. total is what the fan was charged: gross plus the fan’s tax plus the fan-side transaction fee. gross is the creator’s price the earning is calculated from. net is the creator’s cut after Fanvue fees. On referral, affiliate and giveaway rows no fan paid, so total equals gross. Use total when your figures must match what left the fan’s card.
  • The reversal axis. Whether a refunded or charged-back purchase is still counted. The rule is per field and is not consistent across the insights surface.
The reversal axis, field by field:

Why the sources do not add up to the total

On GET /insights/fans/{userUuid}, spending.total is net of reversals while spending.sources are gross of them. The gap between them is exactly the reversals, which are dropped from sources rather than shown as their own entry. To reconcile the two, fetch the fan’s reversals from GET /insights/spending with fanUuid set and subtract them yourself.

How a reversal is recorded

A refund or a chargeback is written as its own invoice, never as an edit to the payment it reverses. Three consequences follow:
  1. The original stays settled. It keeps its own row on GET /insights/earnings with its original amount.
  2. A reversal is always the full amount. Fanvue has no partial refunds, so a reversed purchase is reversed for exactly what the fan paid.
  3. The pairing is explicit. refund, chargeback and earningsDeduction rows carry reversedTransactionOrderId, the transactionOrderId of the payment they reverse or deduct from.
A reversal reports the source the creator sees in their own earnings. chargeback covers a bank dispute and a refund Fanvue issued to stop one. refund covers every other refund and a payment cancelled before it was collected. Filtering by source follows the same split.
Both rows also carry the fan’s user object, trimmed here. The original message row is untouched and still reports the full 1999 it was paid.

Freshness

Agency insights

Three agency-level insights endpoints sit alongside the chatter leaderboard. All of them aggregate across every creator the agency manages and accept a creatorUuids filter of up to 50 UUIDs. Every row returns both gross and net. On top-fans, earningsView chooses which of the two ranks the rows, and both are returned regardless. Amounts are USD cents.
Agency endpoints require agency admin access on top of the listed scopes. A creatorUuids value that does not belong to the agency fails the whole request with 403 rather than being ignored.