Hosted checkout

Hosted checkout

What buyers see on /pay/{invoiceId} and how payment links differ from API invoices.

API invoice checkout

After POST /api/v1/invoices, redirect to checkout_url:

https://ulasend.com/pay/{invoice_id}

The page shows the source coin, exact amount, network, QR and deposit address from payment_instructions, plus any required memo and live status updates. Choose an accepted source before creating the invoice. Live checkout does not switch coins or networks.

Buy with card is available for new checkouts whose source is USDC on Base, when configured. Other payment sources do not offer card purchase. Details: Buy with card.

The payment provider converts the source payment to USDC on Base. The invoice's financial fields use USDC, and its received amount reflects the actual verified settlement. A detected source transfer remains processing until delivery is verified; use the final invoice status or signed webhook to fulfill the order.

Delivery after invoice expiry enters review, even if the payer sent the source coin before expiry. Payments already sent continue to be monitored. Test invoices offer a simulation flow without real payment controls.

Return to your order after payment

Your server can set success_url in POST /api/v1/invoices for each order, whether the invoice uses usd_amount, a coin amount, or product_id:

{
  "usd_amount": "49.99",
  "asset": "USDC_BASE",
  "external_reference": "order-12345",
  "success_url": "https://merchant.example/orders/order-12345/confirmation"
}

Replace the example domain with your own. success_url is optional and must be a complete HTTPS URL, at most 2,048 characters, with no embedded username or password. Ulasend trims surrounding whitespace and normalizes the URL with new URL(value).toString(). It does not append invoice or order IDs; include your order reference in the URL and use external_reference to match the webhook to the same order.

The destination is saved when the invoice is created and cannot be changed on an issued invoice. The authenticated invoice API returns success_url, or nullif it was omitted. A payment link's Redirect After Payment setting applies to invoices created through that link; for a separate API-created invoice, pass success_url explicitly.

Checkout redirects after three seconds once Ulasend confirms paid or overpaid, provided that browser tab has previously seen the invoice awaiting payment. Checkout remembers that state in the tab's session storage, including across a refresh. A manual Continue link is also available. Opening an already-paid receipt without that checkout history offers the manual link without an automatic redirect. Live and test invoices use the same behavior. Incomplete or unsuccessful payments, and invoices without a success_url, do not redirect.

Use the verified payment webhook to mark your order paid and fulfill it. A browser return is not proof of payment. The buyer may return before the webhook arrives, so your confirmation page should show a pending state until your backend has confirmed payment.

Payment links

Dashboard / API payment links (/l/pl_…) are reusable. For an order-specific cart total and reference, your server issues a signed checkout URL from the link's checkout-sessions endpoint. See Dynamic payment links.