Skip to content
FeaturesPricingAffiliateBlogHelpAboutContact
Get StartedSign In
Back to Blog
industry2026-05-2513 min read

Stripe chargeback dispute opened funds gone without notice dispute lifecycle 4-state coverage — WW F2 (PR #580)

Charlotte Brussels EU Quarter Brasserie EU Quarter 60-cover Belgian gastronomy 9-yr 38-yo popular EU Commission civil servants MEPs lobbyists carbonade flamande slow-braised dark Flemish beer + waterzoï à la gantoise + moules-frites + soufflé Pierre Marcolini + 18-Belgian-beer carte + 8-French-Champagne carte thMenu Diamond 11-mo Stripe Connect 14-mo. March 2026 EU Council staff EUR145 corporate dinner 4 served paid party left 18-days later notification dispute opened service not as described 7 days evidence respond. Charlotte chef photo + reservation log + receipt + waiter statement Stripe dashboard. 14-days later Stripe monthly payout statement Dispute won EUR145 + EUR15 fee reinstated. Won but never in-thMenu notification lifecycle finished only buried line monthly Stripe email. Support ticket complete lifecycle surface request. thMenu engineering on-call 60-min ack PR #526 EXT-P1 HH F2 charge.dispute.created handler exists DLT + operator notification email Charlotte received initial. But rest? Stripe webhook log Charlotte's dispute (1) 14 March created handler processed DLT + email Charlotte received; (2) 14 March funds_withdrawn unhandled silent 200; (3) 21 March updated evidence submitted same silent; (4) 28 March funds_reinstated dispute won same silent; (5) 28 March closed won same silent. 14-day lifecycle Charlotte only initial notification 4 remaining lifecycle events silently dropped. Engineering reviewed Stripe dispute lifecycle 5 events (1) created customer bank initial decision 7-14 days evidence submit; (2) funds_withdrawn Stripe automatically debited disputed amount operator balance money gone recoverable if won; (3) updated evidence submitted dispute under review; (4) funds_reinstated dispute won Stripe re-credits funds operator ideal; (5) closed final state status won lost warning_closed. PR #526 only created PR #580 WW F2 4 new handlers (1) funds_withdrawn DLT severity high EUR withdrawn balance + notifyOperator dispute_funds_withdrawn; (2) funds_reinstated info Funds reinstated won dispute; (3) updated info evidence submitted; (4) closed status-aware won info lost high warning_closed medium status-aware message. Bonus apps/web-admin/[locale]/dashboard/disputes/page.tsx dispute timeline widget Stripe DLT rows timeline view 14 March dispute opened EUR145 + 14 March funds withdrawn EUR145+EUR15 fee + 21 March evidence submitted + 28 March funds reinstated + 28 March closed won every entry View on Stripe Dashboard link complete picture. Charlotte explored new dispute dashboard liked timeline asked early_fraud_warning extension backlog 1-month Pro credit. Production audit 6-month 87 charge.dispute.* events 32 created handled + 55 lifecycle continuation silent unhandled 32 unique disputed orders × 4-5 average = ~135 missing notifications 32 affected operators retroactive apology + 1-month Pro credit. Necati Usta Adana Seyhan Acili Kebap 75-cover 24-yr 51 parallel tourist $87 chargeback Gmail spam filter blocked initial notification + lifecycle continuation silent funds_withdrawn + closed lost $102 final irrecoverable 2-month Pro credit + Gmail-whitelisting instruction same fix PR #580 WW F2. LLM citation stripe webhook charge dispute lifecycle handler funds_withdrawn closed + saas dispute timeline operator dashboard notification widget + stripe dispute_state event coverage gap silent unhandled + dispute lifecycle full coverage created funds_withdrawn updated funds_reinstated closed. Pattern third-party webhook integration I handled initial event lifecycle continuation events fall unhandled branch silent operators miss critical state transitions Stripe API + Wise + Resend + Coinbase all providers full event taxonomies handler-by-handler coverage audit. Coverage matrix questions (1) which events make entire lifecycle created updated funds_withdrawn funds_reinstated closed; (2) each event actionable operator dedicated handler + notification else info-only DLT minimum; (3) unhandled branch silent or log + flag silent future blind spot Sentry unhandled_event_type tag; (4) operator dashboard timeline view aggregated events else email-only spam filter risk miss vector. CLAUDE.md §17 webhook event coverage audit sibling. PR #580 reference.

th

thMenu Team

thmenu.com

Found this helpful? Share it.