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.
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.
BI connectors, Excel macros, a chatbot
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.
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.
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.
Next.js
Gemini
Vercel
Zapier
Custom GPT
Nothing commits to master data until a person clears the exceptions
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.
You forward an email. The report lands. The human work moves into the review queue, where a person clears the flagged fields.
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.
Master Data versions every approved snapshot, so only one copy is ever current.
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.
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.jsThe review queue, master data view and report copilot.
ReactThe UI layer.
TypeScriptIncluding the extraction schema.
Automation
ZapierWatches the forwarding inbox and moves the attachment into the protected folder.
Models
Gemini 1.5Field-level extraction into a fixed schema, and the plain-language questions over approved snapshots.
Delivery
VercelHosting 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.



