<!-- Source: https://docs.infraio.xyz/en/payment-links/overview -->
<!-- Last updated: 2026-10-04 -->

# 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](https://docs.infraio.xyz/en/concepts/sessions) —
"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 you don't have a custom cart
- B2B follow-ups: paste the link into an email
- "Buy me a coffee"-style fixed-amount tipping pages

## Create one

Create payment links in the dashboard:

1. Sign in to the [merchant dashboard](https://app.infraio.xyz)
2. **Payments → Payment Links → + New link**
3. 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 `PENDING` order (e.g. the
     buyer abandoned the previous link). Re-issues a fresh link backed
     by the same order, so the order history stays intact.
   - On **New order** you can switch to **Amount only** to charge a set amount without listing products.
4. Save → the dashboard shows the `https://checkout.infraio.xyz/cst_…`
   URL with a copy button and a QR code download. Test-mode links use
   `checkout-dev.infraio.xyz` so the environment is encoded in the
   hostname.

> **Note:**
>
> 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

1. They land on `checkout.infraio.xyz/<session_key>` — the same hosted
   checkout UI you'd get from an SDK-issued session.
2. They go through the standard pick-asset → send funds → wait for
   confirmation flow described in [Checkout — Overview](https://docs.infraio.xyz/en/checkout/overview).
3. `payment.settled` fires on your webhook with the order, intent, receipt,
   on-chain tx hash, and confirmation count — same payload as any other
   settled payment. See [Webhooks](https://docs.infraio.xyz/en/webhooks/overview) 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 for the current environment
  (`live` or `test`), matching what the table shows.
- **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. You
  can create equivalent single-use sessions via `POST /b2b/v1/checkout-sessions/quick`
  (see [API reference](https://docs.infraio.xyz/en/api-reference)), but shareable links are
  created in the dashboard only.
- **No per-buyer authentication** — anyone with the URL can pay. Each
  link is single-use, which limits this.
- **Branding is global** — the link uses your merchant-wide logo, brand
  colour, and border radius from **Settings → Branding**. Per-link branding
  overrides aren't available.

## See also

- [Concepts → Sessions](https://docs.infraio.xyz/en/concepts/sessions) — what's happening at the
  session and intent layer while a buyer is paying.
- [Checkout → Overview](https://docs.infraio.xyz/en/checkout/overview) — what the buyer actually sees.
- [Webhooks → Overview](https://docs.infraio.xyz/en/webhooks/overview) — the `payment.settled`
  event your server reacts to.
