Skip to content

What is a payment link? How to create one and get paid without building a checkout

What a payment link is, how to create a payment link in the dashboard or API, where to share it, how to cap it, and when to use the checkout API.

Published 6 min read

Hand-drawn illustration of a chat bubble holding a pay/plink link, an envelope and a QR code card, each with an arrow to a $99.00 checkout, and a person walking towards it
On this page
  1. How does a payment link work?
  2. How to create a payment link
  3. Where to share a payment link
  4. How to limit or stop a payment link
  5. How do you know who paid?
  6. Payment link vs checkout API: which should you use?
  7. What does a payment link cost?
  8. Payment links for international buyers
  9. Summary

A payment link is a URL that opens a ready-made checkout for a fixed amount. You create the link once, send it to buyers by email, chat or social media, and each buyer who opens it can pay by card or wallet — with no checkout to build and no code to write. That makes a payment link the quickest way for a small business, a freelancer or a new product to start accepting payments online.

This guide explains how a payment link works, how to create a payment link in the KukoPay dashboard or through the API, where to share it, how to limit and stop it, and when you should move from links to the checkout API.

On KukoPay a payment link is a stable address such as https://checkout.kukopay.com/pay/plink_7c2a41e9d8b30f56. Behind it:

  1. Every visit creates a new order and sends the buyer to the checkout. One link can therefore collect any number of payments, and each payment is an ordinary order with its own trade_no, settled, refunded and notified exactly like an order created by the API.
  2. A returning buyer gets their own order back. If the same browser reopens the link while its earlier order is still unpaid and has more than 10 minutes left, the buyer returns to that order instead of starting another — so a buyer who left for a wallet or 3D Secure and came back cannot end up paying twice.
  3. Two counters keep it honest: used_count counts orders the link has created (visits), paid_count counts successful payments.

Visits where nobody tried to pay are still orders and expire with their checkout link. The dashboard's order list hides them by default; tick Include payment link visits nobody paid to see them.

In the dashboard

Open Payment links, choose the currency, enter the amount and, optionally, the item name buyers see and a payment limit, then click Create link. Copy the link from the list. The page also lets you pick the checkout language before copying, and disable or re-enable a link later.

Through the API

curl -X POST "https://api.kukopay.com/v1/payment_links" \
  -H "X-Api-Key: $KUKOPAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 9900,
    "currency": "USD",
    "subject": "Pro plan, 1 year",
    "max_uses": 100,
    "expires_at": "2026-12-31T23:59:59Z",
    "metadata": { "campaign": "winter-2026" }
  }'
FieldWhat it does
amountThe price per payment, as an integer in the minor unit: 9900 is $99.00
currencyUSD, HKD or CNY; a live link can use only the currencies enabled for your account
subjectThe title buyers see at checkout
max_usesThe most successful payments the link will take; omit for no limit
expires_atWhen the link stops working; omit to keep it open
notify_urlWhere this link's orders are notified; a live link without one needs a webhook endpoint subscribed to payment.succeeded
return_urlWhere the buyer goes after paying; must be public HTTPS on a live link
metadataYour own keys, carried onto every order the link creates

The response contains the url to share. Every field is described in the payment links API.

A payment link works anywhere a URL does:

  • email and invoices — a "Pay now" link next to the amount due;
  • chat — WhatsApp, WeChat, Telegram or a support conversation;
  • social media — a bio link, a post or a direct message;
  • a website without a shop — behind a "Buy" button on a landing page;
  • print — turn the URL into a QR code for a flyer or a counter.

Selling to more than one language? Add ?locale= with en, zh, ja, ko or de and send each audience its own version: …/pay/plink_7c2a41e9d8b30f56?locale=ja. The checkout is otherwise English and never follows the browser, and every version shares the same link, orders and counters.

  • max_uses counts payments, not visits. A link set to 1 is not used up by someone who opens it and leaves. If several buyers race for the last payment, the first one credited counts and the others are refunded in full automatically, with payment.duplicate_refunded — your balance is never touched. A refund does not give a use back.
  • expires_at closes the link at a set time — useful for pre-orders, events and limited offers.
  • Disable it with "status": "inactive" (or Disable in the dashboard) and buyers see a short notice instead of a checkout. The same notice covers a link that is unknown, expired or fully paid.

You can update a link's status, subject, max_uses, expires_at and metadata at any time.

Amount and currency are fixed once a link exists. A link that has already been shared must not be able to charge something different from the price the buyer was shown. To change the price, disable the old link and create a new one.

How do you know who paid?

A payment link needs no integration, but your system still has to learn about each payment:

  • Webhooks. Each payment sends payment.succeeded to the link's notify_url or your webhook endpoints. Verify the signature and fulfil once — duplicate payment webhooks shows how.
  • Order numbers. Orders from a link have an out_trade_no like plink_7c2a41e9d8b30f56_3 (link id plus visit number), and their metadata carries kukopay_payment_link, so you can trace any payment back to the link and campaign.
  • Receipts. Every paid order has a printable receipt you can send the buyer — see receipts.

The buyer landing on your return_url is not proof of payment; return_url vs notify_url explains why.

Payment linkCheckout API (POST /v1/orders)
Code neededNoneA server-side call per order
PriceFixed per linkSet per order
One link, many buyersYesNo, one order per call
Your own order numberGenerated from the linkYour out_trade_no
Best forInvoices, deposits, a small catalogue, social selling, testing demandA shop or SaaS with its own carts, plans and orders

Many merchants start with links and add the API later; both use the same checkout, fees and balance. The API side is covered in how to accept international payments on your website.

Creating and sharing links is free; you pay only on successful payments, at the same rates as any other order. At standard pricing that is 3.5% plus a fixed fee by currency ($0.30 on USD, HK$2.35 on HKD, ¥2.00 on CNY), so a $99.00 card payment costs round(9900 × 3.5% + 30) = 377, or $3.77. Visits nobody paid cost nothing. Worked examples are in how cross-border payment fees are calculated.

A payment link opens the same checkout as everything else, so buyers abroad get cards, Apple Pay, Google Pay, PayPal, and Alipay and WeChat Pay for buyers in mainland China — whichever methods are enabled on your account. For a Chinese audience, send the ?locale=zh version; how to accept Alipay and WeChat Pay online covers the wallets in detail. No company yet? An individual can accept payments too, with the rules in accepting international payments as an individual.

Summary

  • A payment link is a fixed-price URL that opens a checkout; every visit becomes its own order;
  • create a payment link in the dashboard or with POST /v1/payment_links, then share it anywhere a URL works;
  • max_uses counts successful payments, expires_at and disabling close the link, and the price never changes;
  • learn about payments from webhooks, not from the redirect;
  • move to the checkout API when each order needs its own price or order number.

Try it in the sandbox

Create a merchant account and request a test key. The sandbox needs no business verification.