# Dodo Payments Usage-Based Billing Setup Guide

This guide explains how to configure usage-based billing (pay-per-token) in Shopify AI App Builder with Dodo Payments.

## Overview

Usage-based billing allows users to pay only for the exact number of tokens they consume **over their plan limit**. When enabled, the system sends usage events to Dodo meters and charges the exact overage automatically each billing cycle. Administrators can set custom rates per currency through the admin panel.

---

## How It Works

1. **User enables unlimited usage** in their account settings
2. **Tokens are consumed** and tracked against the plan limit
3. **Overage tokens** are metered and sent to Dodo usage events
4. **Billing is exact** - users pay only for overage tokens
5. **Automatic billing** occurs each cycle via Dodo usage-based billing

---

## Configuration Steps

### 1) Admin Panel - Set Token Rates

1. Navigate to `/admin/plans` as an admin
2. Scroll to "Token usage rates" section
3. Set the rate per 1,000,000 tokens for each currency (USD, GBP, EUR)
4. Click "Save changes"

**Example Rates**:
- USD: $2.50 per 1M tokens (250 cents)
- GBP: £2.00 per 1M tokens (200 cents)
- EUR: €2.50 per 1M tokens (250 cents)

These rates are automatically applied when users consume tokens.

### 2) Dodo Dashboard - Configure Meter

1. Create a meter with **event name** matching `DODO_USAGE_EVENT_NAME` (default: `token.usage`)
2. Set aggregation to **sum** over `costCents` (or your configured cost field)
3. Attach the meter to your subscription product
4. Set unit price to **$0.01 / €0.01 / £0.01** if summing `costCents`

### 3) User Configuration

Users can configure their billing preferences in `/settings`:

1. **Select currency** (USD, GBP, or EUR)
2. **Enable unlimited usage** checkbox
3. **Save changes** to activate usage-based billing

---

## User Experience

### Enabling Unlimited Usage

1. User navigates to `/settings`
2. User sees "Enable unlimited usage" checkbox in Plan & Billing section
3. User checks the box and selects their preferred currency
4. User clicks "Save changes"
5. System confirms the change

### Token Consumption

When unlimited usage is enabled:

- **Overage tracking**: Only tokens beyond the plan limit are billed
- **Precision billing**: Users pay exactly the rate set by administrator
- **Automatic charges**: Dodo bills usage each cycle via meters
- **Transparent tracking**: Users can see usage in their invoices

---

## API Endpoints

### Get Token Rates (Admin Only)

```http
GET /api/admin/token-rates
Authorization: Admin session required
```

**Response**:
```json
{
  "ok": true,
  "rates": {
    "usd": 250,
    "gbp": 200,
    "eur": 250
  }
}
```

### Update Token Rates (Admin Only)

```http
POST /api/admin/token-rates
Authorization: Admin session required
Content-Type: application/json

{
  "rates": {
    "usd": 250,
    "gbp": 200,
    "eur": 250
  }
}
```

**Response**:
```json
{
  "ok": true,
  "rates": {
    "usd": 250,
    "gbp": 200,
    "eur": 250
  }
}
```

### Usage Events (Server-side)

Usage-based billing relies on server-side ingestion of usage events to Dodo.
Events are sent automatically when overage tokens are detected.

```http
POST https://<dodo_base_url>/events/ingest
Authorization: Bearer <DODO_API_KEY>
Content-Type: application/json

{
  "events": [
    {
      "event_id": "usage_<uuid>",
      "customer_id": "<dodo_customer_id>",
      "event_name": "token.usage",
      "timestamp": "2026-01-20T00:00:00Z",
      "metadata": {
        "billableTokens": 2500000,
        "costCents": 500,
        "currency": "usd",
        "ratePerMillion": 200,
        "plan": "starter",
        "month": "2026-01"
      }
    }
  ]
}
```

---

## Billing Logic

### Token Cost Calculation (Overage Only)

```javascript
// When user consumes tokens
tokensUsed = numberOfTokensConsumed
previousTotal = bucket.usage
bucket.usage = previousTotal + tokensUsed

planLimit = getPlanTokenLimits(user.plan)
previousOverage = max(0, previousTotal - planLimit)
currentOverage = max(0, bucket.usage - planLimit)
overageDelta = max(0, currentOverage - previousOverage)

userCurrency = user.billingCurrency || 'usd'
rate = tokenRates[userCurrency]  // Cents per 1M tokens
chargeAmount = round((overageDelta * rate) / 1_000_000)

// Send usage event to Dodo meters
sendUsageEvent({
  billableTokens: overageDelta,
  costCents: chargeAmount,
  currency: userCurrency,
  ratePerMillion: rate,
})
```

