Skip to content
Crypto Merchant

Alternatives

Coinbase Commerce alternative: Crypto Merchant vs Coinbase Commerce (2026)

Coinbase Commerce closed after 31 March 2026: Coinbase folded it into Coinbase Business, which accepts only registered businesses in the US and Singapore, and told other merchants to “transition to an alternative provider”. Crypto Merchant suits merchants outside those two countries who want to keep accepting USDC and other coins through an API or payment links. It isn't the right fit if you want to hold your own keys as you did with Commerce, or you need plugins or bank settlement.

Last checked: 29 October 2026

Crypto Merchant wrote this comparison, and we're not affiliated with any gateway named here. Every competitor fact comes from the vendor's own pages, linked under the table. Prices and terms change, so check them before you decide.

How does Crypto Merchant compare with Coinbase Commerce?

Coinbase Business, Commerce's successor, is custodial like Crypto Merchant, but it serves only the US and Singapore and accepts only USDC and USDT. Crypto Merchant takes sign-ups from any country and accepts 11 coins, but has no plugins or bank payouts.

FeatureCrypto MerchantCoinbase Business
Payment fee1% of each paid invoice, in the coin paid, deducted when it's credited. Expired or cancelled invoices cost nothing.1% for merchants who moved from Commerce. No public rate for new merchants: Coinbase says to log in to see current fees.[1][2]
Monthly and setup feesNone, and no setup fee. Going live takes a one-time $25 payment, credited in full to your gas balance for network fees. It isn't refunded as cash.“No application fee”. Monthly fee not confirmed.[2]
ConversionOptional: swap everything into one holding coin. The rate is the live market price and includes a service margin.Payments settle in USDC. Auto-conversion from USDC to USD “is subject to a fee”; the amount isn't public.[2][3]
Payouts and withdrawalsAny time, no minimum, no Crypto Merchant payout fee: network fee only. Each coin to its own address, or swapped into one holding coin first.Withdraw to your bank “anytime”, with “no lockups, no minimums”, and a Payouts product. The old Commerce withdrawal tool is permanently disabled after 31 March 2026.[1][2][3]
KYC or KYB to sign upEmail, name and business name. We don't ask for identity documents when you create an account.A registered business entity and a business bank account.[1][2]
CustodyCustodial. We hold the keys; every wallet comes from one recovery phrase kept offline on paper. Payments collect in a pool wallet dedicated to your business.Custodial only. Commerce (legacy) was self-custodial.[1]
Coins and networks11 coins on 11 networks. USDT on Ethereum, BNB Smart Chain, Polygon, Arbitrum One, Tron and Solana. USDC on Ethereum, BNB Smart Chain, Polygon, Base, Arbitrum One and Solana. Plus BTC, ETH, LTC, SOL, XRP, BNB, TRX, POL and GRAM (TON).USDC on Ethereum, Base, Polygon, Optimism, Avalanche and Arbitrum. USDT on Ethereum only, in the US and select jurisdictions. No BTC, ETH, SOL or TRX acceptance stated.[3]
Country limitsAnyone, in any country, can sign up. The Terms prohibit illegal goods, fraud and sanctions evasion.Businesses in the US and Singapore only.[2]
E-commerce pluginsNone: no WooCommerce, Shopify or WHMCS plugin. Use payment links, the hosted checkout or the API.WooCommerce, Magento (Adobe Commerce) and WHMCS, plus QuickBooks and Xero accounting.[1][3]
Fiat (bank) settlementNo. Crypto only: payouts go to crypto addresses.Yes: withdrawals to your business bank account.[1][3]
API and webhooksREST API with Bearer keys for invoices, payment links, balances and coins. Webhooks signed with HMAC-SHA256, retried for about two days.Checkouts API and x402 agent payments.[3]
Payment linksYes: fixed-price or pay-what-you-want links, a hosted checkout page and invoices.Yes: payment links and invoicing.[3]
Every Crypto Merchant cost is on the pricing page, and every API field in the API reference.

Sources

Every Coinbase Commerce fact in the table comes from these pages, checked 29 October 2026. “Not confirmed” means none of them stated it.

  1. [1]Coinbase Help: transitioning from Commerce to Business: https://help.coinbase.com/en/transitioning-from-coinbase-commerce-to-coinbase-business
  2. [2]Coinbase Business: https://www.coinbase.com/business
  3. [3]Coinbase Business: checkouts: https://www.coinbase.com/business/features-checkouts

