Home / Projects / Marketing OS

Marketing OS

The internal control tower for our portfolio. Campaign planning, web automation through Puppeteer, an AI-assisted content brief queue, and accessibility checks — one cockpit, many products.

Category  AI · Marketing Ops Stack  Next.js 14 · TypeScript · Prisma · Tailwind Automation  Puppeteer Status  In final testing

The problem

Running 21 products means running 21 marketing motions. Spreadsheets get out of sync, briefs go missing, the same SEO checks get repeated by hand on every domain. We needed an internal system that knew about every product, scheduled the work that compounds (content, SEO, lifecycle email), and let us see what shipped versus what slipped.

What we built

Marketing OS is a Next.js 14 application backed by Prisma and Postgres. It models the portfolio (products, domains, audiences, campaigns), the calendar (briefs, drafts, scheduled posts, send dates), and the work-queue (claimable tasks for the team). Puppeteer runs scheduled audits across every domain — meta tags, structured data, canonical URLs, broken links, axe-core accessibility — and writes regressions back into the queue.

The AI angle

The brief queue is where the AI lives. Each campaign turns into structured briefs (audience, angle, channel, length, success metric); the LLM expands a one-line idea into a full brief, suggests three angles, and writes the first-draft hook. The team accepts, edits, or rejects. Over time the queue becomes a corpus of accepted vs rejected briefs that we use to pick angles automatically.

How it’s used

  • Studio operators see every product’s health in one place.
  • Writers claim briefs from the queue instead of being assigned them.
  • Engineering gets clean alerts when an SEO regression hits a live site.

What it taught us

That an internal tool is allowed to look ugly — until the moment your team won’t use it. Spending two weeks on the calendar UX paid for itself in adoption. We carry that lesson into client engagements: tools people don’t open are tools you didn’t build.