No Fianto fee during the beta. Any fee comes with at least 30 days notice. See pricing
Payments8 min read

What a hosted USDC checkout does that a wallet address doesn't.

Posting your wallet address gets you paid, but it tells you nothing else: which order the USDC was for, whether the amount was right, or when the transfer became final. A hosted USDC checkout wraps each payment in a session that carries your order id, writes the exact amount into the transaction the customer signs, expires on a timer, and tells your server only once Solana has finalized the payment. For a tip or a one-off payment from someone you know, an address is fine; for orders you fulfil automatically, use a session.

On this page
What does a hosted checkout add to a wallet address?Why can't a wallet address tell you which order was paid?What happens when a customer sends the wrong amount or token?When does a USDC payment to an address count as paid?Why does a checkout session expire?Does a hosted checkout cost more than a wallet address?When is a plain wallet address enough?SourcesQuestions
TL;DR
  • A bare address cannot tell two customers paying the same amount apart; a Fianto session puts a unique reference key on the transfer and matches it to your order_id.
  • On a Fianto checkout the amount, the USDC mint and your wallet are written into the transaction by Fianto, and a signed transaction that differs is never broadcast.
  • Your server hears order.paid only at finalized, never at the earlier confirmed step; the merchant pays nothing for any of it.

What does a hosted checkout add to a wallet address?

A hosted checkout adds a record around the payment: what was owed, by whom, until when, and whether it arrived. A checkout session is that record. It is one payment page for one of your orders, created by your server (or by a shop or payment link) and hosted by the gateway. A wallet address, by contrast, is only a place money can land. The other jobs a gateway does are in what a crypto payment gateway is.

JobBare wallet addressFianto hosted checkout
Which order was paidUnknown unless the customer tells youYour own order_id on the session, and a reference key on the transfer
The amountTyped by the customerWritten into the transaction by Fianto, from 0.01 to 1,000,000 USDC with at most 6 decimals
Token and networkWhatever the customer sendsUSDC on Solana only, checked before the transaction is sent
Time limitNone5 minutes to 24 hours, 30 minutes by default
When it counts as paidWhen you decide, from an explorerAt finalized: the order turns PAID and order.paid is sent
A second payment for the same orderYou may never noticeorder.duplicate_payment and a row on Needs attention
Who holds the moneyNobody: it lands in your walletNobody: it lands in your wallet, in the same transaction

The last row is the same on purpose. A non-custodial gateway changes the paperwork around a payment, not where the money goes. What the page looks like and what it costs are on the USDC checkout page.

Why can't a wallet address tell you which order was paid?

A wallet address cannot tell you which order was paid because every transfer to it looks alike: a sender, an amount and a time. Two customers buying the same 25.00 USDC item an hour apart produce two transfers of the same amount, and a sender address says nothing about which order it belongs to. If one of them paid from an exchange account, the sender is the exchange, not the customer.

Solana Pay, the open payment spec for Solana, solves this with a reference: a one-off address added to the transfer instruction. The Solana Pay specification says the wallet "must include them in the order provided as read-only, non-signer keys" in the transfer, and that "the getSignaturesForAddress RPC method can be used locate transactions this way."

Fianto uses the same idea. Every session has its own reference, appended as a read-only account to the transfer of the price to your wallet. Every 60 seconds Fianto looks up transfers carrying the reference of each open session, and keeps looking for 24 hours after a session closes, so even a payment it did not send itself is matched to the right order.

What happens when a customer sends the wrong amount or token?

With a bare address, a wrong amount or the wrong token simply arrives, and sorting it out is your job. The common cases, and what each costs, are in crypto payment mistakes. The customer types the amount, so 2.50 instead of 25.00 is one slip away. Tokens are another trap. Solana's token documentation puts it plainly: a wallet "needs a token account for each token (mint) it wants to hold". Any token can be sent to you, including one that calls itself USDC. Circle lists one mainnet address for its USDC on Solana, EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, in its USDC contract addresses (checked 15 October 2026).

A hosted checkout takes the typing away. On Fianto, the customer's wallet is handed a transaction Fianto built: two compute-budget instructions, a USDC transfer of the price to your wallet and, when the service fee is above zero, a transfer of the fee to Fianto. The wallet only signs. Before broadcasting, Fianto checks the signed transaction instruction by instruction: the fee payer, each transfer's mint, decimals, source, destination and amount, the reference and the blockhash. If anything differs, the transaction is never sent, and the customer is not charged.

When does a USDC payment to an address count as paid?

A USDC payment on Solana is safe to count once its block is finalized, the last of the confirmation states. The Solana RPC documentation defines confirmed as "a block directly voted on by a supermajority of stake, meaning more than two-thirds of the network's active stake," and finalized as "a block the cluster recognizes as finalized with maximum lockout". A wallet notification or an explorer page often shows the earlier state.

