Go-live checklist and underwriting

Two things stand between a working sandbox and live traffic: a file of documents an underwriter has to read, and about a dozen checks nobody enjoys doing. Both are shorter than they look.

  • Reviewed
  • 10 min read
  • API version 2026-04-01

What underwriting needs

BazPay underwrites low-risk merchants only, which is what keeps approval rates stable for everyone on the platform. Review usually takes two to five working days once the file is complete — and "complete" is the operative word, because a missing document restarts the clock rather than pausing it.

The file, and what each item is actually for
Document Why it is asked for
Certificate of incorporation Confirms the legal entity that will hold the merchant account and receive settlement.
Ownership structure Every beneficial owner above 25 per cent, with ID. A KYC requirement, not a preference.
Bank account proof An IBAN in the company's name. Settlement cannot go to a personal or third-party account.
Live website URL Reviewed against scheme rules: prices, delivery terms, refund policy, contact details and the legal entity must all be visible before purchase.
Processing history Six months of statements if you have them. History raises limits; its absence lowers the starting one.
Expected volume and average order value Sets the initial ceilings and the reserve, if any. Estimate honestly — a large surprise triggers review.
The website check fails most often

Not the finances — the site. Scheme rules require the trading name, a refund policy, delivery timescales, the currency of the price and a working contact route to be visible before the payer commits. A checkout that reveals the refund policy only after payment is a rejection, and it is a rejection you can fix in an afternoon.

The technical checklist

Twelve checks. Every one has cost somebody a live incident, which is why it is on the list rather than in a paragraph of general advice.

Credentials and configuration

  1. Live keys come from configuration, never from source. Grep the repository for sk_ before you ship.
  2. The API version is pinned explicitly in your client, not left to the account default.
  3. The live webhook endpoint has its own whsec_, and it is not the sandbox one.
  4. A key-rotation runbook exists and someone other than its author has read it.

Payment flow

  1. Fulfilment triggers on payment.succeeded only — never on the browser return.
  2. Every write sends an Idempotency-Key, and a timeout resends the same key rather than a new one.
  3. Declines render a specific message per code, not one generic apology.
  4. Manual-capture authorisations are captured or cancelled before the 7-day expiry.

Events and observability

  1. The webhook handler verifies the signature on raw bytes and checks the timestamp.
  2. Event ids are stored with a unique constraint, so a duplicate delivery is a no-op.
  3. The handler answers within 10 seconds and queues everything slow.
  4. BazPay-Request-Id is logged on every response, success or failure.
Prove the event checks

Signature verification, duplicate handling and the ten-second answer cannot be ticked by reading the code. Fire a duplicate event and a deliberate 500 from the sandbox — the testing guide shows the calls — and watch what your service actually does. That is a ten-minute exercise, and it catches the bugs which otherwise surface as a double shipment.

Switching keys

The cut-over itself is four configuration values. Nothing about the request bodies, the URLs or the field names differs between modes — if your code needs a branch on environment beyond reading different secrets, something has been special-cased that should not have been.

what changes between test and live
# the whole cut-over, in configurationBAZPAY_SECRET_KEY   = sk_live_…      # was sk_test_…BAZPAY_PUBLIC_KEY   = pk_live_…      # was pk_test_…BAZPAY_WEBHOOK_SEC  = whsec_…        # DIFFERENT per endpointBAZPAY_API_VERSION  = 2026-04-01     # pin it explicitly# no request body, no URL and no field name changes

The webhook secret is per endpoint, not per account. Copying the sandbox secret into production is the single most common cut-over mistake and it presents as every signature failing.

Then take one real payment before you send any traffic at it.

the smoke test
# first live transaction — smallest amount you can chargePOST /v1/payments   amount: 100  currency: EUR  method: card→ 201  { "id": "pay_7Yb4Rk", "status": "requires_action" }# check all four, in this order1. payment.succeeded reached YOUR endpoint, signature verified2. the order moved to paid in YOUR database3. the payer's statement shows your trading name4. the refund settles and refund.settled arrives

Refund it afterwards. The pair costs a few cents in fees and exercises the entire chain — underwriting, routing, a live issuer, settlement, your webhook, your database and your reconciliation — in a way no sandbox run can.

Watching day one

For the first day, watch four numbers rather than the whole dashboard. Each has a level at which you should stop and look rather than wait and hope.

Day-one metrics and their intervention points
Metric Healthy Look into it at
Authorisation rate Above 85 per cent on EU cards Below 75 per cent, or 10 points under your sandbox mix
Webhook success Over 99 per cent first attempt Any sustained retry, and every disabled endpoint
Challenge rate 10 to 25 per cent of card payments Above 40 per cent — check the exemption request logic
Abandonment at redirect Under 15 per cent Above 25 per cent — usually a confusing hand-off screen

All four are on real-time analytics, broken down by method, issuer country and decline reason. The breakdown matters more than the headline: an authorisation rate that drops five points because one issuer is having a bad hour needs no action, and the same drop spread evenly across issuers usually means your own rules.

Ramp, do not flip

If your platform allows it, route a slice of traffic first — ten per cent for a few hours is enough to expose a broken webhook handler or a mis-set capture mode while the blast radius is small. A staged ramp turns a launch incident into a support ticket.

If something is wrong

Rolling back a payments integration is not the same as rolling back a deployment: money has already moved and the schemes have already been told. What you can do is stop new exposure quickly, in this order.

  • Stop new payments Disable the method in your checkout rather than revoking the key. Revoking breaks refunds and webhook reads too, which makes recovery harder.
  • Leave webhooks running Events for payments already in flight still need to land. Turning the endpoint off strands them until the retry window closes.
  • Cancel, do not refund Uncaptured authorisations should be cancelled — it releases the hold at no cost and never shows on the payer's statement.
  • Replay after the fix Failed deliveries stay in history for 30 days. Replay the range once your handler is correct and the ledger catches up on its own.

Tell us early. With a request id or a payment id we can see exactly what the rail returned, and on a live incident we can freeze payout creation on the account within minutes while you work. Reach the team through contact.

Reconciliation from here

Once traffic is steady the work changes shape: less integration, more matching money to orders. Three habits keep that cheap.

  • Put your order id in reference on every payment. It travels to the settlement line, so reconciliation is a join rather than a search.
  • Reconcile against the settlement report, not against the payment list. Settlement is what arrived in your bank account, net of fees, refunds and any reserve.
  • Pull reports on settlement.created instead of on a nightly cron. The event fires when the file is ready, so you never process a partial one.

Fee structure and interchange++ breakdowns: pricing · report fields and export formats: real-time analytics · commercial and compliance questions: the gateway FAQ.

That is the library

Six guides, from the first sandbox key to a reconciled ledger. If a page was wrong, unclear or missing the case you hit, tell us — documentation defects are tracked like any other, and the changelog on the documentation home records what changed.

Keep reading

Stuck on this page?

Integration questions reach an engineer, not a queue. Send the request id and the response body — that is usually enough to answer in one reply.