When is Coinbase Commerce the better choice?

Coinbase Business is the better choice if your business is registered in the US or Singapore and you want the money in a bank account.

  • Your business is registered in the US or Singapore and has a business bank account. You can move to Coinbase Business, and Coinbase says merchants moving from Commerce keep a 1% rate.
  • You want dollars in the bank: Coinbase Business withdraws to your bank account. Crypto Merchant pays out in crypto only.
  • You use WooCommerce, Magento or WHMCS, or keep your books in QuickBooks or Xero. Coinbase Business works with them; Crypto Merchant has no plugins.
  • You want a provider with a track record and reviews. Crypto Merchant launched on 28 October 2026 and has neither yet.

When does Crypto Merchant fit better?

Crypto Merchant fits better if you're outside the US and Singapore, or your customers pay in more than USDC.

  • Your business is outside the US and Singapore. Anyone, in any country, can sign up, and we don't ask for identity documents when you create an account.
  • Your customers pay USDT on Tron or another network, or pay in BTC, ETH, SOL, LTC, XRP, BNB, TRX, POL or GRAM. Coinbase Business takes USDC, and USDT only on Ethereum.
  • You want a published price: 1% per paid invoice, no monthly fee and no Crypto Merchant payout fee.
  • You're moving a developer integration. Invoices, a REST API and signed webhooks cover what a Commerce integration did, and the guide below maps each step.

How do I switch from Coinbase Commerce to Crypto Merchant?

Sign up, go live with one payment, then point your checkout and webhooks at Crypto Merchant. There's no plugin to install: you use payment links, the hosted checkout or the API.

  1. 1

    Create an account

    Sign up with your email, your name and your business name. We don't ask for identity documents when you create an account.

  2. 2

    Go live

    Turn on the coins and networks you want, then make the one-time $25 go-live payment in any coin. It's credited in full to your gas balance, which pays network fees, and isn't refunded as cash if you close the account.

  3. 3

    Start taking payments

    Share your checkout page, create payment links or invoices in the portal, or create invoices from your site with the API.

  4. 4

    Point your webhooks

    Add your server's HTTPS address under Developers, check the CM-Signature header on every event, and fulfil orders on invoice.paid. Webhooks has the details.

  5. 5

    Move your integration

    If your site created Commerce charges through the API, follow the migration guide below. If it didn't, replace the old payment links or buttons on your site with Crypto Merchant payment links or your checkout page.

How do I migrate from Coinbase Commerce to Crypto Merchant?

Your Commerce integration created charges and received webhooks. With Crypto Merchant you create an invoice for each order, send the customer to its checkout page, and handle signed webhooks. The steps below map each job onto our API; the API reference has every field.

What replaces what

Job in your old integrationWith Crypto Merchant
Create a payment for an orderPOST /invoicesCreate an invoice with the amount, currency and your order ID.
Send the customer to paycheckout_urlRedirect to the invoice's checkout URL.
Keep your own data with the paymentmetadataAny JSON object up to 4 KB, returned on the invoice and in webhooks.
Hear when a payment completesinvoice.paidA webhook endpoint that checks the signature, then fulfils the order on this event.
Check one paymentGET /invoices/{id}Retrieve the invoice.
Match payments to ordersGET /invoices?status=paidList paid invoices, a page at a time.
Withdraw an unpaid payment requestPOST /invoices/{id}/cancelCancel the invoice, before any payment is seen.

1. Create an invoice instead of a charge

Create an API key in the portal under Developers (live keys start with cm_live_) and keep it on your server. Your account has to be live first: until the $25 go-live payment is made, the API answers 403 with the code merchant_not_live. Then, wherever your code created a charge, create an invoice. The amount must be worth at least 0.50 US dollars.

curl · Create an invoice
curl https://cryptomerchant.online/api/v1/invoices \
  -H "Authorization: Bearer $CM_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "49.90",
    "currency": "USD",
    "order_id": "1042",
    "redirect_url": "https://yourstore.example/orders/1042",
    "metadata": { "cart_id": "c_8812" }
  }'
