The short version

Done and ready to launch are not the same thing. Testing catches what you planned for. Production catches everything else. The Mexican credit cards nobody planned for, the iOS update nobody expected, the bug that looks minor until it's costing real customers real money. Launch readiness isn't about perfection. It's about knowing which surprises you're prepared for and which ones you aren't.

We relaunched the platform. Trainers were back, content was in place, marketing had started. Subscriptions were climbing. The system was running.

And then the Stripe disputes began.

A few at first. Then more. Then a pattern: credit cards that looked completely legitimate at signup were being flagged days later. Real profiles, real behavior, the kind of activity that passes every automated check. By the time we understood what was happening, we were weeks into it with the whole team pulled in.

Mexican credit cards, used in a sophisticated fraud scheme to test cards through our payment processor. Stripe has a dedicated page for exactly this type of attack. Everything you need to know is right there. Nobody had gone looking for it. Why would you? Nobody thinks to search “will random fraudsters attack us through Stripe on launch day.”

That’s the thing about launching. You plan for what you can imagine. Production finds everything else.

Done and Ready to Launch Are Not the Same Thing

Reid Hoffman, who founded LinkedIn, said that if you’re not embarrassed by your first version, you launched too late. I believe that. Perfectionism is genuinely the wrong instinct at launch.

But there’s a version of “just launch it” that skips over things that actually matter, and it costs you in ways that are hard to recover from.

Done means the features work. Ready to launch means the features work under conditions you didn’t design for.

Real users doing unexpected things. Real traffic instead of test traffic. Real payment methods including fraudulent ones. Real devices running OS versions you didn’t specifically test. Third-party integrations that behaved perfectly in staging and quietly changed something on a Tuesday in production.

The gap between done and launch-ready is where most post-launch problems live. Not the dramatic failures - those you’d catch in testing. The slow, expensive ones that take weeks to understand and longer to fix.

Testing catches what you planned for. Production catches everything else.

What Testing Actually Catches (and What It Doesn’t)

There’s a common misconception that thorough testing makes launches predictable. It makes them less unpredictable. That’s different.

What each testing stage is actually good for, honestly:

Internal testing is the minimum. Your team uses the product the way your team uses it, which is nothing like how a real user who has never seen it before uses it. Internal testing catches obvious bugs, not UX problems, not fraud patterns, not load behavior. It’s necessary and insufficient.

Friends and family are useful for finding things that are obviously broken before a real customer sees them. That’s all. The concept here is the Mom Test: your mother will never tell you your idea is bad because she doesn’t want to hurt you. Apply this broadly. Anyone who cares about you will soften their feedback. Anyone who wants to do business with you will too. Friends and family tell you what’s broken. They will not tell you that the product isn’t good.

My situation with trucktrack was unusual here: my mother owned a trucking company, which meant she was an actual user. She had no interest in protecting my feelings when her drivers’ routes weren’t tracking correctly. That direct feedback was genuinely useful. Most founders don’t have that.

A small beta group of real users is the closest thing to actual signal before launch. People who have no reason to be kind, who have a real problem they’re hoping you’ve solved, and who will tell you clearly when you haven’t. This doesn’t need to be formal. For one platform we worked on, it was a WhatsApp group with twenty early adopters who knew they were testing an early version. That group found problems in three days that internal testing had missed for weeks.

Closed beta with specific tasks answers one question: do users understand what we built? Not “do they like it” - that comes later. Just: can they find the thing, do the thing, and understand what happened? If they can’t, that’s not a user problem.

Red flag

The waitlist trap

Waitlists only work if you’re opening them within days, not months. Someone who signed up six months ago doesn’t remember why they were excited. Their situation has changed. Your email lands as an interruption, not an invitation. If you’re using a waitlist as a launch mechanism, the window to convert that list into users closes faster than most founders realize.

The UX Problem Nobody Tests For

Registration.

I know. It sounds like the most thoroughly tested thing in any product. You’ve clicked through it fifty times. Your team has clicked through it fifty times.

You haven’t clicked through it the way someone who doesn’t know what your product does clicks through it. You haven’t tried to register on a slow connection on a phone you didn’t optimize for. You haven’t abandoned it at step three because the email didn’t arrive in thirty seconds.

