Marketing OS: Why My Database Refuses Ads Without Evidence

Marketing OS: Why My Database Refuses Ads Without Evidence

AI made ad copy cheap. It also made claims that aren't true even cheaper. Ask a model for ten angles for a heat pump and you get ten confident sentences, and some of them are facts nobody has checked. I wanted a system where that simply can't reach an ad, so I built Marketing OS.

It's the system I use to run research and campaigns across several brands. Nothing generative runs inside it. AI drafts arrive as rows through an MCP server, and a person approves them.

Research is shared, execution is per brand

Facts and claims belong to a market, because a fact about the Bulgarian heating market is true for every brand that sells there. Angles, creatives, offers and social posts belong to one brand. Keeping the two apart means research is done once and reused, and a campaign can't quietly invent its own version of the facts.

Every fact needs a specific, dated source. My own experience counts as a source too, but it gets dated like any other.

The database says no

The core rule is enforced by database triggers, not by application code:

  • an ad angle cannot exist unless its claim is supported, or supported with conditions, by evidence;
  • print and export are refused until the creative is approved, the claim is supported and the legal check has passed.

Why in the database? Because there are two ways in: the cockpit UI and the MCP server that AI assistants use. If the rule lived in one of them, the other would be a way around it. A trigger doesn't care who is asking.

Two questions that must not be mixed

Every claim is tracked on two separate axes. Is it true? That's its factual state. Does it work? That's its market state. A true claim can still make a bad ad, and an ad that converts well is still not allowed to be untrue. Keeping the axes apart stops performance data from ever "proving" a fact.

Moving a claim to supported needs a linked, current piece of evidence, and the operator's confirmation is recorded word for word in the claim's history.

41 tools, and every write says why

The MCP server has 41 tools for facts, claims, personas, keyword themes, angles, offers, creatives and social posts. Every write must state its origin, meaning which project and why, and defaults to a dry run built on nested savepoints, so a preview runs through the very same triggers as the real write. Nothing is approved, published or deleted through the server; those steps belong to a person in the cockpit.

The server only listens on the local machine. That sounds safe, but a local server's real attacker is the browser: a web page can try to reach it through DNS rebinding or a cross-site request. So the server checks the Host and Origin of every request before it touches the database.

Where the media comes from

Creatives are produced with Remotion for rendering, ComfyUI and Veo for images and video, and edge-tts for narration. They go through the same gates as everything else: a beautiful video for an unsupported claim never gets exported.

Why it matters beyond marketing

The pattern is general: let AI produce drafts freely, and put the rules about what may go out into the one place nothing can bypass. I use the same thinking for invoices and hosting, described in How I Let AI Agents Write to Live Business Data. The rest of my AI work is in my AI and MCP portfolio.

← Back to Blog