Hey Builder 👋

Last week I found out my own website had been making things up since January.

And let me tell you… it did not hold back.

The short version:

  • My AI headshots page claimed 50,000+ headshots and 1,000+ happy professionals. The database had 440 images from 12 people.

  • It was also telling Google "4.8 stars from 2,500 reviews". There is no review system for headshots. I didn't know that code existed.

  • 179 blog sentences invited you to "join the 100,000+ job seekers". The real number is 20,996. (And I'd already "fixed" that one in September lol. That part's below.)

Quickly, the rest of my week:

  • Careerkit: every number on the site was re-read from the production database on Nov 5. 20,996 people have used it.

  • ReplyBoss: offline. Vercel's free plan ran out of CPU hours and the site got paused. 0 commits.

  • HelloBuilder: the website is offline too, same "payment required" page. 0 commits. (Yes, the site of the newsletter you're reading. Awkward.)

And the grade I promised for Nov 7? I ran it today. It graded zero of October's changes. All 3 October rows were logged without the check date the grader reads, so it skips them as "not ripe", forever. Same kind of bug as last week 🫠

If AI Wrote Your Landing Page and You Never Checked the Numbers… This Is for You

I want to talk directly to the founder who had AI write a landing page, liked how it looked, and shipped it.

You're not dishonest. You just never looked at the numbers, because they looked like numbers.

Quick disclaimer: I'm not a lawyer. I'm a solo founder with a database and an agent. These are my real numbers, and some of them are embarrassing.

Here's everything below 👇

  • 🤥 What the page said vs what the database said

  • 🔍 How a boring refresh found it

  • 📒 The one file every number has to pass

  • 🧹 How the blog got fixed without trusting the agent

  • 🙃 Why my September fix missed 179 sentences

  • 🛠 How to check your own this week

What the Page Said vs What the Database Said

| The claim | Where | The database |

| 50,000+ headshots generated | headshots page | 440 images |

| 1,000+ happy professionals | headshots page | 12 people, the last in July |

| 4.6/5 average rating | headshots page | no rating system exists |

| $500k+ "saved vs traditional" | headshots page | no source |

| 4.8 stars from 2,500 reviews | structured data, sent to Google | no reviews |

| 3 named testimonials, one promising "300% more profile views" | headshots page | no source |

| "Join the 100,000+ job seekers" | 179 blog sentences | 20,996 people |

Where did they come from? AI wrote them. The headshot stats arrived with a big translations commit on Jan 24. The review markup came the next day, inside a commit called "SEO improvements".

Here's the thing: AI didn't leave a blank where a number goes. It filled the blank with a plausible number. And a plausible number is the kind nobody checks.

One claim survived: "50+ headshots per shoot". Every shoot since August 2025 delivered 52 to 56. So it's not all fiction. Just most of the page lol.

Steal this: list every number, star rating and testimonial on your landing page. Next to each one, write the query that proves it. No query, no claim.

How It Got Found: a Boring Refresh

Nobody audited anything. The resume count on the site was a snapshot from Oct 15, and on Nov 5 an agent session refreshed every number on every page from production (read-only queries).

That refresh reached the headshots page. The commit message it wrote is the most honest sentence in my whole repo:

❝

Production holds 440 images from 12 people, the last in July 2026, and no rating system for headshots exists.

The fake stats, the testimonials, "Join thousands" and the review markup all came out that day. Deleting the testimonials was an easy call: 12 people is not "thousands".

Steal this: schedule the boring refresh. My rule: any number older than 60 days gets re-read from production before anyone quotes it.

The One File Every Number Has to Pass

It's called claims.md, and the first lines are the whole idea:

❝

Every number, customer name, logo, superlative and proof point in anything we ship must trace to a row below. Not here? Write [NEED: <what>] and flag it to the founder. Never invent a plausible figure.

Each row has the number, the date it was read and a safe way to say it. Today, "over 20,000 people have used Careerkit" is true. "Over 20,000 built a resume" is not, so it isn't allowed.

There's a banned list too. "100,000+ job seekers" is on it. So is "trusted by" next to a row of company logos (one of those logos was a single account 🫠).

For the code, there's one file the pages read their numbers from, with a date on it (plus a list of the strings that bypass it, so nothing hides). Its rule: a page may show a number smaller than the truth, never larger.

Steal this: give your agent a claims file and the [NEED] rule. A blank it has to flag beats a number it made up.

How the Blog Got Fixed Without Trusting the Agent

The blog lives in the database, in English, German and French. So the fix was a write to live content, which is exactly where I don't want an agent improvising.

The order:

  1. Dry run. A plan file with every sentence it would change, before and after. I read it.

  2. The script refuses to freelance. One short transaction. If anything differs from the plan I read, or a row changed since it was read, it aborts and writes nothing. It touches the post body only, and it backs up first.

  3. The first try got blocked. The session's own safety check stopped it writing to the live blog. Good. It came to me as one command instead.

  4. Live, no deploy. 179 sentences now say 20,000. (Rounded down, never up.)

Each fix commit also names a guardrail, the number that must not drop: "Search Console clicks on /ai-headshots stay flat."

Steal this: any bulk edit to live content goes dry run, then your eyes, then a script that refuses if reality changed.

The Ouch: Why My September Fix Missed 179 Sentences

On Sep 13 I banned "100,000+ job seekers". It was on every page, against 16,066 real users. A 6x overstatement.

I fixed it everywhere. Everywhere in the code, that is.

The blog lives in the database, so nothing looked there. Seven more weeks of "join the 100,000+" 🙃

Steal this: a ban stops new copy. It doesn't clean old copy. Search everywhere your words actually live: the code, the CMS, the database.

What I Kept (On Purpose)

The ratings line says 93% of the 4,390 people who rated Careerkit rated it positively. That's the old thumbs up/down form. Count the newer 0 to 10 scores too (7 or higher as positive) and it's 86% of 7,538.

Both are true. I kept the higher one. (Yes, I see the irony. It's true, and it's in the file.)

So… How Do You Check Your Own?

The lazy version, this week:

  1. List the claims. Landing page, pricing page, one blog post. Every number, rating, logo and testimonial.

  2. Ask your agent for the query behind each one, run read-only against production.

  3. Check what Google sees. View source and search for aggregateRating. I didn't know mine existed.

  4. Delete or shrink. No query means delete it, or write the real, smaller number.

  5. Put the survivors in one file with a date, and tell your agent: no number ships unless it's in that file. Otherwise it writes [NEED].

  6. Search where your copy lives, not just your repo.

If you take one thing away: every number on your page should match a query against your database that you can run today. If you can't write the query, the number isn't yours.

🧠 What I Learned on X

📰 AI News

🛠 Tools to Try

⚡ Skills to Try

📈 Growth & Money

💬 Builder Discussions

Okay, that's it from me. Reply with your question, I answer one every week. And go check your landing page. Then tell me the worst number you found 👀

Keep shipping,

Nishant