Stablecoins and Payments
How to Accept USDC Payments Without a Payment Processor
A practical method for accepting USDC directly to your own wallet, matching payments to orders with unique amounts and confirming them on-chain without a third party.

Payment processors make crypto checkout easy, but they add fees, sign-up requirements and a company between you and your customers. For many small sellers, agencies and online services, accepting USDC directly into a wallet they control is simpler and cheaper. The challenge is knowing which payment belongs to which order without asking customers to type memos or share personal details.
This article walks through a method that works on any EVM network with standard tokens.
The basic flow
A direct stablecoin checkout has four steps:
- The customer chooses what to buy and a network, such as Base or Arbitrum
- Your system creates an order with a unique amount, for example 25.37 USDC
- The customer sends exactly that amount to your wallet address
- Your system watches the chain, finds a matching transfer and marks the order paid
No custody changes hands except the payment itself. Funds go straight to your wallet.
Why unique amounts work
Stablecoin transfers do not carry an order number. A transfer contains the sender, the recipient and the amount. If two customers both pay 25 USDC, you cannot tell which payment belongs to which order.
Adding a unique set of cents to each open order solves this. One customer pays 25.37 and another pays 25.81. As long as no two open orders on the same network and token share an amount, each incoming transfer matches exactly one order. Customers still pay roughly the same price, and the extra cents are trivial.
A few rules keep the system clean:
- Only reuse an amount after the earlier order is paid or has fully expired
- Match the exact amount, not "at least" the amount
- Only accept transfers that happened after the order was created
- Record the transaction hash so the same payment cannot count twice
Watching the chain
To detect payments, your server asks a blockchain node for token transfer events sent to your address. Standard tokens emit a Transfer event with the sender, recipient and amount. You can query these events for a range of blocks using the eth_getLogs method, filtered by the token contract and your address.
A simple approach:
- When an order is created, record the current block number
- Every minute or so, query new blocks since the last check
- Look for a transfer with exactly the order's amount
- Wait for a few confirmations before marking the order paid
Public RPC endpoints often limit how many blocks you can query at once, so scan in chunks and keep track of how far you have checked.

Confirmations
Blocks can occasionally be reorganised, especially very recent ones. Waiting for confirmations reduces the chance that a payment disappears after you accept it. The right number depends on the network and the amount at stake. Small digital purchases on layer 2 networks often use a handful of blocks. Larger amounts justify waiting longer.
Handling mistakes
Customers will sometimes send the wrong amount, use the wrong network or pay from an exchange that deducts a fee. Plan for it:
| Problem | What to do |
|---|---|
| Amount slightly wrong | Let customers submit the transaction hash for manual review |
| Wrong network, same address | The funds arrive in your wallet on that network, so match by hand |
| Paid after the order expired | Keep watching for a grace period, then resolve manually |
| Paid twice | Refund the duplicate from your wallet to the sender |
Clear instructions prevent most issues. Show the network name prominently, repeat the exact amount near the address and warn that exchange withdrawals must arrive in full.
Making payment easy
Good checkout pages offer several ways to pay:
- A copy button for the address and the amount
- A QR code, which mobile wallets can scan
- A "pay with browser wallet" button that fills in the token, amount and recipient
- A place to paste a transaction hash if detection is slow
Payment request links following the EIP-681 format let a QR code carry the token, network, recipient and amount together, which reduces typing errors on supporting wallets.
Keeping it safe
Use a dedicated wallet for business payments, separate from personal funds. Consider a hardware wallet or multisig for the receiving address, since it will accumulate value over time. Never ask customers to approve token spending for a simple payment, since a plain transfer is all you need.
Proud Globe uses this exact approach for every tile claim: a unique USDC or USDT amount per order, detection from public chain data, and a pin that goes live once the payment confirms.
Educational content only. Nothing here is financial, legal or tax advice. Crypto assets carry risk, so check the details for your own situation.