Response (shortened)
{
  "id": "inv_…",
  "object": "invoice",
  "status": "open",
  "amount": "49.9",
  "currency": "USD",
  "amount_usd": "49.9",
  "order_id": "1042",
  "metadata": { "cart_id": "c_8812" },
  "coin": null,
  "pay_address": null,
  "pay_amount": null,
  "checkout_url": "https://cryptomerchant.online/pay/i/inv_…",
  "redirect_url": "https://yourstore.example/orders/1042",
  "expires_at": "2026-10-30T10:30:00.000Z",
  …
}

The response, with status 201, is the invoice object. Save its id with your order. Its status starts as open.

2. Send customers to the checkout URL

Redirect the customer to the invoice's checkout_url. There they pick a coin and network, get a deposit address used for this invoice only, and see the exact amount at a locked rate. Set redirect_url to bring them back to your site after paying. If no payment is seen by expires_at, the invoice expires.

Commerce ran on Ethereum, Polygon and Base, and Crypto Merchant accepts USDC on all three. To skip the coin choice, pass coin, for example USDC.BASE: pay_address and pay_amount then come back filled in, so you can show the payment details yourself.

Create the invoice and redirect · Node.js, Express
// orders: your own data layer
app.post("/orders/:id/pay", async (req, res) => {
  const order = await orders.find(req.params.id);

  const r = await fetch("https://cryptomerchant.online/api/v1/invoices", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.CM_SECRET_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      amount: order.total, // for example "49.90"
      currency: "USD",
      order_id: order.id,
      redirect_url: `https://yourstore.example/orders/${order.id}`,
    }),
  });
  if (!r.ok) {
    const { error } = await r.json();
    throw new Error(`${error.code}: ${error.message}`);
  }

  const invoice = await r.json();
  await orders.update(order.id, { invoiceId: invoice.id });
  res.redirect(303, invoice.checkout_url);
});

3. Verify the webhook signature

Add your endpoint's HTTPS address under Developers. Each endpoint gets its own signing secret, starting with whsec_. Every event is a POST with a CM-Signature header: t= a Unix timestamp in seconds, then v1= the hex HMAC-SHA256 of the timestamp, a full stop and the raw body, keyed with your endpoint secret.

Compute it over the raw body before parsing the JSON, compare it in constant time, and reject timestamps more than five minutes old. Reply with a 2xx status within 10 seconds; anything else is retried, up to eight times over about two days.

Verify, de-duplicate and handle events · Node.js, Express
import crypto from "node:crypto";
import express from "express";

// CM-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">
function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(
    String(header ?? "").split(",").map((p) => p.trim().split("=")),
  );
  if (!parts.t || !parts.v1) return false;
  const expected = crypto
    .createHmac("sha256", secret) // your endpoint secret, whsec_…
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(parts.v1);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return false;
  return Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300; // 5 minutes
}

const app = express();

// db, tx.webhookEvents, tx.orders: your own data layer
app.post(
  "/webhooks/crypto-merchant",
  express.raw({ type: "application/json" }), // keep the raw body for the signature
  async (req, res) => {
    const raw = req.body.toString("utf8");
    if (!verify(raw, req.get("CM-Signature"), process.env.CM_WEBHOOK_SECRET)) {
      return res.sendStatus(400);
    }
    const event = JSON.parse(raw);
    const invoice = event.data;

    try {
      await db.transaction(async (tx) => {
        // A unique key on the event id: a repeated delivery is skipped.
        const isNew = await tx.webhookEvents.insertIfAbsent(event.id);
        if (!isNew) return;

        if (event.type === "invoice.paid") {
          await tx.orders.markPaid(invoice.order_id, invoice.id); // one-way: never moves back
        } else if (event.type === "invoice.expired" || event.type === "invoice.cancelled") {
          await tx.orders.cancelIfUnpaid(invoice.order_id);
        }
      });
    } catch {
      return res.sendStatus(500); // not 2xx: Crypto Merchant tries again later
    }
    res.sendStatus(200); // within 10 seconds
  },
);

4. Map payment statuses

Fulfil orders only on invoice.paid, and map the other statuses onto your order system as below. An underpaid invoice can still become paid if the customer sends the rest to the same address.

