DIY Agency Rank Tracker Under $10/Month
Build daily rank tracking for agency clients at $0.005/keyword. Compare vs Ahrefs $99+/mo. Python script + Sheets + Slack alerts.
Ahrefs Lite starts at $129/mo. Semrush Pro starts at $139.95/mo. If you run a small agency with 3-5 clients who each care about 10-20 keywords, you are paying enterprise prices for a fraction of the functionality. A DIY rank tracker using a search API, Python, and Google Sheets costs under $10/mo and covers the exact use case: "where do my keywords rank this week?"
The architecture
- Python script queries the search API for each keyword
- Results are parsed to find the client domain position
- Data is appended to a Google Sheet (one tab per client)
- Slack webhook fires if a keyword drops more than 3 positions
- Cron job runs the script daily at 6 AM
Step 1: the rank checker
import requests, os
def check_rank(keyword: str, target_domain: str) -> dict:
"""Check where target_domain ranks for a keyword."""
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": os.environ["SCAVIO_API_KEY"]},
json={"query": keyword, "num_results": 20},
timeout=10,
)
results = resp.json().get("results", [])
for i, r in enumerate(results):
if target_domain in r.get("url", ""):
return {"keyword": keyword, "position": i + 1, "url": r["url"]}
return {"keyword": keyword, "position": None, "url": None}
# Example: check 15 keywords for one client
keywords = ["plumber austin tx", "emergency plumber austin", "drain repair austin"]
for kw in keywords:
rank = check_rank(kw, "austinplumbingpros.com")
pos = rank["position"] or "not in top 20"
print(f"{kw}: position {pos}")Step 2: store in Google Sheets
import gspread, datetime
from google.oauth2.service_account import Credentials
def save_to_sheets(client_name: str, ranks: list):
"""Append daily ranks to a Google Sheet tab."""
creds = Credentials.from_service_account_file(
"service-account.json",
scopes=["https://www.googleapis.com/auth/spreadsheets"],
)
gc = gspread.authorize(creds)
sheet = gc.open("Rank Tracker").worksheet(client_name)
today = datetime.date.today().isoformat()
for r in ranks:
sheet.append_row([today, r["keyword"], r["position"] or "N/A", r.get("url", "")])Step 3: Slack alerts for drops
import json
def alert_drops(client_name: str, previous: list, current: list):
"""Send Slack alert if any keyword drops 3+ positions."""
prev_map = {r["keyword"]: r["position"] for r in previous if r["position"]}
for r in current:
if r["position"] and r["keyword"] in prev_map:
drop = r["position"] - prev_map[r["keyword"]]
if drop >= 3:
msg = f"{client_name}: '{r['keyword']}' dropped {drop} positions (now #{r['position']})"
requests.post(os.environ["SLACK_WEBHOOK"], json={"text": msg})Cost breakdown
- 5 clients, 15 keywords each = 75 keywords total
- Daily checks: 75 API calls/day x 30 days = 2,250 calls/mo
- At $0.005/credit: $11.25/mo. Over budget. Fix: check 3x/week instead of daily.
- 3x/week: 75 x 13 = 975 calls/mo = $4.88/mo. Under $10.
- Google Sheets: free. Slack: free. Server: free cron via GitHub Actions or Railway.
- Total: under $5/mo vs $129+/mo for Ahrefs.
What you lose without Ahrefs or Semrush
This tracker answers one question: "where does my client rank for these keywords?" It does not answer: "who links to my client?" or "what keywords should my client target?" or "what technical SEO issues does the site have?"
- No backlink data -- you cannot track link building progress
- No crawl data -- you cannot find broken pages or redirect chains
- No keyword suggestions -- you cannot discover new opportunities
- No competitor backlink analysis -- you cannot reverse-engineer link strategies
If your agency delivers full-service SEO with link building and technical audits, you need Ahrefs or Semrush. If your clients only care about "are we ranking?" this tracker is enough.
Scaling to 20 clients
20 clients at 15 keywords each, checked 3x/week: 20 x 15 x 13 = 3,900 calls/mo. At $0.005/credit: $19.50/mo. Still cheaper than one month of Ahrefs Lite. The $30/mo plan (7,000 credits) gives you headroom for 25+ clients at this frequency.