# Egress on SupaHost explained

> What counts as egress on SupaHost, how it's measured from the gateway's response bytes, plan allowances and add-ons, and practical ways to reduce it.

Source: https://supahost.app/kb/egress-explained · Updated 2026-11-11

Egress on SupaHost is the data your projects send out through the instance's gateway: the size of every response from the Data API, Auth, Storage, Edge Functions and Realtime. It's measured per project and added up per instance, then compared with your plan's monthly allowance.

## Allowances and pricing

| Plan | Egress per month (shared by all projects) |
|---|---|
| Builder | 250 GB |
| Pro | 500 GB |
| Business | 1 TB |
| Enterprise | Custom |

If you need more, add egress in steps of 100 GB for $12/mo on *Dashboard → **Usage & billing** → Add-ons*. Anything above your allowance and add-ons is billed as overage at $0.12/GB. Unlike Supabase Cloud, there's no separate "cached egress" category: every byte counts the same.

## How it's measured

Every request to `https://<project>.<instance>.supahost.space` (or your custom domain) passes through the gateway, which logs the size of each response. Egress is the total of those response sizes.

| Counts | Doesn't count |
|---|---|
| JSON returned by `/rest/v1` queries and RPCs | Data you upload (requests are inbound) |
| File downloads from Storage, public and private | Traffic inside the instance, such as Auth reading the database |
| Auth responses (sessions, user objects) | Daily backups going to backup storage |
| Edge Function responses | |
| Realtime traffic through the gateway | |

## Where egress usually comes from

1. **Files.** Images and videos served from Storage are almost always the biggest share. A 2 MB photo viewed 50,000 times a month is 100 GB.
2. **Over-fetching.** `select('*')` on a wide table, or listing hundreds of rows when a page shows 20.
3. **Polling.** A client re-fetching the same list every few seconds.
4. **Realtime fan-out.** One message broadcast to 5,000 subscribers is sent 5,000 times.

## Reducing it

- **Select only the columns you need**, and paginate:

  ```ts
  const { data } = await supabase
    .from("recipes")
    .select("id, title, thumb_path")
    .order("created_at", { ascending: false })
    .range(0, 19);
  ```

- **Store smaller images.** SupaHost has no image transformations, so resize and compress images before upload, and store a thumbnail next to the original. See [Images without transformations](/docs/storage/images).
- **Let browsers cache files.** Set `cacheControl` when uploading files that don't change, so repeat views don't download again. See [Files not caching](/kb/storage-cache-control).
- **Serve static site assets from your app's host.** Logos, icons and marketing images that every visitor loads belong with your frontend (Vercel, Netlify and so on), not in Storage.
- **Replace polling with Realtime**, which sends only changes.
- **Keep Realtime payloads small.** Send an ID and let clients fetch details only when they need them.

## Watching usage

*Dashboard → **Usage & billing*** shows egress for the current month next to database size and file storage. You get an email when usage reaches your alert level (80% by default) and again at 100%. Going over never throttles or stops your instance. See [Quota alert emails and going over](/kb/quota-alerts).

## Related

- [Usage, quotas and add-ons](/docs/platform/usage)
- [Plans and limits](/docs/platform/plans)
- [Serving and downloading files](/docs/storage/serving-files)
