On this page
- Cards: renewals fail on expiry, replacement and declines; Stripe updates many saved cards automatically and recommends 8 retries within 2 weeks (Stripe docs, 15 October 2026).
- USDC on Fianto: a wallet never expires; renewals fail on an empty wallet or a removed approval, are tried at the boundary, +1 h, +6 h and +24 h, and end after the fourth failure.
- No chargebacks on USDC, and Fianto sends customers no emails: message them yourself from subscription.payment_failed.
What changes when a subscription moves from cards to stablecoins?
What changes is the reason a renewal fails, how long you get to recover it, and who can take the money back afterwards. The card column below is Stripe Billing as its documentation describes it on 15 October 2026. The stablecoin column is a USDC subscription on Fianto, which publishes this post.
| Card subscription (Stripe Billing) | USDC subscription (Fianto) | |
|---|---|---|
| Main causes of a failed renewal | Expired or replaced cards, issuer declines, insufficient funds | Not enough USDC, a removed approval, a frozen or closed USDC account |
| Automatic fix | Automatic card updates from the networks, where issuers take part | None needed for expiry: a wallet does not expire |
| Retries | Smart Retries; recommended default 8 tries within 2 weeks, configurable | Fixed: at the period boundary, then +1 h, +6 h and +24 h |
| After the last retry | Your setting: cancel, mark unpaid, leave past due, or pause | The subscription ends; the missed period is never billed later |
| Who emails the customer | Stripe, if you turn on its failed-payment and expiring-card emails | You. Fianto sends subscribers no email |
| Disputes | Cardholders can usually dispute within 120 days; $15.00 fee per dispute received (US pricing) | No chargebacks. A refund is USDC you send back |
| Cost to the merchant per charge | 2.9% + 30 cents for a domestic US card, plus Billing | Nothing; the customer pays 0.01 USDC per charge today |
The fee side is worked through for a 20.00 plan in USDC vs card fees. This post is about the subscribers you lose, and the money you lose after the fact.
Why do card renewals and stablecoin renewals fail for different reasons?
A card renewal fails when the bank says no, and a stablecoin renewal fails when the wallet cannot cover it. Involuntary churn, losing a subscriber who never meant to leave, comes from different places on each rail.
Cards
Cards expire and get replaced. Stripe's docs say it "automatically attempts to update saved card details whenever a customer receives a new card", and that this is "widely supported in the United States", while "international support varies from country to country." Some declines cannot be retried at all: Stripe lists hard decline codes such as lost_, stolen_ and revocation_, for which retries only run once a new payment method appears.
USDC subscriptions on Fianto
A Solana wallet has no expiry date and no issuer, so the card-updater problem does not exist. Fianto counts only four failure reasons against a subscription: not enough USDC (INSUFFICIENT_), the wallet's approval for the Subscriptions program removed (DELEGATION_), a frozen USDC account and a closed one. Anything else, such as a network error, is retried without counting. For the customer the fix is usually simple: put USDC back in the wallet that pays.
How does a failed USDC renewal play out, hour by hour?
A failed USDC renewal on Fianto plays out within about 24 hours of the period boundary. Take a monthly subscription whose 30-day period ends on 12 December 2026 at 09:41 UTC, with an empty wallet, and nothing delaying the tries:
- 09:43, two minutes after the boundary: the first attempt fails. Fianto sends subscription.payment_failed with failure.attempt_no 1 and the next attempt time, plus subscription.past_due once. The subscription shows "Past due" in the customer portal.
- 10:41, one hour after the boundary: the second attempt. If the customer has topped up, the charge goes through, subscription.renewed fires and the subscription is active again.
- 15:41, six hours after the boundary: the third attempt.
- 13 December, 09:41, a day after the boundary: the fourth and last attempt. If it fails, Fianto sends subscription.payment_failed with next_attempt_at null, then subscription.ended with end_reason PAYMENT_FAILED.
Compare Stripe: its Smart Retries page says you can retry "a specific number of times within a time period: 1 week, 2 weeks, 3 weeks, 1 month, or 2 months", and that "the recommended default setting is 8 tries within 2 weeks." A card subscriber who is short for a week can still be recovered. A Fianto subscriber who is short for more than a day loses the subscription and has to subscribe again. In our view that is the biggest churn cost of the stablecoin rail, and the schedule is not a merchant setting. More on the four attempts in failed renewals and retries.
Who tells the customer that a payment failed?
On Fianto, you do: Fianto sends subscribers no emails at all, not before a renewal and not after a failure. On the card side, Stripe Billing can do it for you: with "Send emails when card payments fail" turned on, its docs say "Stripe automatically sends an email to your customer after each failed payment." That setting names card payments. Stripe's stablecoin subscription guide instead tells you, on invoice., to "email the customer and request that they attempt the payment again."
A Fianto renewal failure gives your server what a good message needs. The failure object carries the reason, how many counted failures the period has had, and when the next attempt is (null when none is left). With the SDK's Next.js handler:
import { Webhooks } from '@fianto/nextjs';
export const POST = Webhooks({
secret: process.env.FIANTO_WEBHOOK_SECRET,
onSubscriptionPaymentFailed: async (event) => {
const failure = event.data.failure;
// failure?.reason: INSUFFICIENT_FUNDS, DELEGATION_REVOKED, ...
// failure?.next_attempt_at: when Fianto tries again, or null after the last try
// Tell the customer to add USDC before next_attempt_at; dedupe on event.id
},
onSubscriptionEnded: async (event) => {
// event.data.end_reason is PAYMENT_FAILED after the fourth failure: revoke access
},
});Send it on the first failure, because the window is short. For INSUFFICIENT_, ask for a top-up before the next attempt. For a removed approval, point the customer to the portal, which offers to renew the approval when that was the reason the renewal failed. A webhook-driven access setup covers granting and removing access; every event and its fields are listed on the docs page Event types.
Bill a monthly USDC plan with fixed retries and signed webhooks for every failure.
Read about stablecoin subscriptionsWhat happens to disputes and chargebacks?
Disputes are where stablecoin subscriptions are plainly better for the merchant. Stripe's docs say card networks "typically allow cardholders to initiate disputes within 120 days of the original payment", that Stripe debits "the disputed amount, plus a dispute fee" from your balance, and its US pricing page lists a $15.00 fee for each dispute received. A full dispute "can take 2-3 months to complete." On a subscription, a customer who forgot to cancel can dispute the renewal instead of asking you for a refund.
A USDC payment on Solana cannot be pulled back by the payer, so there are no chargebacks on Fianto. Even Stripe's own stablecoin payments page lists dispute support as "No". The flip side is that refunds are manual: Fianto has no refund API, and a refund is USDC you send from your own wallet. Chargebacks vs crypto refunds covers the refund policy side.
Is cancelling easier for a stablecoin subscriber?
Cancelling a USDC subscription on Fianto takes one signature in the customer portal at fianto.xyz/my, and the subscription runs to the end of the paid period. The portal has no undo. You can cancel from your side too, through POST /v1/subscriptions/{id}/cancel with at set to now or period_, or from the dashboard.
An easy, visible cancel loses some subscribers who would have stayed through inertia, and it also removes the main reason a card subscriber files a dispute. Our view is that the trade is worth it, but measure it: the dashboard's Needs attention page lists past-due subscriptions, and the subscriptions CSV export gives you the end reasons. If a renewal never went through, why a USDC subscription didn't renew is the checklist to send the customer.
Which rail keeps more subscribers?
Neither wins everywhere, and nothing stops you offering both. A rule of thumb from the mechanics above:
- Your customers have no crypto wallet: cards. Nothing on the stablecoin side helps a customer who would have to buy USDC and SOL first.
- Your customers often run short and top up late: cards, because a two-week retry window recovers payments that a one-day window cannot.
- Your customers hold USDC on Solana, or you lose money to disputes and card fees: a USDC subscription, with the dunning message sent from your own webhook.
- You sell internationally where card updates are patchy: USDC removes the expiry problem entirely, though not the empty-wallet one.
Fianto bills USDC on Solana only, monthly (every 30 days) or yearly (every 365 days), with no free trials. The merchant pays nothing; the customer pays the 0.01 USDC network fee with each charge today and no Fianto fee during the beta, then about 0.1 to 0.5% on top after it. The head-term page on stablecoin subscriptions has the rest.
- Stripe docs: Automate payment retries (Smart Retries), read 15 October 2026
- Stripe docs: How cards work (automatic card updates), read 15 October 2026
- Stripe docs: How disputes work, read 15 October 2026
- Stripe docs: Automate customer emails, read 15 October 2026
- Stripe docs: Set up a subscription with stablecoin payments, read 15 October 2026
- Stripe docs: Stablecoin payments (dispute support), read 15 October 2026
- Stripe pricing (US card rate, dispute fee), read 15 October 2026
- Solana Foundation: the Subscriptions program (source and README)