The Platform Refund Ledger

Appendix C · The webhook map for money events

The Platform Refund Ledger · 3 min read

Webhooks are how a platform learns about backward money movements at the moment they start, rather than at month-end when they have finished. Event names and payload shapes are Stripe's (docs.stripe.com/api/events/types); the "money meaning" column is the operational reading this book has built up, and the last column is the smallest useful response.

EventFires whenMoney meaningFirst action worth taking
charge.refundedA refund is createdThe buyer's leg moved; the seller's and fee legs moved only if flags were setRecord refund; compute expected reversal and fee share per chapter 8; compare against live transfer state
charge.refund.updatedRefund status changes (pending, failed, canceled)A failed or canceled refund returns funds to the originating balance — destination patterns re-credit the platformReopen the episode if it was counted as done
charge.dispute.createdIssuer opens a disputePlatform debited now on destination/separate patterns; seller untouched; recovery window starts closing at each payoutLog exposure = transfer.amount − amount_reversed; run dial-3 policy from chapter 10
charge.dispute.closedDispute resolves; check statuslost: provisional debit becomes permanent. won: funds return via adjustment linesOn lost: execute clawback or queue for netting; on won: schedule any owed retransfer (mind cross-border limits)
charge.dispute.funds_withdrawnStripe pulls disputed funds from the accountConfirms the debit as ledger lines of type adjustmentMatch to the dispute register entry
charge.dispute.funds_reinstatedFunds returned after a winThe credit side of the same storyMatch, close the register row
application_fee.createdFee object created (asynchronously by default on direct charges)Your revenue line now exists and can be auditedAttach to charge record for step 4 of the audit
application_fee.refundedFee refunded (via flag or standalone call)Platform balance debited; seller creditedVerify proportionality against expected share
transfer.createdTransfer to a connected account createdSeller's money is now in their balance and reachableStart of the reachability clock
transfer.reversedA reversal lands (full or partial)Money came back; amount_reversed changedUpdate findings; confirm against expected figure with tolerance
payout.paidPayout reached the bankReachability for that amount endsMark the window closed for affected transfers
payout.failedPayout failed; funds return to balanceBalance still reachable after all — reversals remain cleanPrioritize any queued findings on that account
balance.availableFunds become availablePending became spendableFeeds cutoff accounting (chapter 9)
account.application.deauthorizedConnected account disconnected your platformAPI recovery path closes; support/legal path remainsFreeze automated actions; route to human process

Two wiring notes. First, events are delivered at-least-once: handlers must be idempotent, because a retried delivery that triggers a non-idempotent reversal creates exactly the double-recovery problem chapter 8 warns about. Second, event order is not guaranteed across types — a charge.dispute.closed may arrive before its created twin finishes processing; key state on object ids, not arrival sequence.