Mikee Shattuck

I build and run the marketing automation behind a 15-office family and estate law firm in the Carolinas.

Systems I run today, as of 23 September 2026
SystemWhat it doesLast 7 daysStatus
LSA WatchTracks the firm's Google Local Services ad position in 45 city and practice markets1,395 scans, 0 failedRunning
Attribution engineLinks ad leads, calls, CRM matters and billed revenue to price every hire7 data checksRunning
AI VisibilityAsks six AI engines what a client would ask and records who they name48,908 answersRunning
Ops agentWrites a weekly marketing brief from the same data, using AI agentsWeekly briefBeing fixed

Featured project: Collins OS

Collins OS is the firm's marketing and intake console. It pulls nine data feeds into one place, so the managing partner and marketing director can see what their ad spend produces before they change it.

It replaced a spread of vendor dashboards and a Friday spreadsheet with one server-rendered app that states each number's source, window and freshness next to it.

Who uses it

The managing partner and marketing director use it to set Local Services Ads budget by office. Intake leadership uses the weekly report, and I use the admin console to keep the pipelines healthy.

How LSA Watch works

  1. A timer fires four scan blocks a day.
  2. A single-file queue runs them, so manual scans never collide with scheduled ones.
  3. Each of 45 queries (15 offices, three search terms) is run against Google's ad block.
  4. Every scan and every advertiser's position is stored.
  5. Scoring computes top-2 rate, appearance and share of ad voice per market.
  6. Rules flag new competitors, dropouts and review surges.
  7. The health check fails loudly if any market goes 12 hours without a good scan.

Attribution without tracking IDs

The CRM stores no click IDs, so the engine uses three models that are not expected to agree: the intake source, a phone match between ad leads and new matters, and a monthly spend cohort. Cost per hire is published as a range, and seven checks count every record that fails to join, so the gaps are visible instead of hidden.

Built with

  • Next.js 16
  • React 19
  • Tailwind CSS
  • Recharts
  • nginx
  • systemd workers
  • Ubuntu VPS
  • Google Ads and LSA APIs
  • Lawmatics
  • Rocket Matter
  • Google Business Profile
  • MCP tools for AI agents

100% to 0%

The share of app pages open to anyone on the internet, before and after I put the console behind a login.

Baseline
4 Sep 2026: all 63 pages, including the admin controls, loaded with no login.
Result
23 Sep 2026: all 69 paths tested refuse access until the user logs in.
How I know
The same anonymous request was run before and after. Only the login gate in front of the app can produce the new response.
Also
Server backups went from none to weekly in the same period.

Experience

Current

Marketing, Collins Family & Estate Law Group

Own marketing operations and analytics for 15 offices across North and South Carolina. Built and run Collins OS, covering LSA tracking, attribution, AI visibility and local SEO.

What I work on

Paid local search (Google Local Services Ads), marketing attribution without click IDs, CRM data quality, local SEO and Google Business Profiles, AI answer visibility, and the automation that keeps these running.