---
title: Billing & Usage Limits
description: Control monthly email usage and costs
---

## What are billing limits

Billing limits let you cap monthly email sends by category to control costs. Set maximum emails per month for transactional, campaigns, and workflows separately.

## Email categories

Plunk tracks usage across three categories:

**Transactional** — Emails sent via `/v1/send` API
- Order confirmations, password resets
- Account notifications
- Any direct API sends

**Campaigns** — One-time broadcast emails
- Newsletters, announcements
- Promotional campaigns
- Marketing blasts

**Workflows** — Automated sequence emails
- Onboarding flows
- Drip campaigns
- Behavior-triggered emails

**Note:** The category is determined by how you send (API, campaign, or workflow), not the template type.

## How limits work

### Monthly reset

Usage resets on the 1st of each month (UTC). Starts fresh at 0.

### Enforcement

When sending emails:

- **Under 80%** — Sends normally
- **80-99%** — Sends with warning flag
- **100%+** — Blocked with 429 error

### Unlimited

Set limit to unlimited for any category (default for all categories).

## Manage limits

You can view and update your billing limits in the dashboard:

1. Go to **Settings** → **Billing**
2. View current usage for each category
3. Update limits as needed (requires Admin or Owner role)

## When limit is reached

### API error

```json
{
  "code": 429,
  "error": "Too Many Requests",
  "message": "Monthly limit exceeded for campaigns (50000/50000). Resets on 2025-12-01."
}
```

### Handle in code

```javascript
try {
  const response = await fetch('{{API_URL}}/v1/send', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(emailData)
  });

  if (response.status === 429) {
    const error = await response.json();

    // Option 1: Notify admin
    await notifyAdmin(`Limit reached: ${error.message}`);

    // Option 2: Increase limit
    await increaseBillingLimit('transactional', 200000);

    // Option 3: Queue for next month
    await queueForNextMonth(emailData);
  }
} catch (error) {
  console.error('Send failed:', error);
}
```

## Best practices

**Monitor usage regularly** — Check dashboard weekly to avoid surprises.

**Set alerts** — Configure notifications at 80% usage.

**Plan for growth** — Increase limits before campaigns, not during.

**Use categories wisely** — Critical transactional emails might need higher limits.

**Review monthly** — Adjust limits based on actual usage patterns.

## Next Steps

- [Track usage analytics](/guides/analytics)
- [Scale email delivery](/guides/scaling-email)
- [Troubleshooting limits](/guides/troubleshooting)
