payment resource. They are delivered in the Standard-Webhooks envelope; the fields below describe the data object.
checkout_link.payment.succeeded covers one-off purchases, initial subscription payments, and renewals. Branch on billing_reason to tell them apart.
Payment resource
Failure reasons
checkout_link.payment.failed carries a sanitised reason. Values are deliberately coarse: Fanvue’s risk screening is never disclosed, so declines it drives surface under neutral values.
Two rules:
- You don’t retry charges yourself. Checkout is buyer-present: a failed one-time payment ends there unless the buyer tries again, and failed renewals enter Fanvue’s own retry schedule (dunning). Don’t treat the first failed renewal as churn.
- Use
reasonfor ops and analytics: spotting a decline spike, deciding when to re-engage a buyer, reconciling failed revenue.
BNPL installments
When a fan finances a purchase with Buy Now, Pay Later (BNPL), Fanvue is paid upfront, so the sale still arrives as a singlecheckout_link.payment.succeeded. The only difference is that it is marked as a financed sale:
paid_in_fullisfalse, andinstallmentis{ "number": 1, "of": N }(the first ofNinstallments).
2..N) are financing movement, not new Fanvue sales. Fanvue has already been paid. Those repayments arrive as checkout_link.installment.paid / .failed events, not as further payment.succeeded events, and the plan finishing emits checkout_link.plan.completed.
For a normal (non-financed) payment, installment is null and paid_in_full is true once collected.
Failure reasons
checkout_link.payment.failed carries a sanitised reason. Values are deliberately coarse: Fanvue’s risk screening is never disclosed, and declines it drives surface under neutral values.
Two rules:
- You don’t retry charges yourself. Checkout is buyer-present: a failed one-time payment ends unless the buyer tries again, and failed renewals enter Fanvue’s own retry schedule, so don’t treat the first
payment.failedon a renewal as churn. - Use
reasonfor ops and analytics: spotting a decline spike, deciding when to re-engage a buyer, and reconciling failed revenue.
Examples
checkout_link.payment.succeeded
checkout_link.payment.succeeded (BNPL financed sale)
The initial financed sale carries paid_in_full: false and installment: { number: 1, of: N }. gross is the full sale amount; currency is what the fan is charged (the processing currency). Repayments 2..N then arrive as installment events.