> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cryptocheckout.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Payment links

> Take payments with no code at all — generate a hosted link and send it.

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

## When to use one

<Columns cols={2}>
  <Card title="Good for" icon="check" color="#10B981">
    Invoices, one-off sales, deposits, quotes over email, selling in DMs, testing before you integrate.
  </Card>

  <Card title="Use the embed instead for" icon="arrow-right">
    A real storefront with a cart, where the customer should never leave your site.
  </Card>
</Columns>

## Create one

<Steps>
  <Step title="Open Payment links" icon="link">
    In the dashboard.
  </Step>

  <Step title="Set the amount" icon="money-bill">
    Price and currency. Optionally a title the customer will see.
  </Step>

  <Step title="Pick what you accept" icon="coins">
    Which tokens and which chains, from those you've enabled.
  </Step>

  <Step title="Set an expiry" icon="clock">
    Defaults to one hour. The price is locked for that window.
  </Step>

  <Step title="Generate and send" icon="paper-plane">
    You get a URL. Send it however you like.
  </Step>
</Steps>

## What the customer sees

The same checkout as the embedded widget — the same rails, the same on-chain verification, the same confirmation flow. Only the wrapper differs.

## Expiry and late payment

Expiry locks the **price**, not the address.

If a customer pays after expiry, the money still arrives and is still credited — it shows as paid late rather than clean. You decide whether to honour the original price or contact them. [Edge cases](/money/edge-cases).

<Warning>
  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.
</Warning>

## 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.

## Current limitations

<Warning>
  Two behaviours to know about in the current release:

  * **Single-use isn't enforced server-side.** A link that's been paid can still open a working checkout. Don't rely on the link itself to prevent a double payment — check your own order state.
  * **Amounts in the URL can be edited.** Treat the amount as advisory and reconcile against what actually arrived, which is authoritative in your dashboard and webhooks.

  Both are being fixed. Until then, for anything where a duplicate or altered payment would matter, use the embed or verify amounts server-side.
</Warning>

<Card title="Embed instead" icon="code" href="/integration/embed" horizontal>
  Two script tags, customer stays on your site.
</Card>
