MerchantsSell

Orders and payments

What each order and payment status means in the dashboard, when an order counts as paid, and what to do when USDC arrives that fianto did not accept.

4 min read

An order is what your server asked a payer to pay: it is created with the first checkout session for your order_id. A payment is one attempt to pay it: a transaction the payer signed, which fianto broadcasts to Solana and follows until it is final. One order can have several payments. You find them under Orders ("Each order your server created, and whether it was paid.") and Payments ("Every charge, with your order ID on it.").

Order and payment statuses
How an order's and a payment's status can changeOrderfinalizedexpiresnew session, same order_idlate settlementPENDINGPAIDEXPIREDA cancelled session leaves it PENDINGPaymentfound by sweepfinalizedfailstransfer landsfailsalso superseded at finalized,though its funds landedPROCESSINGCONFIRMEDSUCCEEDEDFAILED

Scroll sideways to see the whole diagram →

Show as text
  1. Order: `PENDING` → `PAID` at finalized, or `PENDING` → `EXPIRED` when its session expires.
  2. `EXPIRED` → `PAID` when a late payment still settles.
  3. `EXPIRED` → `PENDING` when you create a new session with the same `order_id`.
  4. A cancelled session leaves the order `PENDING`. An order is never `CANCELED`.
  5. Payment: `PROCESSING` → `CONFIRMED` → `SUCCEEDED` at finalized.
  6. A payment can fail from `PROCESSING` or `CONFIRMED`, and `FAILED` → `PROCESSING` if the transfer lands after all.
  7. A payment whose session was superseded (a newer session for the order, or changed order terms) is recorded `FAILED` at finalized, even though its funds landed. It never shows as `SUCCEEDED` first.
  8. Payments found by the reference sweep start at `CONFIRMED`.
  9. `SUCCEEDED` is final. `EXPIRED` and `FAILED` are not.

Order statuses

The dashboard labels are in quotes.

StatusMeaningWhat you can do
PENDING"Not paid": the order is waiting for a payment. A cancelled checkout session leaves it here, with no end date.Wait, or have your server create a new session for the same order_id.
PAID"Paid": a payment for it finalized on Solana. fianto sends order.paid at this moment.Fulfil the order.
EXPIRED"Expired": its checkout session ran out of time before a payment finalized.Create a new session with the same order_id: the order goes back to PENDING. A late payment that still settles moves it to PAID.

EXPIRED is not final: a payment already on its way can still settle and make the order PAID, and a new session for the same order_id reopens it.

The status filter on Orders also offers "Canceled", but fianto never gives an order that status: a cancelled checkout session leaves its order "Not paid", so that filter shows nothing.

Payment statuses

StatusMeaningWhat you can do
PROCESSING"Processing": the payer signed, and fianto sent the transaction to Solana.Wait.
CONFIRMED"Confirmed": Solana accepted the transaction, but it is not final yet. Payments that fianto finds on its own (below) start here.Do not fulfil yet: wait for SUCCEEDED.
SUCCEEDED"Succeeded": finalized on Solana. The money is in your wallet.The order is PAID; fulfil it.
FAILED"Failed": fianto did not accept this payment. It can fail from PROCESSING or CONFIRMED.Check whether money arrived anyway (below) before you tell the payer anything.

SUCCEEDED is final; FAILED is not. A FAILED payment goes back to PROCESSING if its transfer lands after all. A payment whose session was superseded, by a newer session for the same order or by changed order terms, is recorded FAILED at finalized, even though its funds landed; it never shows as SUCCEEDED first.

When a payment counts as paid

The payer's checkout page shows success as soon as the transaction is confirmed. fianto marks the payment SUCCEEDED and the order PAID only once it is finalized. It then sends order.paid, and checkout.session.completed too when the session was still OPEN. So the payer's success screen is not proof that you were paid: fulfil on PAID, or on the order.paid webhook.

Who pays what

You receive the price. When the service fee is above zero, it is added on top and the payer pays it, so the payer signs for the total. The dashboard says the same on each order: "You receive the subtotal. The service fee is added on top and the payer pays it, so the payer signs for the total."

Failed payments where the money arrived

FAILED does not mean no money moved. A transfer can finalize and put USDC in your wallet but not match what the payment asked for, for example the wrong amount or fee, so fianto refuses it as payment. The payment page then shows "Money arrived on this failed payment." On Payments, the chip "Money arrived on a failed payment" lists every such payment, and Needs attention counts them.

Never tell a payer nothing was taken without checking

Before you tell a payer their payment failed and nothing moved, open the payment and check whether money arrived. If it did, refund the payer or ask them to pay again from a new payment link.

Duplicate and unmatched transfers

fianto also finds transfers it did not broadcast itself, by looking for the session's reference: every 60 seconds while a session is open, and for 24 hours after it closes. A transfer that carries an order's reference but is not that order's payment is recorded on the order (only transfers that increased your USDC balance, at most 20 per payment link), and the order page says which case it is:

  • "Paid twice — refund the payer": the order was already paid, and another transfer arrived for it.
  • "A transfer arrived that does not match this order": the amount or the fee was wrong, so it was not accepted and the order is still unpaid.

fianto sends order.duplicate_payment only when the order is already PAID or has another payment that has not failed. Any other stray transfer is recorded on the order with no webhook.

In both cases the USDC reached your wallet. On Orders, the chip "Unmatched transfer" lists these orders.

Refunds are yours to send

fianto never holds your funds, so it cannot refund. There is no refund API: send the USDC back from your own wallet, to the wallet the transfer came from.

Finding an order or a payment

Search is exact: paste a whole value, not part of one. On Orders, search by the order id (ORD-12 or fian_ord_…), your own order ID, a payer wallet or a payer email. On Payments, search by the payment id (PAY-12 or fian_pay_…), a transaction signature, your own order ID, a payer wallet or a payer email. A payer's email is shown as "entered by the payer, not verified".

See also

Was this page helpful? Tell us

On this page