# Diagnosing missing @upstash/ratelimit analytics
## Symptom
The Ratelimit dashboard shows far fewer requests than your traffic,
or blocked-request counts do not match your 429 logs.
## Cause
With analytics: true, every limit() call fires a ZINCRBY after the
verdict is returned. On serverless runtimes the function can end
before that write lands. The verdict reached the user, the analytics
write did not. Result: systematic undercounting, worse on
high-churn serverless with short-lived instances.
## Confirm
1. Check that analytics: true is actually set on the production
limiter instance.
2. Check whether the code destructures and awaits pending:
const { success, pending } = await ratelimit.limit(id);
context.waitUntil(pending);
If pending is ignored, that is the cause.
3. Compare dashboard totals against your edge access logs for the
same window. A consistent ratio (like 60% of traffic recorded)
points at dropped background writes, not at a filter.
## Fix
Wire pending into waitUntil on every platform (Cloudflare
context.waitUntil, Vercel Functions waitUntil).
## Verify
Dashboard totals converge with access-log totals within a few
percent over the next hour of traffic.