Rank Tracking & SEO Audits
Track keyword rankings and run technical audits to find issues.
Two ongoing habits keep SEO healthy: tracking rankings and auditing the site.
Rank tracking
Rank trackers (Ahrefs, Semrush, and others) monitor your positions for target keywords over time, across devices and locations. They show progress and reveal wins and drops.
SEO audits
An audit is a systematic health check. Crawl tools like Screaming Frog or Sitebulb flag issues such as:
- Broken links and redirect chains.
- Missing or duplicate titles and meta descriptions.
- Missing alt text or headings.
- Indexability problems (noindex, blocked, canonical errors).
- Slow pages and Core Web Vitals failures.
Example
# A lightweight monthly SEO audit routine
1. Crawl the site (Screaming Frog) for broken links & tags
2. Review Search Console: indexing + Core Web Vitals
3. Check ranking movements for target keywords
4. Refresh decaying content and fix top issuesWhen to use it
- An SEO agency tracks 500 target keywords weekly for a client and automatically alerts the account manager when any position drops more than 5 places in a single week.
- A developer schedules a monthly Screaming Frog crawl via cron to catch regressions in title tags, canonical tags, and broken links before clients notice ranking drops.
- A content team uses rank tracking to discover a competitor has outranked them on 15 keywords, triggering a targeted content refresh sprint for those specific pages.
More examples
Rank tracking via SERP API
Polling a SERP API for each tracked keyword and recording position with a date stamp creates a time-series ranking database for trend analysis.
python3 - << 'EOF'
import requests, json, datetime
keywords = ["trail running shoes", "best trail runners 2024"]
target_domain = "example.com"
for kw in keywords:
r = requests.get(
"https://serpapi.com/search",
params={"q": kw, "num": 20, "api_key": "YOUR_KEY"},
timeout=10
)
results = r.json().get("organic_results", [])
position = next(
(i+1 for i, res in enumerate(results) if target_domain in res.get("link","")),
None
)
print(f"{datetime.date.today()} pos={position or 'NR':>3} '{kw}'")
EOFAutomated crawl audit with Screaming Frog CLI
Scheduling a headless Screaming Frog crawl monthly and exporting key tabs creates a reproducible audit trail for detecting technical regressions over time.
#!/usr/bin/env bash
# Monthly SEO crawl audit — run via cron on the 1st of each month
SITE="https://example.com"
OUT="/var/reports/seo/$(date +%Y-%m)"
mkdir -p "$OUT"
screaming_frog_seo_spider \
--crawl "$SITE" \
--headless \
--output-folder "$OUT" \
--export-tabs "Internal:All,Response Codes:Client Error (4xx),Directives:Noindex" \
--save-crawl
echo "Crawl saved to $OUT"Alert on rank drops via Python script
Comparing weekly position snapshots and flagging drops greater than 5 places creates a simple early-warning system for ranking volatility.
python3 - << 'EOF'
# Compare this week's positions against last week and alert on drops > 5
this_week = {
"trail running shoes": 7,
"best trail runners 2024": 3,
"trail shoe review": 14,
}
last_week = {
"trail running shoes": 5,
"best trail runners 2024": 3,
"trail shoe review": 8,
}
for kw in this_week:
drop = last_week.get(kw, 100) - this_week[kw]
if drop < -5: # position increased = rank dropped
print(f"ALERT: '{kw}' dropped {abs(drop)} positions"
f" ({last_week.get(kw,'?')} -> {this_week[kw]})")
else:
print(f"OK: '{kw}' pos={this_week[kw]}")
EOF
Discussion