Found 2026-09-04 on the deploy preview of #1422 (flow D). A wallet top-up creates a real Razorpay order and the card is captured, but WalletTopUp stays PENDING and the wallet is not credited until payment.captured arrives (app/api/organizations/[orgId]/billing-account/wallet/top-ups/route.ts → handleOrgPaymentSuccess → confirmTopUp). Consumer checkout has a second, client-side confirmation path (verify-signature) so a lost or delayed webhook does not strand the buyer; the top-up has none, so the org admin sees a captured card and an unchanged balance until the sweep-orphaned-topup-captures job runs. Decide whether to add the same client-side verify path for top-ups or document the webhook-only design and surface the pending state in the wallet UI.
🤖 Generated with Claude Code
https://claude.ai/code/session_01MgadJydWEKkdhhzY58yiL7
Found 2026-09-04 on the deploy preview of #1422 (flow D). A wallet top-up creates a real Razorpay order and the card is captured, but WalletTopUp stays PENDING and the wallet is not credited until
payment.capturedarrives (app/api/organizations/[orgId]/billing-account/wallet/top-ups/route.ts → handleOrgPaymentSuccess → confirmTopUp). Consumer checkout has a second, client-side confirmation path (verify-signature) so a lost or delayed webhook does not strand the buyer; the top-up has none, so the org admin sees a captured card and an unchanged balance until the sweep-orphaned-topup-captures job runs. Decide whether to add the same client-side verify path for top-ups or document the webhook-only design and surface the pending state in the wallet UI.🤖 Generated with Claude Code
https://claude.ai/code/session_01MgadJydWEKkdhhzY58yiL7