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
Hosted checkout/pay/inv…

Order 1042

$49.00

USD · customer picks the coin

BitcoinBitcoin
LitecoinLitecoin
USDCEthereum
USDTTron

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 unhandledExceptions and overUnderPaidAmount.
  • 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.

  1. 01

    prepared

    No coin picked yet. No address. Expires if it sits idle.

  2. 02

    active

    Address and quoted amount. Countdown is the invoice TTL.

  3. 03

    confirming

    A payment was seen. Waiting on that chain's confirmation count.

  4. 04

    paid

    Confirmations met. USDC ledger credited. Webhook fired.

  5. 05

    expired

    Nothing arrived, or an underpay sat past the window.

  6. 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.

MethodNetworkConfirmations to paid
BTC (Bitcoin)Bitcoin1
LTC (Litecoin)Litecoin6
USDT (Ethereum)Ethereum12
USDC (Ethereum)Ethereum12
USDT (Polygon)Polygon30
USDC (Polygon)Polygon30
USDT (Solana)Solana32
USDC (Solana)Solana32
USDT (BNB Smart Chain)BNB Smart Chain15
USDC (BNB Smart Chain)BNB Smart Chain15
USDT (Tron)Tron19

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.

Full API reference

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.