Short answer
On the free quota, Firestore allows 50,000 document reads, 20,000 writes and 20,000 deletes a day, reset around midnight Pacific time. Hitting the limit usually means something reads the same documents again and again: listeners that reconnect, queries with no limit, offsets, security rules that read other documents, or counting by downloading a whole collection. Check the Usage tab, fix the biggest source, or enable billing and set a budget alert, knowing a budget doesn’t cap usage.
Where the reads come from, and the fix
01
The free daily quota ran out
“Quotas are applied daily and reset around midnight Pacific time.” Firebase, Usage and limits
Without billing, Firestore gives you a fixed amount each day: 50,000 document reads, 20,000 writes, 20,000 deletes and 1 GiB stored. Once one runs out, Firebase says more quota needs billing; the free amounts come back at the daily reset. Open the Usage tab in the Firebase console to see which limit you hit, then find the code behind it before enabling billing.
02
Listeners that keep reconnecting
“If offline persistence is disabled, you will be charged for documents and index entries read as if you had issued a brand-new query whenever the listener disconnects and reconnects.” Firebase, Understand Cloud Firestore billing
A realtime listener is billed like a query when it starts, then one read each time a document in its results is added or updated. If a screen attaches a listener each time it opens, or the connection drops, Firestore can bill the full result again. Attach listeners once and detach them when the screen closes. Without offline persistence, every reconnect is billed as a new query; with it, only a disconnect of more than 30 minutes is.
03
Queries with no limit, or with offsets
“However, when you send a query that includes an offset, you are charged a read for each skipped document.” Firebase, Understand Cloud Firestore billing
Firestore bills every document a query reads, so a query with no limit reads the whole collection even if the screen shows 20. Add a limit and page with cursors. Offsets look cheaper but aren’t: every skipped document still counts as a read.
import { collection, query, orderBy, limit, startAfter, getDocs } from "firebase/firestore"; const first = await getDocs(query(collection(db, "posts"), orderBy("createdAt"), limit(20))); const last = first.docs[first.docs.length - 1]; const next = await getDocs(query(collection(db, "posts"), orderBy("createdAt"), startAfter(last), limit(20)));04
Security rules that read other documents
“You are charged for reads that are necessary to evaluate your Cloud Firestore Security Rules .” Firebase, Understand Cloud Firestore billing
Rules that call get() or exists() to look up a user or role document add reads to requests from your app. Keep the lookups you need, and drop the ones you don’t.
05
Counting by downloading every document
“For example, count() operations that read between 0 and 1000 index entries are billed for one document read.” Firebase, Understand Cloud Firestore billing
Fetching the whole collection to count it on the device is billed for every document read. A count() aggregation query is billed by index entries instead: up to 1,000 of them cost one document read.
import { collection, getCountFromServer } from "firebase/firestore"; const snap = await getCountFromServer(collection(db, "orders")); console.log(snap.data().count);
Checked against the vendor’s docs on : Firebase docs: Usage and limits for Cloud Firestore; Firebase docs: Understand Cloud Firestore billing.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way.See scope and start
Related: Firestore “The query requires an index” · Firebase “Missing or insufficient permissions” · How to cut your Firebase bill · Unexpected Gemini API charges on Firebase