Skip to main content
Working in the sandbox is not the same as being ready to launch. This page lists what to clear first.

Complete account verification

Taking real payments and receiving payouts requires account verification. Submit your details under Settings, where Clink reviews your payment entity and settlement eligibility. Status is one of not started, under review, rejected, or approved. For merchants going through onboarding, the rest of Settings unlocks once business verification (KYB) or personal verification (KYC) is approved. Creating a product or completing a first payment is not required.
Some production accounts see only the first step, Complete account verification, with nothing after it. For those accounts that step unlocks payouts.
Verification and integration work run in parallel. While production review is pending you can keep building in the sandbox — the sandbox has its own verification step, which is approved automatically and does not depend on production approval.

Verify in four layers

Work through these in order. Do not move up a layer until the one below passes.
1

Local logic

No real payments. Verify amount calculation, product snapshots, idempotency keys, state transitions, and fulfillment deduplication. Unit tests cover this layer.
2

Simulated webhooks

Send signed requests to your own webhook endpoint and verify: the raw body is read correctly, the HMAC matches, repeated events do not fulfill twice, out-of-order events do not overwrite newer state, and bad signatures are rejected.
3

Real sandbox Session

Have your backend create a real sandbox Checkout Session and confirm the frontend redirects or mounts correctly.
4

Real sandbox payment

Pay with a test card end to end. Confirm your local order becomes paid and that shipping, top-up, or entitlement actually ran.
Layer four passes when the business outcome is complete, not when the webhook returned 200. Check the fulfillment status in your own database rather than reading logs.

Scenario checklist

Also verify these if you have subscriptions

Also verify these if you offer discounts

The only sandbox test data published today is the success card 4242 4242 4242 4242. There is no public test data for failed, 3DS, or pending.Those three rows therefore cannot currently be reproduced in the sandbox, so cover them with code review and unit tests instead. Read the pending path carefully: confirm your code does not treat it as a failure and start a second charge, which is the most common cause of double billing.

What to change for production

Everything above is environment-specific configuration. The account itself does not change — sandbox and production share one login, and you switch with Enter production in the top right of the sandbox dashboard. There is no second registration.
Production keys must be initialized in the production dashboard, and the webhook endpoint registered again in production with a different signing key. Miss this and every production event fails signature verification — quietly. Your service keeps returning 401, customers pay, and nothing ever ships.
After launch, run one small real transaction end to end and confirm payment, webhook, fulfillment, and reconciliation all work before opening the traffic.

Debugging

The customer says they paid, but the order did not change

Work down this list:
  1. Look for the transaction on the Transactions page — in the dashboard for the matching environment, since sandbox and production are separate
  2. If it is not there, call GET /checkout/session/{id} with the sessionId and read status and orderId
  3. If there is an orderId, call GET /order/{id} and check whether Order status is success
  4. If the Order is success but your order did not update, the problem is in the webhook path — keep reading

Webhooks never arrive

Signature verification always fails

The three usual causes:
  • The parsed body was used instead of the raw one (express.json() in Express)
  • The signing key does not belong to the current endpoint — it was rotated, or copied from the sandbox
  • The . between timestamp and body is missing, or a self-generated timestamp was used instead of the header value

A customer was charged twice

Check these:
  • Whether your create-order endpoint guards against double submission, and whether one cart can produce two orders
  • Whether pending was treated as failure and triggered an automatic retry
  • Whether webhooks are deduplicated by event.id
merchantReferenceId is not an idempotency key. Creating two Sessions with the same value gives you two Sessions, and both can be paid.

Account verification was rejected

Settings shows the specific reason. Correct the details and resubmit. Integration work is unaffected — keep building in the sandbox.

After launch

Balance & payouts

When money becomes withdrawable and how fees are calculated.

Refunds

The refund flow and status synchronization.