Skip to main content
Most merchants don’t want a payments integration; they want to get paid. A payment link is one API call (or one dashboard form) that produces a URL. Your customer opens it and pays on a page Chipper hosts, in your branding, over whichever rail they have. Two objects, one checkout:
Send url to the customer. That’s the integration.

Create a page

Omit amount and the page asks the payer what to pay.

What the payer sees

Your name, logo, and accent colour; the amount; and one of three flows:
  • Mobile money: picks their operator, enters their number, taps Pay. An approval prompt hits their phone. This is the only rail that charges on click.
  • Bank transfer: taps Get account details. A dedicated virtual account is set aside for this payment; they transfer the exact amount from their own banking app; we detect it. Partial amounts count and accumulate.
  • Stablecoin: picks USDC or USDT and a network, gets an address with a QR code and the exact crypto amount at a locked rate (90 minutes for stablecoins), plus a “send only USDC on Solana” warning.
Every attempt is a checkout session (cs_…) with its own countdown (5 min mobile money · 30 min bank · 15–90 min crypto). A failed or expired session never affects the link; the payer just picks another method. On success they get a receipt they can download.

Branding rules

accentColor can be any hex. The checkout paints it in exactly two places, the identity mark and the pay button, with the text colour computed for contrast, so no colour can break the page. logoUrl (square) and businessName complete the identity.

Knowing you’ve been paid

  • Webhooks: the link’s payment settles through the normal rails, so you receive collection.completed and account.credited; for bank and crypto sessions the checkout deposit fires them too.
  • Polling: GET /v1/payment-links/{id} → status: "paid", with sessions showing every attempt and which one succeeded.
  • Dashboard: Payment links → the link → Checkout sessions.
redirectUrl on the link sends the payer back to you after success (with a 5-second countdown they can skip).

Closing and expiry

PATCH /v1/payment-links/{id} { "status": "closed" } stops further attempts. expiresAt on creation does it on a schedule. Pages close the same way; they never “expire”; an expired page simply refuses new checkouts.

Sandbox

Everything above works on sandbox with pl_test_ ids and simulated money. The checkout page carries dev tools in local development to complete, partial-pay, fail, or expire a session on demand; via the API, POST /v1/simulations/checkout-deposit pays a bank-transfer session.