From 140e74435dcf3f19035781ebc2c6712d7d9d9e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Gr=C3=BCneberg?= Date: Mon, 12 Jan 2026 16:03:25 +0700 Subject: [PATCH] docs: rename Realtime quotas to Limits (#41816) We use the quota term for actual billing quotas, so using "Quota" as a term for configurable Realtime limits is confusing. While there are varying per-plan limits, they are not used for billing. Realtime Quotas on plans refer to Realtime Messages and Realtime Peak Connections --- .../NavigationMenu.constants.ts | 2 +- .../guides/deployment/going-into-prod.mdx | 6 +- .../guides/realtime/getting_started.mdx | 2 +- apps/docs/content/guides/realtime/limits.mdx | 63 +++++++++++++++++++ apps/docs/content/guides/realtime/quotas.mdx | 63 ------------------- .../content/guides/storage/vector/limits.mdx | 2 +- .../troubleshooting/exhaust-disk-io.mdx | 2 +- ...ncurrent-peak-connections-quota-jdDqcp.mdx | 2 +- .../Organization/Usage/Usage.constants.tsx | 8 +-- apps/www/lib/redirects.js | 9 ++- 10 files changed, 82 insertions(+), 77 deletions(-) create mode 100644 apps/docs/content/guides/realtime/limits.mdx delete mode 100644 apps/docs/content/guides/realtime/quotas.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 3290cb1f146..977fb699362 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -1871,7 +1871,7 @@ export const realtime: NavMenuConstant = { name: 'Deep dive', url: undefined, items: [ - { name: 'Quotas', url: '/guides/realtime/quotas', enabled: billingEnabled }, + { name: 'Limits', url: '/guides/realtime/limits', enabled: billingEnabled }, { name: 'Pricing', url: '/guides/realtime/pricing' as `/${string}`, diff --git a/apps/docs/content/guides/deployment/going-into-prod.mdx b/apps/docs/content/guides/deployment/going-into-prod.mdx index ed14427080c..1b23ede39a9 100644 --- a/apps/docs/content/guides/deployment/going-into-prod.mdx +++ b/apps/docs/content/guides/deployment/going-into-prod.mdx @@ -84,10 +84,10 @@ After developing your project and deciding it's production ready, you should run | Create or Verify an MFA challenge | `/auth/v1/factors/:id/challenge` `/auth/v1/factors/:id/verify` | IP Address | 15 requests per minute (with bursts up to 30 requests) | | Anonymous sign-ins | `/auth/v1/signup`[^2] | IP Address | 30 requests per hour (with bursts up to 30 requests) | -### Realtime quotas +### Realtime limits -- Review the [Realtime quotas](/docs/guides/realtime/quotas). -- If you need quotas increased you can always [contact support](/dashboard/support/new). +- Review the [Realtime limits](/docs/guides/realtime/limits). +- If you need limits increased you can always [contact support](/dashboard/support/new). ### Abuse prevention diff --git a/apps/docs/content/guides/realtime/getting_started.mdx b/apps/docs/content/guides/realtime/getting_started.mdx index 8860fbbf94a..b473d2abcf9 100644 --- a/apps/docs/content/guides/realtime/getting_started.mdx +++ b/apps/docs/content/guides/realtime/getting_started.mdx @@ -688,7 +688,7 @@ Now that you understand the basics, dive deeper into each feature: - **[Architecture](/docs/guides/realtime/architecture)** - Understand how Realtime works under the hood - **[Benchmarks](/docs/guides/realtime/benchmarks)** - Performance characteristics and scaling considerations -- **[Quotas](/docs/guides/realtime/quotas)** - Usage limits and best practices +- **[Limits](/docs/guides/realtime/limits)** - Usage limits and best practices ### Integration guides diff --git a/apps/docs/content/guides/realtime/limits.mdx b/apps/docs/content/guides/realtime/limits.mdx new file mode 100644 index 00000000000..5aea01f8202 --- /dev/null +++ b/apps/docs/content/guides/realtime/limits.mdx @@ -0,0 +1,63 @@ +--- +id: 'limits' +title: 'Realtime Limits' +description: 'Understanding Realtime limits' +sidebar_label: 'Limits' +--- + +Our cluster supports millions of concurrent connections and message throughput for production workloads. + + + +Upgrade your plan to increase your limits. Without a spend cap, or on an Enterprise plan, some limits are still in place to protect budgets. All limits are configurable per project. [Contact support](/dashboard/support/new) if you need your limits increased. + + + +## Limits by plan + +| | Free | Pro | Pro (no spend cap) | Team | Enterprise | +| ----------------------------------------------------------------------------------- | -------- | -------- | ------------------ | -------- | ---------- | +| **Concurrent connections** | 200 | 500 | 10,000 | 10,000 | 10,000+ | +| **Messages per second** | 100 | 500 | 2,500 | 2,500 | 2,500+ | +| **Channel joins per second** | 100 | 500 | 2,500 | 2,500 | 2,500+ | +| **Channels per connection** | 100 | 100 | 100 | 100 | 100+ | +| **Presence keys per object** | 10 | 10 | 10 | 10 | 10+ | +| **Presence messages per second** | 20 | 50 | 1,000 | 1,000 | 1,000+ | +| **Broadcast payload size** | 256 KB | 3,000 KB | 3,000 KB | 3,000 KB | 3,000+ KB | +| **Postgres change payload size ([**read more**](#postgres-changes-payload-limit))** | 1,024 KB | 1,024 KB | 1,024 KB | 1,024 KB | 1,024+ KB | + +Beyond the Free and Pro Plan you can customize your limits by [contacting support](/dashboard/support/new). + +## Limit errors + +When you exceed a limit, errors will appear in the backend logs and client-side messages in the WebSocket connection. + +- **Logs**: check the [Realtime logs](/dashboard/project/_/database/realtime-logs) inside your project Dashboard. +- **WebSocket errors**: Use your browser's developer tools to find the WebSocket initiation request and view individual messages. + + + +You can use the [Realtime Inspector](https://realtime.supabase.com/inspector/new) to reproduce an error and share those connection details with Supabase support. + + +Some limits can cause a Channel join to be refused. Realtime will reply with one of the following WebSocket messages: + +### `too_many_channels` + +Too many channels currently joined for a single connection. + +### `too_many_connections` + +Too many total concurrent connections for a project. + +### `too_many_joins` + +Too many Channel joins per second. + +### `tenant_events` + +Connections will be disconnected if your project is generating too many messages per second. `supabase-js` will reconnect automatically when the message throughput decreases below your plan limit. An `event` is a WebSocket message delivered to, or sent from a client. + +## Postgres changes payload limit + +When this limit is reached, the `new` and `old` record payloads only include the fields with a value size of less than or equal to 64 bytes. diff --git a/apps/docs/content/guides/realtime/quotas.mdx b/apps/docs/content/guides/realtime/quotas.mdx deleted file mode 100644 index a7b4a7e6d93..00000000000 --- a/apps/docs/content/guides/realtime/quotas.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -id: 'quotas' -title: 'Realtime Quotas' -description: 'Understanding Realtime quotas' -sidebar_label: 'Quotas' ---- - -Our cluster supports millions of concurrent connections and message throughput for production workloads. - - - -Upgrade your plan to increase your quotas. Without a spend cap, or on an Enterprise plan, some quotas are still in place to protect budgets. All quotas are configurable per project. [Contact support](/dashboard/support/new) if you need your quotas increased. - - - -## Quotas by plan - -| | Free | Pro | Pro (no spend cap) | Team | Enterprise | -| -------------------------------------------------------------------------------------- | ----- | ----- | ------------------ | ------ | ---------- | -| **Concurrent connections** | 200 | 500 | 10,000 | 10,000 | 10,000+ | -| **Messages per second** | 100 | 500 | 2,500 | 2,500 | 2,500+ | -| **Channel joins per second** | 100 | 500 | 2,500 | 2,500 | 2,500+ | -| **Channels per connection** | 100 | 100 | 100 | 100 | 100+ | -| **Presence keys per object** | 10 | 10 | 10 | 10 | 10+ | -| **Presence messages per second** | 20 | 50 | 1,000 | 1,000 | 1,000+ | -| **Broadcast payload size KB** | 256 | 3,000 | 3,000 | 3,000 | 3,000+ | -| **Postgres change payload size KB ([**read more**](#postgres-changes-payload-quota))** | 1,024 | 1,024 | 1,024 | 1,024 | 1,024+ | - -Beyond the Free and Pro Plan you can customize your quotas by [contacting support](/dashboard/support/new). - -## Quota errors - -When you exceed a quota, errors will appear in the backend logs and client-side messages in the WebSocket connection. - -- **Logs**: check the [Realtime logs](/dashboard/project/_/database/realtime-logs) inside your project Dashboard. -- **WebSocket errors**: Use your browser's developer tools to find the WebSocket initiation request and view individual messages. - - - -You can use the [Realtime Inspector](https://realtime.supabase.com/inspector/new) to reproduce an error and share those connection details with Supabase support. - - -Some quotas can cause a Channel join to be refused. Realtime will reply with one of the following WebSocket messages: - -### `too_many_channels` - -Too many channels currently joined for a single connection. - -### `too_many_connections` - -Too many total concurrent connections for a project. - -### `too_many_joins` - -Too many Channel joins per second. - -### `tenant_events` - -Connections will be disconnected if your project is generating too many messages per second. `supabase-js` will reconnect automatically when the message throughput decreases below your plan quota. An `event` is a WebSocket message delivered to, or sent from a client. - -## Postgres changes payload quota - -When this quota is reached, the `new` and `old` record payloads only include the fields with a value size of less than or equal to 64 bytes. diff --git a/apps/docs/content/guides/storage/vector/limits.mdx b/apps/docs/content/guides/storage/vector/limits.mdx index 0b0883367af..71bacfcf935 100644 --- a/apps/docs/content/guides/storage/vector/limits.mdx +++ b/apps/docs/content/guides/storage/vector/limits.mdx @@ -1,6 +1,6 @@ --- title: 'Vector Bucket Limits' -subtitle: 'Understanding capacity, quotas, and billing for vector buckets.' +subtitle: 'Understanding capacity, limits, and billing for vector buckets.' --- diff --git a/apps/docs/content/troubleshooting/exhaust-disk-io.mdx b/apps/docs/content/troubleshooting/exhaust-disk-io.mdx index b397180a608..9a9b1597f5d 100644 --- a/apps/docs/content/troubleshooting/exhaust-disk-io.mdx +++ b/apps/docs/content/troubleshooting/exhaust-disk-io.mdx @@ -9,7 +9,7 @@ database_id = "4844905d-1456-44a1-858e-7a4995e5054c" Disk IO refers to two metrics: throughput in Megabits per Second and IOPS which are Input/Output Operations per Second. Depending on the compute add-on of your instance you will have [different baseline performances](/docs/guides/platform/compute-add-ons#compute-size). -Smaller compute instances can burst and exceed their baseline performance for a short quota of time every day. This is represented as your Disk IO Budget and once your Disk IO Budget is consumed, your instance reverts back to its baseline performance. Learn more about [choosing the right compute instance for consistent disk performance](/docs/guides/platform/compute-add-ons#choosing-the-right-compute-instance-for-consistent-disk-performance). +Smaller compute instances can burst and exceed their baseline performance for a short period of time every day. This is represented as your Disk IO Budget and once your Disk IO Budget is consumed, your instance reverts back to its baseline performance. Learn more about [choosing the right compute instance for consistent disk performance](/docs/guides/platform/compute-add-ons#choosing-the-right-compute-instance-for-consistent-disk-performance). ## Depleting your disk IO budget diff --git a/apps/docs/content/troubleshooting/realtime-concurrent-peak-connections-quota-jdDqcp.mdx b/apps/docs/content/troubleshooting/realtime-concurrent-peak-connections-quota-jdDqcp.mdx index be05dc98a95..2cacce34d5b 100644 --- a/apps/docs/content/troubleshooting/realtime-concurrent-peak-connections-quota-jdDqcp.mdx +++ b/apps/docs/content/troubleshooting/realtime-concurrent-peak-connections-quota-jdDqcp.mdx @@ -12,4 +12,4 @@ For example, if you have a chat application that uses Supabase Realtime and you This quota applies to all Supabase projects, including self-hosted projects, but you can increase it depending on your use case. For hosted Supabase projects, select the plan that fits your Realtime usage and reach out if you need custom quotas. For those self-hosting Supabase, you can set those limits yourself by setting the `max_concurrent_users` field on the tenant record (see: https://supabase.com/docs/guides/self-hosting/realtime/config). -You can learn more about Realtime quotas here: https://supabase.com/docs/guides/realtime/quotas#quotas-by-plan +You can learn more about Realtime limits here: https://supabase.com/docs/guides/realtime/limits#limits-by-plan diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx index 9ea41399363..e9a196b921d 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx @@ -334,8 +334,8 @@ export const USAGE_CATEGORIES: (subscription?: OrgSubscription) => CategoryMeta[ chartDescription: 'The data refreshes every hour.', links: [ { - name: 'Realtime Quotas', - url: `${DOCS_URL}/guides/realtime/quotas`, + name: 'Realtime Limits', + url: `${DOCS_URL}/guides/realtime/limits`, }, ], }, @@ -353,8 +353,8 @@ export const USAGE_CATEGORIES: (subscription?: OrgSubscription) => CategoryMeta[ chartDescription: 'The data refreshes every hour.', links: [ { - name: 'Realtime Quotas', - url: `${DOCS_URL}/guides/realtime/quotas`, + name: 'Realtime Limits', + url: `${DOCS_URL}/guides/realtime/limits`, }, ], }, diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 1f19a987c74..8eac3b7e071 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2176,7 +2176,12 @@ module.exports = [ { permanent: true, source: '/docs/guides/realtime/rate-limits', - destination: '/docs/guides/realtime/quotas', + destination: '/docs/guides/realtime/limits', + }, + { + permanent: true, + source: '/docs/guides/realtime/quotas', + destination: '/docs/guides/realtime/limits', }, { permanent: true, @@ -2206,7 +2211,7 @@ module.exports = [ { permanent: true, source: '/docs/guides/realtime/guides/client-side-throttling', - destination: '/docs/guides/realtime/quotas', + destination: '/docs/guides/realtime/limits', }, { permanent: true,