On this page
- Stripe's stablecoin payments (as of 15 October 2026): businesses in the US, private preview in the EU, Hong Kong, Mexico and Switzerland; 1.5% of each payment on its pricing page; settled in your Stripe balance in local currency.
- Fianto: USDC on Solana straight into your wallet, nothing charged to you; a payment link per plan with no code, or a checkout session keyed to your own order id.
- Either way, keep one access table with a source column, so a customer paying by card and one paying in USDC get the same access.
Can you add crypto payments without leaving Stripe?
Yes: you can add crypto payments without leaving Stripe, either by switching on Stripe's own stablecoin payment method or by adding a second processor for USDC beside Stripe. Fianto publishes this post and is the second kind, so weigh what follows with that in mind. The Stripe facts below come from Stripe's stablecoin payments docs and its pricing page, both read on 15 October 2026.
| Stripe stablecoin payments | Fianto beside Stripe | |
|---|---|---|
| Who can accept | Businesses in the US; private preview in the EU, Hong Kong, Mexico and Switzerland | Merchants Fianto approves by hand after a business profile, two-factor sign-in and a signed wallet proof |
| Tokens and networks | USDC on Tempo, Ethereum, Solana, Polygon and Base, plus USDP and USDG in the US | USDC on Solana only |
| Where the money lands | "your Stripe balance in your local currency" | Your own Solana wallet, as USDC, in the same transaction |
| Fee to the merchant | 1.5% of the transaction amount in USD (a separate Link entry lists 0.8% per successful transaction, a promotional rate through 1 January 2027) | None. The customer pays any fees on top |
| Refunds | Through Stripe's refund flow, back to the original wallet | You send USDC back from your wallet |
| Subscriptions | Through Stripe Billing; the subscriptions guide opens with a request-access form | Monthly or yearly plans the customer approves once |
| Code changes | Enable the method in the Stripe Dashboard | None with a payment link; a checkout route and a webhook route with the API |
Pick Stripe's own method when you qualify and want dollars, Stripe's refunds and one dashboard: it is a setting, not a project. Pick a separate USDC checkout when you want to hold USDC yourself, when 1.5% matters at your price points, or when Stripe's stablecoin option is not available where you operate. A merchant whose Stripe account is at risk should not hang a backup rail on that same account; that case is in Stripe closed my account: USDC as a second rail. The fuller head-to-head is Stripe stablecoin payments vs Fianto checkout.
How do you add a USDC option next to a Stripe button without code?
Without code, you add a USDC option by putting a Fianto payment link next to each Stripe button or Stripe Payment Link. A payment link sells one price, so a pricing page with three plans gets three USDC links, one under each card button.
- Create the product and its price in the Fianto dashboard: one-off, monthly (every 30 days) or yearly (every 365 days), in USDC from 0.01 to 1,000,000.
- Under Payments, then Payment links, create a link for that price. Set "Ask for email" to "Ask, required" so you can match the payer to an account.
- Paste the link under the card button, labelled for what it is, for example "Pay with USDC (Solana)".
- When a sale comes in, find it under Payments and grant access by hand, or from your webhook if you have one.
The trade-off is matching. A link checkout gets a random order id (plink_ plus a UUID) and carries no id of yours, and the email the payer types is never verified. That is fine for a handful of sales a week. Beyond that, the coded route below ties each payment to your user. Placing links on WordPress, Webflow, Framer, Carrd or Notion is covered in adding a USDC payment link to a website builder.
How do you add USDC to a coded checkout without touching Stripe?
With code, you add USDC by creating a Fianto checkout session from your own server, using your own order or user id, and listening for Fianto's webhooks beside Stripe's. Your Stripe integration does not change at all. Two create fields do the linking: order_ (your id, up to 128 characters) and customer_, which comes back in each order and subscription event as customer.. A subscription example in Next.js, shaped like the docs quickstart:
// app/api/checkout/usdc/route.ts
import { Checkout } from '@fianto/nextjs';
import { requireUser } from '@/lib/auth'; // your own sign-in helper
export const POST = Checkout({
createSession: async (request) => {
const user = await requireUser(request);
return {
mode: 'subscription',
price_id: 'fian_price_...', // your monthly price, copied from the dashboard
order_id: `sub_${user.id}_pro`, // a later re-subscribe needs a new order_id
customer_reference: user.id,
metadata: { plan: 'pro', rail: 'usdc' },
success_url: 'https://app.example.com/billing?paid=usdc',
cancel_url: 'https://app.example.com/billing',
};
},
});// app/api/webhooks/fianto/route.ts
import { Webhooks } from '@fianto/nextjs';
import { setAccess } from '@/lib/access'; // writes your access table
export const POST = Webhooks({
secret: process.env.FIANTO_WEBHOOK_SECRET,
onSubscriptionCreated: async (event) => {
const s = event.data;
await setAccess(s.customer.reference, 'fianto', s.id, s.current_period_end);
},
onSubscriptionRenewed: async (event) => {
const s = event.data;
await setAccess(s.customer.reference, 'fianto', s.id, s.current_period_end);
},
onSubscriptionEnded: async (event) => {
await setAccess(event.data.customer.reference, 'fianto', event.data.id, null);
},
});A subscription creates no order, so order. never fires for it: it sends subscription., subscription., subscription. and subscription.. A one-off purchase is the opposite: create the session with mode: 'payment' and fulfil on order., which arrives only once Solana has finalized the payment. Every field is in the checkout sessions reference. Store each event id and skip ones you have seen, since delivery is at least once. The full Next.js build, with a page gated on subscription status, is in accepting USDC in a Next.js app.
See the hosted checkout your USDC customers land on, fees and all.
Look at the USDC checkoutHow do you keep Stripe and USDC customers in one place?
Keep one access table that both webhook handlers write to, with a column for the rail, rather than asking Stripe or Fianto which customers are paying. Neither knows about the other.
| Column | Card customer | USDC customer |
|---|---|---|
| user_id | Your user id | Your user id, from customer.reference |
| source | stripe | fianto |
| external_id | The Stripe subscription id | The Fianto subscription id, fian_sub_... |
| paid_until | From your Stripe webhooks | current_period_end from subscription.created and subscription.renewed |
| status | From your Stripe webhooks | ACTIVE, PAST_DUE or ENDED, from subscription.* events |
- Before you open either checkout, check the table, so nobody pays the same plan on both rails.
- Switching a customer from card to USDC is two actions: cancel the Stripe subscription at period end, then send them the USDC checkout. Fianto cannot import a Stripe subscription.
- Report the two rails separately. Fianto's Overview shows your net in US dollars with an MRR tile, and its CSV exports cover payments, orders, subscriptions and customers. How to book USDC receipts is in accounting for USDC revenue.
What changes for customers who choose USDC instead of a card?
A customer who picks USDC needs a Solana wallet holding USDC and a little SOL, signs once, and cancels in a portal instead of in your app. Tell them before they choose.
- They pay the fees on top of your price: a Solana transaction fee under $0.01, and on a subscription a flat 0.01 USDC network fee with each charge today plus SOL account rent the checkout shows. There is no Fianto fee during the beta; after it, about 0.1 to 0.5% on top. You receive your full price.
- A subscription renews every 30 or 365 days from the day they subscribed, not on the date your Stripe plans renew. There are no free trials and no weekly or quarterly plans.
- They cancel in the customer portal at fianto.xyz/my, and the plan runs to the end of the period paid. Your app cannot cancel it on their behalf except through your Fianto dashboard or API.
- There are no chargebacks. A refund is USDC you send back from your own wallet.
What does Fianto not do that Stripe does?
Fianto does not replace Stripe: it takes no cards, pays out no dollars and keeps no balance. Before you add it, check these limits against what your Stripe setup does today:
- No cards, bank transfers or fiat payouts. USDC on Solana only, landing in your wallet.
- No invoices, tax calculation or team accounts.
- No test mode or sandbox: production runs on Solana mainnet, and testing uses a test event, the CLI or a small real payment.
- Products, prices, payment links and coupons are made in the dashboard. The API reads products and prices but cannot create them.
- Your account is reviewed by hand before it can take payments, and no review time is promised.
If those limits fit, the USDC side is small to run: a link per plan, or one checkout route and one webhook route. The developers page lists the SDKs for Next.js, Express and Hono; accepting USDC with Hono on Workers or Bun walks through one of them.