Payment Links — Overview
A Payment Link is a shareable URL that drops a buyer into a hosted
checkout you’ve already configured. No SDK, no server integration — issue
it in the dashboard, share it, and the same payment.settled webhook
fires when funds confirm on-chain.
Under the hood, a Payment Link is a CheckoutSession — “Payment Link” is just the dashboard-side name for a session that wasn’t created by a buyer-driven SDK flow. Same webhook contract, same on-chain settlement, same fees.
Common uses:
- Invoicing a one-off customer without writing code
- Sales pages where the dev team isn’t going to wire a custom cart this quarter
- B2B follow-ups — paste the link into an email and call it done
- “Buy me a coffee”-style fixed-amount tipping pages
Create one
Today this is dashboard-only:
- Sign in to the merchant dashboard
- Payments → Payment Links → + New link
- Pick one of two paths:
- New order — enter line items, currency, customer info, and optional metadata. The dashboard creates the Order and the Payment Link in a single call.
- Existing order — pick a
PENDINGorder (e.g. the buyer abandoned the previous link). Re-issues a fresh link backed by the same order, so the order history stays intact.
- Save → the dashboard shows the
https://checkout.infraio.xyz/cst_…URL with a copy button and a QR code download. Test-mode links usecheckout-dev.infraio.xyzso the environment is encoded in the hostname.
Each Payment Link is single-use today: once a buyer pays, the session
is COMPLETED. If a session expires before payment (default TTL is
30 minutes), open the order detail page and click Re-create link
to issue a fresh one against the same order.
What the buyer sees
- They land on
checkout.infraio.xyz/<session_key>— the same hosted checkout UI you’d get from an SDK-issued session. - They go through the standard pick-asset → send funds → wait for confirmation flow described in Checkout — Overview.
payment.settledfires on your webhook with the order, intent, receipt, on-chain tx hash, and confirmation count — same payload as any other settled payment. See Webhooks for the schema.
What the dashboard gives you
The Payment Links surface today ships with:
- List view — every link you’ve issued, cursor-paginated, with status, amount, parent order number, customer, expiry, and a one-click open to the buyer URL.
- Filters — status (
ACTIVE/COMPLETED/EXPIRED/CANCELED), date range, and full-text search across order number, customer name, email, or external ref. - CSV export — one click, respects the current filters.
- KPI strip — counts per status, scoped to the current environment
(
livevstest) via theX-Environmentheader so the numbers always match what the table is showing. - Detail page — order summary, sessions history (every attempt for this order), on-chain history with block explorer links, and a Re-create link action for sessions that expired before payment.
Limitations today
- No programmatic API — links must be created in the dashboard. The
SDK can create equivalent single-use sessions via
POST /b2b/v1/checkout-sessions/quick(see API reference), but the “long-lived shareable URL” UX is dashboard-only for now. - No per-buyer authentication — anyone with the URL can pay. The single-use model partially mitigates this; full buyer identity binding is on the roadmap below.
- Branding is global — the link uses your merchant-wide logo, brand colour, and border radius from Settings → Branding. Per-link branding overrides aren’t surfaced in the dashboard UI yet.
Roadmap
Items we know we want, prioritised highest to lowest:
- Programmatic creation — a
POST /b2b/v1/payment-linksendpoint that mirrors the dashboard’s two-tab dialog and returns the samecheckout_url. Pairs naturally with listing + revocation. - Time-based expiry — link stays valid until a specific date, not just until the session TTL elapses. Needed for invoicing flows where “due in 14 days” is the natural deadline.
- Reusable links — Stripe-style multi-buyer pages (donation, tipping, recurring tabs). Today every link is single-use.
- Per-buyer identity — lock a link to a specific email or wallet so it can’t be forwarded.
- API-side QR generation — the dashboard renders QR codes client-side today; surfacing this on the API for label printing and embedded receipts is on the list.
See also
- Concepts → Sessions — what’s happening at the session and intent layer while a buyer is paying.
- Checkout → Overview — what the buyer actually sees.
- Webhooks → Overview — the
payment.settledevent your server reacts to.