<!-- ZenPays documentation · https://docs.zenpayz.com/docs/examples/checkout-flow -->

# Checkout Flow

Create a checkout session for on-ramp payments.

<Tabs groupId="language">
  <TabItem value="javascript" label="JavaScript" default>

```typescript
import { ZenPays } from '@zenxdigitalholdings/zenpays'

async function createCheckout() {
  const zenpays = new ZenPays({
    apiKey: process.env.ZENPAYS_API_KEY!,
  })

  // 1. Detect customer's location
  const geo = await zenpays.checkout.detectGeo()
  console.log('Detected country:', geo.country, 'Currency:', geo.currency)

  // 2. Create checkout session
  const session = await zenpays.checkout.createSession({
    playerId: 'player_123',
    amount: 100, // Amount in fiat currency
    targetSettlementAsset: 'USDT',
    successUrl: 'https://example.com/success',
    cancelUrl: 'https://example.com/cancel',
  })

  console.log('Session created:', session.id)

  // 3. Get available banks (if bank transfer)
  const { banks } = await zenpays.checkout.getBanks(geo.currency)
  console.log('Available banks:', banks.length)

  // 4. Select optimal provider
  const provider = await zenpays.checkout.selectProvider({
    sessionId: session.id,
    playerGeo: geo.country,
    currency: geo.currency,
    amount: 100,
    paymentMethod: 'card',
    targetSettlementAsset: 'USDT',
  })

  console.log('Selected provider:', provider.provider)
  console.log('Widget URL:', provider.widgetUrl)
  console.log('Embed mode:', provider.embedMode)

  // 5. Redirect or embed widget
  if (provider.embedMode === 'redirect') {
    // Redirect to provider
    window.location.href = provider.widgetUrl
  }
  else {
    // Embed in iframe
    const iframe = document.createElement('iframe')
    iframe.src = provider.widgetUrl
    iframe.style.width = '100%'
    iframe.style.height = '600px'
    document.body.appendChild(iframe)
  }

  // 6. Monitor order status
  const checkStatus = async () => {
    const order = await zenpays.checkout.getRampOrder(session.rampOrderId!)

    switch (order.status) {
      case 'pending':
        console.log('Waiting for payment...')
        break
      case 'pending_funds':
        console.log('Payment received, waiting for confirmation...')
        break
      case 'confirmed':
        console.log('Payment confirmed!')
        break
      case 'matched':
        console.log('Crypto matched!')
        break
      case 'cleared':
        console.log('Order complete!')
        return true
      case 'failed':
        console.log('Order failed')
        return false
    }

    // Check again in 5 seconds
    setTimeout(checkStatus, 5000)
  }

  checkStatus()
}

createCheckout()
```

  </TabItem>
  <TabItem value="python" label="Python">

```python
import os
import time
from zenpays import ZenPays

def create_checkout():
    zenpays = ZenPays(api_key=os.environ["ZENPAYS_API_KEY"])

    # 1. Detect customer's location
    geo = zenpays.checkout.detect_geo()
    print(f"Detected country: {geo['country']}, Currency: {geo['currency']}")

    # 2. Create checkout session
    session = zenpays.checkout.create_session({
        "player_id": "player_123",
        "amount": 100,  # Amount in fiat currency
        "target_settlement_asset": "USDT",
        "success_url": "https://example.com/success",
        "cancel_url": "https://example.com/cancel",
    })

    print(f"Session created: {session['id']}")

    # 3. Get available banks (if bank transfer)
    result = zenpays.checkout.get_banks(geo["currency"])
    banks = result["banks"]
    print(f"Available banks: {len(banks)}")

    # 4. Select optimal provider
    provider = zenpays.checkout.select_provider({
        "session_id": session["id"],
        "player_geo": geo["country"],
        "currency": geo["currency"],
        "amount": 100,
        "payment_method": "card",
        "target_settlement_asset": "USDT",
    })

    print(f"Selected provider: {provider['provider']}")
    print(f"Widget URL: {provider['widget_url']}")
    print(f"Embed mode: {provider['embed_mode']}")

    # 5. Redirect or embed widget
    if provider["embed_mode"] == "redirect":
        # Redirect to provider
        print(f"Redirect to: {provider['widget_url']}")
        # In a web app: redirect user to provider["widget_url"]
    else:
        # Embed in iframe
        print("Embed widget in iframe")
        # In a web app: create iframe with provider["widget_url"]

    # 6. Monitor order status
    def check_status():
        order = zenpays.checkout.get_ramp_order(session["ramp_order_id"])

        status = order["status"]

        if status == "pending":
            print("Waiting for payment...")
        elif status == "pending_funds":
            print("Payment received, waiting for confirmation...")
        elif status == "confirmed":
            print("Payment confirmed!")
        elif status == "matched":
            print("Crypto matched!")
        elif status == "cleared":
            print("Order complete!")
            return True
        elif status == "failed":
            print("Order failed")
            return False

        # Check again in 5 seconds
        time.sleep(5)
        return check_status()

    check_status()

if __name__ == "__main__":
    create_checkout()
```

  </TabItem>
</Tabs>
