Caynetic Blog

If Money Moves Instantly, Who Owns the Exception?

A failed, duplicate and pending payment walkthrough with safe retries and reconciliation.

Back to Blog

Practical software guides

Fast payment rails still need exception handling. “Pending”, “failed”, “reversed” and “paid” must come from the provider’s supported states, not a customer screenshot or a timer in your app.

Synthetic payment exceptions
SituationSafe response
Browser times outCheck the original provider reference before retrying
Same event arrives twiceDeduplicate by event/transaction identity
Payment remains pendingHold final fulfilment or use the approved risk policy
Refund requestedCheck authority, original payment and provider refund state
Provider/bank totals differReconcile references, fees and payout batch

Use an idempotency key for supported provider write requests. Persist the business reference before acting on a callback, verify the callback’s authenticity and make duplicate delivery harmless. Unknown state should remain visible for review.

The Stripe idempotency documentation is a provider-specific example. It does not define Bahamas instant-payment-system behaviour. Consult the Central Bank and the actual participating provider for current local rail availability, rules and status semantics; no rollout date or universal instant-settlement claim is made here.

Keep card data and credentials out of application logs. The checkout-to-payout example covers reconciliation after a successful payment.

Explore the current journal · Earlier topics