Firestore charges per operation — reads, writes, and deletes. The free tier is generous for small apps. The traps emerge at scale. Here's everything you need to know to predict your Firestore bill.
Daily limits reset at midnight Pacific Time. Storage and egress limits are monthly.
50,000 reads per day sounds like a lot. Whether it's enough depends entirely on how your app is structured. Here are three real examples:
| Operation | Spark free tier | Blaze — price beyond free tier |
|---|---|---|
| Document reads | 50,000 / day | $0.06 per 100,000 reads |
| Document writes | 20,000 / day | $0.18 per 100,000 writes |
| Document deletes | 20,000 / day | $0.02 per 100,000 deletes |
| Storage | 1 GiB | $0.18 per GiB / month |
| Network egress | 10 GB / month (shared) | $0.12 / GB (after 10 GB free) |
Source: firebase.google.com/pricing · Verified April 2026 · Prices may vary by GCP region (above are default multi-region)
The most common cause of unexpected Firestore bills is a real-time listener attached to a large collection. Here's how the numbers escalate faster than most developers expect:
A collection of 5,000 documents with a real-time listener. Each time any document in the collection changes, Firestore re-delivers all changed documents. With 10 writes per minute: 5,000 affected reads × 10 writes/minute × 60 minutes/hour = 3,000,000 reads/hour. The entire daily free tier consumed every minute.
Here's the difference between an expensive pattern and an efficient one:
// Listens to ALL documents in the
// collection. Every write triggers
// a re-read of every document.
const unsub = db
.collection("messages")
.onSnapshot(snapshot => {
// snapshot contains ALL docs
renderMessages(snapshot.docs);
});// Listens only to messages after
// a timestamp. Reads scale with
// new messages, not collection size.
const unsub = db
.collection("messages")
.where("createdAt", ">", lastRead)
.orderBy("createdAt")
.onSnapshot(snapshot => {
appendMessages(snapshot.docs);
});Only the first Firestore database in a project qualifies for the free tier quota. If you create additional databases — a Blaze-only feature — those are billed at pay-as-you-go rates from the very first operation with no free tier applied.