N+1 Queries
We catch thisLooping requests that multiply with your data.
ReadMeter makes invisible Firestore reads visible during development, so you can catch n+1 query patterns and hidden document fetches before traffic turns them into a bill explosion.
Loading interactive demo...
Saw how it works? Get ReadMeter.
Get ReadMeter — $9 (one-time)They are caused by invisible behavior.
Traffic profile
1 User
Everything looks fine.
Traffic profile
10,000 Users
The bill jumps
Looping requests that multiply with your data.
Downloading entire objects for just one field.
UI triggers that silent-fire duplicate reads.
Firebase shows totals — not causes.
ReadMeter shows the causes while you’re building.
Works with your stack
Next.js
Verified
SSR Compatible
Nuxt
Full Support
REST/proxy
Works with Nuxt Hooks
React
Verified
Works with React Hooks
Vite
Verified
Works with Vite Plugins
Angular
Compatible
Installer adds the widget to your HTML entry (e.g. src/index.html).
Vue
Compatible
Most Vue apps: follow our Vite guide. The bundled recordRead composable ships with Nuxt only.
Firestore charges per document read, not per query. A page that looks harmless in development can become expensive once real users start loading it.
Data is taken from a personal project that uses all firebase services.
ReadMeter exists to make those patterns visible early.
Get ReadMeter — $9One-time license · One device (non-transferable) · Dev-only · Unlimited projects · Updates included
CASE STUDY: TRAINING APP
Imagine a company training app: 2,000 people are registered, and on a normal weekday about 375 sign in. They open their dashboard, watch a module, take a quiz, then hit the leaderboard and refresh to see if their score moved. It all feels routine—but every step can mean many Firestore document reads, multiplied by everyone who takes that path.
Solution that works
In development, this screen would have shown 180 reads. Would you have caught it?
All visible on the page while you build — plus local history and JSON export.
Get ReadMeter — $9Counts are Firestore document reads from the client SDK in this dev session (not billing-accurate).
At 1K users this could add about $0.19–$0.37/month.
This can make the page feel slower on load.
Reads scale with traffic—cost and load will grow as more users hit this page.
ReadMeter identified something worth checking — paste in your AI agent to investigate.
Firestore read hotspot: loadUsers() causes 312 reads per page load (triggered on every render). Page/route: / Caller: loadUsers() (collection: users). Impact: At 1K users this could add about $0.19–$0.37/month. Reads scale with traffic—cost and load will grow as more users hit this page. Task: 1) Locate: Use the page/route (and title, if present) above to find the right entry file for this view (page, layout, route loader, or parent shell), then trace to the Firestore access for collection "users". Prioritize the call path hinted by: loadUsers(). 2) Diagnose: 6 execution(s) this load — often re-renders, unstable hook deps, or a fetch invoked from render/hot paths. ReadMeter attributes ~312 document read(s) here. 3) Remediate: Consolidate so Firestore runs once per navigation or meaningful invalidation: move reads out of render, stabilize hook/effect dependencies, dedupe with context or a module singleton, or use React Query/SWR with a single stable query key and appropriate staleTime. 4) Deliver: Name exact files/functions to change, show the revised query or data flow (limits, where/orderBy + indexes, cursors, cache keys/TTL, or server aggregation), how to verify fewer reads (ReadMeter reload, emulator, or usage metrics), and any UX or staleness tradeoffs.
Trace where reads come from, generate AI-ready fixes, and track local history while you build.
Deep Trace
Pinpoint the hot path fast: route, caller, executions, and the collection that scales your bill.
AI-Fix
Copy a context-rich prompt to Cursor or Claude with offender details and optimization hints.
Refactor loadDashboardFeed() in /dashboard: - It executes 6x and triggers 240 reads - Batch post+author lookups - Add cache layer for repeated renders
Local History
Compare routes over time without external dashboards or production instrumentation.
JSON Export
Save route-level read data as JSON so you or your team can diff, audit, and discuss optimizations with context.
{
"route": "/dashboard",
"totalReads": 312,
"worstOffender": "loadDashboardFeed()",
"collection": "posts"
}The root causes
Most developers only see the total after a bill arrives — not the individual patterns that caused it.
One project: monthly Firestore costs dropped from ~$190 to ~$75 after catching expensive read patterns early.