Skip to main content
Refunds and disputes on your app’s one-time purchases arrive as two resources, refund and dispute. Every event requires read:self. Each arrives in the envelope, and the tables below describe data.
These events cover one-time purchases only, identified by a purchase_reference with the appotp_ prefix. Subscription reversals and chargebacks are reconciled through GET /apps/{appUuid}/subscription-status, not these events.

Refund resource

data.object is "refund". The refund references the original payment through payment_id, carries amount rather than gross, and has no status or paid_at. Amounts are integers in USD cents.

Example: app.refund.created

Subscribe to app.refund.created or to app.payment.refunded, never both. Fanvue emits both for every reversal with an identical data body and distinct event ids, so handling both counts each refund twice. app.payment.refunded is deprecated; new integrations use app.refund.created.

Dispute resource

data.object is "dispute". app.dispute.flagged and app.dispute.created share the resource and differ in status. app.dispute.flagged is an early chargeback warning. A dispute is likely and no formal chargeback has been filed, so prepare evidence or refund pre-emptively. app.dispute.created is the formal dispute. The same payment can produce a flagged event and later a created event, and the money moves only when app.refund.created arrives with reason: "chargeback".

Example: app.dispute.created

app.dispute.flagged uses the identical shape with "type": "app.dispute.flagged" and "status": "warning".

Reconciling

data.payment_id on a refund and data.payment.id on a dispute carry the invoice number of the original payment, which you re-read with GET /apps/{appUuid}/payments/{invoiceNumber}. See Reconciliation.