Skip to content
Checkout

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

Published

Design retainer

$2,400.00

Onboarding

$600.00

Total

$3,000.00

Pay with crypto

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.

server/create-sale.ts
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.