With an address, you pick the moment yourself, usually by refreshing an explorer. Fianto splits it by audience: the customer's checkout page shows "Payment received" at confirmed, so nobody stares at a spinner, while your order turns PAID and your server receives order.paid and checkout.session.completed only at finalized. The full sequence is in confirmed vs finalized on Solana.

Why does a checkout session expire?

A checkout session expires so that an old payment page cannot be paid at an old price after you have moved on. An address never expires, which is convenient until a customer pays a quote from last month. A Fianto session's link works until its expires_at, between 5 minutes and 24 hours after it was created, 30 minutes if you set nothing. Sessions from a shop or a payment link always get 30 minutes.

  • Create again with the same order_id while its session is open, and you get that same session back, with no second page.
  • Try to charge an order that is already paid, and the API answers 409 order_already_paid.
  • A payment that still finalizes after its session expired pays the order anyway, as long as you have not opened a newer session for it.

One session per order, matched by reference, reported at finalized. No Fianto fee during the beta.

See the hosted checkout

Does a hosted checkout cost more than a wallet address?

For the merchant, a Fianto checkout costs the same as an address: nothing. You never pay Fianto and never pay a Solana network fee. During the beta there is no Fianto fee at all. After the beta the customer pays a Fianto fee of about 0.1 to 0.5% on top of your price, shown on its own line before they sign, and the amount you set is still what lands in your wallet.

The customer pays the Solana network fee for the transaction they sign, shown on the page as "paid by you, under $0.01". A one-off payment carries no network fee in USDC and needs no account rent. The wallet does need a little SOL for the fee and the minimum balance Solana requires: about 0.00067 SOL as of 15 October 2026, and the checkout names the exact amount if the wallet is short.

When is a plain wallet address enough?

A plain wallet address is enough when a person, not your software, checks each payment. Tips, a contractor paying you back, a friend settling a split bill: you know who is paying, roughly when, and you will look at the wallet anyway. Adding a gateway there adds an approval process and nothing you need.

Pick a hosted checkout once any of these is true: you fulfil orders automatically, two customers could pay the same amount, you need to know a payment is final before shipping, or you want records you can export. Know its limits too. Fianto takes USDC on Solana only, approves each merchant before the first payment, has no test mode, and needs a customer wallet that can sign a transaction without sending it; a wallet that can only sign and send at once is refused with wallet_unsupported.

If you want the record without writing code, a USDC payment link opens a fresh checkout session on every click. If you are wiring it into your own site, how to add a Pay with USDC button shows the code, how to accept USDC on Solana walks through the setup, and the payment lifecycle docs list every status a session, order and payment can take.

Sources
Questions

Questions about hosted checkout and wallet addresses.

Can I accept USDC by just sharing my wallet address?

Yes, and the money arrives directly. You lose the link between a payment and an order, any check on the amount or token, and a signal that tells your server the payment is final.

Does a hosted crypto checkout hold my money?

Fianto's does not. The customer's transaction sends the price straight to your wallet, and any service fee to Fianto in the same transaction, so there is no balance to withdraw.

Can a customer underpay on a hosted USDC checkout?

Not through the checkout page. The amount is written into the transaction Fianto builds, and Fianto refuses to broadcast a signed transaction whose amount, token or destination differs. A hand-built transfer that carries the session's reference with the wrong amount is not accepted as payment; it shows as an unmatched transfer on Needs attention.

Does every order get its own wallet address?

No. Every payment goes to your one receiving wallet. Each session gets its own reference key on the transfer instead, which is how Fianto tells orders apart.

What happens if a customer pays after the checkout expired?

If the payment still finalizes, the order is paid and order.paid is sent, unless you opened a newer session for that order in the meantime.

Read next.

Payments7 min read

How a merchant knows a crypto payment arrived: references, memos and order matching

To know a crypto payment really arrived, you need three answers: which transfer belongs to which order, whether it moved the right token and amount into your wallet, and whether the network has made it final. On Solana the first is solved with a reference key added to the transfer, the second by reading the transfer itself, and the third by waiting for the finalized commitment level. Fianto does all three and sends your server a signed order.paid webhook only once the payment is finalized.

Payments8 min read

What is a crypto payment gateway, and how does a Solana one work?

A crypto payment gateway is the software between a customer's wallet and your order system: it tells the customer exactly what to pay, recognises the payment on the blockchain, decides when it is final, and tells your server. The classic design watches an address for incoming coins, while on Solana a gateway can build the exact transaction for the customer to sign, which rules out underpayments and wrong-token mistakes. Fianto is a gateway of the second kind, for USDC on Solana, and it never holds the money.

DevelopersGuides8 min read

Add a "Pay with USDC" button to your website

You need three pieces for a Pay with USDC button: a server route that creates a Fianto checkout session with your app secret, a button from @fianto/js or @fianto/react that opens that session in a popup, and a webhook route that marks the order paid when order.paid arrives. The browser never sees a key, and nothing the browser reports counts as proof of payment.

Give each payment an order.

Create a session, share the link, fulfil on order.paid.

New posts are announced on X and Discord.