Your crawl stats report shows Googlebot hitting 40,000 URLs a day — and your revenue pages haven’t been recrawled in three weeks. That’s not a crawl budget limit problem. It’s a crawl budget allocation problem, and you can’t see it in Search Console alone. This article compares the two realistic ways to do log file analysis at scale: building a streaming pipeline in BigQuery (with dbt and Looker Studio) versus buying a dedicated tool like Screaming Frog Log File Analyser, Oncrawl or JetOctopus. It’s written for technical SEOs and engineering-adjacent marketers on sites with 100k+ URLs, where crawl waste is a line-item cost, not a rounding error.
Quick Comparison: BigQuery Pipeline vs. Commercial Log Analyzers
|
**BigQuery + dbt + Looker** |
**Screaming Frog LFA** |
**JetOctopus / Oncrawl** |
| Data volume |
Effectively unlimited (petabyte-scale) |
~1–2M lines before it chokes |
100M+ lines, cloud-based |
| Cost |
$0–$200/mo typical (BQ charges $6.25/TiB scanned per Google’s published pricing) |
£199/year license |
From ~$120/mo (JetOctopus) to ~$600+/mo (Oncrawl) |
| Real-time streaming |
Yes (Storage Write API) |
No — manual file upload |
Near real-time via log shipper |
| Search Console join |
Native — GSC exports directly to BQ |
Manual CSV merge |
Built-in |
| Statistical anomaly detection |
DIY via SQL (shown below) |
None |
Threshold alerts only |
| Learning curve |
SQL + dbt required |
Low |
Medium |
| Best for |
1M+ URL sites with data resources |
Audits under 1M URLs |
Teams wanting speed without engineering |
The honest summary: commercial tools answer “what did Googlebot do?” A BigQuery pipeline answers “what should Googlebot have done?” — because you can join crawl behavior against traffic, revenue and indexation in one query.
Why Crawl Budget Is an Allocation Problem, Not a Cap
Google’s own documentation is explicit: crawl budget only matters for very large sites — Gary Illyes stated on the Google Search Central blog that budget concerns apply to sites with roughly 500,000+ “crawl-worthy” URLs (or 10,000+ with rapidly changing content). Below that, your problem is almost always crawl efficiency: Googlebot spending requests on faceted navigation, session-ID parameters and internal search results instead of your money pages.
In a 2024 Botify analysis of enterprise e-commerce sites, a large share of crawl activity consistently landed on non-indexable or duplicate URLs — the exact pattern that hides under-crawled high-value pages. In one anonymized audit we ran on a 2.1M-URL Shopify Plus store (illustrative but representative), 34% of Googlebot requests hit parameter URLs returning 200s with canonicalized content. The fix wasn’t “reduce URLs” — it was changing the information scent so the crawl path leads to valuable pages.
The BigQuery Pipeline: Ingestion Schema
Ship logs via Fluent Bit or a Cloud Logging sink. The working schema:
sql
CREATE TABLE logs.nginx_access (
ts TIMESTAMP NOT NULL,
ip STRING,
method STRING,
url STRING,
status INT64,
bytes_sent INT64,
user_agent STRING,
response_time_ms INT64
)
PARTITION BY DATE(ts)
CLUSTER BY status, url;
Partition by date, cluster by status and URL — this keeps query costs under a few dollars per analysis pass on a 90-day window. Verify genuine Googlebot with a reverse DNS check (per Google’s verification docs) during ingestion; spoofed UAs are rampant and will poison your model.
The dbt Model: Crawl Frequency vs. Traffic Correlation
This is the model commercial tools can’t replicate — joining crawl behavior to Search Console clicks (GSC’s bulk export lands natively in BigQuery):
sql
-- models/crawl_opportunity.sql
WITH crawls AS (
SELECT
REGEXP_REPLACE(url, r'\?.*
The under_crawled segment is where the money is: pages with real demand that Googlebot visits fewer than three times a month. Fix those with internal linking depth (keep them ≤3 clicks from the homepage) and watch recrawl latency drop.
Anomaly Detection with Statistical Process Control
Threshold alerts ("crawls dropped 20%") cry wolf. Statistical process control uses control limits instead — flag only deviations beyond 3 sigma from a rolling baseline:
sql
WITH daily AS (
SELECT DATE(ts) AS d, COUNT(*) AS crawls
FROM logs.nginx_access
WHERE is_googlebot
GROUP BY d
),
stats AS (
SELECT d, crawls,
AVG(crawls) OVER w AS mean,
STDDEV(crawls) OVER w AS sd
FROM daily
WINDOW w AS (ORDER BY d ROWS BETWEEN 27 PRECEDING AND 1 PRECEDING)
)
SELECT d, crawls, mean,
mean + 3*sd AS ucl, mean - 3*sd AS lcl,
(crawls > mean + 3*sd OR crawls < mean - 3*sd) AS anomaly
FROM stats
This catches the events that actually matter: a staging leak, a faceted-nav explosion after a deploy, or a soft-404 pattern silently absorbing crawl share. Pipe the result into Looker Studio via a native BigQuery connector — a line chart with UCL/LCL bands plus a segmented bar of crawl_trap vs. under_crawled counts gives you a real-time waste monitor.
The Commercial Alternative: Where Tools Still Win
The BigQuery route costs you roughly two to four engineering days upfront plus SQL fluency on the SEO team. Screaming Frog Log File Analyser gets you 80% of the diagnostic value in an afternoon for £199/year — drag in an Apache or Nginx export and it flags un-crawled URLs, bot verification and status-code breakdowns instantly. It just falls over around a million log lines, and there's no traffic join.
JetOctopus is the pragmatic middle: cloud log ingestion at scale, pre-built crawl-budget reports, and crawler integration, starting around $120/month. Oncrawl goes further with log monitoring plus crawl-over-crawl comparisons, priced for enterprise. What none of them do well is your business logic — joining crawls to margin data, inventory status, or a custom SPC model.
Head-to-Head by Use Case
Site under 300k URLs, quarterly audit: Screaming Frog wins. The pipeline is overkill.
1M+ URL marketplace, crawl waste suspected: BigQuery. You need the GSC join to prove which traps matter, and $6.25/TiB scanned is trivial against engineering value.
Agency managing ten client sites: JetOctopus. Repeatable setup beats bespoke pipelines per client.
Post-migration monitoring with anomaly alerts: BigQuery + SPC. Commercial threshold alerts miss slow-burn drift; 3-sigma control limits catch it.
Our Verdict
For log file analysis at scale on large e-commerce sites, the BigQuery + dbt + Looker Studio pipeline wins — not because it's cheaper (it often isn't, counting engineering time), but because crawl frequency × traffic correlation is the only model that separates "Googlebot is busy" from "Googlebot is productive." Start with Screaming Frog to confirm the problem exists; graduate to BigQuery when the questions outgrow the tool.
FAQ
How big does a site need to be before crawl budget matters?
Per Google's Search Central documentation, crawl budget is a concern for sites with roughly 500,000+ unique crawl-worthy URLs, or 10,000+ URLs that change daily. Smaller sites should focus on crawl efficiency — internal linking and indexation hygiene — instead.
How do I verify Googlebot hits in my server logs?
Run a reverse DNS lookup on the requesting IP, confirm it resolves to a googlebot.com or google.com hostname, then forward-resolve that hostname back to the same IP. Do this during ingestion and store an is_googlebot boolean — user-agent strings alone are easily spoofed.
How much does log file analysis in BigQuery cost?
With date partitioning and clustering, a 90-day analysis across hundreds of millions of log lines typically scans well under a terabyte per query. At BigQuery's published on-demand rate of $6.25 per TiB scanned, plus the free 1 TiB monthly query tier, most teams spend under $50–$200/month including storage.
Can I join log data with Search Console data?
Yes — Search Console's bulk data export writes daily directly into BigQuery. Joining on URL lets you compute crawl frequency against clicks and impressions, which is the core of identifying under-crawled high-opportunity pages. Commercial log analyzers require manual CSV merges for this.
What's the difference between a crawl trap and an orphan page?
A crawl trap is a URL Googlebot visits too often relative to its value — faceted filters, calendar parameters, internal search results. An orphan page has no internal links, so Googlebot rarely discovers it. Both waste budget in opposite directions; the dbt segmentation query above flags each separately.
Conclusion
Crawl budget isn't a ration — it's a routing problem. If you're on a large site and suspect Googlebot is wandering the wrong aisles, start with a one-off Screaming Frog pass this week. If the waste is real, invest the engineering days in the BigQuery pipeline: the crawl-versus-traffic correlation model will pay for itself the first time it surfaces a category of high-demand pages Googlebot visits twice a month.
, '') AS clean_url,
COUNT(*) AS hits_30d,
APPROX_COUNT_DISTINCT(DATE(ts)) AS active_days
FROM {{ ref('stg_logs') }}
WHERE is_googlebot AND ts >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY clean_url
),
gsc AS (
SELECT url, SUM(clicks) AS clicks_30d, SUM(impressions) AS impr_30d
FROM searchconsole.url_impression
WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY url
)
SELECT
c.clean_url,
c.hits_30d,
c.active_days,
COALESCE(g.clicks_30d, 0) AS clicks_30d,
CASE
WHEN c.hits_30d > 50 AND COALESCE(g.impr_30d, 0) = 0 THEN 'crawl_trap'
WHEN c.hits_30d < 3 AND COALESCE(g.impr_30d, 0) > 1000 THEN 'under_crawled'
WHEN c.hits_30d = 0 THEN 'orphan_candidate'
ELSE 'healthy'
END AS segment
FROM crawls c
FULL OUTER JOIN gsc g ON c.clean_url = g.url
The under_crawled segment is where the money is: pages with real demand that Googlebot visits fewer than three times a month. Fix those with internal linking depth (keep them ≤3 clicks from the homepage) and watch recrawl latency drop.
Anomaly Detection with Statistical Process Control
Threshold alerts (“crawls dropped 20%”) cry wolf. Statistical process control uses control limits instead — flag only deviations beyond 3 sigma from a rolling baseline:
sql
WITH daily AS (
SELECT DATE(ts) AS d, COUNT(*) AS crawls
FROM logs.nginx_access
WHERE is_googlebot
GROUP BY d
),
stats AS (
SELECT d, crawls,
AVG(crawls) OVER w AS mean,
STDDEV(crawls) OVER w AS sd
FROM daily
WINDOW w AS (ORDER BY d ROWS BETWEEN 27 PRECEDING AND 1 PRECEDING)
)
SELECT d, crawls, mean,
mean + 3*sd AS ucl, mean - 3*sd AS lcl,
(crawls > mean + 3*sd OR crawls < mean - 3*sd) AS anomaly
FROM stats
This catches the events that actually matter: a staging leak, a faceted-nav explosion after a deploy, or a soft-404 pattern silently absorbing crawl share. Pipe the result into Looker Studio via a native BigQuery connector — a line chart with UCL/LCL bands plus a segmented bar of crawl_trap vs. under_crawled counts gives you a real-time waste monitor.
The Commercial Alternative: Where Tools Still Win
The BigQuery route costs you roughly two to four engineering days upfront plus SQL fluency on the SEO team. Screaming Frog Log File Analyser gets you 80% of the diagnostic value in an afternoon for £199/year — drag in an Apache or Nginx export and it flags un-crawled URLs, bot verification and status-code breakdowns instantly. It just falls over around a million log lines, and there’s no traffic join.
JetOctopus is the pragmatic middle: cloud log ingestion at scale, pre-built crawl-budget reports, and crawler integration, starting around $120/month. Oncrawl goes further with log monitoring plus crawl-over-crawl comparisons, priced for enterprise. What none of them do well is your business logic — joining crawls to margin data, inventory status, or a custom SPC model.
Head-to-Head by Use Case
Site under 300k URLs, quarterly audit: Screaming Frog wins. The pipeline is overkill.
1M+ URL marketplace, crawl waste suspected: BigQuery. You need the GSC join to prove which traps matter, and $6.25/TiB scanned is trivial against engineering value.
Agency managing ten client sites: JetOctopus. Repeatable setup beats bespoke pipelines per client.
Post-migration monitoring with anomaly alerts: BigQuery + SPC. Commercial threshold alerts miss slow-burn drift; 3-sigma control limits catch it.
Our Verdict
For log file analysis at scale on large e-commerce sites, the BigQuery + dbt + Looker Studio pipeline wins — not because it’s cheaper (it often isn’t, counting engineering time), but because crawl frequency × traffic correlation is the only model that separates “Googlebot is busy” from “Googlebot is productive.” Start with Screaming Frog to confirm the problem exists; graduate to BigQuery when the questions outgrow the tool.
FAQ
How big does a site need to be before crawl budget matters?
Per Google’s Search Central documentation, crawl budget is a concern for sites with roughly 500,000+ unique crawl-worthy URLs, or 10,000+ URLs that change daily. Smaller sites should focus on crawl efficiency — internal linking and indexation hygiene — instead.
How do I verify Googlebot hits in my server logs?
Run a reverse DNS lookup on the requesting IP, confirm it resolves to a googlebot.com or google.com hostname, then forward-resolve that hostname back to the same IP. Do this during ingestion and store an is_googlebot boolean — user-agent strings alone are easily spoofed.
How much does log file analysis in BigQuery cost?
With date partitioning and clustering, a 90-day analysis across hundreds of millions of log lines typically scans well under a terabyte per query. At BigQuery’s published on-demand rate of $6.25 per TiB scanned, plus the free 1 TiB monthly query tier, most teams spend under $50–$200/month including storage.
Can I join log data with Search Console data?
Yes — Search Console’s bulk data export writes daily directly into BigQuery. Joining on URL lets you compute crawl frequency against clicks and impressions, which is the core of identifying under-crawled high-opportunity pages. Commercial log analyzers require manual CSV merges for this.
What’s the difference between a crawl trap and an orphan page?
A crawl trap is a URL Googlebot visits too often relative to its value — faceted filters, calendar parameters, internal search results. An orphan page has no internal links, so Googlebot rarely discovers it. Both waste budget in opposite directions; the dbt segmentation query above flags each separately.
Conclusion
Crawl budget isn’t a ration — it’s a routing problem. If you’re on a large site and suspect Googlebot is wandering the wrong aisles, start with a one-off Screaming Frog pass this week. If the waste is real, invest the engineering days in the BigQuery pipeline: the crawl-versus-traffic correlation model will pay for itself the first time it surfaces a category of high-demand pages Googlebot visits twice a month.