Lab / In production
NovaBiome
One view of every marketing number. It started as a way to see everything in one place, and turned into a lesson in how rarely a team agrees on what its numbers mean.
Where it came from
One view of every number, so planning gets better.
Many marketing teams run like this today. Campaigns are planned in Asana. Several agencies and in house marketers each manage their own surfaces: the store, email, subscriptions, paid social, search. Each one reports from its own tool, in its own definitions.
Unless the company pays for a tool like Triple Whale, nobody has a single view of what is actually going on. Without it, deciding which campaign to run next, and whether the last one worked, is guesswork.
Every number in one place, fresh enough to plan from.
That was the first goal, and it sounded simple. NovaBiome is a fictional name: the client system ran on its own infrastructure, and the public demo is an anonymized copy with made up numbers.
What I learned
The hard part was agreeing what the numbers mean.
Building the dashboard showed me how much depends on the underlying data, and on the team's own understanding of its metrics.
The office of the CEO runs on a fiscal calendar. Marketing often runs on the regular one, but its targets are set in fiscal weeks. So how do you run your spreadsheet? Usually by hand. Someone opens Shopify, Klaviyo, Meta and the agency reports, collates the weekly numbers, and compares them to weekly targets derived from the annual goals, across tab after tab. Every step is a chance for an error.
Then there is the back office. A legacy NetSuite system counts a sale when it ships. Shopify counts it when it is ordered. For one week, units differed by 17%. Both numbers were right. They answer different questions, and over a quarter they close to under 1%.
More often than not, these conversations are not happening, and the answers are not agreed company wide.
So a large part of the work was sitting with the client, agreeing how every metric is calculated, and writing it down. Renewal rate is a good example. The first version said 91%. The client's definition, counting a customer as lost only when they have no subscription left, says about 60%. The code changed, not the client.
Same word, different numberA few of the definitions we had to agree before any number shipped.
| The number | One answer | Another answer | What we agreed |
|---|---|---|---|
| A week | The calendar week marketing works in | The fiscal week the targets are set in, with week 1 starting October 1 | Fiscal weeks, Sunday to Saturday, always shown with their dates |
| Units sold | The store counts a sale when it is ordered | The accounting system counts it when it ships. 17% apart in one week | Order date, because marketing decisions run on it. Under 1% apart over a quarter, and the gap is written down |
| Renewal rate | The first version said 91% | The client said about 60% | A customer is lost only when no subscription is left. Same day cancel and restart does not count |
| Sessions | Web analytics read 67% higher | Store analytics | Store analytics, humans only, because that is what the team already reports |
What I built
Clean it, explain it, then let AI help.
- First, clean and unify the data. Shopify, Klaviyo, Recharge and LoyaltyLion read directly, ads and social through Windsor.ai, all landing in one database. Where a connector could not match the client's definition, I went to the source API instead. A failed sync shows as missing, never as zero.
- Second, say what everything is, in plain English. In my years in software I have seen this done badly far too often. Every number in the dashboard says where it comes from and how it is calculated. A help section explains each metric, and what puts it in green, orange or red: at 95% or more of where it should be by now it is green, below 75% it is red. The goal is no ambiguity, whichever source a number comes from.
- Third, let AI draft, and a person decide. Claude drafts the weekly leadership report, a short read on the home page, and a note on any day revenue moves more than 15%. The report goes through an edit screen before anyone sees it.
- Next, agents that act. The point of all this was to let agents decide which campaigns to prioritize and route the work as tasks, with an approval step. That part is designed, not built. Clean, agreed data had to come first.
What every number says about itselfThe units card, as the client reads it on hover. Every number in the dashboard has one.
Units sold
- Where it comes from
- Shopify, read directly.
- How it is calculated
- Every unit on every order, net of refunds. A 3 pack counts as three, a 6 pack as six. Counted by order date.
- Worth knowing
- Finance counts units by ship date, so a single week can differ by around 15%. Over a quarter the two close to under 1%.
How it fits together
Every source, one database, one weekly rhythm.
Views for revenue, subscriptions, acquisition with a one year customer value cohort table, paid media, email flows, units, loyalty, social, goals, reports and alerts. Fourteen scheduled jobs refresh the data, most of them every six hours, each isolated so a slow source cannot stall the rest. Four weekly jobs are too heavy for a serverless function, so they run end to end on a small server of their own.
Built with:
- Next.js 16, TypeScript, Tailwind 4, Recharts, the dashboard and every chart
- Supabase Postgres, where every source lands
- Vercel and Vercel cron, hosting and fourteen scheduled syncs
- A small Hetzner server, four heavy weekly jobs that outlast a serverless function
- Shopify, Klaviyo, Recharge and LoyaltyLion APIs, store, email, subscriptions and loyalty, read directly
- Windsor.ai, Meta, Google Ads, Instagram and Facebook
- Claude Sonnet, the weekly report draft, the weekly read and the daily notes
How NovaBiome worksFrom each source app to the dashboard and the Monday report.
Scroll sideways to see the whole diagram.
What the client opens every week
Honest scope
I was building Triple Whale, and did not know it.
It shows how extraordinary it is today that one person could build what was probably the MVP of Triple Whale.
When I started, I did not know Triple Whale. By the time I came across it, I had built a lot of what its early product does: one view across store, email, subscriptions and ads, lifetime value by cohort, and a weekly read on what changed.
It is not the same thing. Tools in that category sell for roughly $250 to $1,500 a month, with attribution modeling and many brands on one platform. I am one person, and I built for one client. But it took me about six weeks.
What it costs
The connectors cost more than the intelligence.
The intelligence was the cheap part. Almost all of the running cost is the connector that pulls ads and social data, and the model that writes about it costs less in a year than the connector does in a week.
| What it runs on | Cost |
|---|---|
| Windsor.ai, for ads and social | $99 a month, the largest line |
| Claude, for the weekly report, the weekly read and the daily notes | under $20 a year |
| Supabase, for the database | free tier |
| Vercel and the small server | plans I already had |
Claude cost from token counts per run: about 7.5 cents for a weekly report or read, about 2.5 cents for a daily note.
What I am still thinking about
Do we still need the dashboard?
If agents can work directly in the data, and act in the tools a team already uses, is there still a place for dashboards?
I think it depends on the maturity of the team. People need to see what is going on, and they need to audit what an agent did and why. I am a visual person myself. I need to see things. But that is a bigger debate, and this project is where I started having it.
How I built it
Ambiguity in, an operator-ready system out.
YC’s Paxel read my Claude Code sessions on this build. Its verdict: “You steer Claude through messy dashboard architecture, reject shortcuts, and turn product ambiguity into operator-ready systems.” It singled out how I catch AI implementation drift before it hardens into architecture, keep the source of truth close to the work, and write process down so every session starts from a better place.
The client’s system ran in production on its own infrastructure. NovaBiome is a copy of it with a demo layer on top: fictional brand, fictional products, made up numbers. That report names the client, so it stays private.
Talk to me
Drowning in agency reports and dashboards that disagree? I start with the definitions.