Skip to content

Commit e69992d

Browse files
docs: document error tracking rate limiting (#17345)
1 parent 34522e6 commit e69992d

4 files changed

Lines changed: 67 additions & 0 deletions

File tree

contents/docs/error-tracking/capture.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ import BurstProtection from './_snippets/burst-protection.mdx'
455455
456456
<BurstProtection />
457457
458+
Burst protection runs client-side, per client. To cap exception volume across your whole project – or per issue – set a server-side [rate limit](/docs/error-tracking/rate-limiting).
459+
458460
## Common problems
459461
460462
### Exception steps don't appear in the session timeline

contents/docs/error-tracking/pricing.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,7 @@ import BurstProtection from './_snippets/burst-protection.mdx'
6969
import BeforeSendHook from './_snippets/before-send-hook.mdx'
7070

7171
<BeforeSendHook />
72+
73+
### Rate limits
74+
75+
Set a server-side [rate limit](/docs/error-tracking/rate-limiting) to cap how many exceptions PostHog ingests per project or per issue. Exceptions received above the configured rate are dropped at ingestion, so they aren't billed. This is the best way to stop a single noisy client or runaway issue from unexpectedly inflating your bill.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
title: Rate limiting
3+
---
4+
5+
import { CalloutBox } from 'components/Docs/CalloutBox'
6+
7+
Rate limits cap how many exception events PostHog ingests, so a single noisy client or runaway issue can't blow through your quota – or your bill. Exceptions received above the configured rate are dropped at ingestion, before they're [stored or billed](/docs/error-tracking/pricing).
8+
9+
## How rate limiting works
10+
11+
PostHog applies rate limits using a token bucket. You set a **maximum number of exceptions** and a **time window** (for example, 10,000 exceptions per hour). The bucket holds up to that maximum and refills steadily across the window, so short bursts are absorbed while sustained over-the-limit volume is capped. Exceptions that arrive when the bucket is empty are dropped at ingestion.
12+
13+
Because dropped exceptions are never ingested, they don't count toward your bill.
14+
15+
There are two types of rate limit. They're applied independently, and you can use either or both. You can configure both in the [Error Tracking configuration page](https://app.posthog.com/error_tracking/configuration#selectedSetting=error-tracking-rate-limits).
16+
17+
### Project-wide rate limit
18+
19+
This limit applies across your entire project, regardless of which issue an exception belongs to. It acts as a single safety cap on total exception volume.
20+
21+
<ProductScreenshot
22+
imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_08_44_937_Z_c8badbee44.png"
23+
imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_04_59_591_Z_1f50e085fa.png"
24+
alt="Project-wide rate limit settings"
25+
classes="rounded"
26+
/>
27+
28+
### Per-issue rate limit
29+
30+
You set a single limit, and PostHog automatically applies it to every issue individually – each issue gets its own bucket. Once an issue exceeds the configured rate, further exceptions for *that issue* are dropped, while exceptions from your other issues keep flowing. Use this to stop a single noisy issue from drowning out everything else.
31+
32+
When configuring a per-issue limit, you can pick an issue from your most active issues to preview its recent exception volume against the limit, so you can choose a threshold before saving.
33+
34+
<ProductScreenshot
35+
imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_09_34_375_Z_d89669f2f6.png"
36+
imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_10_04_339_Z_652b6381b6.png"
37+
alt="Per-issue rate limit settings"
38+
classes="rounded"
39+
/>
40+
41+
## Configuring rate limits
42+
43+
The following options are available for each limit:
44+
45+
| Option | Description |
46+
| --- | --- |
47+
| **Maximum exceptions** | The most exceptions to ingest per window. Leave this empty for no limit. |
48+
| **Per** | The time window the limit applies over – 15 minutes, 30 minutes, or 1 hour. |
49+
50+
<CalloutBox icon="IconInfo" title="Rate limits vs. client-side controls" type="fyi">
51+
52+
Rate limits run server-side, at ingestion, and apply to every client sending exceptions to your project. To reduce exceptions before they leave the client, see [burst protection](/docs/error-tracking/capture#burst-protection), [suppression rules](/docs/error-tracking/capture#suppressing-exceptions), and the [`before_send` hook](/docs/error-tracking/capture). For more ways to lower your bill, see [reducing Error Tracking costs](/docs/error-tracking/pricing).
53+
54+
</CalloutBox>

src/navs/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5050,6 +5050,13 @@ export const docsMenu = {
50505050
color: 'yellow',
50515051
featured: true,
50525052
},
5053+
{
5054+
name: 'Rate limiting',
5055+
url: '/docs/error-tracking/rate-limiting',
5056+
icon: 'IconThrottle',
5057+
color: 'orange',
5058+
featured: true,
5059+
},
50535060
{
50545061
name: 'Code variables',
50555062
url: '/docs/error-tracking/code-variables',

0 commit comments

Comments
 (0)