StatusWebhook eventWhat it meansWhat your order system should do
openinvoice.createdCreated. The customer hasn't picked a coin yet.Waiting for payment.
awaiting_paymentNoneA coin is chosen, the deposit address is assigned and the rate is locked.Still waiting: the customer has chosen how to pay.
confirminginvoice.confirmingA payment was seen on-chain and is waiting for confirmations.Show “payment received, confirming”. Don't ship yet.
underpaidinvoice.underpaidThe confirmed payment is short by more than your tolerance. The customer can pay the rest or ask for a refund.Don't ship. The customer can pay the rest or ask for a refund.
paidinvoice.paidPaid and confirmed. The amount, minus the fee, is in your balance.Mark it paid and fulfil the order.
expiredinvoice.expiredTime ran out before any payment was seen.Release the stock or cancel the order.
cancelledinvoice.cancelledThe invoice was cancelled before any payment was seen.Cancel the order.
refundedinvoice.refundedThe customer was refunded what they sent on an underpaid invoice.Cancel the order: the customer has their coins back.

5. Handle duplicate and out-of-order webhooks

Events can arrive more than once, and not always in order. Store each event's id (also sent in the CM-Event-Id header) under a unique key, in the same database transaction as the order update, and skip events you've already stored. Make status changes one-way, so a late invoice.confirming never moves a paid order back. Before shipping something valuable, fetch the invoice from the API to double-check its status.

6. Reconcile

List paid invoices 100 at a time, following starting_after while has_more is true, and match each one to an order by order_id or metadata.

Fetch every paid invoice · Node.js
// Every paid invoice, newest first. Match each one to an order by order_id.
async function paidInvoices() {
  const all = [];
  let after = null;
  do {
    const url = new URL("https://cryptomerchant.online/api/v1/invoices");
    url.searchParams.set("status", "paid");
    url.searchParams.set("limit", "100");
    if (after) url.searchParams.set("starting_after", after);

    const r = await fetch(url, {
      headers: { Authorization: `Bearer ${process.env.CM_SECRET_KEY}` },
    });
    const page = await r.json();
    all.push(...page.data);
    after = page.has_more ? page.data[page.data.length - 1].id : null;
  } while (after);
  return all;
}

Your balance is credited with the invoice amount (or the slightly smaller amount received, if an underpayment within your tolerance was accepted), minus the 1% fee, in the coin paid. Overpayments aren't credited to you: above $5, the customer can withdraw the extra from the invoice page; $5 or less goes to the platform pool. The portal's Reports page gives gross, fees and net for any period as a CSV, and GET /balances shows what you hold now.

Frequently asked questions

What happened to Coinbase Commerce?
Coinbase unified Commerce with Coinbase Business. Merchants had to move by 31 March 2026; after that the Commerce portal became inaccessible and its withdrawal tool was permanently disabled. Coinbase Business is open only to registered businesses in the US and Singapore, and Coinbase told other merchants to move to an alternative provider.
What is the best Coinbase Commerce alternative outside the US?
If you want to hold your own keys as with Commerce, a self-hosted, non-custodial tool such as BTCPay Server is the closest. If a hosted, custodial service is fine, Crypto Merchant takes sign-ups from any country without documents, accepts USDC on Ethereum, Polygon and Base, the networks Commerce used, and has an API with signed webhooks. It has no plugins and no bank payouts.
How much does Coinbase Business charge?
Coinbase says merchants moving from Commerce keep a 1% fee. It doesn't publish a rate for new merchants: its business page says to log in to see current fees, and converting USDC to USD costs an unpublished fee. Crypto Merchant charges 1% of each paid invoice and no monthly fee.
Is Crypto Merchant custodial like Coinbase Business?
Yes. Crypto Merchant holds the keys to your pool wallet and deposit addresses, all derived from one recovery phrase kept offline, and keeps a balance for you until you pay out. Coinbase Business is custodial too. Commerce was self-custodial, so this is a change if you're coming from it.
Can I keep accepting USDC on Base?
Yes. Crypto Merchant accepts USDC on Base, Ethereum, Polygon, Arbitrum One, BNB Smart Chain and Solana, and USDT on six networks including Tron. Network fees for moving tokens are paid from your gas balance.

Other gateways compared

All gateways in one table

Start accepting crypto today

Free setup, no documents to sign up, 1% per paid invoice, and payouts whenever you want.