The problem
Running close to 40 products means running close to 40 sets of SEO/GEO checks, indexing status, and usage numbers. Doing that by hand on each domain doesn’t scale, and it doesn’t compound — a fix on one site teaches you nothing about the other 39 unless something is watching all of them at once. We built one internal dashboard that watches the whole portfolio instead of checking products one at a time.
What we built
Marketing OS is a Next.js 14 application backed by Prisma and Postgres, built around four views. Audits runs Puppeteer plus Google’s PageSpeed Insights API across every live domain — meta tags, structured data, canonical URLs, broken links, axe-core accessibility, performance — and stores the findings per domain. Search Visibility pulls indexing coverage and search-analytics totals straight from Search Console via a zero-dependency, JWT-signed client (no googleapis package). Customers tracks who’s actually using each of the 11 products that have real accounts, reading from whichever store that product actually uses — Postgres role or SQLite — instead of forcing every product onto one shared schema. Project Overview is the single screen that answers “is everything up and healthy right now” across the whole portfolio.
The AI angle
The audit findings feed a separate GEO module that generates llms.txt, an AI-crawler-aware robots.txt, and FAQPage/Organization structured data per domain — so a fix that starts as an audit finding can go straight to a generated file without leaving the tool. The weekly cross-portfolio audit itself runs as a scheduled Claude Code skill that writes its findings back into Marketing OS’s own audits/ directory, one per domain, which is what actually gets read before any fix gets proposed.
What it doesn’t do
Earlier versions of this page described a campaign-planning calendar and an AI content-brief queue living here. That never shipped in this app — content production and scheduling run through a separate pipeline (Ghost Writer drafts, PostReel posts them out, orchestrated in n8n), not Marketing OS. PostReel keeps a separate workspace per product, so posts go out under each site’s own branding and channels rather than one combined feed. This page describes what the tool actually does today: audit, index-track, and report on customer usage across the portfolio, not plan, write, or post the content itself.
How it’s used
- Studio operator (me) checks Project Overview first thing to see what’s down or regressed before touching anything else.
- Weekly audit cron writes fresh findings into every domain’s folder under
audits/, which is what a fix session actually reads. - Customers view is the fast answer to “is anyone actually using this” before sinking more time into a product.
What it taught us
That an internal tool is only worth what you actually keep open. The audits/search-visibility/customers loop gets checked every week; the campaign-calendar idea never got used once and quietly rotted until the page describing it was the only place it still existed. We carry that lesson into client engagements: build the screen that gets opened, not the one that sounded good in the pitch.