# Payment Links (no-code) (/en/integrate/integration-patterns/payment-links)

Use the URL your merchant created in the dashboard. Embed it on a site, drop it in an email, print a QR code, or listen for paid events with a webhook.

Payment Links are a no-code feature. They're created in the dashboard, not via the API. This page covers what to do with the link once it exists: how to drop it into your own surfaces, what the URL looks like, and how to confirm payments programmatically if you want to.

<Cards className="grid-cols-1">
  <Card icon="<Sparkles />" title="Start here: create the link in the dashboard" href="/features/payment-links">
    The full walkthrough (products, collection, confirmation, share) lives on the Payment Links
    feature page. Come back here once you have a link in hand.
  </Card>
</Cards>

## The link URL [#the-link-url]

Every Payment Link has a URL of the form:

```
https://checkout.xpay.app/p/{paymentLinkId}
```

The `paymentLinkId` is the link's ID from the dashboard, prefixed `plink_test_*` in test mode and `plink_live_*` in live mode. The hostname is the same in both modes; the prefix tells you which environment a link belongs to.

Open the link's detail page in the dashboard and click **Copy link** to grab the URL, or **Show QR code** to download a printable QR.

## Use the link [#use-the-link]

The URL is a regular HTTPS URL. Use it anywhere a URL works.

<Cards>
  <Card icon="<ExternalLink />" title="Anchor or button on your site">
    `<a href="https://checkout.xpay.app/p/plink_...">` opens the hosted checkout in the same tab. Add `target="_blank"` to open in a new tab.
  </Card>

  <Card icon="<QrCode />" title="QR code on print or screen">
    The dashboard generates a printable QR. Stick it on a poster, a flyer, a restaurant table, or display it on a register screen.
  </Card>

  <Card icon="<CodeXml />" title="Email, chat, social">
    Drop the URL into a transactional email, a Slack message, an Instagram bio, a WhatsApp text. The link works in any channel that renders URLs.
  </Card>

  <Card icon="<LinkIcon />" title="Webflow, Wix, Squarespace, Shopify">
    Most no-code site builders accept a custom URL on a button or image. Paste the link there. No script tag, no SDK, no embed.
  </Card>
</Cards>

## One link, many customers [#one-link-many-customers]

The same Payment Link is accepted by an unlimited number of customers. Each customer's interaction stands on its own: their own card, their own form, their own receipt.

This is useful for invoices you re-send, posters that hang for weeks, or evergreen "Buy now" buttons. It's a problem if the link gates a single sale or a limited slot. For one-of-a-kind sales, deactivate the link after the customer pays (list page, bulk action) so the URL stops accepting new payments.

## Confirm payments programmatically (optional) [#confirm-payments-programmatically-optional]

You don't need code to take payments through a Payment Link. The dashboard already shows you every transaction, every customer, and every payout that came through it.

Reach for code only when you need an automated reaction to each successful payment: granting access, sending a tracked-email receipt, posting to your warehouse system, updating an internal CRM. For that, set up a webhook endpoint and listen for `checkout.session.completed` events.

The event is the same one every other XPay integration emits. The session payload carries a `paymentLinkId` field telling you which Payment Link the customer paid through, so you can branch your handler based on the link.

The minimum your handler needs to do:

1. Verify the `XPay-Signature` header.
2. Parse the JSON body.
3. If `event.type === "checkout.session.completed"` and `event.data.object.paymentLinkId === "plink_..."`, do whatever fulfillment you want for that link.

For the full setup (creating an endpoint, getting the signing secret, the verification recipe in Node and Python), see the Webhooks group.

<Cards>
  <Card icon="<Webhook />" title="Set up a webhook endpoint" href="/integrate/webhooks/setting-up-an-endpoint">
    Add an endpoint in the dashboard and grab the `whsec_*` signing secret.
  </Card>

  <Card icon="<Webhook />" title="Verify signatures" href="/integrate/webhooks/verifying-signatures">
    HMAC-SHA256 signature verification with replay protection.
  </Card>
</Cards>

## Where to next [#where-to-next]

<Cards>
  <Card icon="<LinkIcon />" title="Create a payment link" href="/features/payment-links">
    The dashboard walkthrough: products, collection, confirmation, share.
  </Card>

  <Card icon="<FlaskConical />" title="Test mode and test cards" href="/get-started/test-mode">
    Open a `plink_test_*` URL with a test card to run an end-to-end payment without spending money.
  </Card>

  <Card icon="<GitBranch />" title="Need code-driven checkout?" href="/get-started/choose-your-integration">
    If you want full programmatic control over each session, look at Hosted Checkout, Drop-in, or
    Elements.
  </Card>
</Cards>