The build felt good. That's the honest starting point.
We had a working prototype in days, not weeks. The code was readable. The API calls were structured cleanly. ChatGPT caught a couple of type mismatches I'd have spent an afternoon chasing. For a founder who wanted to test a product idea without assembling a full team before knowing whether the idea even deserved one, it was exactly the kind of speed that changes what's possible.
I want to be clear about that before anything else, because what follows is a post-mortem, and post-mortems have a tendency to flatten everything into cautionary tales. This isn't one. What it is, I hope, is an honest account of where AI-assisted prototyping genuinely delivered, and where it quietly set traps we only found when real users walked in.
ChatGPT was genuinely good at scaffolding. Give it a clear problem with clear constraints, and it builds toward a solution with unusual speed. It generated clean API call structures, it kept the code organised, and, when I described the shape of what I needed rather than the exact implementation, it often returned something sensible on the first or second attempt.
It was also good at the kinds of tasks that eat a lone developer's time without producing anything interesting: writing boilerplate, switching between patterns, explaining why a particular approach might cause problems later. For those things, having a capable thinking partner available at any hour was genuinely valuable.
I've been building software for a long time, and I still found it useful. I'd argue that's the correct reading of the tool: not a replacement for technical judgment, but a way to move faster when you already have it. Think of it as an extremely capable session musician. Brilliant to play with, but someone still has to know what song you're making.
Here's where I want to be honest without being dramatic.
The code was correct. It wasn't resilient.
There's a difference, and it matters a lot more than it sounds. Correct means it does what you asked in the conditions you described. Resilient means it keeps doing something sensible when conditions change, when users do unexpected things, when the API you're calling starts behaving oddly. ChatGPT optimises for the former. It builds what you asked for. It doesn't particularly volunteer what you forgot to ask.
Within the first hour of real user testing, someone pasted a screenshot into a text field. A simple thing. A human thing. The kind of thing that never comes up when you're describing your idea to an AI assistant. The app handled it badly.
That wasn't ChatGPT's failure, to be fair. It was mine. I hadn't thought to specify it, because the kind of knowledge you need to anticipate that moment comes from watching real users, not from having a clean mental model of your own product.

The integrations had no defences.
No retry logic. No handling for rate-limit headers. No idempotency where it mattered. When a third-party API started returning intermittent errors under load, the whole flow broke, and the generated code had nothing to say about it. Again, this was code that was functionally correct in isolation. It just hadn't been written with the assumption that the world outside it would misbehave.
This one stung, because I know better. Correct code and resilient code are not the same thing. The pace of the build had let me forget that temporarily.
The context didn't survive.
This is the failure I've thought about most. As the codebase grew, I was carrying more and more of the architectural reasoning in the chat log. The decisions we'd made, why we'd made them, what we'd tried and discarded: it all lived in a conversation window. When a second developer joined three weeks later, the context was gone. We had the code. We didn't have the thinking behind the code.
Any experienced team knows documentation matters. But with a traditional build, the decisions tend to leave at least some traces in the structure itself. With this approach, the reasoning was entirely in the conversation, and conversations don't travel well.
The prompts produced inconsistency at scale.
Early on, I was running similar prompts and getting similar outputs, which felt fine. Later, as the product grew and I was prompting across more surface area, identical requests started producing outputs that were subtly tonally inconsistent with each other. In a prototype, that's cosmetic. In a product people are using daily, it starts to feel unpolished in ways that are hard to explain but easy to feel.

We did rebuild. Not from scratch, but substantially. It cost us real time and real focus, and it delayed a release we'd already talked about publicly. I won't dress that up.
But I'm not sure I'd have skipped the initial ChatGPT build. The MVP did what an MVP is supposed to do: it asked a question of the market and got a real answer back. That answer informed the rebuild in ways that pure planning never would have. If I'd spent six months spec-writing before writing a line of code, I'd have built something more architecturally sound and much more wrong.
An MVP is a question you ask the market. Not a monument you carve. ChatGPT let us ask the question fast. The rebuild was the answer taking shape.

What I'd tell you before you start:

I've always believed the limiting factor in building software isn't writing code. It's knowing what to build, and why, and for whom. ChatGPT doesn't change that equation. What it changes is how quickly you can test your theory about all three.
The painful part of this story isn't that the tool failed. It's that I let the speed of the tool outrun my own discipline. The checklist I'd have run through on a slower build, defensive integration patterns, shared context, edge-case planning, I skipped because things were moving fast and it felt fine.
AI doesn't replace the thinker. It amplifies them. If your thinking is good, you'll build faster. If your thinking has gaps, you'll discover them at scale, in production, with real users watching.
That's a lesson I knew before this build. I needed a rebuild to actually learn it.
TL;DR
Did building with ChatGPT actually work? Yes, a working prototype was ready in days, the code was clean, and it saved significant time on repetitive tasks.
What went wrong when real users arrived? The code worked in ideal conditions but broke under real-world use: no retry logic, no handling for unexpected inputs, and no protection when outside services misbehaved.
Why did adding a second developer cause problems? All the reasoning behind design decisions lived in the chat window and disappeared, the new developer had the code but none of the thinking behind it.
Was the rebuild worth it, and would they do the AI-assisted build again? Yes to both, the MVP got a real market answer that shaped the rebuild, which pure planning never would have provided.
What should you do differently before you start? Treat generated code as a first draft, write decisions down outside the chat, ask explicitly about failure scenarios, and expect some inconsistency as the product grows.**