Non-custodial stablecoin payments

Accept stablecoin payments.
Your books close themselves.

Every payment arrives matched and ready for month-end review. Connect one USDC or USDT address you control and integrate in minutes.

Just getting paid in stablecoin? Keep a free income ledger
Non-custodial Your wallet, your funds One-time payments + prepaid credits
Overview
PAYMENTS + RECONCILIATIONGood morning, Atlas.
Payments received$52,690.00● Settled to your wallets
Open orders1228 total created
Needs attention2Review exceptions
Revenue · last 30 days▲ 18.4%
Recent activityView all →
ACINV-042Arc & Co.$4,800Paid
NOINV-041Northstar$2,200Pending
Receiving rails Live
UUSDCBase$24,850
UUSDTTRON$18,240
Payment matched4,800 USDC · INV-042

One operational layer for

USDCArbitrumBaseEthereumHyperEVMOPSolana
USDTEthereumHyperEVMOPTRON

The built-in advantage

Not just a checkout.
Already reconciled.

Each payment keeps its customer, order or invoice, exact amount, wallet, and transaction together. Exceptions are flagged, then accountant-ready CSV exports support QuickBooks or Xero.

MainPay connects the payment to the books—without touching the funds.

Explore reconciliation

One clean payment loop

From order to wallet
to closed books.

01
ORDER$4,800.00USDC · Base

Create a one-time order

Create it from your server, then share the hosted payment link. Your API key stays private.

02
AC······→MDirect to your wallet

Let the customer pay

They scan the QR code or connect their own wallet, review the exact transfer, and sign it themselves.

03
Paid + matchedSigned webhook sent

Fulfill and close

MainPay confirms the transfer, sends a signed webhook, and reconciles the payment automatically.

Where MainPay is different

The books close behind the payment.

Revenue is matched to its customer and order as it arrives. Your team handles only the exceptions, then exports a clean, verifiable close record.

Automatic payment matchingConnect transfers to the correct customer and invoice.
Human-readable exceptionsCatch partial, late, duplicate, and unknown payments.
Audit-ready exportsPreserve exact amounts, addresses, and transaction hashes.
See reconciliation and operations
Exception review2 open
UnderpaidINV-038 · Northstar Labs

1,995.00 / 2,000.00 USDC received

Difference−5.00 USDC
UnmatchedUnknown transfer

850.00 USDT received on TRON

Received 2 minutes ago

For developers

Accept a payment in ~5 lines.

Create a hosted checkout from your server with the Node SDK—non-custodial, funds settle straight to your own wallet. Test mode is free; go live when you're ready.

import MainPay from "@mainpay/node";

const mainpay = new MainPay(process.env.MAINPAY_API_KEY);

// Hosted checkout — funds settle to your own wallet.
const order = await mainpay.orders.create({
  fiat_amount: "4800.00",
  asset: "USDC",
  network: "base",
  receiving_account_id: process.env.MAINPAY_WALLET_ID,
  client_reference_id: "INV-042",
});

return Response.redirect(order.hosted_url);

Designed around control

Your money never enters MainPay.

Direct settlement

Customers pay the receiving addresses you control.

No keys, ever

MainPay only needs public wallet addresses to monitor payments.

Verifiable evidence

Every record links back to its source transaction on-chain.

Already getting paid?

We reconcile
that too.

Already receiving USDC or USDT outside MainPay? Connect the public wallet addresses you control, match existing transfers to customers and invoices, and give your accountant a clean month-end trail.

Explore the founding reconciliation pilot or build with the API.