Skip to main content

Merchant setup

Charge customers in the payment app they already use. Receive USDC on Base.

1. Set up your account

Merchant dashboardmerchant.pay.peer.xyzSign up, settings, orders.
Peer appApp Store, Google PlayYour wallet on your phone.
Developer documentationdocs.pay.peer.xyzAdding Peer Pay to your checkout.
Product overviewpay.peer.xyzWhat Peer Pay is.

Five steps

  1. Sign up with your email. Every login sends a one time code there.
  2. Add your business name, logo and industry. The name and logo appear on your customers' checkout.
  3. Turn on your payment platforms. Settings, Payments. Only enabled platforms appear at checkout.
  4. Set who pays the fee. Same screen. Fee Payer is merchant pays or buyer pays. See fee models.
  5. Run a test order. Every account starts in free Sandbox Mode. Switch it on in the sidebar, walk the checkout yourself, and confirm it lands under Orders.
Before you go live

Live orders need a plan. Pick Base or Pro yourself under Settings, Billing (onboarding asks at the go-live step), or ask for Concierge. Until a plan is selected, live order creation is rejected with 403 MERCHANT_TIER_FORBIDDEN; sandbox never needs one. Base and Pro carry monthly caps. See plans and support.

2. How your account works

The payment flow

Every order runs the same way, whichever integration created it.

  1. You create an order with an amount and a checkout link.
  2. Your customer opens the link and picks one of your platforms.
  3. They pay from their own app.
  4. A cryptographic proof verifies the payment privately.
  5. 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.

FlowYour customerPlatforms
Buyer verifiedConfirms 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 ReleaseInstalls nothing. Submits the transaction ID, typed or read off a screenshot. On PayPal, the name on their PayPal account.Venmo, Cash App, Wise, PayPal.

Base accounts run buyer verified. Pro includes Seller Automated Release as the default route, with buyer verified as the fallback; it means fewer steps, fewer abandoned checkouts, and it is what lets Scan to Pay settle at the counter. Concierge accounts are configured by the team. Read the trade offs in verification routes.

Creating orders

There are four ways to create orders.

Telegram bot

No code, no website. Create payment links in a chat and get notified there when they are paid.

  1. Open the bot. Message @peer_pay_merchant_bot with /start.
  2. Link your account. Send /link YOUR_API_KEY, using the key from Settings, Developer. Treat it like a password.
  3. Create a link. /request 50 for 50 USDC, /request 50 EUR to price in fiat.
CommandDoes
/linkConnects the bot to your account.
/helpUsage and the supported currencies.
/requestAmount, then optional currency, token, chain: /request 100 EUR USDT 42161.
/ordersRecent orders, five by default.
/activePayments in flight, grouped by order.
/unlinkDisconnects 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.

WooCommerce

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.

  1. Install the plugin. peer-pay-gateway.zip from the WordPress integration guide, then Plugins, Add New, Upload Plugin.
  2. Add a webhook. In Settings, Developer, point one at https://yourstore.com/wc-api/WC_Gateway_Peer_Pay/ for ORDER_FULFILLED and ORDER_CANCELLED, and copy the secret.
  3. Paste your credentials. WooCommerce, Settings, Payments, Peer Pay. The method stays hidden until the key and secret are set and the gateway is enabled.
  4. 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-pay log under WooCommerce, Status, Logs.

Classic and block checkouts both work, as one Peer Pay tile or split into one option per platform.

Shopify

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.

  1. 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.
  2. 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.
  3. Place a low value order. Confirm the link appears and Shopify marks the order paid once you pay.

Custom SDK

For any other site. Your backend creates the order and redirects the customer to the checkout URL it returns.

npm install @zkp2p/pay-sdk@4
import { 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 in the webhooks docs.

To hand the work to a coding agent, choose the custom integration path in onboarding and copy the generated prompt. It carries your sandbox and live keys and points the agent at the runbook served from the API; the agent verifies its own work with a sandbox test order and the integration status endpoint, and hands back anything only you can do, such as picking a plan. Details in let a coding agent integrate.

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 start a fresh payment, or reach support from the checkout if they already paid, and you can cancel from Orders as long as no payment was attempted.

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.

OrderMeaning
CreatedWaiting on the customer.
Partially fulfilledPart settled, the rest outstanding.
FulfilledSettled. The only status to act on.
CancelledClosed without settling.
PaymentMeaning
CreatedAttempt started, countdown running.
SettledVerified. USDC moved.
ExpiredWindow passed. The order stays open and can still settle late.
FailedDid not verify. The customer can try again.
CancelledCancelled 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. Venmo and PayPal payments can be disputed after they settle and are backed by stake on Base and Pro; see staking. Cash App is non-chargebackable and does not require stake. A successful Venmo or PayPal dispute is recorded on the order as a chargeback. It never undoes Fulfilled: the order keeps its status and gains a separate chargeback badge under Orders, and your webhook endpoint receives PAYMENT_CHARGEBACKED and ORDER_CHARGEBACKED events, so keep fulfillment and chargeback state apart in your own system. Keep order IDs, timestamps, customer messages and fulfillment records. Elevated dispute rates can lead to limits or termination, so raise an issue early.

Next: the advanced merchant guide, or send customers to how to pay.