İçeriğe atla
ÖzelliklerFiyatlandırmaİş OrtaklığıBlogYardımHakkımızdaİletişim
BaşlaGiriş Yap
Bloga Dön
industry2026-05-2413 dk okuma

Kartim 3DS de takildi, thMenu grace period gosterdi — Stripe invoice.payment_action_required eksigi (PR #606 CCC F4)

Malatya Inonu Cad nde 42-yas "Malatya Kayisi + Kebap" sahibi Sevda, 9 yillik Dogu Anadolu mutfagi + kayisi retail 50-cover. Pro tier $29/ay otomatik Stripe charge. Sali 06:42 UTC bildirim: "thMenu Aboneliginiz GRACE PERIOD a alindi. Odeme basarisiz. 7 gun icinde guncelleyin." Ayni anda VakifBank SMS: "$29 thMenu odemesi 3D-Secure dogrulamasi gerektiriyor app ten onaylayin." Sevda VakifBank app push Onayla + FaceID 3DS code dogrulama basarili. 5dk bekledi thMenu hala GRACE PERIOD. EU PSD2 SCA 2019 dan beri online card payment 3DS challenge tetikler. Stripe payment flow 3DS sirasinda invoice.payment_action_required webhook event gonderir customer action gerekli temporary hold tier dokunulmamali. Sevda flow: 06:30 charge attempt, 06:31 VakifBank 3DS required + Stripe invoice.payment_action_required webhook → thMenu default branch silent 200 OK, 06:42 thMenu invoice.payment_failed logic e dustugu icin yanlislikla GRACE PERIOD email (action_required != payment_failed iki farkli state confused), 06:43 Sevda 3DS complete + Stripe invoice.paid → thMenu tier active. Email confusion: action_required ile payment_failed conflated. Engineering forensik apps/web-admin/src/app/api/stripe/webhook/route.ts switch event.type 6 case handled: checkout.session.completed + customer.subscription.updated + customer.subscription.deleted + invoice.paid + invoice.payment_failed + charge.dispute.created. **3 modern Customer Portal lifecycle event missing**: (1) invoice.payment_action_required 3DS/SCA Sevda case; (2) customer.subscription.paused Stripe Customer Portal pause feature tier hala paid; (3) customer.subscription.resumed pre-pause tier yerine current price_id re-derive. 90-gun Stripe dashboard delivered events grouped by type: **847 missing-handler events** 612 invoice.payment_action_required + 178 customer.subscription.paused + 57 customer.subscription.resumed %2 hata orani her event customer-affecting. **PR #606 batch CCC F4** 4-katmanli fix: **Layer 1** invoice.payment_action_required DLT info row + sendActionRequiredEmail "complete 3DS challenge in bank app" + Stripe hosted invoice link, **NO tier change** temporary state. **Layer 2** customer.subscription.paused tier = starter + cascadeTierDowngrade (PR #519 EE) + DLT info row. **Layer 3** customer.subscription.resumed deriveTierFromPriceId current price (stale pre-pause yerine — customer pause sirasinda upgrade/downgrade etmis olabilir) + syncD1Tier. **Layer 4** default branch [BEACON:stripe_webhook_unhandled] Sentry beacon + DLT info — silent 200 yerine coverage gap loudly. Sevda response 12 saat 1-ay Pro tier credit + dogru email. 847 backfill: 612 action_required retro-replay yapilamaz (Stripe delivered) ama super-admin dashboard DLT-replay button enabled + 360-gun-pro-discount-coupon affected restaurants. 178 paused 23 stale-entitlement compassionate hediye. 57 resumed 12 pause-sonrasi upgrade tier backfill. Asdis Reykjavik Skolavordustigur "Kjotsupan" 32-cover modern Icelandic comfort food version ayni flow Arion Bank FaceID 3DS. Pattern: **Stripe webhook handler modern Customer Portal lifecycle her event type explicit handle etmeli; default branch silent 200 yerine [BEACON:stripe_webhook_unhandled] Sentry alert emit etmeli coverage gap loud.** Implementation checklist: (1) switch explicit cases lifecycle events; (2) action_required DLT + email NO tier change; (3) paused tier=starter + cascade + DLT; (4) resumed price_id re-derive; (5) trial_will_end customer email; (6) default branch Sentry beacon + DLT info; (7) quarterly Stripe dashboard audit; (8) customer-side UX action_required vs failed differentiation.

th

thMenu Ekibi

thmenu.com

Faydalı buldunuz mu? Paylaşın.