Payment Links
Shareable URLs that spawn a fresh checkout for every customer. No code required.
A payment link is a shareable URL (e.g. checkout.noholdpay.com/donate-2026). Fixed-amount links spawn a new payment with source_type='link' on every visit and land the customer on the standard hosted checkout. Customer-entered and preset links show an amount step first and spawn the payment when the customer submits. Send the same link to a thousand customers and you get a thousand isolated payments.
List page
Sidebar: Payment Links. The list page shows your most recent 100 links per mode.
- Search by title, slug, public URL, or description.
- Filter with the Status dropdown: All, Active, Inactive. The filter follows the link's on/off toggle only. An expired or exhausted link keeps its toggle state, so it shows an Expired or Exhausted badge but still lists under Active unless you also deactivate it.
- Each row shows the link title with its share URL beneath it, the Price (or "any amount"), Uses (e.g.
18 of 20), the Status badge with a context line (e.g.last paid 2h ago), the Created date, and copy/open buttons on active rows. - Top-right CTA: New link.
Bulk actions
Tick the row checkboxes to reveal:
- Activate (re-opens selected links).
- Deactivate (closes their share URLs until you reactivate them).
- Clear (deselect).
Confirmation dialogs cover both bulk actions explicitly. In-flight payments already spawned from a link keep working through a deactivation.
Create a link
In the Basics card, fill in the Title (shown above the amount on the checkout), the Amount, and the Currency. Currency defaults to your account's default fiat currency. The same card holds the optional Description and Custom URL fields.
(Optional) Flip the Any amount switch to let the customer set the amount instead of a fixed price, then choose Customer enters amount or Preset amounts.
In Accepted payment methods, pick which chains and coins this link accepts. Defaults to every coin on every wallet you have.
(Optional) Set Max uses, Expires at, and redirect URLs in the Limits and redirects card.
A live Preview panel on the right summarises the link's configuration (title, public URL, amount, accepted methods, limits, redirects) as you type.
Amount modes
The Any amount switch on the create form picks the mode (off means Fixed amount, the default):
| Mode | What the customer sees |
|---|---|
| Fixed amount | A single locked amount. Every visit pays the same thing. |
| Customer enters amount | Free-form input. Use for donations or pay-what-you-want. Optional Min and Max bounds. |
| Preset options | A list of labelled tiers (e.g. "Coffee, $5", "Lunch, $25"). The customer picks one. |
The amount, currency, and amount mode are fixed at creation and can never be edited. Changing them would silently re-price share URLs already in the wild. To change them, deactivate the link and create a new one.
Custom slugs
The Custom URL field in the Basics card lets you pick the slug for the share URL.
- 3 to 30 characters.
- Lowercase letters, digits, and dashes only.
- No leading or trailing dash.
- Reserved words (top-level dashboard routes, framework paths, single letters) are rejected.
Leave the field empty and the system auto-generates a 10-character random slug on save. The Generate button next to the field gives you a suggested random slug without saving.
The slug locks once the first payment spawns from the link.
Limits and redirects
In the Limits and redirects card:
| Field | Purpose |
|---|---|
| Max uses | Stop accepting new visits after this many payments confirm. Empty = unlimited. |
| Expires at | The link stops accepting visits after this date. Empty = no expiry. |
| Success URL | Where the customer lands after a confirmed payment. Optional. |
| Cancel URL | Where the customer lands if they cancel. Optional. |
Statuses
Each link surfaces one of four statuses:
| Status | When |
|---|---|
Active | Link accepts new payments. |
Inactive | You toggled it off. |
Expired | Expires at has passed. |
Exhausted | The confirmed count has reached the Max uses cap. |
Detail page
Opens at /payment-links/{id}. Top-right action buttons:
| Button | When it appears |
|---|---|
| Edit | Always. |
| Activate or Deactivate | Always. |
| Delete | Only when no payment has spawned. Otherwise deactivate. |
The page is organised as:
- Header with the share URL, Copy and Open buttons, and the Accepting payments toggle.
- Three stat tiles: Uses, Collected, Last payment.
- Configuration card (price, slug, max uses, expires, created, redirect URLs, accepted methods).
- Activity card with confirmed counts for the last 24 h, 7 d, and 30 d.
- Spawned payments list. Each row links to the underlying payment.
Edit a link
Click Edit on the detail page. You can change:
- Title, description.
- Accepted chains and coins.
- Max uses, expires at, success URL, cancel URL.
The following are locked:
- Public URL (slug) once the first payment has spawned.
- Amount, Currency, and amount mode from the moment the link is created. To change them, deactivate this link and create a new one.
Public URL behaviour
When a customer visits the share URL of a fixed-amount link, the platform spawns a fresh payment and redirects to the hosted checkout. For customer-entered and preset links, the visit shows an amount step first and the payment spawns when the customer submits. If the link is Inactive, Expired, or Exhausted, the URL serves a closed-link page.
Webhooks
There are no link.* webhook events. Each payment spawned from a link fires the standard payment.* lifecycle events. The payload includes source_type: "link" and payment_link_id so your handler can branch.
See Webhooks for the full event list.
Errors you may see
| Code | When |
|---|---|
INVALID_SLUG | Slug fails the length or character rules. |
SLUG_RESERVED | Slug is on the platform's reserved-word list. |
SLUG_TAKEN | Another link already uses this slug. |
SLUG_LOCKED | You tried to change the slug after the first payment spawned. |
NO_VIABLE_OPTIONS | The chains and coins you allowed don't intersect any wallet you have. |
PAYMENT_LINK_INACTIVE / _EXPIRED / _EXHAUSTED | A customer tried to spawn a payment but the link is closed. |
PAYMENT_LINK_HAS_PAYMENTS | You tried to delete a link that already has spawned payments. Deactivate instead. |