The problem
The agency paid for a third-party reporting tool and still lived in a dozen tabs: rank trackers, ad consoles, analytics, audit tools, and manual WordPress edits. Data lived everywhere, fixes lived nowhere, and nothing connected what a client paid for to what actually happened on their site or their ad account.
What I built in 16 days
Roughly 51,000 lines of TypeScript across 60 database models, a companion WordPress plugin in PHP with an HMAC-signed REST API, and 1,257 automated tests. Eight integrations feed a local warehouse: GA4, Search Console, Google Ads, the Meta Marketing API, SERP and keyword data, PageSpeed Insights, Census demographics, and search-question research, plus Claude for content generation.
Per-client dashboards cover analytics, search performance, Core Web Vitals, a 23-check technical audit with client-facing fix guidance, a 15-check security scan, rankings, an opportunity queue, AI visibility, ads, and shareable reports, behind five roles and enforced two-factor authentication. Nightly engines do the ETL, rank tracking, crawls, and ads ingestion.
The ads engine runs ten checks for wasted spend, disapproved ads, conversion-tracking gaps, and fatigue. Write-back actions, pauses, budget changes, and negative keywords, capture before-state, require typed confirmation, log an applied-or-failed ledger entry, and roll back in one click. A failed mutation can never be recorded as a success.
How I knew it worked
Every milestone got a written spec, test-driven implementation, an adversarial review by a second model instance before merge, and live verification in production. Review caught a role-based-access hole and a query-injection path before they shipped. Live verification caught what unit tests could not: the Meta API silently paginating at 25 rows, exact-match location names, a sunset ads API version. Each became a fix and a regression test.
On a real account with $1,731 of spend and zero conversions, the engine correctly flagged missing conversion tracking and $37 of waste across 16 non-converting terms. I applied a negative keyword to the live account, confirmed it by re-query, rolled it back, and confirmed the removal. The opportunity engine produced 72 prioritized opportunities from one client's 43,000 queries, including 22 terms that convert in paid and are absent in organic.
Why it matters
The agency stopped paying for the reporting tool, gained one place where data and fixes live together, and got documentation and runbooks for handoff. The AI-visibility work carried forward into Obelisk.
In brief
- What is Agency SEO and Ads Platform?
- One platform and one warehouse replacing a paid reporting tool and a scatter of consoles for a healthcare marketing agency: rankings, audits, security scans, Google and Meta ads, AI search visibility, and one-click WordPress fixes with rollback.
- What did Brian Powell build for Agency SEO and Ads Platform?
- Roughly 51,000 lines of TypeScript across 60 database models, a companion WordPress plugin in PHP with an HMAC-signed REST API, and 1,257 automated tests. Eight integrations feed a local warehouse: GA4, Search Console, Google Ads, the Meta Marketing API, SERP and keyword data, PageSpeed Insights, Census demographics, and search-question research, plus Claude for content generation.
- What was the result of Agency SEO and Ads Platform?
- The agency stopped paying for the reporting tool, gained one place where data and fixes live together, and got documentation and runbooks for handoff. The AI-visibility work carried forward into Obelisk.