source actually covers, which figures are gross and which are net of refunds and chargebacks, and how a reversal is recorded.
Payment sources
Every earning row onGET /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, no matter which 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.
The consequence catches integrators out. A fan subscribes to a recurring fan experience priced at 500 cents per month:
So
fanExperience only ever holds first payments and one-off unlocks, and the same is true of subscription and checkoutLink. If you want a product’s full recurring revenue you cannot read it off one source: renewal is where the ongoing money is, and it does not say which product produced it.
A
renewal row does not tell you which product renewed. To attribute renewals
to a product, 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 are different:fanExperienceis the creator selling to a fan. An experience is a fan-facing mini-app the creator publishes, backed by a third-party app. This is fan-to-creator spend and it belongs in fan spend metrics.appStoreis the app developer selling to the creator. The buyer is the creator who installs the app. A fan cannot even see the App Store, so anappStoreinvoice is not fan spend on a creator.
Gross, net, and reversals
Two different distinctions share the words gross and net, and the endpoint decides which one is meant:- The fee axis. On the earnings endpoints and the agency insights endpoints,
grossis what the fan paid andnetis the creator’s cut after platform fees. Both describe the same transaction. - The reversal axis. Whether a refunded or charged-back purchase is still counted. This is per field, and it is not consistent across the insights surface.
Why the sources do not add up to the total
OnGET /insights/fans/{userUuid}, spending.total is net of reversals while spending.sources are gross of them. The two therefore disagree, and the gap is exactly the reversals, which are dropped from sources entirely rather than shown as their own entry.
If you need the two to reconcile, fetch the fan’s reversals from GET /insights/spending with fanUuid set and subtract them yourself.
Fanvue is adding reversal-free companions to
spending.total, to each
per-source figure and its average, and a last-valid-purchase field alongside
spending.lastPurchaseAt. The existing fields keep their current meaning, so
nothing shifts under an integration that already reads them. Separately,
Fanvue is removing appStore from the fan spend metrics as a correction,
because it records a creator’s purchase from an app developer rather than a
fan’s spend. That one does move numbers, and the changelog will
call it out when it ships.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 worth knowing:- The original stays settled. It keeps its own row on
GET /insights/earningswith its original amount. Nothing about it changes when it is reversed. - A reversal is always the full amount. Fanvue has no partial refunds, so a reversed purchase is reversed for exactly what the fan paid.
- The pairing is explicit. On
GET /insights/earnings,refundandchargebackrows carryreversedTransactionOrderId, which is thetransactionOrderIdof the payment they reverse. That is the supported way to match the two.
user object, trimmed here for brevity. Note that the original message row is untouched: it still reports the full 1999 it was paid.
Freshness
Agency insights
Three agency-level insights endpoints sit alongside the chatter leaderboard, under Agency Insights in the API Reference. All of them are agency-wide: they aggregate across every creator the agency manages, and accept acreatorUuids filter (max 50) to narrow to a subset.
Every row returns both figures,
gross and net, so you never have to pick one at request time. On top-fans, earningsView chooses which of the two the ranking is done by, and both are returned regardless. Amounts are USD cents.
This gross-and-net-on-every-row shape is the convention the fan insights endpoints are moving to as well.
Agency endpoints require agency admin access on top of the scopes above. A
creatorUuids value that does not belong to the agency fails the whole
request with 403 rather than being ignored.