When I show site owners their real logs, the most common insight sounds like: “Up to 35–60% of our requests are bots”. According to industry reports and the practice of BUSINESS SITE, on a large e‑commerce site Googlebot can generate up to a third of all hits on the origin, sometimes creating more load than live users. This affects the crawl budget, indexing speed and even the load on payment and delivery systems (for example, integrations with PrivatBank/Monobank or “Nova Poshta”). Logging Googlebot requests gives an accurate picture: how to understand the site’s crawl frequency, where the crawl budget goes and where bottlenecks appear.
I consider logs as the financial statements of SEO. They provide a convenient basis for calculating metrics: requests per day, unique URLs, crawl frequency per page, shares of 4xx/5xx and the average interval between crawls (average time between crawls). These indicators allow linking technical events to business results: an increase in the share of 5xx and 429 predictably reduces the crawl rate and slows indexing, which is reflected in visibility and sales. Where the BUSINESS SITE team implemented systematic log analysis, the indexing speed of new product pages and categories increased by 25–70%, and the increase in organic conversion was already measured in revenue.
For engineering discipline it is important to standardize the access log (access log). A minimally useful set of fields: timestamp, IP, method, path, status, user-agent, referrer, response_time, X-Forwarded-For. Such a combined log format is suitable for calculating KPIs for SEO and SRE: from the metric of requests per day to segmentation by user-agent and diagnosing the CDN’s impact on logging. A transparent log is the foundation on which crawl budget analysis and correct indexing decisions are built.
Logging Googlebot on Nginx and Apache

Before calculating the frequency, I always ask the team to normalize the access.log format, add X-Real-IP/X-Forwarded-For and time-taken (request_time). This allows accounting for proxies, load balancers and CDNs, and correctly separating Googlebot smartphone from desktop.
Filtering Googlebot in Nginx configuration
Example:
log_format bots_combined '$remote_addr - $host [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time '
'xff="$http_x_forwarded_for"';
map $http_user_agent $is_googlebot {
default 0;
~*(Googlebot|Googlebot-Image|Googlebot-Video) 1;
}
access_log /var/log/nginx/access.log bots_combined;
access_log /var/log/nginx/googlebot.log bots_combined if=$is_googlebot;
Separating by device is convenient to do with an additional map: for lines containing “Googlebot/2.1; +http://www.google.com/bot.html” and the marker “Mobile”: that’s Googlebot smartphone; for desktop, the absence of “Mobile”. This approach speeds up analysis when we look at how logging Googlebot smartphone versus desktop affects the reindexing speed of mobile pages.
access_log configuration and Apache modules
In Apache I use CustomLog with an explicit user-agent and processing time. For virtual hosts it’s convenient to create a separate Googlebot log to avoid overloading the main stream:
LogFormat "%h %v %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" rt=%D xff=\"%{X-Forwarded-For}i\"" vhost_combined
CustomLog logs/access_log vhost_combined
SetEnvIfNoCase User-Agent "Googlebot" is_googlebot
CustomLog logs/googlebot_access_log vhost_combined env=is_googlebot
Logs: CDN, load balancers, reverse proxy
How to filter Googlebot requests

This pipeline separates the real Googlebot from fake crawlers that copy the user-agent string.
In traffic through proxies and CDNs I analyze X-Forwarded-For and the origin of subnets. If the source is suspicious, requests go into a quarantine index – it’s convenient to tag them with the flag suspicious_bot. I also separate Googlebot smartphone and desktop by markers in the user-agent, which helps to more accurately understand which page templates the mobile bot sees and how it consumes the crawl budget.
Log parsing: Logstash and BigQuery

In our experience, the optimal architecture depends on scale. For sites up to a few million hits per day, GoAccess and batch parsing with Python (pandas) work excellently. For high-load projects, the BUSINESS SITE team recommends Logstash/Fluentd with export to Elasticsearch or streaming delivery to BigQuery, and for long-term storage – Parquet in S3 or GCS.
How to calculate Googlebot crawl frequency

Metrics I use on projects:
- Crawl rate: requests/day from verified Googlebot (by ASN and PTR).
- Average interval between page crawls: avg(diff(timestamp) per URL).
- Unique URLs/day: the number of unique paths the bot visited in a day.
- Statuses: proportions of 2xx/3xx/4xx/5xx, share of 304, average TTFB for the bot.
Step-by-step method: I aggregate by IP and user-agent, keep only verified requests → group by URL → calculate intervals between adjacent hits → average them. For CDN and cache I take 304 (Not Modified) into account: it’s useful to count repeated conditional requests separately to understand how caching and ETag/Last‑Modified work. If the goal is to understand Googlebot’s crawl frequency at the section level, I add a breakdown by directories /category/, /product/ and by template types.
SQL/BigQuery scripts for crawl analysis

