How to fix Firestore: Daily read quota exceeded (50,000 reads/day on free tier) in Firebase

FirebaseINTERMEDIATEHIGHUpdated Dec 22, 2025· 300 views

The Spark (free) Firebase plan caps Firestore at 50,000 document reads per 24-hour window, so once your project consumes the allotment Firestore returns a ResourceExhausted error and blocks any further reads until the quota resets. Confirm the quota usage, upgrade to Blaze, and cut the number of reads (caching, aggregation, alerts, etc.) so you no longer burn through the free limit.

Quick fix

Fixes Firestore: Daily read quota exceeded (50,000 reads/day on free tier)

const cache = new Map<string, { data: DocumentData; expiresAt: number }>();

async function getCachedDoc(path: string) {
  const entry = cache.get(path);
  if (entry && entry.expiresAt > Date.now()) {
    return entry.data;
  }

  const snapshot = await getDoc(doc(db, path));
  const data = snapshot.data() || {};
  cache.set(path, { data, expiresAt: Date.now() + 60_000 }); // 60s TTL
  return data;
}
  1. Inspect the Firestore usage chart and confirm you are hitting the Spark quota
  2. Upgrade to the Blaze plan or enable billing so the daily cap is removed
  3. Cache frequently read documents or enable offline persistence
  4. Model your data to read fewer documents and only needed fields
firebase — error
const cache = new Map<string, { data: DocumentData; expiresAt: number }>();
async function getCachedDoc(path: string) {
const entry = cache.get(path);
if (entry && entry.expiresAt > Date.now()) {
return entry.data;
}
const snapshot = await getDoc(doc(db, path));
const data = snapshot.data() || {};
cache.set(path, { data, expiresAt: Date.now() + 60_000 }); // 60s TTL
return data;
}
Firestore: Daily read quota exceeded (50,000 reads/day on free tier)

What this error means

The error means Firestore is enforcing the Spark plan's daily document read quota (50,000 reads/day) and has reached that hard limit. Every read operation counts toward the quota, including listeners, explicit get() calls, and Cloud Functions that rehydrate data. When the counter hits 50,000 the backend returns ResourceExhausted and stops serving reads for the rest of the day; the quota resets around midnight Pacific time. Because the free tier only allows one Firestore database per Firebase project, the only way to keep serving reads beyond that point is to either throttle the workload (caching, aggregation, fewer documents per request) or upgrade the project to the Blaze (pay-as-you-go) plan and link it to a Cloud Billing account.

Typical symptoms

  • All Firestore reads fail with "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)" in client and server logs
  • Document read counters in Firebase Console > Firestore > Usage flatline at 50,000 reads/day and no additional reads succeed afterwards
  • Cloud Functions, hosting SSR builds, or APIs that hydrate Firestore data start throwing ResourceExhausted / 429 errors
  • Realtime listeners (`onSnapshot`) stop emitting updates after the quota is reached
  • New deployments or data-heavy UI states that fetch entire collections fail until the quota window resets

Common causes

  1. Project is still on the Spark free tier, so every read counts toward the 50,000 read/day quota documented in Firebase Firestore limits
  2. Chatty read patterns (looping over collections, fetching all documents on every visit, or reading inside Cloud Functions with every trigger)
  3. No caching or offline persistence, so the same documents are requested repeatedly across sessions or tabs
  4. Large queries that pull thousands of documents each time even when the UI needs only a few fields
  5. Cloud Functions, scheduled jobs, or backend cron tasks re-read the same documents every time they run

How to fix "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)"

1Inspect the Firestore usage chart and confirm you are hitting the Spark quota

