Merchant guide
Merchant setup
Charge customers in the payment app they already use. Receive USDC on Base.
1. Set up your account
Five steps
- Sign up with your email
Every login sends a one time code there.
- Add your business name, logo and industry
The name and logo appear on your customers' checkout.
- Turn on your payment platforms
Settings, Payments. Only enabled platforms appear at checkout.
- Set who pays the fee
Same screen. Fee Payer is merchant pays or buyer pays. See fee models.
- Run a test order
Every account starts on the free Basic plan. Switch on Sandbox Mode in the sidebar, walk the checkout yourself, and confirm it lands under Orders.
Before you go live
Live payments need the Concierge plan, priced around your usage. Open Settings, Billing, or see plans and support.
2. How your account works
The payment flow
Every order runs the same way, whichever integration created it.
- You create an order with an amount and a checkout link.
- Your customer opens the link and picks one of your platforms.
- They pay from their own app. Peer is never in the middle of that transfer.
- An enclave verifies the payment privately.
- USDC settles to your wallet on Base.
They need no Peer account and no crypto wallet.
Two verification flows
Step four runs one of two ways, and it sets how much work your customer does.
| Flow | Your customer | Platforms |
|---|---|---|
| Buyer verified | Confirms the payment in the Peer app or the PeerAuth extension. Costs them an install or an in-app step. | Every platform you enable. |
| Seller Automated Release | Installs nothing. Submits the transaction ID, typed or read off a screenshot. On PayPal, the name on their PayPal account. | Venmo, Cash App, Wise, PayPal. |
Buyer verified is the default. Seller Automated Release means fewer steps, fewer abandoned checkouts, and it is what lets Scan to Pay settle at the counter. Request it under Settings, Checkout once you have read the trade offs in verification routes.
Creating orders
Four ways in. Pick one.
No code, no website. Create payment links in a chat and get notified there when they are paid.
- Open the bot
Message @peer_pay_merchant_bot with
/start. - Link your account
Send
/link YOUR_API_KEY, using the key from Settings, Developer. Treat it like a password. - Create a link
/request 50for 50 USDC,/request 50 EURto price in fiat.
| Command | Does |
|---|---|
/link | Connects the bot to your account. |
/request | Amount, then optional currency, token, chain: /request 100 EUR USDT 42161. |
/orders | Recent orders, five by default. |
/active | Payments in flight, grouped by order. |
/unlink | Disconnects the bot. |
Fiat pricing covers USD, EUR, GBP, CAD, AUD, SGD, INR, BRL and MXN. The bot snapshots your recipient, chain and token when you run /link, so unlink and relink after changing those settings. You can also name a chain and token per request.
Peer Pay becomes a payment method at checkout and order status flows back. Needs WordPress 5.8, WooCommerce 7.0, PHP 7.4 or later. USD totals go out as USDC; other currencies convert at the live rate.
- Install the plugin
peer-pay-gateway.zipfrom docs.pay.peer.xyz/integrations/wordpress, then Plugins, Add New, Upload Plugin. - Add a webhook
In Settings, Developer, point one at
https://yourstore.com/wc-api/WC_Gateway_Peer_Pay/forORDER_FULFILLEDandORDER_CANCELLED, and copy the secret. - Paste your credentials
WooCommerce, Settings, Payments, Peer Pay. The method stays hidden until the key and secret are set and the gateway is enabled.
- Buy something cheap from your own store
The order should move from On Hold to Processing. If it sticks, check the webhook logs and the
peer-paylog under WooCommerce, Status, Logs.
Classic and block checkouts both work, as one Peer Pay tile or split into one option per platform.
The Peer Pay app plus a custom manual payment method. Shopify holds the order as pending, the customer pays through the link on the order status page, and the app marks it paid on fulfillment. Orders must be priced in USD.
- Create the payment method
In Shopify admin, add a custom manual payment method named exactly Peer Pay, with the instructions field pointing at the confirmation page.
- Ask for the app
It is not listed publicly yet. Ask the team to install it and confirm the method name, using the contacts under plans and support.
- Place a low value order
Confirm the link appears and Shopify marks the order paid once you pay.
For any other site. Your backend creates the order and redirects the customer to the checkout URL it returns.
npm install @zkp2p/pay-sdkimport { createCheckout } from '@zkp2p/pay-sdk';
const { checkoutUrl } = await createCheckout(
{
requestedUsdcAmount: '50.00',
successUrl: 'https://yoursite.com/success',
notes: { merchantOrderId: 'order_123' },
},
{
apiBaseUrl: 'https://api.pay.peer.xyz',
checkoutBaseUrl: 'https://pay.peer.xyz',
apiKey: process.env.ZKPAY_API_KEY,
},
);Send the customer to checkoutUrl. Anything you leave out falls back to your dashboard defaults, so most integrations send an amount and nothing else. Release goods on ORDER_FULFILLED, never on a redirect. Payloads and signature verification are at docs.pay.peer.xyz.
Payment platforms
Turn these on under Settings, Payments: Venmo, Cash App, PayPal, Zelle and Chime in the US, Revolut, Wise, Monzo and N26 across Europe and the UK, plus an optional crypto wallet spanning eleven chains including Base, Ethereum, Solana, Bitcoin and Tron. Venmo is the highest volume rail, Zelle covers selected banks that customers pick at checkout, and anything with no liquidity for a quote shows as unavailable.
Rates are variable
Peer Pay is a marketplace. Each order is filled by whoever is offering fiat liquidity for that platform, currency and size at that moment, so there is no fixed price list.
- When you pay the fee, cap it under Max Fee Configuration: a tighter cap costs less and fills more slowly. See fee models.
- When your customer pays, they see one final price and the cap does not apply.
- Dynamic orders rescues an order no liquidity covers, offering the customer nearby amounts and firing an order resized webhook.
3. Getting paid
Where the money lands
Verified payments settle as USDC on Base, straight to your merchant wallet. Peer never holds your funds and cannot move them. Cash out to fiat in the app, or send, swap and bridge it yourself. To settle elsewhere, see payout routing.
Timing
Each payment attempt runs against a countdown. If it runs out the order is not cancelled: the customer can request more time or start a fresh payment, and you can cancel from Orders.
Note
Ship on a fulfilled status, never on a customer saying they sent the money.
Statuses
Orders and their payment attempts carry separate statuses. An order outlives a failed attempt, so read both.
| Order | Meaning |
|---|---|
| Created | Waiting on the customer. |
| Partially fulfilled | Part settled, the rest outstanding. |
| Fulfilled | Settled. The only status to act on. |
| Cancelled | Closed without settling. |
| Payment | Meaning |
|---|---|
| Created | Attempt started, countdown running. |
| Settled | Verified. USDC moved. |
| Expired | Window passed. The order stays open and can still settle late. |
| Failed | Did not verify. The customer can try again. |
| Cancelled | Cancelled before settling. |
When something looks stuck
- Refresh the order to pull latest state.
- Ask the customer to open the support chat on their checkout. Most stuck payments are an unfinished verification step.
- If they paid and nothing settled, send the team the order ID before replacing it.
Chargebacks
Chargebacks, reversals and refunds on your transactions are yours. Keep order IDs, timestamps, customer messages and fulfillment records. Elevated dispute rates can lead to limits or termination, so raise an issue early.
Support: @PeerConcierge on Telegram, or concierge@peer.xyz.
Peer Pay is a peer-to-peer payment marketplace. Peer never takes custody of merchant funds.