Firebase’s Spark (free) tier is one of the most generous on the static-hosting market, but Google’s own docs split the transfer allowance into two numbers — a 10 GB/month total and a 360 MB/day soft cap — which is why people can’t tell if their site fits. This page turns those numbers into real page views, shows how to measure your own egress, and gives the budget config that keeps Blaze from surprising you.
TL;DR
As of June 2026, the Spark plan gives you 10 GB of stored files and 10 GB/month of data transfer, with a 360 MB/day soft ceiling on top of that. Custom domains, free SSL, the global CDN, and preview channels are all included. For a content site doing under ~10,000 views/day with normal asset weight, Spark is enough indefinitely. You only need Blaze the day you add Cloud Functions, Cloud Run rewrites, or sustain traffic past the daily cap. The only “free” gotcha: stay under 360 MB on any single day, because both the daily and monthly numbers apply.
The two numbers that confuse everyone
Firebase quotes the Spark transfer allowance two ways, and both are enforced:
| Limit | Value (June 2026) | Reset | What hits it first |
|---|---|---|---|
| Storage | 10 GB total | n/a | Big media libraries, unoptimized images |
| Data transfer (monthly) | 10 GB / month | monthly | Steady traffic over the whole month |
| Data transfer (daily) | 360 MB / day | daily, midnight UTC | A single viral day |
On Spark, exceeding the limits does not bill you — it cuts you off. Hit the daily cap and Hosting returns a quota-exceeded response until midnight UTC; blow past the monthly transfer total and the site is disabled until the next month. Almost every “I went viral and got a $400 bill” story is about Cloud Functions or Firestore on Blaze, not Hosting on Spark.
Quick verdict: does Spark fit you?
You fit comfortably if all of these are true:
- Daily traffic stays under ~10,000 page views with normal asset weight.
- Total site size is under 10 GB (almost always true for content sites).
- No single day pushes transfer over 360 MB.
- You do not need rewrites to Cloud Run / Cloud Functions (those require Blaze).
- Average page weight is under ~500 KB on first visit (text + cached images + cached fonts).
- You can live with the site temporarily returning a quota error on a freak viral day.
For most indie content sites and SaaS marketing pages, that holds forever. Upgrade to Blaze the day you need Cloud Functions, Cloud Run rewrites, or expect sustained traffic past the daily cap.
Before you start
- Open the project in the Firebase Console with the current plan visible.
- Install
firebase-toolsso you can pull usage from the CLI:npm install -g firebase-tools. - Know your build output size (
du -sh dist/) before you measure anything.
Step by step
1. Measure your average page weight
Run Chrome DevTools → Network → reload, then read the bottom-bar transfer total. Or use curl to estimate the HTML plus key assets:
curl -sL -o /tmp/page.html https://yourdomain.com/articles/some-slug/
wc -c /tmp/page.html
# 45000 (45 KB HTML)
# Add the immutable cached parts (a visitor pays for these once):
curl -sIL https://yourdomain.com/_astro/index.abc123.css | grep -i content-length
curl -sIL https://yourdomain.com/_astro/main.def456.js | grep -i content-length
For a content site with hashed assets, the cached-visitor page weight is often 30-80 KB; the first-visit weight is 200-500 KB.
2. Compute your daily and monthly egress
A rough formula:
daily_MB = (first_visits * first_visit_KB + repeat_visits * cached_visit_KB) / 1024
+ sitemap_and_misc_overhead
Worked example for a 500-pageview/day blog:
first_visits = 300 * 400 KB = 120000 KB ≈ 117 MB
repeat = 200 * 60 KB = 12000 KB ≈ 12 MB
daily total ≈ 129 MB/day ← well under 360 MB/day
monthly (x30) ≈ 3.9 GB/mo ← well under 10 GB/month
Check both axes. A site that averages 200 MB/day sits fine against the daily cap but lands at ~6 GB/month — comfortable. A site that spikes to 400 MB on one day trips the daily cap even though its monthly total is tiny.
3. Check the real numbers after a week
Firebase Console → Hosting → Usage, or via CLI:
firebase hosting:sites:list
# lists your sites; the dashboard URL shows per-day bandwidth
# Or pull the Cloud Monitoring metric directly:
gcloud monitoring time-series list \
--filter='metric.type="firebasehosting.googleapis.com/network/sent_bytes_count"' \
--interval-start-time=-P7D --format=json | jq '.[].points'
4. Enable budget alerts on the project
Firebase Console → Project Settings → Usage and billing → Details & Settings → set a $1 budget with alerts at 50% / 90% / 100%. Even on Spark this is worth doing in case you upgrade later.
5. If you upgrade to Blaze, set a real cost cap
GCP Console → Budgets & alerts → Create budget. Alert thresholds stop nothing automatically — they only email you. To actually cap spend, use Google’s published “Pub/Sub topic + Cloud Function to disable billing” recipe:
# example budget-action.yaml
budget:
displayName: hosting-cap
amount:
specifiedAmount: { currencyCode: USD, units: 10 }
thresholdRules:
- thresholdPercent: 0.5
- thresholdPercent: 0.9
- thresholdPercent: 1.0
notificationsRule:
pubsubTopic: projects/your-project/topics/billing-alerts
disableDefaultIamRecipients: false
6. Audit build size before pushing big content
A quick CI guard:
TOTAL=$(du -sb dist/ | cut -f1)
LIMIT=$((10 * 1024 * 1024 * 1024)) # 10 GB
if [ "$TOTAL" -gt "$LIMIT" ]; then
echo "Build output exceeds Spark 10 GB ceiling"; exit 1
fi
7. Pre-optimize images before they hit the build
A single 2 MB hero image eats the 360 MB daily cap in about 180 visits:
# Use sharp via a Node script or astro-imagetools
npx sharp-cli --input "public/raw/**/*.{jpg,png}" \
--output "public/img/" \
--resize 1600 \
--format webp \
--quality 82
What Blaze actually costs for Hosting
The fear of an open-ended bill keeps people on Spark longer than they need to be. The Hosting line item on Blaze is small. As of June 2026:
| Resource | Free allowance (Blaze) | Overage rate |
|---|---|---|
| Storage | 10 GB | $0.026 / GB |
| Data transfer | 10 GB / month | $0.15 / GB |
The free monthly allowance on Blaze (10 GB transfer) is the same headline number as Spark, so moving to Blaze for the Hosting product alone changes nothing about your bill until you cross 10 GB/month. A site serving 30 GB/month of egress pays for the 20 GB over the allowance: 20 × $0.15 = $3.00/month. The danger on Blaze is never Hosting — it is forgetting that Cloud Functions, Firestore, and Cloud Run on the same project now bill on usage.
Implementation checklist
- Build output size measured with
du -sh dist/— well under 10 GB. - Average page weight measured for both first-visit and cached-visit.
- Daily egress estimate under 50% of 360 MB, and monthly under 50% of 10 GB.
- Budget alerts configured even on Spark.
- Image pipeline produces compressed
.webp/.aviffor hero assets.
After-launch verification
- After 7 days, Firebase Console → Hosting → Usage matches your estimate within ~25%.
- No “Quota exceeded” events in the project log.
- Budget alert emails arrive when you simulate a 50% threshold.
Common pitfalls
- Confusing Hosting bandwidth with Firestore / Functions bandwidth — they bill separately.
- Watching only the monthly total and missing the 360 MB/day cap. A modest monthly footprint can still trip the daily limit on a spike.
- Heavy unoptimized images chewing through the daily quota in hours.
- Adding rewrites to Cloud Functions while still on Spark — those calls fail because Functions require Blaze. Detection: 500 errors on the rewritten path.
- Hot-linking large videos from the bundle instead of YouTube/Vimeo. Video is the fastest way to blow the cap.
- Forgetting that preview channels and all sites share the same project-level quota — Firebase counts transfer per project, not per site or per channel.
FAQ
- What happens if I exceed the free quota on Spark?: Hit the 360 MB/day cap and the site returns a quota-exceeded response until midnight UTC. Exceed the 10 GB/month transfer total and the site is disabled until the next month. Neither auto-bills you — Spark cuts off rather than charging.
- Does the free tier include custom domains and SSL?: Yes. Custom domains, automatic free SSL certificates (Spark uses the GROUPED certificate type), and the global CDN are all included on Spark at no cost.
- Does the free tier include preview channels?: Yes, including the unique preview URLs. They share the same project-level storage and transfer quota as your live site.
- Is the limit 360 MB/day or 10 GB/month?: Both, and both are enforced. The daily cap protects against a single viral day; the monthly total covers steady traffic. You stay free only if you respect both.
- When should I upgrade to Blaze?: The moment you need Cloud Functions or Cloud Run rewrites, or when sustained traffic pushes you past the daily cap. Blaze is pay-as-you-go and the Hosting line item is cheap.
- What does the Hosting line item cost on Blaze?: Transfer is $0.15/GB after a 10 GB/month free allowance; storage is $0.026/GB after 10 GB free. A site doing under 10 GB/month of egress stays inside the free allowance, so the Hosting cost is effectively $0.