LegalRankings
Internal · Confidential
Project Saul

Build plan, architecture & economics for the $1,800/mo attorney tier. Sign in to continue.

demo / demo
The "Better Call Saul" line · Attorney-only

A whole SEO engine, fully automated, for $1,800 a month.

Low-touch. Dashboard-as-product. Heavy front-loaded onboarding, near-zero recurring labor — and the recurring value carried by live competitive data they can watch move. Served per-client at {firm}.legalrankings.com.

7 modules 3 architecture planes ~10-client roster cap 100% client-side automation
$1,800/mo
Base tier, all modules
~80%
Read-side already built
~2,700
Domains already scanned weekly
~10
Premium roster cap / market
1
Human in the loop (our operator)
The thesis

The intelligence half is already paid for.

⚡ Why this works at $1,800

We already run a full DataForSEO + GBP + GSC pipeline across the entire attorney market (~2,700 domains) every week. For a signed client, the dashboard is mostly a filtered view of data we already pay to collect — so the marginal cost of the "intelligence" half is near zero. The new engineering is the action plane (the things we do for them) and the premium per-client lookups (AI-citations, AI Overview, deep backlinks) that don't scale to 2,700 domains but are trivially affordable for ~10 signed clients. That asymmetry is the business model: front-loaded build, near-free recurring delivery, premium data as the moat.

The irresistible offer

Everything a small firm needs, done for them.

Bought separately — web rebuild, rank tracker, local-grid tool, GBP & review management, backlink tool — this is $1,500–3,000+/mo and still wouldn't include AI-citation work or a competitor-relative dashboard. We bundle all of it.

🎨

Fast, reskinned website

Rebuilt on our edge with JSON-LD schema, clean meta, and auto-indexing. Front-loaded build.

📊

Live intelligence dashboard

Where they rank, on the map grid, vs. every competitor — review velocity, keyword movement, a leads north-star.

📍

Done-for-you local presence

GBP posts published automatically; review replies drafted and sent (operator-approved); GBP/NAP health monitored.

🤖

Premium data, normally out of reach

AI-citation footprint (Knowledge Graph), AI Overview presence, deep backlink intelligence — affordable only because the roster is small.

📨

Multi-channel intake

Form on the site we host → instant Slack + SMS + email, every lead captured for the leads/month number.

📑

Branded monthly report

Auto-generated from live dashboard data, lands in their inbox — proves the $1,800 without them logging in.

See the full offer → The complete value stack, the premium data, and pricing.
Architecture

Three planes, kept separate.

Every part of the system is one of three things. The separation lets the cheap, already-built read-side ship first and keeps the risky write-side isolated. Tenancy lives entirely in the app layer — we filter shared BigQuery tables by each account's CID list at query time, and never write org_id back into the pipeline.

🔑 Tenancy / App Plane Foundation exists

Flask portal · {firm}.legalrankings.com
Auth + sessionsCloned from app_dot_site/portal — werkzeug hashing, SQLite, 14-day revocable sessions.
Host → account resolverSubdomain → slug → anchor + member CIDs. Cross-tenant guard already built.
Operator console + OAuth onboardingProvision accounts; client grants Google access once. (New)
↓ reads JSON    triggers ↓

📥 Data Plane — READ ~80% exists

Shared pipeline → BigQuery → per-account JSON
Shared pipelineScans all ~2,700 domains weekly/monthly → amicus_pipeline.*. Already running.
Per-account generatorExtend generate_data.py to filter by an account's CID list → owned family vs. field.
Premium runner008f / 009x / KG for the signed roster only. (New)

📤 Action Plane — WRITE Net new — the real build

Per-client workers · depend on Google OAuth
GBP post publisherLLM draft → guardrail → auto-publish.
Review-reply queueLLM draft → operator approves → send.
GSC submitterNew/changed pages → index.
Intake routerForm → Slack + SMS + email.
Alert engineRank drop / new review / competitor surge.
Monthly reportRender dashboard → branded PDF → email.

🔒 The critical dependency: Google OAuth

GBP posting, review replies, GSC submission, and GA4 read all require the client to grant OAuth access to their Google properties. Google Business Profile API access approval is the single longest lead-time item — apply for it the day this is greenlit, not at build time.

The product

Seven modules.

Each is scored on one question: does it keep the dashboard worth opening between logins? The status dot on every surface shows whether the data already exists, needs wiring, or is net-new work.

Exists — data already collected Wire-up — partial / needs logic New build — net new
MODULE 01

Site & Content

Reskin + the data that proves the speed claim on screen.
  • Reskin · meta · JSON-LD schema injection
  • Core Web Vitals widget 005h/005i
  • Technical health 005b
  • GSC auto-indexing (OAuth)
MODULE 02Heaviest recurring

Local Presence

PI firms live or die local. The most active module.
  • GBP posts — auto-publish
  • Review replies — approval queue
  • GBP audit score 007a
  • NAP / citation consistency
MODULE 03Flagship visual

