Firebase Hosting free tier: what you actually get

The Firebase Spark free tier in 2026 gives 10 GB storage + 360 MB/day egress. Use this page-weight math, budget config, and asset checklist to know if you fit.

Firebase’s Spark (free) tier is one of the most generous on the static-hosting market, but Google’s phrasing leaves people unsure whether their site will fit. This article translates the numbers into real-world page views, shows how to measure your own, and gives the budget-cap config that prevents Blaze from surprising you.

Background

The Spark plan gives you 10 GB of stored files and 360 MB of egress per day, free. Egress resets daily, not monthly. Most “I went viral and got a $400 bill” stories are about Cloud Functions or Firestore, not Hosting. Hosting itself has a hard ceiling on Spark — once the daily egress is hit, the site returns a quota-exceeded response until midnight UTC.

How to tell

  • Your daily traffic is under ~10k page views with average asset weight.
  • Your site’s total size is under 10 GB (almost always true for content sites).
  • You do not need custom rewrites to Cloud Run / Functions billed under Blaze.
  • You are fine with the site temporarily returning a quota error on a viral day.
  • Your average page weight is under ~500 KB (text + cached images + cached fonts).

Quick verdict

For most indie content sites and SaaS marketing pages, Spark is enough indefinitely. Upgrade to Blaze the day you need Cloud Functions, Cloud Run rewrites, or expect traffic spikes that exceed 360 MB/day.

Before you start

  • Have the project open in Firebase Console with the current plan visible.
  • Install firebase-tools so you can pull usage via CLI.
  • Know your build output directory size (du -sh dist/) before measuring.

Step by step

  1. Measure your average page weight. Run Chrome DevTools → Network → reload, then read the bottom-bar total. Or use curl to estimate just the HTML + key assets:
curl -sL -o /tmp/page.html https://yourdomain.com/articles/some-slug/
wc -c /tmp/page.html
# 45000  (45 KB HTML)

# Add up the immutable cached parts (only paid the first time per visitor):
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.

  1. Compute daily 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
total                         ≈ 129 MB/day  ← well within 360 MB
  1. Check the real numbers after a week. Firebase Console → Hosting → Usage, or via CLI:
firebase hosting:sites:list
# pulls site list + per-day bandwidth in the dashboard URL

# 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'
  1. 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.

  2. If you decide to upgrade to Blaze, set a daily cost cap. GCP Console → Budgets & alerts → Create budget. The “Alert thresholds” stop nothing automatically, but they email you. To actually cap, use the “Pub/Sub topic + Cloud Function to disable billing” recipe Google publishes:

# 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
  1. Audit asset weight before pushing big content. Quick CI check:
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
  1. Pre-optimize images before they hit the build. A 2 MB hero image will eat the Spark budget in 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

Implementation checklist

  • Build output size measured with du -sh dist/ — well under 10 GB.
  • Average page weight measured for first-visit and cached-visit.
  • Daily egress estimate is under 50% of 360 MB (room for spikes).
  • Budget alerts configured even on Spark.
  • Image pipeline produces compressed .webp / .avif for 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 are billed separately.
  • Forgetting that egress resets daily, not monthly — one viral day will not consume your “month”.
  • Heavy unoptimized images chewing through the 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. Videos are the fastest way to blow Spark.
  • Forgetting that preview channels count against the same quota.

FAQ

  • What happens if I exceed the free quota?: On Spark, the site returns a quota-exceeded response until daily reset (midnight UTC). It does not auto-bill.
  • Does the free tier include custom domains and SSL?: Yes. Custom domains and free SSL are included on Spark with no extra cost.
  • Does the free tier include preview channels?: Yes, including the unique preview URLs. They count against the same storage / egress quota.
  • When should I upgrade to Blaze?: The moment you need Cloud Functions or expect more than ~10k daily views. Blaze is pay-as-you-go and the Hosting price is cheap.
  • What does the Hosting line item cost on Blaze?: Roughly $0.026/GB after the 360 MB/day free allotment. A site doing 10 GB/month of egress costs about $0.25.

Tags: #Indie dev #Firebase #Hosting #Monetization