Skip to main content

QA checklist

Credentials​

  • Keys live in a secret manager; none in source control, client code or logs.
  • The base URL and the key come from configuration, together.
  • One secret key per service, so revoking one stops one service.
  • The key's checksum is validated at start-up.
  • You can rotate a key without downtime — create, deploy, revoke.

Payouts​

  • Every payout carries an Idempotency-Key derived from your own record, reused on retry.
  • Retries after a timeout or 5xx reuse the key, and the replay's status is read.
  • Nothing treats 202 as "paid"; settled is the only success.
  • failed, cancelled and returned are handled as final.
  • Payout status is polled with backoff until final.
  • payee_name_mismatch shows the payer the bank's answer before accept-verification is called, and the payout is resent under the same Idempotency-Key.
  • corridor_unsupported is final — it is not retried.
  • A payout left created after a 5xx or timeout is polled, not resent.
  • invalid payee outcomes lead to corrected details, not a retry.
  • reference fits in 18 characters.
  • plan_limit_exceeded is shown to the user with its message.
  • Cross-currency payouts use a locked quote (fx_quote_id), and expiry is handled.

Verification​

  • Payouts and conversions are not offered until the account is active.
  • The KYB referral status is polled; nothing waits on kyb.updated for it.

Errors​

  • Branching uses the status and error, never message.
  • Plain-text 400/415/422 responses are handled without a JSON parse failure.
  • X-Request-Id is logged with every call.
  • Production's 400 bad_request, and a payout or conversion that turns failed after it was accepted, are handled where the sandbox returns insufficient_balance or, on conversions, quote_expired / quote_consumed.
  • 503 platform_paused and 403 account_on_hold are shown, not retried in a tight loop.

Webhooks​

  • Signatures are verified over the raw body, with a 300-second tolerance.
  • The receiver answers 2xx within 10 seconds and works asynchronously.
  • Duplicates are ignored by event id.
  • The endpoint's status is monitored; a disabled endpoint is noticed.
  • Secret rotation is tested.

Production readiness​

  • Your production account is verified (active).
  • You know your production accounts' pay-in details for funding.
  • Support contacts and an escalation path are agreed.