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

Language: Python 3.12
Compute: AWS Lambda + EventBridge (scheduled jobs)
Content backend: Notion (templates with location-token placeholders)
GBP API: Google Business Profile API (per-location posting)
Rank tracking: DataForSEO API (~30 keywords × 12 locations × daily)
Citation scraping: Python + rotating residential proxies (~40 UK directories)
Database: PostgreSQL on Neon (historical ranking + citation data)
Visualisation: Metabase (open-source dashboards)
Alerting: Slack webhooks + email digest (leadership)
Observability: CloudWatch + Sentry

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:

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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).
  6. 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

6. Outcomes

Cost£1,800/month agency → £450/month run cost (after £6,500 one-off build)
GBP post cadenceInconsistent (some locations going months without posts) → reliable weekly per location
Citation NAP issues found in first month17 (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 workReal-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

SEO & visibility growth

9. ROI math

Payback & ongoing return: Agency cost £1,800/month → run cost £450/month = £1,350/month saving = £16,200/year. Build cost £6,500 = payback ~5 months. After year one: net ~£16,200/year ongoing, plus the ranking improvements (harder to monetise directly but driving +34% GBP impressions = meaningful additional leads).

10. Maintenance model

Custom retainer at £450/month (between Silver and Gold tiers — falls outside the standard ladder because of the bespoke SEO scope). Includes: monthly keyword and citation review, quarterly content-strategy session with marketing, prompt/script tuning as Google changes (their SERP layout updates ~quarterly), on-call for any sudden ranking-drop investigation. Bigger multi-location operators often want Gold or Enterprise to layer in ongoing content development.

See care plan tiers for full structure.

11. Honest gotchas — what we'd do differently

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.