Classify decline codes returned in the authorization response: hard declines (e.g., do_not_honor_permanent, invalid_account, card_not_supported, stolen_card) indicate the card cannot be used and should not be retried; soft declines (e.g., insufficient_funds, do_not_honor, try_again_later) may succeed on a later retry.
For soft declines, implement an exponential backoff retry schedule aligned with network retry rules: Visa and Mastercard allow a maximum of 15 retries over 30 days after an initial decline; exceeding this triggers excessive retry monitoring fees.
Do not retry hard decline codes (card blocked, fraud, stolen) under any circumstances — retrying these increases fraud risk and may violate card network excessive retry rules.
For insufficient_funds declines on recurring subscriptions, schedule retries toward end-of-month or payroll dates when funds are more likely to be available.
Implement idempotency keys on each retry attempt using a new unique key per attempt — do not reuse the same idempotency key across retries as it will return the cached original decline response.
After exhausting retries, trigger account updater (VAU/ABU) to check for new card credentials before presenting the cardholder with a payment update prompt.
Known gotchas
Mastercard and Visa both enforce excessive retry rules (Mastercard Transaction Processing Excellence, Visa Retry Advice) — retrying a hard decline code or exceeding 15 retry attempts in 30 days can result in fines applied through your acquirer.
authentication_required declines on MIT recurring charges cannot be resolved by 3DS retry since the cardholder is not present; these require the cardholder to re-authenticate in a future CIT session.
Identical retry amounts at identical times are detectable by issuers and increase the probability of a block; staggering retry amounts (when permitted by contract) and times reduces pattern-matching declines.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp