> ## Documentation Index
> Fetch the complete documentation index at: https://docs.niobi.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Go-Live Checklist

> Essential prerequisites and configuration steps before transitioning your integration from sandbox to live production.

Once your sandbox testing is complete across all collection and payout endpoints, follow this checklist to move your integration into live production.

***

## Pre-Launch Steps

<Steps>
  <Step title="1. Complete Sandbox Integration Testing">
    Verify that all API calls have been successfully tested in the sandbox environment:

    * Test both successful transactions and edge-case error scenarios.
    * Verify inbound webhook signature verification for callbacks (`payment_step: 2`).
    * Test the [Transaction Status API](/api-reference/get-transaction-status) fallback query.
  </Step>

  <Step title="2. Whitelist Production IP Addresses">
    Ensure your live server IP addresses are whitelisted on the payment portal before sending live API calls:

    * Navigate to **Settings > IP Whitelist** in the [Payment Portal](https://payments.niobi.co).
    * Refer to the [IP Whitelisting Guide](/ip-whitelisting) for detailed instructions.
  </Step>

  <Step title="3. Switch to Production Base URL">
    Update your integration environment configuration to use Niobi's live production endpoints:

    | Environment    | Base URL                         |
    | :------------- | :------------------------------- |
    | **Sandbox**    | `https://sandbox.users.niobi.co` |
    | **Production** | `https://users.niobi.co`         |
  </Step>

  <Step title="4. Generate & Configure Production Credentials">
    Generate dedicated live credentials from the portal:

    * Obtain your live `client_id` and integration Secret Key (`senderKey`).
    * Ensure secrets are stored securely in environment variables (never committed to version control).
    * Refer to [Getting Credentials](/getting-credentials) for a step-by-step walkthrough.
  </Step>
</Steps>

***

## Production Readiness Checklist

<AccordionGroup>
  <Accordion title="Remove Test Data & Mock Handlers">
    Ensure no sandbox test data, dummy mobile numbers, or mock webhooks are active in your production environment.
  </Accordion>

  <Accordion title="Fund Your Merchant Wallet (For Payouts)">
    Before executing live disbursements, ensure your merchant currency wallet has a sufficient balance to cover payout amounts and associated transaction fees.
  </Accordion>

  <Accordion title="Idempotent Callback Processing">
    Ensure your callback listener handles retries idempotently by checking `params.reference` or `params.third_party_reference_1` before executing state updates.
  </Accordion>

  <Accordion title="Live Transaction Fees">
    All transactions processed in the live production environment are subject to agreed commercial fees.
  </Accordion>
</AccordionGroup>

***

## Technical Checklist

Beyond the setup steps above, confirm these implementation details before your first live transaction. Each one has caused real production issues for integrations that skipped it.

| Check                                                       | Why It Matters                                                                                                                                                               | Reference                                                                                                            |
| :---------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------- |
| Idempotency keys configured on every request                | Network retries without a stable `third_party_reference_1` / `payment_reference` can trigger duplicate payouts or duplicate collection prompts.                              | [Idempotency](/idempotency)                                                                                          |
| Payout reconciliation flow implemented                      | A callback can arrive late or not at all. Without a status-check fallback and a triple-point match (status, amount, reference), you risk crediting or refunding incorrectly. | [Payout Best Practices](/making-payments/best-practices#2-the-double-verification-reconciliation-recipe-for-payouts) |
| Transaction amounts fall within corridor limits             | Each country and payment method has its own min/max. Requests outside that range are rejected, test with production-realistic amounts, not just sandbox defaults.            | [Transaction Limits](/transaction-limits)                                                                            |
| Rate limit handling in place                                | Sustained high-volume traffic without backoff can trigger `429` responses.                                                                                                   | [429 Too Many Requests](/errors/429/too-many-requests)                                                               |
| `amount` sent as a whole integer                            | Decimal amounts (e.g. `1000.50`) fail validation, even though your wallet balance itself can show decimals from fee deductions.                                              | [Payout Best Practices](/making-payments/best-practices)                                                             |
| `callback_url` is a public, reachable HTTPS endpoint        | A `localhost`, internal, or expired tunnel URL (e.g. ngrok) cannot receive production callbacks, transactions will complete but you'll never be notified.                    | [Collection Callbacks](/collecting-payments/callbacks) · [Payout Callbacks](/making-payments/callbacks)              |
| Balance checks use `available_balance`, not `total_balance` | `total_balance` includes funds that are locked or in-flight. Checking it instead of `available_balance` can make a payout appear affordable when it isn't.                   | [Get Account Balance](/api-reference/get-account-balance)                                                            |
