Stablecoin settlement for stores
Accept crypto. Credit USDC.
Price the order in USD. The customer pays on a hosted page in BTC, LTC, USDC, or USDT. When the invoice is paid, your ledger is credited in USDC. Payouts send that USDC on Ethereum.
- 11
- Payment methods
- 7
- Networks
- 11
- Checkout languages
Order 1042
$49.00
USD · customer picks the coin
bc1q… prepared → active
quote window 15:00 · then confirmations
Checkout
A hosted page. You never touch the customer's wallet.
POST /api/v3/invoices creates a prepared invoice. Send the customer to url. They choose one of the coins you left enabled in Settings. That activates a fresh address and a quoted crypto amount.
The quote lasts for the invoice TTL. Default is 15 minutes. Settings accepts 60 seconds through 24 hours. Status moves to confirming when a payment is seen, then paid after that method's required confirmations. The USDC ledger is credited the invoice amount.
The same page works as a payment button and inside an iframe. The frame posts its height and a close message so a storefront can embed it. Checkout copy follows the invoice language.
USD in
invoice.currencyFrom is USD. currencyTo is accepted and ignored — the customer picks the coin.
Return URL
returnUrl sends the customer back after payment. Falls back to the merchant default.
You choose the coins
New merchants start with every method on. Turn networks off in Settings → accepted methods.
Sandbox
Outside production, sandbox mode checks out with sUSDC and a button that mints a test payment. Production never uses it.
Invoices
Dashboard, API, or a payment link you send yourself.
Create in the dashboard
Invoices and Payment tools both open a USD invoice. You get the hosted link immediately. The invoice starts as prepared — no deposit address until the customer picks a coin.
Create from the API
POST /api/v3/invoices with amount, product name, reference, notifyUrl, and returnUrl. GET and list use the same object. The JSON shape is Confirmo-compatible.
Email invoice is a link
POST /api/v3/email-invoices stores targetEmail and returns paymentLink. Coinflo does not send that email. You deliver the link. Settlement currency is USDC.
When the amount doesn't match
- Underpay tolerance is basis points in Settings. 100 bps is 1%.
- A material overpay or underpay sets
unhandledExceptionsandoverUnderPaidAmount. - Expired invoices can be accepted from the invoice page, which marks them paid.
- Overpayments can be credited from the invoice, with the customer's confirmation attached.
What gets stored
- Product name and description.
reference— an opaque string, often JSON. Echoed on webhooks and the ledger.- Customer email, notify email, and language.
- Chain, address, rate, confirmations, and each inbound transaction id.
Payouts
Spend the USDC ledger. The transfer is USDC on Ethereum.
A payout debits your USDC balance and sends USDC on Ethereum to a 0x address. That is the only network that completes. Drafts for other coins fail on process with a recorded error.
Create one payout in the dashboard, or import a CSV. The importer skips the header row and reads amount, method, address, reference. Blank method defaults to USDC on Ethereum. Rows land as drafts. Bulk process runs them. Bulk delete removes drafts and failed rows.
Settlements is the completed-payout list: time, address, amount, USDC. If you save an Ethereum settlement address, a paid USDC-on-Ethereum invoice can be collected and forwarded there. Other coins still credit the ledger when paid. They are not auto-forwarded.
Payout
- Source
- USDC ledger
- Sends
- USDC on Ethereum
- Needs
- A 0x address and a balance that covers the amount
- States
- draft → prepared → processing → completed or failed
- Search
- Payout id, address, txid, reference
- Export
- CSV of the filtered table
Ledger
One USDC balance, no matter which coin they paid with.
Credit on paid
A paid invoice writes one credit for the USD invoice amount, denominated as USDC. A second credit for the same invoice is ignored.
Dashboard
Revenue is that ledger, charted for the last year, month, week, or 24 hours, in USD or USDC. Sales is the paid-invoice count in the range.
Keys stay on the server
The wallets page lists treasury and invoice receive addresses, derivation paths, and on-chain balances. Private keys are not shown.
Invoice lifecycle
The states your webhook will see.
01
prepared
No coin picked yet. No address. Expires if it sits idle.
02
active
Address and quoted amount. Countdown is the invoice TTL.
03
confirming
A payment was seen. Waiting on that chain's confirmation count.
04
paid
Confirmations met. USDC ledger credited. Webhook fired.
05
expired
Nothing arrived, or an underpay sat past the window.
06
error
Confirmations did not arrive within 96 hours.
blocked is a compliance hold. The API also carries refund, refunded, reversal, chargeback, and dispute statuses for compatibility. Creating an invoice does not open a card chargeback, and invoices are not marked refundable.
Payment methods
11 methods across Bitcoin, Litecoin, Ethereum, Polygon, Solana, BNB Smart Chain, Tron.
| Method | Network | Confirmations to paid |
|---|---|---|
| BTC (Bitcoin) | Bitcoin | 1 |
| LTC (Litecoin) | Litecoin | 6 |
| USDT (Ethereum) | Ethereum | 12 |
| USDC (Ethereum) | Ethereum | 12 |
| USDT (Polygon) | Polygon | 30 |
| USDC (Polygon) | Polygon | 30 |
| USDT (Solana) | Solana | 32 |
| USDC (Solana) | Solana | 32 |
| USDT (BNB Smart Chain) | BNB Smart Chain | 15 |
| USDC (BNB Smart Chain) | BNB Smart Chain | 15 |
| USDT (Tron) | Tron | 19 |
Checkout languages: English, Español, Français, Português, 中文, العربية, Bahasa Indonesia, हिन्दी, Tagalog, ਪੰਜਾਬੀ, 한국어. Pass language on the invoice. Arabic renders right to left.
Merchant API
Bearer key. USD invoice. Signed webhook.
Register with email or Google. The API key is shown once. The callback password is on that screen and again in Settings. More keys live under Settings → API keys. Send Authorization: Bearer ck_live_…. A bad key is HTTP 401.
POST /api/v3/invoices
{
"invoice": { "amount": "49.00", "currencyFrom": "USD" },
"product": { "name": "Order 1042" },
"reference": "{\"orderId\":\"1042\"}",
"returnUrl": "https://shop.example/thanks",
"notifyUrl": "https://shop.example/webhooks/coinflo",
"settlement": { "currency": "USDC" }
}Webhooks
Every status change POSTs the full invoice JSON to notifyUrl, or the merchant default. Header bp-signature is the SHA-256 hex of the raw body concatenated with your callback password.
Delivery retries up to 20 times, backing off from 1 second and capping at 1 hour. HTTP 200 stops the retries. After a paid webhook, re-fetch GET /api/v3/invoices/:id before you fulfill. Don't trust the webhook body alone.
Create a merchant and post the first invoice.
You get an API key, a callback password, and a dashboard with invoices, the USDC ledger, and Ethereum USDC payouts.