Search Intelligence

The persuasive core — rankings that move after the tune-up.
  • Organic rankings + movement 010a/c
  • Geo-grid local pack 008e
  • Organic-vs-local-pack split 008b/c
MODULE 04The moat

Competitive Intelligence

What justifies recurring spend after the build is done.
  • Competitor rank movement
  • Review-velocity gap
  • Share of Local Voice 008e
  • New competitor content / GBP changes
MODULE 05Premium-gated

Entity & AI

The frontier differentiator in the pitch.
  • Knowledge Graph / AI citations 011a toggle
  • AI Overview presence 008f
  • Avvo / Martindale footprint
MODULE 06Ties work → cases

Capture & Conversion

Attorneys care about cases, not rankings.
  • Multi-channel intake → Slack/SMS/email
  • GA4 traffic + conversions (OAuth)
  • Leads/month north-star
MODULE 07

Backlinks (passive)

Surfaced, not worked — sponsorships show up automatically.
  • Backlink summary / referring domains 009a/f
  • New / lost referring domains 009g
  • Deep backlinks (premium) 009x
CROSS-CUT

Always-on adds

The retention layer that fights the churn cliff.
  • Review sentiment analysis (LLM)
  • Auto monthly report
  • Alert system (email/SMS)
  • CPC / paid intel (display) cpc_benchmarks
Premium · per-client only

Data that doesn't scale to 2,700 — but is trivial for 10.

Gated to signed clients via a per-account feature flag and run by a separate lightweight runner (anchor + top competitors only), never the mass pipeline. This is both the pitch differentiator and the reason the tier is capped.

Exists · toggle on

Knowledge Graph / AI citations

Step 011a already implemented. Turn it on per signed client to populate the public Knowledge Graph so the firm becomes citable by AI systems.

New step 008f

AI Overview presence

Does the firm (and competitors) appear in Google's AI answers for target keywords? Parses ai_overview from the SERP. ~$0.0003/query — cheap, just not run market-wide.

New step 009x

Deep backlinks

Depth-500 backlink intelligence vs. the standard depth-20 bulk summary. ~$0.07/domain — fine for one client's anchor + ~20 competitors (~$1.50/run).

💸 Cost discipline (standing rule)

All premium API calls are paid. The premium runner must print target count + estimated cost and wait for explicit confirmation on first run, and pull-existing rather than re-submit on a killed run. Cost figures here are estimates from pipeline code — measure on the first real cycle before quoting margin.

The action plane

Six workers. One human in the loop.

The "100% automated" promise to the client is honest: the client does nothing. The only human is our operator approving review replies — a few clicks a week across the whole roster, which is what keeps it low-touch and safe.

WorkerModeHow it worksHuman gate
GBP post publisherAutoLLM draft → guardrail filter (no guarantees, no fee claims, no confidential detail) → publish on cadence.Guardrail; failures → queue
Review-reply queueApprovalLLM draft tuned to star rating + content, de-escalation template for negatives → operator console.Operator approves every one
Review sentimentAutoLLM over the review stream → theme tags + negative flags on dashboard and in alerts.None
GSC submitterAutoWe control deploys, so we know the page diff → sitemap + URL-inspection submit, status per page.None (low risk)
Intake routerAutoForm on the site we host → instant Slack + Twilio SMS + email; every lead persisted.Spam filter
Alert engineAutoRank drop / new review / competitor surge / SoLV drop / token failure → email + SMS, frequency-capped.Frequency cap
Monthly reportAutoRender dashboard headless (Playwright → PDF), branded, plain-English "what changed" → email.Optional glance

✅ Trust model (locked)

GBP posts auto-publish (guardrailed). Review replies go through the approval queue — a bad auto-reply to a 1-star review on a law firm is a real liability, so they're never auto-sent.

Economics

Great margin — and a churn cliff.

Month 1 is expensive (reskin-heavy). Months 2–12 are nearly free to deliver. That's an excellent margin profile and a dangerous shape: if the dashboard goes stale, the client cancels once the site is done. Every design decision is judged on whether the screen keeps earning $1,800.

Per-client recurring cost Est. — measure first

The intelligence half rides the shared pipeline (sunk cost). The genuinely per-client incremental cost is tiny:

AI Overview (008f)cents/wk
Deep backlinks (009x)~$1.50/wk
KG population (011a)cents
LLM drafting (posts + replies)cents
GBP / GSC / GA4 APIs$0 (free tiers)

Packaging

Base $1,800/mo — all seven modules, full dashboard, premium data, monthly report, alerts.

Add-ons (protect base margin):

  • Active link building
  • PPC / LSA (Google Screened) management
  • CallRail DNI (cost passthrough)
  • Net-new content writing
  • Review-request automation

⚠️ Pressure-test #1 — automation must be real

GBP posts + review replies are the only true recurring labor. If they aren't genuinely automated (LLM + guardrails + queue), they silently eat the tier's margin at scale. Build the guardrail layer before selling.

