Something I built with AI

Using data to build with AI

birthday-cards.ai started as a fun way to make cards for friends and family. The more I built, the more I found I could do with AI beside me. This page shows how I built a product end to end, how its analytics steer what gets built next, and how all of it connects to an AI model in Claude Code, where we work on every part of the business from the command line. That is the 2026 model I work in. AI does as much as it can, and a person sets the direction and the thinking behind it.

The numbers as of today

353 cards made last 30 days
880 cards made since March 2026
449 visitors last 30 days
93 visitors from search last 30 days
Cards made per month
Cards made per month on birthday-cards.ai Cards made per month since March 2026: March 2026 47, April 2026 57, May 2026 63, June 2026 139, July 2026 159, August 2026 277, September 2026 138 so far. 47 Mar 57 Apr 63 May 139 Jun 159 Jul 277 Aug 138 Sep so far
Where cards were made
World map with the countries where a card was made marked in gold United StatesCanadaArgentinaAntigua and BarbudaBrazilPortugalFranceSpainUnited KingdomBelgiumNetherlandsSwitzerlandNigeriaGermanyNorwayCzechiaCroatiaFinlandEstoniaGreeceUkraineRwandaAzerbaijanSeychellesKazakhstanIndiaSri LankaSingaporeJapan

Antigua and Barbuda, Argentina, Azerbaijan, Belgium, Brazil, Canada, Croatia, Czechia, Estonia, Finland, France, Germany, Greece, India, Japan, Kazakhstan, Netherlands, Nigeria, Norway, Portugal, Rwanda, Seychelles, Singapore, Spain, Sri Lanka, Switzerland, Ukraine, United Kingdom, United States

Refreshed September 13, 2026 from Vercel Web Analytics on birthday-cards.ai. Test traffic excluded.

  • Vercel Web Analytics
  • Google Search Console
  • Bing Webmaster
  • Airtable
  • Vercel runtime logs
  • Claude Code

How it started

The first version was a single HTML file on a weekend in March 2026. A card maker for friends and family. For the first months fewer than ten people used it. Then search visitors started arriving and making cards for people I had never met, and it became a product with a job to do.

Building it end to end

One person and one AI model built all of it: design, code, email, delivery, the search pages, the tracking. Next.js and TypeScript on Vercel. gpt-image-2 draws the card. GPT-4o writes the prompt. Resend sends the email, Vercel Blob holds the share and gift links, Airtable takes the leads, Upstash runs the rate limits, and pdf-lib makes the printable.

Claude Code runs the codebase under a doc system: a briefing, a state file rewritten every session, a session log, a learnings file, and an archive that fills before anything is deleted. More than two hundred and fifty sessions so far. Every change passes the same gates before I see it: types, lint, the test suite, the build.

  • Next.js
  • TypeScript
  • Vercel
  • OpenAI
  • Gemini
  • Resend
  • Airtable
  • Upstash
  • Claude Code

The loop

The app sends an event for every step a person takes. Vercel keeps those events. Google Search Console and Bing Webmaster hold the search side. Airtable holds the leads.

Once a week Claude Code pulls all of it into a dated snapshot, diffs it against the week before, and writes a short memo. I read the memo and decide what changes. Claude builds the change, verifies it, and hands me a test list for my phone. This site reads the same pipe when it builds. Nothing above was typed in.

Instrument before you grow

The tracking went in before the first search visitor arrived. About sixty custom events, written so a finished card is counted apart from a click and a delivered email apart from a sent one. Test surfaces carry a marker and every query filters them out.

Definitions came before rates. On a small site the owner is the traffic, so every read asks the same question first: was any of this me? The homepage conversion rate once counted people who had walked in from another page. The fix was a range with the pass-through subtracted, not a bigger number.

Connected sources

Vercel Web Analytics is read through its MCP server. Search Console through a service account. Bing through its API. Airtable holds the leads. A skill runs the weekly ritual in one pass: pull, snapshot, diff, memo. A rate built on fewer than twenty visitors is called unreadable rather than quoted.

In the last 30 days 93 of 449 visitors came from a search engine.

What the numbers changed

Three reads from the memos. Each one is a number, a call, and what shipped.

Bing ranks the plain exact-match page at position 4 for its head term. Google puts that same page at 10 and ranks the themed pages instead. The call: never clone the head term. The milestone-age page shipped the next night.

In the 30 days to September 11, search visitors who landed on a themed page made a card 43% of the time. On the homepage it was 19%. The call: the homepage was never the problem. Six pages had no search visitors at all, and that is where the work went.

17 of 330 renders failed in a 31 day window, and one morning the model refused my own photo four times in a row. The call: a render never fails closed. If a guard trips, a fallback concept carrying the typed details runs instead. And no prompt on a photo path ships until eight or more real photos pass at zero refusals.

Working together from the command line

Everything on this page came out of the same terminal: the analytics reads, the copy, the prompts, the code, the docs, and this page itself. I open a session, say what I want in plain words, and Claude Code reads the project's own files before it touches anything.

I ask the question and read the memo on my phone. Every trade-off gets framed by Claude and called by me. The push comes from GitHub Desktop, by hand, and Claude never commits. The AI does as much as it can. The direction and the thinking behind it are mine.

The same model on a business

A business already has the sources: orders, web, ads, support, finance. Connect them into one warehouse and fix the definitions before the first dashboard. Then let AI read the pipe, draft the read, and build what gets picked, with a person deciding and owning every change.

Questions

Where do the numbers on this page come from?

From Vercel Web Analytics on birthday-cards.ai, read when this site builds. Test traffic is filtered out. The refreshed date under the dashboard is the date of the last read.

What is connected to what?

The app sends events to Vercel. Google Search Console and Bing hold the search side. Airtable holds the leads. Claude Code reads all of them through their APIs, writes the weekly memo, and builds the changes.

Who makes the decisions?

I do. Claude frames each trade-off, builds what I pick, and verifies it. I review on my phone and push the release myself.