AI agents can now build a surprisingly complete product. Not a demo, not a prototype with three pages and a fake signup form â an actual product with a database, a pricing page, Stripe integration, email flows, and over a thousand content pages. Watching it happen is genuinely impressive, and if you stop watching at that point, youâd walk away thinking the âAI replaces developersâ people might have a point.
Then someone has to actually run the thing. Thatâs where this story starts.
The experiment
The project is called GetPricePulse â a SaaS pricing intelligence product, and itâs Claudeâs entry from The $100 AI Startup Race, the season-long challenge where seven AI agents each got $100 and full autonomy to build a real startup from scratch, with no human coding and no product manager in the loop. Claude picked SaaS pricing intelligence as its idea, built it out under the name PricePulse, and kept adding to it across the race, explicitly optimized for speed, feature creation, shipping, and monetization experiments. Not for correctness. Not for coherence. For velocity.
Claude delivered on exactly what it was optimized for. Across the race, it produced:
- More than 1,300 HTML files
- Hundreds of content pages
- A pricing database
- Calculators
- Monitoring features
- Full authentication
- Stripe payment integration
- Email flows
That is, by any reasonable measure, a lot of software for a single agent to produce. If you handed a solo developer this scope and a normal timeline, youâd expect months of work. Claude produced it across the raceâs running sessions.
The lesson of this piece is not that this was bad. It wasnât. The lesson is what happened next: a full production audit, performed after the race, before anyone could reasonably treat this as a real business. That audit is the actual subject of this article, because itâs the part nobody shows you when they demo an AI agent building a SaaS product live.
What the AI actually built
Before getting into what was wrong, itâs worth being precise about what was right, because the instinct in AI criticism pieces is to undersell the achievement to make the lesson land harder. Thatâs not accurate here, and itâs not useful either.
The agent shipped a functioning product. Authentication worked, in the sense that users could sign up and log in. Stripe was wired up and processing at least one pricing tier correctly. There was a real database of company pricing information, not placeholder text. There were working calculators. There was a monitoring feature that could, in principle, track pricing changes. This is not a âthe AI produced garbageâ story. If it were, thereâd be nothing interesting to say about it.
What Claude optimized for â because itâs what the race rewarded â was local objectives: more features, more pages, more calls-to-action, faster paths to monetization, more experiments running in parallel. Each of those objectives, evaluated on its own, looks like progress. Add a pricing tier: progress. Add a CTA: progress. Add a content page: progress. Add another monetization experiment: progress.
The problem only shows up when you evaluate the product as a whole, rather than as a sum of individually-reasonable additions. And thatâs precisely the kind of evaluation an agent optimizing for shipping speed has no built-in reason to perform.
Why the first version was impressive but immature
Hereâs the discovery that reframes the whole story: the biggest problems were not in any single feature. Every individual thing the agents built basically worked, in isolation. The problems were in the seams between things â the parts that only become visible when you look at the product as a whole rather than as a checklist of shipped features.
Five categories of problems surfaced during the audit: positioning, commercial structure, trust, information architecture, and a handful of concrete engineering bugs. Each one is worth walking through, because each one teaches something different about what âfinishedâ actually means.
1. The positioning problem: too many products in one
The site had, without anyone deciding this on purpose, become five products stapled together:
- A SaaS pricing publication/database
- A monitoring SaaS
- A FinOps toolkit
- A competitive intelligence product
- A lead generation system
None of these are bad ideas. Some of them are genuinely good ideas. The problem is that a visitor landing on the site had no way to know which product they were looking at, because the site itself didnât know. The navigation, the CTAs, and the content all pulled in different directions, because each was added in pursuit of a locally reasonable goal (âadd a monitoring feature,â âadd a FinOps calculator,â âadd a lead capture formâ) without any mechanism enforcing a single coherent answer to âwhat is this, actually.â
The fix wasnât to remove features. It was to pick an identity and make everything else subordinate to it. The final positioning: âSaaS pricing intelligence publication and database, with optional monitoring in beta.â That single sentence did more to make the product legible than any individual feature change. Monitoring didnât disappear â it got demoted from co-equal product pillar to a clearly-labeled beta feature sitting inside a publication-and-database identity. Everything else could then be evaluated against that sentence: does this page/feature/CTA serve the pricing intelligence publication, or is it pulling toward a different, uncommitted-to identity?
2. Commercial cleanup: pricing chaos as a symptom, not the disease
The commercial layer had accumulated, not been designed. Before cleanup, GetPricePulse simultaneously offered:
- A $9 lifetime deal
- A $49 lifetime deal
- A $99 âfounding memberâ deal
- Regular monthly plans
- Multiple, different checkout paths for each
Each of those was, individually, a reasonable monetization experiment â the kind of thing youâd genuinely want to A/B test if you were deliberately researching pricing psychology. Stacked together with no single owner deciding which ones stay, they created real operational problems, not just messaging confusion:
- Multiple checkout systems that had to each independently be correct
- Inconsistent promises made to different segments of buyers
- Some purchases did not automatically provision user access â meaning a customer could pay and not receive what they paid for, without anyone necessarily noticing right away
- Cancellation promises that didnât match what was actually implemented in the billing logic
That last point deserves emphasis: this isnât a copywriting problem. A page that promises a cancellation policy the codebase doesnât actually implement is a liability, not a UX rough edge. Itâs the kind of thing that looks fine in a demo and becomes a real problem the first time a real customer tries to act on the promise.
The cleanup collapsed this into something a single person could hold in their head: a Free tier, a Starter tier at $19/month or $190/year, and a Pro tier marked explicitly as coming later. Lifetime offers, aggressive sales CTAs, and fake urgency all got removed. Not because theyâre inherently wrong tactics â but because a product with an unclear identity and multiple unverified checkout paths has no business running aggressive urgency tactics on top of that foundation. Fix the foundation first.
3. Trust and content: modeled scenarios wearing the clothes of case studies
This is the finding that will feel most familiar to anyone who has spent time around AI-generated marketing copy. Pages across the site contained claims that read like real-world evidence: âreal case studies,â exact savings figures, benchmark statistics, examples written in a voice that implied specific customers with specific results.
The actual source of most of this content: modeled scenarios based on public pricing data. Not fabricated numbers pulled from nowhere â legitimately calculated estimates based on real, publicly available pricing information. But presented with the confidence and specificity of verified customer outcomes, which they werenât.
This is a subtle failure mode worth sitting with, because itâs not âthe AI lied.â Itâs that confident, specific-sounding language is the agentâs default register, and nothing in a âship more contentâ objective pushes back against that register when the underlying claim is actually a model, not a measurement. The fix wasnât to make the content less impressive â a modeled scenario based on real pricing data is genuinely useful information. The fix was to make it honest about what it was: labeling scenarios as modeled, stating the assumptions behind the calculation, dating when the calculation was performed, and being explicit about limitations.
Trustworthy and impressive turned out not to be in tension here. A clearly-labeled modeled scenario with visible assumptions is more credible than a vague âreal case studyâ claim with no verifiable specifics â precisely because the reader can check your work.
4. Information architecture: the SEO problem that wasnât about content
This is the finding most worth internalizing if youâre building anything content-heavy with AI agents, because it inverts the assumption most people bring to âAI-generated content and SEO.â
The instinct is to worry about content quality or thinness â the classic âwill Google penalize AI contentâ fear. That wasnât the actual problem here. The actual problem was structural:
- Navigation was inconsistent across hundreds of pages, meaning different sections of the site behaved like different products stitched together (which, per the positioning finding above, they kind of were)
- Company pages existed but were disconnected from the rest of the siteâs structure
- Site search covered only a fraction of the actual database â 68 records were searchable when 201 company pages actually existed
- Duplicate tools competed with each other for the same search intent instead of one canonical version existing
- Important company pricing pages werenât properly linked into the siteâs structure at all, making them effectively invisible even though the content existed
None of this is a content-quality problem. You could have the single best-written pricing comparison page on the internet, and if it isnât linked from anywhere discoverable and isnât in the siteâs search index, it doesnât matter. Each feature or content batch had reasonable local logic behind it. Nothing was coordinating the structure those pieces needed to sit inside.
The fixes were entirely structural, not editorial:
- Navigation standardized across all 201 company pricing pages
- Search coverage brought from 68 records up to 127, with a target and eventual result of 201/201 company pages discoverable
- Roughly 1,800 lines of duplicated JavaScript search code removed and replaced with a single shared search module
That last fix matters beyond the line count. Duplicated inline search implementations across pages means every future search improvement has to be made N times, correctly, everywhere, or you get silent inconsistency. A shared module means one fix propagates everywhere. Thatâs not an SEO fix. Itâs a maintainability fix that happens to also fix SEO, because search engines and users both rely on the same underlying discoverability.
5. UX fragmentation: five products, five sets of navigation
This finding is closely related to the positioning problem, but itâs worth separating because the fix was different. Before cleanup, different sections of the site had different navigation entirely â company pages had one navigation pattern, the blog had another, tools had a third. Visiting different parts of the site felt like visiting different products, because in a real sense, each section had been built in isolation, session by session, with no shared navigation contract enforced across them.
The fix was a single, unified information architecture applied everywhere: Pricing Database, Price Changes, Comparisons, Calculators, Guides, Alerts, Pricing. One navigation structure, consistently present, everywhere on the site. Contextual search was also added throughout the company pages specifically, since thatâs where the biggest coverage gap had existed.
6. Real engineering bugs: the kind that only show up under actual use
Beyond structure and positioning, the audit also surfaced concrete engineering problems â the kind that are invisible in a quick demo and only show up when you actually try to use the product the way a real user would.
The authentication crash. The signup button appeared broken. The root cause was a naming collision: the code declared a local variable const supabase, while the Supabase browser library itself already used the global window.supabase. That collision caused a JavaScript failure before the authentication request ever fired â meaning the button didnât just fail gracefully, it broke in a way that would be genuinely confusing to debug if you didnât know to look for a naming conflict specifically. The fix was mechanical once found: rename the local variable to supabaseClient consistently across signup, login, dashboard, settings, and password reset pages. Simple fix. Not simple to notice, because it only manifests as âthe button doesnât work,â with nothing in the visible UI hinting at why.
The session bug that looked like a login bug but wasnât. After logging in, users would browse to public pages and appear logged out again â the classic, confidence-destroying âdid my login even work?â experience. The actual cause was more interesting than a broken session: the session was working correctly the entire time. The bug was that public pages simply never checked authentication status at all, so they had no way to reflect that a user was logged in even though they genuinely were. The fix was adding shared authentication-status handling across 225 pages, so that a logged-in user consistently sees âDashboardâ instead of âStart freeâ everywhere on the site, not just on the pages an agent happened to remember to wire up.
Email infrastructure sprawl. The product had accumulated multiple parallel marketing email systems: old campaigns, lifetime-deal-specific emails, growth experiments, nurture sequences â each added, presumably, in pursuit of a specific monetization experiment at the time. The cleanup removed the obsolete marketing systems entirely and kept only what a production product actually needs: transactional emails, account emails, monitoring alerts, and an explicit, opt-in newsletter signup. Fewer systems, but the right systems.
Infrastructure credentials, not infrastructure design. The product ran on Supabase, Resend, and Stripe â a reasonable, standard stack. The Resend API key turned out to be invalid, which meant transactional email wasnât actually sending. This is worth calling out specifically: the architecture was not broken. The credential was simply expired or invalid, which is a completely different category of problem than a design flaw. Once the key was replaced and the sending domain verified, transactional email worked as designed. Similarly, the annual Stripe pricing tier ($190/year) was fully coded in the application, but the corresponding Stripe price object had never actually been created on Stripeâs side â so the code was correct and the integration was incomplete for reasons that had nothing to do with the code. The fix was creating the missing Stripe price object and connecting it. Both of these are reminders that âproduction-readyâ isnât purely a code-quality question. It includes the boring operational work of actually verifying that every external dependency your code assumes exists, actually exists, with valid credentials, in the state your code expects.
The transformation
After the audit and cleanup, GetPricePulse became something narrower and, not coincidentally, something more credible: a focused SaaS pricing intelligence publication and database, with monitoring clearly positioned as an in-beta feature rather than a co-equal pillar competing for the same attention.
Concretely, what changed:
- Positioning: one clear sentence describing what the product is, with everything else subordinate to it
- Pricing: collapsed to Free, Starter ($19/mo or $190/yr), and a clearly-labeled âPro, coming laterâ â down from a tangle of lifetime deals and founding-member offers with inconsistent implementation
- Trust: modeled scenarios now labeled as modeled, with visible assumptions and calculation dates, instead of reading like unverified case studies
- UX: one navigation structure across the entire site instead of five different ones
- Search: full coverage of the actual database (201/201 company pages discoverable) instead of a fraction of it (68 records)
- Authentication: fixed the naming collision that broke signup, and added consistent auth-status awareness across 225 pages
- Email: reduced to the systems a production product actually needs
- Payments: verified and completed the Stripe integration for the tier that had been coded but never actually connected on Stripeâs side
None of this required rebuilding what Claude built. Almost all of it was auditing, consolidating, and connecting what already existed. The volume of work Claude produced was not wasted â it was the raw material. What was missing was the layer of judgment that decides which raw material becomes the product and which gets cut, and the verification work that confirms every piece that survives actually functions the way it appears to.
Lessons for AI builders
If youâre using AI agents to build something you intend to actually run as a product â not a demo, not a portfolio piece, an actual product with actual users â a few things from this audit generalize well beyond GetPricePulse specifically.
Feature count is not a proxy for product quality. An agent that ships ten features that donât share a coherent identity has produced less value than an agent that ships three features that do, even though the first agentâs changelog looks more impressive. If nothing is enforcing coherence, nothing will produce it, because coherence isnât a local property of any single change â itâs a property of how changes relate to each other.
Confident language is not evidence. AI-generated content defaults to a specific, confident register, whether or not the underlying claim has specific, confident evidence behind it. A modeled scenario described with case-study confidence is a trust problem waiting to surface, even if every underlying number is calculated correctly and honestly. The fix is not less confident-sounding writing across the board â itâs matching the confidence of the language to the actual epistemic status of the claim.
Structure is invisible until you go looking for it. Nobodyâs individual page was the problem. The relationships between pages â navigation, search coverage, internal linking â were. Structural problems donât show up when you review any single artifact an agent produced; they only show up when you deliberately audit the system those artifacts are supposed to form.
âIt works in the demoâ and âit worksâ are different claims. The auth bug, the session bug, and the missing Stripe price object all would have looked fine in a quick walkthrough. They only surfaced under something closer to real usage patterns â trying multiple pages, trying the annual plan specifically, checking whether a signed-in user sees consistent state everywhere. Production readiness requires testing the paths a demo doesnât naturally walk.
Credentials and configuration are part of âdone,â not an afterthought. Code that correctly assumes a valid API key, a created Stripe price object, or a verified sending domain is not finished code if any of those external states doesnât actually exist yet. This is boring, unglamorous verification work, and itâs exactly the kind of thing that doesnât show up in a feature list.
The nuanced conclusion
It would be easy to write this story as âAI built a bad product and humans had to save it.â Thatâs not what happened, and itâs not an accurate read of the evidence. Claude, optimizing exactly for what the race rewarded â speed, feature creation, shipping, monetization experiments â produced an enormous amount of legitimately useful raw material in a fraction of the time a solo developer would need. The database was real. The calculators worked. The core Stripe integration mostly worked. Thatâs not a small accomplishment.
What Claude did not do, and had no mechanism to do on its own, was provide the layer of judgment that a real product needs on top of raw capability: a single coherent identity, a commercial model a customer could trust, content thatâs honest about its own epistemic status, a structure that makes a thousand pages actually discoverable and coherent rather than merely present, and the boring verification work that confirms every integration a codebase assumes to exist, actually does.
The accurate conclusion isnât that AI built a bad product. Itâs that AI built a fast, genuinely capable prototype that required a production maturity phase â the same phase that any fast-moving human team building fast would also need, just compressed into a shorter timeline because the raw building happened so much faster. Claude didnât fail at its job. The job, as the race defined it, didnât include the parts that turned out to matter most for whether this could be a real business.
If youâre building with AI agents, the lesson isnât to slow down the building. Itâs to budget, explicitly and deliberately, for the audit phase â the phase where a human looks at the whole system rather than any individual piece of it, and asks the questions no local optimization objective was ever going to ask on its own.
Related Articles
- I Let an AI Agent Run a SaaS Like a Solo Founder. It Made the Same Mistakes Humans Make. â the first-person account of what auditing this project actually felt like
- 7 Things AI Coding Agents Donât Understand About Real Products
- We Built 1,300 Pages With AI. The Biggest Problems Were Not SEO
- AI Agents Are Great Employees. They Still Need Product Managers.