⚠️ Pressure-test #2 — contract the front-load

Because month 1 is expensive and months 2–12 are cheap, a client who cancels at month 2 is a loss. Needs a 12-month term or a separate onboarding/setup fee.

Build plan

Thin vertical slice — one client, end-to-end.

Take one real client fully through every plane before scaling the roster. Ordered by value-per-effort: ship the cheap, already-built read-side first (it's the demo that sells the tier), then onboarding, then the genuinely-new action plane, then premium + retention.

Phase 0

Shell — app & routing

~Foundation
  • Clone app_dot_site/portal → project_saul/app
  • BASE_DOMAIN → legalrankings.com
  • Extend schema: features, OAuth tokens, settings
  • Deploy Flask (gunicorn + nginx + systemd)
  • CF DNS: *.legalrankings.com → VM; apex/www stay on Pages
  • Provision first test account; serve dashboard at /report
Exit: testfirm.legalrankings.com loads, login works, cross-tenant guard holds.
Phase 1

Read-side live

Cheapest · highest-visibility
  • generate_data.py takes an account CID list
  • Owned family vs. field vs. competitors
  • Wire dashboard index.html → real per-account JSON
  • Review-velocity gap + SoLV + rank deltas
  • Schedule per-account JSON regen
  • Smoke test: 0 console errors, WCAG AA contrast
Exit: the test firm's dashboard shows real rankings, grid, reviews, competitors — from data we already collect. This is the pitch-ready demo.
Phase 2

Onboarding (front-loaded)

Per client
  • Reskin site (siteripper4 + frontend-design)
  • On-page + meta + JSON-LD schema
  • Stand up Google OAuth app — apply for GBP API now
  • Connect client GBP + GSC + GA4 (store refresh token)
  • Baseline scans confirmed in BQ
  • Knowledge Graph (011a) toggled on
Exit: reskinned site live + fast, schema in place, Google properties connected.
Phase 3

Action plane — the real build

Net new
  • GBP post publisher (auto + guardrail)
  • Review-reply queue + operator console
  • Review sentiment pass
  • GSC submitter on deploy diff
  • Intake router → Slack + SMS + email
  • Alert engine
Exit: posts publishing, replies flowing through the queue, leads routing, alerts firing — client does nothing.
Phase 4

Premium + retention

Then scale the roster
  • New step 008f AI Overview (planner→writer→reviewer)
  • New step 009x deep backlinks
  • premium_runner.py keyed off roster + flags
  • Premium dashboard panels (flag-gated)
  • Monthly report generator (Playwright → PDF)
  • Measure real premium cost → finalize margin
Exit: first client fully delivered — all 7 modules + premium + monthly report, automated. Only then scale.

🧭 Critical path

Longest pole: Google Business Profile API access approval. Start it in Phase 0/2, not Phase 3. The read-side (Phase 1) is the demo that sells the tier — it's cheap and uses existing data, so build it early, even before onboarding machinery.

Open decisions

Calls to make before each phase.

Defaults are noted where there's an obvious choice — flagged for confirmation, not invented silently.

1
Google API scope & approval

Confirm the GBP API + Indexing API access path and quota. → The blocker. Apply Phase 2.

2
Review-reply approval surface

Operator console vs. client-facing approve button. Default: operator console (keeps it low-touch for the client).

3
Intake form ownership

Replace their form with ours on the reskinned site? Default: yes — we own the site, so we own the form.

4
Per-account JSON regen location

VM cron vs. GitHub Actions. Default: VM cron alongside the pipeline.

5
Minimum contract term / setup fee

Needed to cover the front-loaded month-1 cost against early churn. → Decide before selling.

6
Subdomain vs. path

{firm}.legalrankings.com wildcard → VM confirmed; verify CF cleanly splits apex (Pages) from wildcard (VM). → Verify Phase 0.

Grounded in the repo

What we're not building from scratch.

Verified against the live codebase, June 2026. The foundation already exists.

AssetPathRole in Saul
Portal Flask shellapp_dot_site/portal/Auth, sessions, slug→account resolver, SQLite tenancy, manage.py CLI. Clone + reskin.
Dashboard SPAapp_dot_site/dashboard/index.htmlFinished 7-section vanilla-JS dashboard (synthetic data). Wire to real per-account JSON.
Metric generatoratty_dashboard/generate_data.pyProven BQ→JSON pillar/SoLV/weighted-visibility model. Extend to take a CID list.
Pipelinepipeline/steps/ (10 phases)Already produces ~90% of the dashboard's data for the whole market.
Account design specsapp_dot_site/app_sections/*.mdLocked pillar + account-layer design.
Sales site + CF zonelegalrankings_site/Apex/www stay here; *.legalrankings.com → VM for client dashboards.
Next step

Start Phase 0 — or lock the open decisions first.

The read-side demo is the cheapest, highest-leverage build and the thing that sells the tier. The Google OAuth / GBP API approval is the long pole — start it the day this is greenlit.