At a glance
The breakdown of failed-charge reasons in the period, ranked by count. The companion to rec_decline_rate: when the headline rate moves, this card explains why. Reasons are pass-through values from the underlying processor (Shopify Payments / Stripe / Authorize.Net), so the exact codes you see depend on which processor your store uses. Common Recharge clusters: EXPIRED_CARD, INSUFFICIENT_FUNDS, DO_NOT_HONOR, CARD_NOT_SUPPORTED, AUTHENTICATION_REQUIRED.
| What it counts | Top-N (default 8) decline reason codes from /charges where status = ERROR, grouped by error_type and error_code fields. Each row: count + percentage of total declines + period-over-period delta. |
| Reason taxonomy | Pass-through from the underlying processor. Stripe card_declined codes (insufficient_funds, expired_card, card_not_supported, do_not_honor, etc.); Authorize.Net response codes (Reason 6, 27, 36, etc.); Shopify Payments shows the same codes as Stripe. |
| Currency | Currency-neutral (it’s a count distribution). |
| First-attempt only | Yes. Retried-and-still-failed counts the original reason. Retried-and-recovered no longer appears in the failure pool. |
| Cancellations / SKIPPED | Excluded. |
| Time window | 7D vsP rolling default. |
| Alert trigger | Reason-cluster spike: any single reason rising >50% absolute count vsP. sentiment_key: decline_rate. |
| Reading hints | EXPIRED_CARD spike = card-batch reissue or year-end. INSUFFICIENT_FUNDS spike = end-of-month billing or cohort-wide thin-wallet pattern. DO_NOT_HONOR spike = issuer-side fraud filter, often BIN-clustered. AUTHENTICATION_REQUIRED = SCA / 3DS misconfiguration on EU traffic. |
| Roles | owner, finance, operations |
Calculation
Calculated automatically from your Recharge data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
“Daily Greens Co”. 7-day window 26 Apr 26 to 02 May 26. Top 8 decline reasons:| Rank | Reason code | Count | % of declines | vsP (count delta) | Likely cause |
|---|---|---|---|---|---|
| 1 | INSUFFICIENT_FUNDS | 102 | 31.2% | +18 | End-of-month thin-wallet cohort |
| 2 | EXPIRED_CARD | 88 | 26.9% | +30 | Issuer reissue cycle |
| 3 | DO_NOT_HONOR | 64 | 19.6% | +12 | Issuer-side fraud flag (BIN cluster suspected) |
| 4 | TRANSACTION_NOT_PERMITTED | 21 | 6.4% | +3 | Mostly closed accounts post-fraud event |
| 5 | PROCESSING_ERROR | 18 | 5.5% | +5 | Transient processor faults |
| 6 | CARD_NOT_SUPPORTED | 14 | 4.3% | -2 | Prepaid debit / digital-only cards being declined for recurring |
| 7 | AUTHENTICATION_REQUIRED | 11 | 3.4% | +9 | EU SCA mis-flag on UK customers |
| 8 | other | 9 | 2.7% | -1 | Long tail |
- EXPIRED_CARD jumped 52% week-over-week. This is highly suspect of a card-batch reissue. Check if a major issuer (Chase, Capital One, Bank of America) reissued a tranche of cards with new expiry dates in late April. Account Updater would auto-resolve most of these. Without it, the customer must update their card-on-file in the portal.
- AUTHENTICATION_REQUIRED rose from 2 to 11. Small absolute number but +450% relative. On Recharge, recurring rebills should NOT trigger SCA, MIT (Merchant Initiated Transaction) exemption applies for subscription billing. If this code appears at all on rebills, the MIT flag is not being passed correctly to the underlying processor. Bug.
- CARD_NOT_SUPPORTED at 14 declines is mostly customers who paid with a prepaid debit card or a digital-only card during signup, neither of which supports recurring authorization. Recharge can flag these at signup with proper validation; they’re an acquisition-quality issue not a decline-fix issue.
- DO_NOT_HONOR at 64 is the hardest to action because issuers don’t disclose the real reason. If clustered to one BIN, it’s a fraud-flag wave (escalate to Recharge support, who can engage with issuer). If spread across BINs, it’s noise.
- INSUFFICIENT_FUNDS at 102 is the largest cluster but the least actionable, customers genuinely don’t have funds at rebill moment. Long-term fix: offer billing-day choice, allow customers to align rebill with payday.
Sibling cards merchants should reference together
| Card | Why pair it with Top Decline Reasons |
|---|---|
rec_decline_rate | The headline rate this card decomposes. |
rec_success_rate | The complement view. |
rec_top_payment_methods | Method-by-reason cross-tab reveals (e.g.) “Amex declines on AUTHENTICATION_REQUIRED”. |
rec_threedsecure_abandon_rate | If AUTHENTICATION_REQUIRED is climbing, abandons are likely rising too. |
rec_volume_trend | Volume troughs frequently coincide with reason-cluster spikes. |
| Stripe / Shopify Payments decline reasons | The native processor view; codes match. |
Recurly rec_top_decline_reasons | Cross-platform pattern compare. |
Reconciling against the vendor’s own dashboard
Where to look in the Recharge merchant portal: admin.rechargepayments.com. The closest comparable view is Recharge Admin → Charges → Failed → group by error code. The CSV export from this view gives the same ranked breakdown. Some reason codes only appear in the underlying processor’s dashboard (Stripe Radar / Shopify Payments dispute view) with extra context Recharge admin doesn’t surface. Why our number may legitimately differ from the Recharge merchant portal:| Reason | Direction | Why |
|---|---|---|
| Reason normalisation | Slight differences | Different processors use different code names for the same underlying decline. Our engine normalises some (e.g. Stripe card_declined.expired_card and Authorize.Net Reason 8 both map to EXPIRED_CARD in our taxonomy). Recharge admin shows raw codes. |
| Time zone bucketing | Boundary days off | Recharge admin: store TZ. Vortex IQ: UTC. |
| Retry-resolved declines | Theirs may show 1 fewer count | If a charge failed with EXPIRED_CARD on day 1 then succeeded on day 4 retry (because Account Updater pushed a new card), our snapshot taken between day 1 and day 4 still shows the EXPIRED_CARD; Recharge admin in retrospect may purge it. |
| Comparison | Expected relationship | When divergence is legitimate |
|---|---|---|
rec_top_decline_reasons ↔ underlying processor decline reasons | Should match closely | Recharge passes through processor codes; the same decline shows up in both dashboards. |