We had a registration flow that made sense to us. Enter email, receive code, enter code, enter phone number, receive code, enter code, fill in details. Solid security. Completely reasonable from the inside.

The conversion rate was terrible. Real users were abandoning at every step after the first one.

When we switched to passwordless login - enter email, receive a link, click the link, you’re in - the conversion changed significantly. Same product. Same security posture. Different path to get in.

This is a UX problem that doesn’t show up in testing because everyone who tests it already wants to get through it. Real users make the decision whether to continue at each step. Testing never captures that decision.

Before launch

Registration tested and working

Team has gone through the flow many times. It works. Everyone agrees it's clear.

Launch week

Users start dropping off

70% of new visitors don't complete registration. Analytics show they're stopping at step two.

Week 2

Investigation

The flow that was obvious to people who built it is confusing to people who've never seen it.

Week 4

Rebuilt and relaunched

Passwordless login. Three fewer steps. Conversion recovers. A month of growth lost.

The Day After Launch Is a Phase, Not a Moment

This is the part that gets skipped the most in launch planning.

The founder launches and turns toward the next thing. New markets. Marketing. Fundraising. The product is live. That chapter is done.

The team stays with a live system that now has real users, real data, real traffic, and real attacks. And that system is learning what production actually looks like.

No matter how thoroughly you tested, something will surprise you. It’s not a question of whether - it’s a question of what and when. Configuration that looked correct in staging and isn’t. Data that was clean in the test environment and is messy in production. An integration with a third party that breaks because they made a change on their side with no warning.

The word I use for this period is stabilization. It’s a phase with its own priorities, not a moment you pass through on the way to growth.

“That’s just a bug” is a sentence that creates serious problems in post-launch teams. A bug that charges a real customer the wrong amount is not “just” anything. A bug that prevents new users from completing their first action is not “just” anything. Not all bugs are equal, and the founder who doesn’t make that distinction creates chaos in the team’s priorities.

How to think about bug severity after launch: is this costing users money, blocking users from doing the core thing, or degrading the experience? Those are not the same category. The first two are emergencies. The third is a queue item.

Communicating that distinction clearly to the team is part of post-launch leadership. It’s one of the things we establish early in how we work with founders through the stabilization phase.

Software Is Never Done

This is true for every piece of software that exists. Planning for it makes it manageable. Being surprised by it makes it expensive.

After launch, the maintenance costs don’t stop. They change shape.

Apple releases a new iOS version. Your app needs to adapt. Miss two or three versions and you can no longer publish updates because your build tools don’t support the current system. Google does the same thing. The payment processor you integrated changes how their API works. The email service you use deprecates an endpoint you’re using. The mapping library you chose releases a breaking update.

None of these are failures. They’re just the cost of having software in the world. What makes them expensive is when they’re not planned for.

If you have one developer, that developer is either building new features or maintaining what exists. It is very hard to do both at the same time, and pretending otherwise leads to either maintenance debt or feature slowdown. This isn’t a problem you solve with effort. It’s a problem you solve with planning. If development has already been slower than expected, here’s the structural reason why.

Weeks
spent by the whole team on a fraud pattern that fraud prevention tools would have caught automatically
1 popup
a single confirmation dialog that prevented all future accidental company data deletions
3 steps
removed from registration that recovered the majority of the conversion drop

The One Question That Tells You If You’re Ready

Before you launch, or before you launch a major new feature, write one sentence:

Who is the first person who will pay for this, and exactly how will I reach them?

Not “who is the target audience.” Not “who is the ICP.” One concrete person, and a specific path to them.

If you don’t have that answer, you’re not ready. It doesn’t matter how polished the product is, how well the tests passed, or how good the design looks. Without a clear path to the first sale, you’re launching into silence.

If you have that answer, launch. Don’t wait for perfect. Perfect costs you time that belongs to your first users.

The other question worth asking, on the technical side: what happens if it goes wrong in a way we haven’t planned for? Do you have error monitoring? Do you have a way to know something broke before a user tells you? Do you have a plan for the fraud patterns that don’t show up until you’re processing real payments?

Those aren’t reasons to delay launch. They’re things to have answers to before you get there.

Are you actually ready to launch?

Mark anything that's true right now.

0 / 8 0%

You have gaps that will cost you after launch. Better to know now.