# Go live

**Switch to Production, verify your first live payment, and start accepting real money.**

This is the final page of [Test and go live](/docs/guides/merchant/test-and-go-live/introduction.md): you switch your keys, endpoints, and webhooks from Sandbox to Production, verify one real payment, and finish with a checklist that proves you're ready for live customers.

## How it works

Going live means pointing every part of your setup - keys, endpoints, and webhooks - to Production instead of Sandbox. If your [Merchant account](/docs/guides/merchant/get-started#apply-for-a-merchant-account) is approved and your implementation passes [testing](/docs/guides/merchant/test-and-go-live/introduction.md), the switch itself is quick:

#### 1. Create your Production key [!step]

- [:Key: Create your Production API key](#1-create-your-production-api-key 'Create your key in your Production account in the API Console')

#### 2. Flip your integration to Production [!step]

- [:ArrowExchange: Point your integration at the Production endpoints](#2-point-your-integration-at-production 'Move your base URL, API key, SDK modes, and webhooks')

#### 3. Make your first live payment [!step]

- [:Card: Verify your first live payment](#3-verify-your-first-live-payment 'Pay with your own card, watch the webhook, refund')

### Before you begin

Confirm all three before you start the switch:

- [ ] An approved **Merchant account** - the [Know Your Merchant (KYM) review](/docs/guides/merchant/get-started#apply-for-a-merchant-account) only gates your move to Production, so you can [apply in parallel](/docs/guides/merchant/get-started#your-journey) while you test.
- [ ] If you're building with API keys, your implementation passes the [Sandbox test scenarios](/docs/guides/merchant/test-and-go-live/testing/sandbox-test-scenarios.md). Using a plugin? Follow the test section of your plugin's [configuration guide](/docs/guides/merchant/accept-payments/no-code/plugins/introduction) instead.
- [ ] A fully verified Revolut Business account.

## Switch to Production

The switch runs in three steps - keys first, then endpoints, then a real payment to confirm everything works:

:::note [Dashboard only?]
Payment links and invoices need no keys and there's nothing to reconfigure - skip steps 1 and 2.
:::

### 1. Create your Production API key

Production keys come from your **Production** account in the [API Console](https://developer.revolut.com/console) - see [Create an API key](/docs/guides/api-console/create-key). A key created without signing keys is shown only once - save it immediately and store it securely.

### 2. Point your integration at Production

Everything you pointed at Sandbox in [Set up test environment](/docs/guides/merchant/test-and-go-live/set-up-test-environment.md#point-integration-at-sandbox) flips back the same way - the plugin's mode, your base URL and API key pair, and your SDK initialisations:

- ![Plugins]

  Switch your plugin from test mode to live mode and connect it with your Production credentials - see your plugin's [configuration guide](/docs/guides/merchant/accept-payments/no-code/plugins/introduction).

- ![API]

  Most integrations run on two layers: your backend calls the Merchant API to create orders and manage payments, and your checkout initialises a Revolut SDK to render the payment method for your customer. Flip both through the same environment switch you built for Sandbox:

  #### Server-side calls

  Your base URL and secret API key move as a pair - flip your environment switch and load the Production values:

  ```diff [.env.production]
  - REVOLUT_MERCHANT_API_BASE_URL=https://sandbox-merchant.revolut.com/
  - REVOLUT_MERCHANT_API_KEY=r_test_...
  + REVOLUT_MERCHANT_API_BASE_URL=https://merchant.revolut.com/
  + REVOLUT_MERCHANT_API_KEY=r_prod_...
  ```

  The `r_prod_...` prefix confirms you're loading the live pair. Your webhooks move with it: register your Production webhook URL and allowlist the [Production webhook IPs](/docs/guides/merchant/test-and-go-live/environments#webhooks) - your Sandbox registration doesn't carry over.

  #### Checkout SDKs

  Every Revolut SDK flips the same way - swap your Sandbox public key for the Production one and drop the Sandbox mode setting (production is the default in every SDK):

  - ```diff [checkout.ts]
    // Token-based initialisation - mode is a positional argument (default: 'prod')
    - await RevolutCheckout('order_token_here', 'sandbox')
    + await RevolutCheckout('order_token_here')

    // Payments module - mode is part of the options object
    - await RevolutCheckout.payments({ publicToken: 'pk_...', mode: 'sandbox' })
    + await RevolutCheckout.payments({ publicToken: 'pk_...' })
    ```

  - ```diff [MainActivity.kt]
    val configuration = RevolutPaymentsSDK.Configuration(
        merchantPublicKey = "pk_...",
    -     environment = Environment.SANDBOX
    +     environment = Environment.PRODUCTION
    )
    ```

  - ```diff [AppDelegate.swift]
    RevolutPaymentsSDK.configure(
        with: .init(
            merchantPublicKey: "pk_...",
    -         environment: .sandbox
    +         environment: .production
        )
    )
    ```

  [Token-based initialisation](/docs/sdks/merchant-web-sdk/initialisation/token-based) takes its token from the server-side order, so it needs no extra change.

### 3. Verify your first live payment

Make a small real payment with your own card, then confirm it appears in your Merchant dashboard and triggers your webhook. Refund it to confirm your refund path works - you're now live.

:::tip [You're live]
Your integration now handles real money. Announce that you accept payments, and keep an eye on your dashboard and webhook logs as your first customer orders come in.
:::

## Go-live checklist

Run through the list for your path before you announce that you accept payments:

### Building with API keys

- [ ] Merchant account approved - KYM review complete
- [ ] Production API key created and saved immediately - the value is shown only once
- [ ] Production secret API key kept server-side - never in client code, version control, or logs
- [ ] Base URL switched to `https://merchant.revolut.com/`
- [ ] SDK initialisation no longer uses `mode: 'sandbox'`
- [ ] Production SDK key in use client-side (payments module initialisation)
- [ ] Production webhook URL registered and [Production webhook IPs](/docs/guides/merchant/test-and-go-live/environments#webhooks) allowlisted
- [ ] [Webhook signature verification](/docs/guides/merchant/monitor-and-observe/webhooks/using-webhooks) active on your Production webhook endpoint
- [ ] Test cards removed from your own test suites
- [ ] First live payment made, verified in the dashboard and via webhook, then refunded

### Using a no-code plugin

- [ ] Merchant account approved - KYM review complete
- [ ] Plugin switched to live mode on your live store
- [ ] Live payment tested end to end, then refunded

### Dashboard only

- [ ] Merchant account approved - KYM review complete
- [ ] First payment link or invoice created and paid by a real customer

## What's next

- [:Timeline: Order and payment lifecycle](/docs/guides/merchant/reference/order-lifecycle 'Learn how orders and payments progress from creation to completion')
- [:Browser: Accept online payments](/docs/guides/merchant/accept-payments/online-payments/introduction 'Expand the payment methods you accept')
- [:Link: Create payment links](/docs/guides/merchant/accept-payments/online-payments/hosted-checkout-page/payment-link 'Take payments without a website')
- [:AddProduct: Subscriptions and billing](/docs/guides/merchant/billing-subscriptions/introduction 'Set up recurring payments')