Price it in dollars. Get paid in crypto.
Ecommerce, SaaS billing, bookings, credits, digital goods. Your customer pays with whatever token they hold; you settle into the asset and chain you want.
INV-0042
PublishedDesign retainer
$2,400.00
Onboarding
$600.00
Total
$3,000.00
A checkout your finance team can reconcile
Crypto checkout usually fails on the accounting side, not the payment side. This is built the other way around.
Priced in fiat, paid in crypto
Set an amount in USD or another fiat unit. The customer pays in the token they hold; you settle in the asset you configured.
Authorized on your server
A SALE order is created with your API secret and an HMAC-SHA256 signature. Only the resulting order ID reaches the browser.
Your order ID travels with it
Put your internal order and customer IDs into order metadata at creation. They come back on every webhook, which is what makes reconciliation and idempotent fulfilment possible.
Every terminal state is explicit
EXPIRED, FAILED, REFUNDED, and PARTIAL_PAYMENT are distinct states with distinct webhooks, so an unpaid order never sits ambiguous in your database.
The integration, end to end
Four steps, and the only one that touches your secret runs on your server.
01
Create your internal order first
Store the amount, currency, customer, and line items on your side before you touch the CoinVoyage API.
02
Create the SALE order server-side
Call createSaleOrder with your API secret and pass your internal order ID in metadata.
03
Send only the order ID to the client
The browser renders the payment modal from the server-generated orderId. The secret never leaves your server.
04
Fulfil from the verified webhook
Release goods or services after your backend receives and verifies ORDER_COMPLETED. Never from a browser callback alone.
const { data, error } = await apiClient.createSaleOrder(
{
amount: "149",
fiat_unit: "USD",
metadata: {
order_id: "order_123",
customer_id: "customer_456",
},
},
process.env.COIN_VOYAGE_API_SECRET!,
);Three ways for the customer to pay
All three land in the same SALE order, fire the same webhooks, and settle to the same wallet. Open the modal on whichever one fits the moment.
WALLET
Pay with Wallet
The customer connects their wallet, picks any token they hold on any supported chain, and confirms. Balances are scanned first, so they only see routes they can fund.
DEPOSIT_ADDRESS
Pay to Address
They choose a chain and token and get a unique deposit address and exact amount, valid for about 30 minutes, payable from any wallet or exchange. Underpayments stay open.
CARD
Pay with Card
For the customer with no crypto: an embedded Stripe session takes USD or EUR by card and still settles on-chain to your wallet. Appears only once your organization is approved.
The specifics
Order mode
SALE
Credential
API secret, used server-side to sign the request
Signature
HMAC-SHA256 over METHOD + path + timestamp, where path excludes the /v3 prefix
Price in
Digital assets, or a fiat unit such as USD
Settlement
Your configured settlement currencies and wallets, set in the Dashboard
Refunds
Full or partial on-chain refunds from a transaction's detail view, or the refund endpoint
Pricing
Depends on the products you use, your volume, and how you settle. Contact us.
Charge in the currency you think in
Set your settlement asset once in the Dashboard and stop thinking about what your customers are holding.