Skip to main content
A payment link is a hosted checkout page you can send to a customer. Same settlement, same verification, no integration.

When to use one

Good for

Invoices, one-off sales, deposits, quotes over email, selling in DMs, testing before you integrate.

Use the embed instead for

A real storefront with a cart, where the customer should never leave your site.

Create one

Open Payment links

In the dashboard.

Set the amount

Price and currency. Optionally a title — an internal label only. It appears in your Payment links list so you can find the link again, and is searchable there. The customer never sees it on the checkout page.

Token and network are picked for you

The form doesn’t ask. Each link is assigned one token and one network from what you’ve already activated under Tokens, preferring your default stablecoin. If you haven’t activated a token and a network there, generation is blocked until you do.

Set an expiry

Defaults to one hour. The price is locked for that window.

Generate and send

You get a URL. Send it however you like.

What the customer sees

The same checkout as the embedded widget — the same two ways to pay, the same on-chain verification, the same confirmation flow. Only the wrapper differs.

Sending customers back to your site

Add return_url to a link and, once the customer has paid, the checkout offers Return to your-shop.example instead of leaving them on our page:
We add two parameters when we send them back: cc_order (your order reference) and cc_intent (ours). Read order state from your server on that page — the webhook is still what fulfils. The URL must be https, and its origin must be on your Allowed origins list in Settings → Integration. Anything else is ignored and the customer is told they can close the page — a link someone else crafted cannot use your checkout to send your customers somewhere else. If you only use payment links, add your shop’s domain to that list; it has no other effect.

Expiry and late payment

Expiry locks the price, not the address. On the EVM networks, a customer who pays after expiry still has the money arrive and credited — it shows as paid late rather than clean — as long as it lands inside the window that address is watched for, seven days by default. You decide whether to honour the original price or contact them. On TRON a late payment is not reconciled automatically today: once the quote lapses that address stops being watched, so recovering the funds needs us to step in. Edge cases.
Set expiry deliberately. A long window on a volatile pair means you’re holding a price you may not want. An hour is a reasonable default for stablecoin pricing.

Tracking

Links appear in Payment links with status, and any payment appears in Payments like any other. Webhooks fire exactly as they do for embedded checkouts, so a link payment can drive the same fulfilment code. A link generated from Payment links is enforced on the server, not just in the page:
  • Single use. The link’s effective status is derived in the database each time it’s opened — voided, then paid (including a link matched to a payment that has already settled), then expired, then whatever is stored. A link that’s been paid, voided or expired doesn’t open a working checkout: the hosted page blocks it, and the quote endpoint independently refuses with link_not_open even if the page is bypassed. The customer sees a plain reason — expired, already paid, or no longer active — and is told to ask you for a new link.
  • The price. Amount, currency, token and network come from the stored link, not from the URL. Editing &amount= in the link does nothing — the quote endpoint re-checks the same four values against the stored link and refuses a mismatch with link_params_mismatch.
Two residuals worth knowing:
  • If the link resolver is unreachable, both layers fail open rather than blocking, and the checkout proceeds on the values in the URL. Your dashboard and webhooks remain authoritative for what actually arrived.
  • Quick links generated from the Pool tab are not payment links. They’re an ad-hoc checkout URL with no link record behind them, so they’re neither tracked in Payment links nor single-use nor price-enforced. Generate from Payment links for anything where a duplicate or altered payment would matter.

Embed instead

Two script tags, customer stays on your site.