In BigQuery, aggregation by user-agent and dates looks like this:
-- Requests per day and unique URLs from verified Googlebot
SELECT
DATE(timestamp) AS d,
COUNT(1) AS requests,
COUNT(DISTINCT path) AS unique_urls,
SUM(CASE WHEN status BETWEEN 500 AND 599 THEN 1 ELSE 0 END) AS err_5xx,
SUM(CASE WHEN status = 304 THEN 1 ELSE 0 END) AS hits_304
FROM `project.logs.googlebot`
WHERE is_googlebot_verified = TRUE
GROUP BY d
ORDER BY d DESC;
To calculate intervals between crawls of a specific URL:
WITH hits AS (
SELECT path, timestamp
FROM `project.logs.googlebot`
WHERE is_googlebot_verified = TRUE
),
seq AS (
SELECT
path,
timestamp,
LAG(timestamp) OVER (PARTITION BY path ORDER BY timestamp) AS prev_ts
FROM hits
)
SELECT
path,
AVG(TIMESTAMP_DIFF(timestamp, prev_ts, SECOND)) AS avg_interval_sec
FROM seq
WHERE prev_ts IS NOT NULL
GROUP BY path
ORDER BY avg_interval_sec ASC
LIMIT 100;
A quick Python script using pandas to calculate crawl rate and visualize series:
import pandas as pd
df = pd.read_parquet('googlebot.parquet')
df = df[df['is_googlebot_verified'] == True]
df['date'] = df['timestamp'].dt.date
daily = (df.groupby('date')
.agg(requests=('path','count'),
unique_urls=('path','nunique'),
err_5xx=('status', lambda s: (s.between(500,599)).sum()))
.reset_index())
# Rolling average to smooth spikes
daily['requests_ma7'] = daily['requests'].rolling(7, min_periods=1).mean()
Correlation of logs with Search Console and the API
Through the Search Console API it’s convenient to automate collecting indexing and click data, and to use the URL Inspection API for selective checks of page status. In BUSINESS SITE projects we build joins of logs with GSC data in BigQuery, note the dates of robots.txt edits, sitemap.xml updates and changes to crawl rate settings (where the parameter is available only in a limited way), and see how this is reflected in bot traffic.
Analysis of crawling patterns
For behavioral analysis I build time series and work with rolling average and the median, then apply ARIMA or Prophet models to detect spikes. Typical anomalies: sharp peaks on sections, long pauses on important URLs, increase in 5xx/429. If a bot starts visiting filter pages more often, that’s a signal to revisit URL parameters and internal linking.
Alerts help respond in time. I configure thresholds in Grafana or Datadog: for example, an increase in 5xx > 1% of Googlebot requests over 15 minutes or a jump in requests of >50% over the 7‑day average. Elasticsearch Watcher and Kibana are also suitable for notifications to Slack and e‑mail.
Logs and errors: crawling and indexing
Googlebot’s crawl frequency is sensitive to the quality of responses. An increase in the share of 5xx and 503 responses leads to a reduced crawl rate, and 429 signals the bot to slow down. In the case of one media site we saw how a cluster change caused an increase in TTFB and the share of 5xx; after optimizing the cache and the database the average interval between crawls of top articles was cut in half.
Release control and post-deploy monitoring via checklists reduce the risk of an indexing failure during peak hours.
Crawl budget for large sites and ROI
Tactics that deliver measurable impact:
- Sitemap.xml: prioritizing important sections, fixing 404/301s, quick submission of new product pages and categories.
- Internal linking and crawlability: short click distances to money pages (LTV/ROI higher).
- Canonical/noindex, removing duplicates and URL parameters that don’t create additional value.
- Performance: reducing TTFB, predictable 200 responses, JavaScript rendering/dynamic rendering where it pays off.
Measuring ROI relies on two axes: speeding up indexing of priority pages and reducing load on infrastructure. In one online electronics store, after decomposing the sitemap and cleaning up duplicates, Googlebot redistributed crawl budget in favor of categories and product pages with high-margin SKUs, and the time to reach top positions for keywords decreased by weeks.
Bot detection, log security, GDPR
Spoofing detection is built on PTR verification, checking ASN 15169 and analyzing IP ranges. It’s convenient to tag suspicious sources, apply rate limits and track them in a separate log. WAF rules and CAPTCHAs are not related to users, but they protect against fake crawlers that impersonate Googlebot.
Scaling logs and analytics
Enterprise-grade architecture is usually three-tier: a hot tier (Elasticsearch for operational diagnostics), a warm tier (BigQuery/Snowflake for ad-hoc analytics) and a cold tier (S3/GCS in Parquet/Avro). Partitioning by date and sharding by domain speed up queries and simplify retention.
In BUSINESS SITE projects I automate deployment of ELK/EFK stacks and BigQuery pipelines via Terraform/Ansible. Infrastructure version control and declarative configs simplify environment migration and accelerate recovery after failures. Such a foundation scales with business growth and withstands seasonal spikes, for example sales or the high tourist season.
Case studies and Googlebot crawl audits
The audit methodology is universal: collection → filtering → analysis → hypotheses → A/B testing of changes and monitoring. First I verify the authenticity of Googlebot, then calculate metrics and build breakdowns by page type, status, and time. After that I form hypotheses: where crawl budget is being lost, which sections need prioritization.
Common findings: in e‑commerce the bot spends budget on pagination and combinations of parameters; in SaaS – on dynamic routes without value; in media – on duplicates and archives. Solutions include managing the sitemap, internal linking, canonical/noindex and parameter cleanup. Post-release control includes a monitoring checklist, reversible feature flags and fast rollback procedures, which the BUSINESS SITE team has honed on projects in pharmaceuticals, finance and online retail.
Dashboards in Kibana, Grafana, BigQuery
For the business it’s important to see the picture without SQL. I build dashboards: crawl frequency over time, top URLs by request count, hotspots for 4xx/5xx, breakdown by devices (Googlebot smartphone/desktop), TTFB and 304. In Kibana it’s convenient to build line charts and heatmaps, and then export to CSV for quick communication with marketing. In Grafana: set up alerts and thresholds, for example “>2% 5xx from Googlebot over 10 minutes”.
A separate panel – an example visualization of crawl frequency in Kibana: the metric “requests per 15m” with a 7-day moving average. Such a chart clearly shows Googlebot peak crawls and the effect of changes to robots.txt or sitemap.xml a few hours after deployment.
Frequently Asked Questions and Answers
- How can you quickly tell if Googlebot’s crawl rate has increased and whether to worry?
I compare daily and hourly metrics in the logs, check the Crawl stats tab in Search Console and immediately check the share of 5xx/429. If the increase in requests is accompanied by stable 200s and low TTFB, the situation is healthy; if errors are rising at the same time, you should adjust limits and caching. - Is filtering by user-agent sufficient to identify Googlebot?
For reliability it’s recommended to perform verification: reverse DNS lookup, PTR to Google domains, reverse IP check and ASN 15169 matching. This sequence prevents user-agent spoofing of Googlebot and keeps analytics clean. - How to reduce Googlebot load without hurting indexing?
Helpful measures include optimizing the sitemap (prioritizing important sections), caching and stable 200s, robots rules for meaningless parameters and selective noindex for pages without value. This approach keeps the crawl budget focused on key pages and maintains a steady indexing rate. - What is the benefit of correlating logs with Search Console?
It shows how actual crawls translate into indexing and clicks, and explains discrepancies due to CDNs, sharding or delays. Integrating logs with the Search Console API for correlation helps quickly verify the effect of robots.txt and sitemap changes in numbers. - How to store logs economically and securely?
I recommend a clear retention policy: hot data in Elasticsearch for 7–14 days, warm in BigQuery for 3–6 months, cold in S3/GCS up to a year in Parquet.
IP anonymization and access restriction support GDPR compliance and reduce risks.
Conclusion, practical steps and CTA
Systematic logging of Googlebot requests is a way to control crawl budget and achieve predictable indexing. In my experience, companies that can see their logs find bottlenecks faster, plan priorities more accurately, and obtain measurable ROI from SEO: they drive traffic to profitable pages faster and save infrastructure resources.
30/60/90-day plan:
- 30 days: standardize the access log (timestamp, IP, path, status, user-agent, response_time, X‑Forwarded‑For), enable a separate log for bots, collect the first metrics summary and a basic dashboard.
- 60 days: implement Googlebot verification (PTR/ASN), set up ETL into BigQuery or Elasticsearch, build alerts for 5xx/429 and anomalies, conduct an audit of robots.txt and sitemap.xml.
- 90 days: optimize internal linking structure and URL parameters, implement release control and post-deploy monitoring, evaluate the ROI of crawl budget optimization based on indexing and sales.
The BUSINESS SITE team has prepared a checklist, configuration templates and starter scripts for analysis. I invite you to a consultative audit: we’ll analyze your logs, verify Googlebot, set priorities, and assemble a clear dashboard for the executive and the marketer.
Additional materials
- Ready-made templates:
- Nginx & Apache log format with request_time, upstream_response_time, X‑Forwarded‑For.
- BigQuery schemas for Googlebot access logs with partitioning.
- Example Python pipeline using pandas to calculate crawl rate and export to Parquet/Avro.
- Storage recommendations:
- S3/GCS as a cold layer with ZSTD/Snappy compression; lifecycle policies for automatic transition to Glacier/Archive.
- Retention policy: 14 days hot, 90 days warm, 6–12 months cold – taking into account log storage costs and analytics needs.
- Tools:
- Logstash/Fluentd for streaming, GoAccess for quick inspection, Elasticsearch + Kibana stack for visualization, Grafana and Datadog for alerts.
- Screaming Frog and Sitebulb for combined analysis alongside logs, google search console API for automating reports.
- Storage: BigQuery for logs, S3, GCS; support for parsing large logs into Parquet/Avro.










