AI Systems · MarketingOps · Live demo · seed data

Forward the report email to MarketingOps, and the master data updates itself once a person signs the close

I built this after I left that job, on my own, from the problem I had lived with there. The version running online uses demo data.

A marketing-ops reporting assistant: you forward the report email, an AI pass cleans the numbers, a human approves them, and every figure lands in a version-controlled master dataset.

Rebuilt after I leftpublic demo running on seed data
Human in loopextract → review → commit
The first morning of the month

The export that ate the first morning of every month

Every month a raw Excel export from HQ landed in my inbox: inconsistent column names, mixed formats, missing values, and enough PII that pasting it into any external tool was off the table. Cleaning it by hand took one to two hours at every monthly close, plus about fifteen minutes a day once the exports went daily.

The part that finally made me act was quieter than the lost hours. Every region, Korea, Vietnam, India, North America and the UK, pulled from the same source, but for historical reasons each region's raw report came out with slightly different specs and measurements, and arrived differently too, some as an email attachment and some pulled by hand. Four of us in marketing, all peers, were each running a private version of the same cleanup, and nobody could say which cleaned copy was the latest without asking around. We automated most of it on Zapier before any AI was involved, and standardized how the reports came in along the way. The obvious shortcuts were fenced off, because the file carried personal data that could not legally leave the building. Somewhere between the third rename of KYC Status and the second duplicate row, I stopped treating this as housekeeping and started treating it as a system I should build.

Before · the monthly close
Cleaning the HQ export, by hand1–2 h
Same cleanup, run privatelyseveral copies
PII blocks external toolshard wall
The starting state: a messy export I cleaned by hand every month, duplicated across the team, and a compliance wall around every off-the-shelf shortcut.
The research

BI connectors, Excel macros, a chatbot

Three routes, three wallswhy none of them shipped
BI connectors: the data has to leave, PII says no
Excel macros: break on every renamed column
Paste into a chatbot: no PII gate, no review trail

Connector suites solve the pulling problem well, and Supermetrics measured the scale: its 2025 Marketing Data Report found marketers handling 230% more data than in 2020, while 56% say they don't have time to analyze it thoroughly.

But a connector needs the data to leave the building, and ours could not. Spreadsheet macros stayed inside the wall, so I tried those first; every column rename from HQ broke them, and whoever wrote the macro became its single point of failure. I ruled out pasting the raw file into a chatbot for the same PII reason, before accuracy even came up. What I needed was narrower than any tool on the list. I strip the sensitive columns before any model sees a row, then extract into a fixed schema. I keep a human between the model and the record.

What it refused to become

I wrote down what it would refuse to do first

The scope started as a list of things it would not do. It would not become a BI suite. No dashboard engine, no charting library.

I wanted the close under five minutes, PII stripped in the workflow layer before any model saw a row, and corrections to compound, so a mapping fixed once stays fixed in every later run. One inbox feeds a review gate, and the versioned store behind it serves eight standing reports.

monthly close · end to end PII stops here corrections commit · the next run inherits every fix Report email forwarded in input Zapier clean PII gate clean Custom GPT extract pass extract Review Queue human approves gate Master Data versioned store 8 reports refreshed output
The path a report takes: reports forward to one inbox, a Zapier pass strips PII and normalizes fields before any model, a custom GPT proposes the extraction, a human approves it, and approved figures version into Master Data that feeds eight standing reports. Corrections committed at the gate flow back into the next run.
A weekend of pipeline

A weekend of pipeline, months of review queue

At PingPong we ran a version of this on Zapier and a custom GPT. A Zapier flow watched the inbox, pulled the attachment into a protected Drive folder, dropped the sensitive columns, and renamed fields so kyc_status meant one thing. A custom GPT with a schema doc did the extraction. The pipeline took a weekend, most of it spent pair-writing the schema doc with the model instead of typing code. Deliberately boring: no engineering time to borrow, and everything went past compliance.

The plumbing held. What broke was accuracy. Published benchmarks on field-level LLM extraction put the best configurations at 71–84% agreement with human coders, and my logs matched: about one field in five needed a person. Re-checking everything would have been the old job back with extra steps, so I redesigned the review step instead. The queue flags confidence per field, diffs each figure against last month, and does its arithmetic without the model. The web app below, built the same AI-paired way, wraps that queue in a clickable interface.

Shipped on
Next.js Gemini Vercel Zapier Custom GPT
The loop, on screen

Nothing commits to master data until a person clears the exceptions

marketing-report-web.vercel.app
Marketing Ops review queue with source-badged reports awaiting human approval
Marketing Ops Master Data view with versioned, snapshot-dated reports
Marketing Ops report copilot answering questions from the approved data store
Marketing Ops Assistant landing page stating the manual-reporting problem

I built it because I hate manual data entry, and one to two hours at every close plus fifteen minutes a day was a cost I could remove.

01 Collection stops being manual

You forward an email. The report lands. The human work moves into the review queue, where a person clears the flagged fields.

02 Cleanup happens before the model

The Zapier pass renames columns on arrival, so kyc_status means one thing, and duplicate rows drop out. Name drift is the quiet failure that makes a model wrong without making it look wrong.

03 There is one current version

Master Data versions every approved snapshot, so only one copy is ever current.

The close, after

The close shrank, and every correction stuck

On the rebuilt version, with demo data, the monthly close that took one to two hours by hand finishes in under five minutes. Daily snapshots, which we never had time to produce, take one forwarded email.

The quieter change is the one I value more. A correction made in the review queue lands as a versioned commit, so the same fix never has to be made twice. Any month's numbers can be rebuilt from the record.

Monthly close
<5 min was 1–2 hours
Corrections compound
Fix a mapping once
Every next run inherits it
Any month reproducible
Left, the monthly close: one to two hours by hand, then under five minutes on a single demo run with exception clearing included. Right, corrections versioned into the master dataset.
What it runs on

The least interesting stack here, which was the point

Nothing here is novel and nothing needed to be. I had zero engineering bandwidth and a compliance team with opinions, so somebody else could take over any piece of it.

Application

Next.js logoNext.jsThe review queue, master data view and report copilot. React logoReactThe UI layer. TypeScript logoTypeScriptIncluding the extraction schema.

Automation

Zapier logoZapierWatches the forwarding inbox and moves the attachment into the protected folder.

Models

Gemini logoGemini 1.5Field-level extraction into a fixed schema, and the plain-language questions over approved snapshots.

Delivery

Vercel logoVercelHosting and the extraction endpoint.

Want this kind of tooling on your team?

PII stripped in the workflow layer, and the arithmetic runs outside the model.