On this page
- A stablecoin subscription is a recurring payment in a stablecoin such as USDC, collected from the customer's wallet on a schedule after one approval.
- On Solana, the Subscriptions program enforces the schedule and the cap on chain. The customer approves once; every later renewal is automatic.
- With Fianto the merchant pays nothing. The customer pays a flat 0.01 USDC with each charge today. There is no Fianto fee during the beta.
What a stablecoin subscription is
A stablecoin subscription is a recurring payment in a stablecoin, such as USDC, that is collected from the customer's wallet on a fixed schedule after the customer approves it once. It replaces the card on file. The money goes from the customer's wallet to the merchant's wallet in one Solana transaction, with no bank, no card network and no payment processor holding it in between.
For years, recurring payments were the hard part of getting paid in crypto. A wallet only sends money when its owner signs. A card can be charged by the merchant; a wallet cannot. So most "crypto subscriptions" were a reminder email and a manual payment every month.
Merchants describe the result the same way. A SaaS founder on r/SaaS put it in eight words: "Each month the user has to manually pay." A creator selling access for USDC wrote this:
I currently handle everything manually, verify USDC/USDT transactions, update access, track renewals. It's a lot of manual work.
What changed on Solana
In 2026 the Solana Foundation released the Subscriptions program, a public program on Solana for managed token delegations, recurring payments among them. The customer signs once and accepts a plan's terms. The program then lets an approved party collect within those terms, each billing period, and refuses anything else.
Three facts about the program matter to a merchant:
- The limits live on chain. The amount per billing period, the wallets the money may go to and the period length are fixed in the plan, and the subscription is bound to them when the customer signs. A collection that breaks any of them is refused by the program, not by a company policy.
- The code is audited and verified. Cantina's audit reports are published in the program's repository, and the program deployed on mainnet is a verified build of its public source.
- It is not custodial. Nothing is prepaid and nothing is held. USDC stays in the customer's wallet until the due date, then moves straight to the merchant's wallet.
Fianto runs the merchant side of this program: the plan, the hosted checkout, the collection on each due date, the retries, the webhooks and the dashboard. The program does the enforcing.
How a renewal works, step by step
- The merchant creates a product with a monthly price in USDC. When the first customer opens a checkout for that price, Fianto publishes a plan on chain with the amount, the period and the wallets the money goes to: the merchant's receiving wallet, and Fianto's for the network fee.
- The customer opens the checkout and signs one transaction from their own wallet. That transaction sets up the subscription with a cap per billing period and pays the first period.
- On each due date Fianto asks the program to collect. The program checks three things before anything moves: the amount is within the cap, the money goes only to the plan's wallets, and the new period has started.
- If every check passes, the price moves from the customer's wallet to the merchant's wallet in that transaction, and the network fee to Fianto's. The merchant's server gets a signed webhook with the transaction signature.
- If the customer's wallet is short, nothing is taken. The subscription is past due and Fianto tries again one hour, six hours and one day into the period. If the fourth attempt fails, the subscription ends and that period is never charged later.
Subscribing to
Pro
One signature. Cancel any time at fianto.xyz/my with one more signature.
A monthly plan renews every 30 days and a yearly plan every 365 days. The program never takes part of an amount: a charge either happens in full or not at all. The retry schedule is in failed renewals and retries.
| Subscription | Status | Customer | Product | Price | Value | Billing | Period ends | Started |
|---|---|---|---|---|---|---|---|---|
| SUB-42 | Active | 7xKp..Q3fN | Pro | 19.00 | $19.00 | Every month | 12 Nov 2026 | 13 Oct 2026 |
| SUB-37 | Past due | Bq2z..m8Lr | Pro | 19.00 | $19.00 | Every month | 13 Oct 2026 | 13 Sep 2026 |
| SUB-12 | Ended | H4nT..e9Vk | Team | 190.00 | $190.00 | Every year | ended 2 Oct 2026 | 2 Oct 2025 |
Sell a membership in USDC without code. Open a shop, pick a theme, share the link. No Fianto fee during the beta.
See how a plan is billedWhat the customer pays, and what the merchant pays
The merchant pays nothing. The price the merchant sets is the amount that lands in the merchant's wallet. The customer pays:
| Cost | Amount | When |
|---|---|---|
| Network fee of the Solana transaction they sign | Under $0.01 | Once, at checkout |
| Account rent for the subscription account | About 0.00197 SOL today, returned when the customer reclaims it after the subscription ends | Once, at checkout |
| Account rent for the wallet setup account | About 0.00163 SOL today, not returned when the subscription ends | Once, on the wallet's first subscription |
| Flat network fee toward the subscription's running costs | 0.01 USDC with each charge today, the first one included | Every charge |
| Fianto fee | None during the beta. Any later fee is added on top of the merchant's price, paid by the customer, with at least 30 days notice | Every charge |
Rent is a Solana rule, not a fee: an account must hold a small SOL balance for as long as it exists, and that balance comes back when the account is closed. The hosted checkout shows the rent and the fee before the customer approves anything. More in account rent and reclaim and on the pricing page.
Stablecoin subscription versus card billing
The comparison below uses the assumptions on Fianto's pricing page: a published US rate for domestic cards of 2.9% plus $0.30 per charge, 1 USDC counted as $1, and no future Fianto fee.
| Card billing | Stablecoin subscription on Fianto | |
|---|---|---|
| Who approves | The customer enters a card; the merchant charges it | The customer signs once in their wallet |
| Merchant cost on a 19.00 monthly plan | $0.85 per charge, $10.21 over twelve charges | 0 |
| Customer cost per charge | Usually nothing visible | 0.01 USDC |
| Where the money waits | Processor balance, then a payout | Nowhere: wallet to wallet in one transaction |
| Chargebacks | Possible | None. A refund is the merchant sending USDC back |
| Who can use it | Countries and business types the processor accepts | Anyone with a Solana wallet, USDC and a little SOL |
Card billing still has what wallets do not: the customer needs no wallet, no SOL and no USDC. A stablecoin subscription fits a merchant whose customers already hold stablecoins, or who cannot get a card processor at all.
Cancelling
The customer sees every subscription their wallet pays in the customer portal at fianto.xyz/my, and cancels there with one signature. Signing in is a signed message, not a transaction, so it moves nothing. A cancelled subscription runs to the end of the paid period and then stops.
Setting one up
There are two ways to offer a stablecoin subscription with Fianto.
Without code
Create a product with a monthly price, open a shop, pick a theme, edit the text on the page and publish. Share the shop link anywhere. Customers subscribe from the shop, approve once, and renew automatically.
With code
Create a checkout session from your server with the Fianto SDK for Next.js, Hono or Express, render the checkout button, and grant or revoke access from signed webhooks. The events are named for what happened: subscription., subscription., subscription., subscription.. A subscription creates no order, so order. never fires for it. The webhook route from the SDK's Next.js example:
import { Webhooks } from '@fianto/nextjs';
export const POST = Webhooks({
secret: process.env.FIANTO_WEBHOOK_SECRET,
onSubscriptionCreated: async (event) => {
// grant access for the first period; dedupe on event.id
},
onSubscriptionRenewed: async (event) => {
// extend access by one period
},
onSubscriptionPastDue: async (event) => {
// a renewal could not be charged: tell the customer
},
onSubscriptionEnded: async (event) => {
// revoke access
},
});Keys, sessions and events are on the developers page; the full reference is at docs.fianto.xyz.