A payment link is a URL to a Zahlo checkout page for a fixed product. Share it in an email, a social post or a “Buy” button on any website builder. Each visit starts its own checkout, so one link can be paid many times. You need: a Sandbox account at https://merchant-demo.zahlo.eu.
1

Create the product

In the dashboard, open Products and add a product with a one-time price in EUR, for example “T-shirt”, €25.00.
2

Create the link

Open Links, create a payment link, pick the price and the quantity, and save. Copy the link’s URL (…/pay/<id>).To send customers back to your site after paying, set a redirect URL. Its host must be a registered checkout domain: add it under Developers → Checkout domains first (HTTPS only in live). Without a redirect URL, customers see Zahlo’s confirmation page and no domain is needed.All prices on a link use one currency. A link can also apply a coupon or accept promotion codes.
3

Test a payment

Open the link in a private window and pay with the Sandbox test card 4111 1111 1111 1111, expiry 03/30, CVC 737. Check that the payment appears under Payments with the link’s product.
4

Fulfil the order

Each paid order appears under Payments, with the customer’s email. Fulfil from there; reaching the redirect URL is not proof of payment, because anyone can open it.To fulfil automatically, add a webhook endpoint for checkout.session.completed and handle it as in Hosted checkout with Next.js: verify the signature, re-fetch the session, and record the event and the order change in one transaction.
5

Refunds and disputes

Refund a payment from its page under Payments; it is final when the refund shows as succeeded. If a customer disputes a payment, respond in the dashboard before the deadline. See Refunds and Disputes.
6

Stop a link

Deactivate a link under Links when the offer ends. New checkouts stop at once, and a payment that still completes on an already open checkout is refunded automatically.
7

Go live

Only steps 3, 4 (if you use a webhook), 5 (if you set a redirect URL) and 7 apply to links, plus recreating the product:Your live account starts empty, and Sandbox IDs, keys and secrets don’t work there. Recreate what this integration uses, in this order (details: Go live; your live dashboard’s Go live page at https://merchant.zahlo.eu/merchant/go-live tracks each step):
  1. Create a live API key and set ZAHLO_API_KEY to it (zk_live_…). Code that reads ZAHLO_API_BASE sets it to https://merchant.zahlo.eu.
  2. Run setup-catalog against live. It creates the same lookupKeys and coupon codes, so your code needs no change.
  3. Recreate your payment links; live links have new URLs.
  4. Add your live webhook endpoint, set ZAHLO_WEBHOOK_SECRET to its new signing secret, and confirm one live delivery arrives.
  5. Register your site’s checkout domain in live (HTTPS only), plus the Apple Pay domain if you embed checkout with wallets.
  6. Customers, subscriptions and saved payment methods don’t carry over; real checkouts create them.
  7. Make one small live payment, check that payment.confirmed and your fulfilment ran, then refund it.