cimplify
Cimplify Pay

Payment links

A payment link is a short URL on `pay.cimplify.io/:token` that takes payment for an _already-existing_ order. Use these for invoicing flows: you bill someone offline, generate a token, drop the link into a WhatsApp / email / SMS, and the customer clicks through to settle.

ConcernCheckout sessionPayment link
URL shape/s/:sessionId/:token
Order exists yet?No (created on submit).Yes; the link pays an existing order.
Customer picks order type / address?YesNo; those came from the order.
Auth flowOTP via CheckoutElement"Sign in to Link" or "Pay as guest" choice screen, then provider selection.
Use caseE-commerce / DTC checkout.Invoices, balance settlements, manual quotes.

What the customer sees

  1. Order summary: line items, business name, total.
  2. AuthChoice: "Sign in with Cimplify Link" or "Pay as guest".
  3. If Link: a Link OTP flow loads saved methods. If Guest: the customer enters phone + provider (or card).
  4. Provider does its thing (mobile-money push, 3DS, OTP). The page shows a processing screen with poll updates.
  5. Success: a confirmation card. Guest customers are invited to enroll in Link with one click so the next link skips the auth choice.
  • You sent a quote / invoice and want a one-click pay button in the email.
  • You took an order via WhatsApp / phone and need to collect payment async.
  • The order is already in your system (POS, CRM, custom app) and you just need a remote way to settle the balance.
  • Subscription dunning: re-collect a failed renewal via a one-off link.

For storefronts where the customer is currently in a cart, use checkout sessions; they let the customer choose order type, fill an address, etc.

Payment-link tokens are created server-side off an existing order. The URL is deterministic: once you have a token, the link is https://pay.cimplify.io/<token>.

cURL
# Create a payment link for an existing order. Returns { token, url, expires_at }.
curl https://api.cimplify.io/v1/orders/<order_id>/payment-link \
  -X POST \
  -H "Authorization: Bearer $CIMPLIFY_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

The hosted page reads the order via the public Pay API:

GET /v1/pay/orders/<token>          # the order summary
POST /v1/pay/orders/<token>/init    # initialize a payment (mobile money / card)
GET /v1/pay/orders/<token>/status   # poll until paid

States

The hosted page mirrors the order's payment status:

UI stateWhen
loadingFetching the order.
order_loaded / auth_choiceCustomer is choosing guest vs Link.
guest_flow / link_flowFilling in payment provider details.
processingProvider charge in progress.
awaiting_authorizationApprove-on-phone style challenge.
successSettled. Guest sees a Link enrollment offer.
already_paidToken belongs to an order that's already paid.
errorCouldn't load order or hit a network failure. Retry button.

Provider redirects

Some payment methods (cards via 3DS, certain mobile-money flows) require a hop through the provider's domain. The hosted page handles the round-trip: the customer is redirected out, completes the challenge, and lands back at pay.cimplify.io/<token>?reference=… where the page resumes polling and shows the success state.

Webhooks

Same as everywhere else: order.completed and payment.succeeded fire when the link successfully settles. Always treat webhooks as the source of truth.

Next

On this page