### Example Scenarios

#### Scenario 1: User consumes 500,000 tokens over limit at $2.50/M rate

- Rate: 250 cents per 1M tokens
- Overage tokens: 500,000
- Calculation: (500,000 * 250) / 1,000,000 = 125 cents
- **Charge**: **$1.25** (usage event)

#### Scenario 2: User consumes 2,500,000 tokens over limit at $2.00/M rate

- Rate: 200 cents per 1M tokens
- Overage tokens: 2,500,000
- Calculation: (2,500,000 * 200) / 1,000,000 = 500 cents
- **Charge**: **$5.00** (usage event)

---

## Important Notes

### 1) Rate Configuration

- **Admin control**: Only administrators can set token rates via admin panel
- **Per currency**: Separate rates for USD, GBP, and EUR
- **Flexible**: Rates can be adjusted at any time
- **Precision**: Calculated in cents/minor units for accuracy

### 2) Dodo Meter Configuration

- **Event name**: Must match `DODO_USAGE_EVENT_NAME` (default: `token.usage`)
- **Aggregation**: Use `sum` over `costCents` (or your configured cost field)
- **Unit price**: Set to **$0.01** per unit if summing `costCents`
- **Free threshold**: Optional; can be used to mirror plan limits if desired

### 3) Currency Handling

- **User selection**: Users can choose their preferred currency in settings
- **Rate matching**: Appropriate rate applied based on user's currency
- **Consistency**: Events include `currency` and `ratePerMillion`

### 4) Unlimited Usage Flag

- **Required**: Must be enabled for usage-based billing
- **Optional**: Users can disable and return to plan-based limits
- **Flexible**: Can be toggled at any time
- **Persistent**: Setting saved per user

---

## Troubleshooting

### Issue: Usage events not billing

**Symptom**: Tokens over limit are recorded but no charges appear

**Solutions**:
1. Verify `unlimitedUsage` is enabled for the user
2. Check the user has a Dodo customer ID and billing email
3. Verify `tokenRates` are configured in admin panel
4. Ensure Dodo meter event name matches `DODO_USAGE_EVENT_NAME`
5. Review `recordUserTokens()` logs for ingest errors

### Issue: Rates not applying correctly

**Symptom**: Charges don't match configured rates

**Solutions**:
1. Verify rates are saved to `token-rates.json`
2. Check `loadTokenRates()` is called on server startup
3. Ensure currency conversion is correct (cents vs dollars)
4. Review token division by 1,000,000 calculation

---

## Best Practices

### 1) Rate Configuration

- **Set competitive rates**: Align with market prices for token usage
- **Update regularly**: Adjust for currency exchange rate changes
- **Test calculations**: Verify rate × tokens = correct charge
- **Document changes**: Keep record of rate adjustments

### 2) User Communication

- **Clear pricing**: Display rates prominently in settings
- **Show calculations**: Let users see how charge is calculated
- **Invoice transparency**: Show usage and charges in invoices

### 3) Monitoring

- **Monitor usage events**: Track ingest success and meter totals
- **Monitor token consumption**: Analyze usage patterns by user
- **Watch for anomalies**: Detect unusual consumption patterns
- **Revenue analytics**: Compare usage-based vs subscription revenue

### 4) System Performance

- **Batch ingestion**: Send usage events in batches where possible
- **Error handling**: Retry failed usage event ingestion gracefully
- **Logging**: Track all usage events for audit trails

---

## Reference Links

- [Dodo Payments API Documentation](https://docs.dodopayments.com)
- [Main Dodo Setup Guide](./dodo.md)
- [Token Usage Implementation](./TOKEN_USAGE_IMPLEMENTATION.md)
- [Payment Flow Documentation](./DODO_INLINE_CHECKOUT_THEMING.md)

---

## Summary

The usage-based billing model provides:

- **Exact charging**: Users pay only for tokens they actually consume over limit
- **Flexible pricing**: Administrators can set custom rates per currency
- **No limits**: Usage can exceed plan limits with automatic billing
- **Metered tracking**: Usage is reported via Dodo meters
- **Simple management**: Charges appear automatically in invoices

Users can enable unlimited usage and the system will automatically charge the exact amount for overage tokens based on administrator-set rates.

