SEO Automation Suite for a Multi-Location Service Business
Replacing a £1,800/month agency with an engineered system handling 12 locations. Representative engagement.
- Sector
- Multi-location service business (UK-wide, 12 sites)
- Duration
- 5 weeks build + ongoing retainer
- Budget band
- £6,500 fixed-price build + £450/month run + monitoring
1. The problem
A UK service business with 12 locations was paying an agency £1,800/month for local SEO across all sites. Output: a monthly PDF report and unclear activity in between. Visibility into actual ranking movement, GBP post cadence, and citation status was minimal. Suspicion (later confirmed): not much was actually being done between monthly reports. Decision: scope a custom automation suite, see if engineering can deliver what the agency promised.
2. Stack
3. Architecture
System topology — what runs where, what talks to what:
+-------------------+ +-------------------+
| Marketing team | | Notion content |
| writes post | | database |
| templates with | ---> | {{city}} |
| location tokens | | {{post_code}} |
+-------------------+ | {{location_name}}|
+---------+---------+
|
v
+-----------------------------+
| Weekly Lambda |
| - Read Notion templates |
| - Expand per-location |
| - Post via GBP API |
| - Track post IDs |
+--------------+--------------+
|
+---------------------------------+---------------------------------+
| | |
v v v
+-----------------------+ +-----------------------+ +-----------------------+
| Daily Lambda: | | Daily Lambda: | | Daily Lambda: |
| Rank tracking | | Citation NAP check | | Review velocity |
| - DataForSEO API | | - Scrape 40 sources | | - Per-location count |
| - 30 kw x 12 locs | | - Compare to canon | | - 14-day baseline |
| - Store in Postgres | | - Alert on drift | | - Anomaly detection |
+-----------+-----------+ +-----------+-----------+ +-----------+-----------+
| | |
+----------------+---------------+--------------------------------+
|
v
+-----------------------------+
| Metabase dashboard |
| - Rank movement heatmap |
| - Citation health % |
| - Review velocity trend |
| - GBP post performance |
+--------------+--------------+
|
v
+-----------------------------+
| Weekly leadership digest |
| (auto-generated email) |
| Real commentary, not PDF |
+-----------------------------+
4. Automation flow
End-to-end runtime flow — what happens when a real input arrives:
- Content writing (manual, ~30 min/week). Marketing team writes 1-2 GBP post templates in Notion with location-token placeholders. Template database supports rotation: not all locations get the same post in the same week.
- Weekly posting (automated). Lambda runs Monday 09:00. Reads templates, picks rotation, expands tokens per location, posts via GBP API. Each post tagged with internal post ID for tracking.
- Daily rank pull (automated). Lambda runs 02:00. DataForSEO API pulls daily SERP positions for ~30 keywords × 12 locations = 360 keyword-location combinations. Smoothed with 7-day rolling average before any alerting (raw daily data too noisy).
- Daily citation scan (automated). Lambda runs 03:00. Visits ~40 UK directories (Yell, Bing Places, Yelp, FreeIndex, Cylex, etc.), extracts current NAP for each location, compares to canonical record. Discrepancies → Slack alert with link.
- Daily review monitoring (automated). Counts new Google reviews per location. Compared to trailing 14-day baseline. Sudden drops → alert (often signals operational issue at that location).
- Weekly digest (automated). Monday morning leadership email: top-line changes, biggest movers per location, citation issues found/fixed, review counts. No PDF — a focused email leadership actually reads.
5. What success looked like
- Replace the £1,800/month agency retainer with an automated, transparent system
- Maintain weekly GBP post cadence on every location automatically (currently inconsistent)
- Catch citation NAP-inconsistencies as they appear (not after months of damage)
- Track keyword rankings daily per location and alert on big movements
- Surface review-velocity changes (sudden drop in new reviews → operational signal)
6. Outcomes
| Cost | £1,800/month agency → £450/month run cost (after £6,500 one-off build) |
| GBP post cadence | Inconsistent (some locations going months without posts) → reliable weekly per location |
| Citation NAP issues found in first month | 17 (none of which the agency had flagged in 18 months) |
| Average ranking position (target keywords) | Improved 1.8 positions across the keyword-location matrix over 4 months |
| Visibility into actual work | Real-time dashboards vs monthly PDF — leadership now answers their own questions |
| Time saved by leadership | ~4 hours/month previously spent in agency calls + report reading |
7. Speed improvements
- Detection of NAP inconsistencies. Was: discovered when ranking dropped or customers complained. Now: alerted within 24h of the change.
- GBP posting latency. Was: weeks between posts on some locations. Now: every location posts every Monday morning, automatically.
- Leadership reporting cycle. Was: monthly PDF (already 2 weeks stale on arrival). Now: real-time dashboard, weekly written digest.
SEO & visibility growth
- Average keyword position. Improved 1.8 positions across 360 keyword-location pairs over 4 months
- Top-3 (local pack) appearance rate. Up 18% across target queries — biggest gains in locations where the previous citation work had been weakest
- Total Google Business Profile views. +34% over first 4 months (consistent posting effect)
- GBP-driven calls/messages. +47% (direct attribution via GBP Insights)
9. ROI math
10. Maintenance model
See care plan tiers for full structure.
11. Honest gotchas — what we'd do differently
- Google Business Profile API has rate limits and occasional auth quirks — needed careful retry/backoff logic. Hit limits twice in first month, refined.
- Some citation sources block scrapers; for those we use rotating residential proxies (cost included in £450/month run).
- Rank tracking can be very volatile day-to-day; we smooth with 7-day rolling averages before alerting. Initial deployment alerted on every fluctuation and trained leadership to ignore alerts — bad. Re-tuned.
- DataForSEO's API occasionally returns stale data (especially around weekends). Workaround: detect and re-query, mark in dashboard.
- Notion as content backend turned out to be the easy win — marketing team was already there, no new tool to learn. But its API has its quirks (database queries vs page reads behave differently); abstracted both.
- Citation drift correlation with ranking drop is real but not always 1:1 — some "drift" is benign (slightly different formatting Google ignores). Tuned alerting to filter benign cases.
Have a workflow that looks like this?
30 minutes, no pitch. We'll tell you honestly whether automation will pay back for your specific case.