Open Firebase Console → Firestore → Usage & billing and switch the chart to Document reads with the last 24‑hour window. If the line hits 50,000 and the count stops growing, the Spark plan quota is exhausted. Also inspect Project settings → Usage and billing to confirm the project is still on the Spark (free) tier, which includes exactly one Firestore database and 50,000 reads/day (see https://firebase.google.com/docs/firestore/quotas).

2Upgrade to the Blaze plan or enable billing so the daily cap is removed

In Firebase Console → Usage & billing → Manage plan, switch from Spark to Blaze and attach a Cloud Billing account. Blaze removes the 50,000/day free cap and charges per Firestore read (e.g., $0.06 per 100k reads in the U.S.), so you can serve more traffic without ResourceExhausted errors. After upgrading, create budgets/alerts in Cloud Billing so you get notified before the spend exceeds your comfort level.

3Cache frequently read documents or enable offline persistence

For repeated reads (feature flags, config, dashboards), store the last value in memory and only refetch when it expires. Example in JavaScript:

ts
const cache = new Map<string, { data: DocumentData; expiresAt: number }>();

async function getCachedDoc(path: string) {
  const entry = cache.get(path);
  if (entry && entry.expiresAt > Date.now()) {
    return entry.data;
  }

  const snapshot = await getDoc(doc(db, path));
  const data = snapshot.data() || {};
  cache.set(path, { data, expiresAt: Date.now() + 60_000 }); // 60s TTL
  return data;
}

Also enable IndexedDB persistence (call enableIndexedDbPersistence() on web clients or disk persistence on mobile) so Firestore automatically serves cached data and reduces network reads.

4Model your data to read fewer documents and only needed fields

Instead of fetching an entire collection, store pre-aggregated documents that contain the values your UI or function needs and update those summaries via Cloud Functions:

ts
exports.refreshDailyTotals = functions.firestore
  .document('orders/{orderId}')
  .onWrite(async (change, context) => {
    const db = admin.firestore();
    const summaryRef = db.doc('materialized/dailyTotals');
    await db.runTransaction(async (tx) => {
      const summary = (await tx.get(summaryRef)).data() || { reads: 0 };
      const delta = (change.after.exists ? change.after.get('amount') : 0) - (change.before.exists ? change.before.get('amount') : 0);
      tx.set(summaryRef, { reads: summary.reads + delta }, { merge: true });
    });
  });

Also use select(), limit(), and where() filters that keep the number of matched documents low.

5Monitor read volume and alert before the quota is exhausted

Create a Cloud Monitoring alert on the metric firestore.googleapis.com/document/read_count and set the threshold at ~45,000 reads for a rolling 24-hour window. Configure notifications (email, Slack, etc.) so your team can throttle traffic before Firestore responds with the quota error. You can also export Firestore usage to BigQuery or use the Firebase Usage page to look at top collections and Cloud Functions that consume reads.

Advanced notes

Quota usage resets around midnight Pacific time, so after a Spark plan project hits the 50,000 read cap it automatically recovers at the next reset window (per https://firebase.google.com/docs/firestore/quotas). However, because Spark only allows one free Firestore database per project you cannot simply create multiple databases to multiply the quota. Switching to Blaze lets you keep consuming reads (you pay per operation), and you can still rely on per-second/per-minute rate limits documented in the quotas page, so keep bursty workloads in check even after the upgrade.

Frequently asked questions

What does "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)" mean?
The error means Firestore is enforcing the Spark plan's daily document read quota (50,000 reads/day) and has reached that hard limit. Every read operation counts toward the quota, including listeners, explicit get() calls, and Cloud Functions that rehydrate data. When the counter hits 50,000 the backend returns ResourceExhausted and stops serving reads for the rest of the day; the quota resets around midnight Pacific time.
How do I fix "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)"?
The Spark (free) Firebase plan caps Firestore at 50,000 document reads per 24-hour window, so once your project consumes the allotment Firestore returns a ResourceExhausted error and blocks any further reads until the quota resets. Confirm the quota usage, upgrade to Blaze, and cut the number of reads (caching, aggregation, alerts, etc.) so you no longer burn through the free limit.
What causes "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)"?
Project is still on the Spark free tier, so every read counts toward the 50,000 read/day quota documented in Firebase Firestore limits Chatty read patterns (looping over collections, fetching all documents on every visit, or reading inside Cloud Functions with every trigger) No caching or offline persistence, so the same documents are requested repeatedly across sessions or tabs
Is the "Firestore: Daily read quota exceeded (50,000 reads/day on free tier)" error serious?
Yes. This is a high-severity error that usually blocks work until it is fixed, but the steps above resolve it.

Official resources & further reading