I built an AI marketing tool in 16 days. It made $0.


Between the 21st of March and the 6th of April this year, I built a product called LaunchMap. A hundred-odd commits, three pivots, a payment flow tested end to end, an email funnel, a launch plan. Then I shipped it, and it made zero dollars.

Not “slow start” zero. Not “still early” zero. Under a hundred visitors, ten free plans generated, zero paying subscribers, $0 in revenue. A clean, round, honest nothing.

I want to write down how that actually happened, because the failure isn’t where you’d expect. The build went fine. The product was good. What killed it was the one thing the product was literally designed to solve - and I walked into it with my eyes open.

What I was building

The premise was simple, and I still think it’s true: building is no longer the hard part. A whole wave of people who’d never have called themselves developers are shipping real apps in a weekend now - vibe coding - and I’ve come to build almost everything this way too. The hard part - the part nobody hands you a tool for - is getting anyone to use what you built. You finish, you deploy, you have zero users, and you have no idea what to do next.

LaunchMap was meant to be that next step. You’d paste in your app - a URL, a sentence, a category - and it would generate a full distribution plan: who your audience is, which subreddits to post in with the actual posts written out, SEO keywords, social copy, DM scripts, a seven-day action calendar. Then, if you wanted, it would coach you through executing it: three concrete tasks every Monday morning, with the copy ready to paste, adapting to what was working.

The tagline was “You built it. Now get your first 100 users.” I meant it as a promise to other people. It turned out to be a problem I hadn’t solved for myself.

Three products in sixteen days

The thing I’m almost proud of is how fast the idea moved. The thing I should have noticed is that all the movement was on my side of the screen.

Version one was a one-shot generator. Paste your app, get a plan, pay $29 to unlock the full thing. I built it in a day or two and then, the next morning, killed the business model in a sentence I wrote into my own spec: “LaunchMap generates a plan once and dies.” A one-time payment for a document people copy once and never return to. No reason to come back, no recurring revenue, nothing that compounds.

Version two was the pivot. Make the plan free - give the whole thing away - and sell the part that’s actually hard: doing it, every week, consistently. The insight I anchored on came from a real teardown I’d read, where a founder tracked conversions channel by channel and found Reddit converting at 6.25% while Twitter converted at 0%, despite Twitter sending far more traffic. Most people never run that analysis. They spray content everywhere and hope. So the product became a $9/month coach: it would watch what worked and tell you where to double down.

The subscription wasn’t a pricing trick, it was the whole point. In week one, you could get similar advice from ChatGPT. By week eight, the product would know your app, your audience, which channels converted for you specifically - institutional memory that no fresh prompt can reproduce. The longer you stayed, the better it got, and the harder it was to leave. On paper that’s a real moat. I wrote it down, I believed it, and I was reasoning about week eight for a product that never reached week one.

Version three stripped even that back. I cut the dashboard, the heatmaps, the tracking UI, and decided the email is the product. Three tasks a Monday, one tap to report your user count, and a prompt smart enough to read your trajectory and adjust. The check-in was the cleverest part: a single question - how many users do you have now? - answered by tapping one of five buttons. That one growing number was the entire data model, the thing that let the coach say “you went from 3 to 19, here’s what to do with the momentum.” I wrote in the spec that “the overwhelm is the conversion mechanism” - the free plan would be so complete it was paralysing, and the paid coaching was the relief. Honestly, it was a clean piece of product thinking. It just wasn’t the thing that mattered.

This is the email, by the way - the real Week 1 send. The only person who ever received one was me, testing the checkout on my old company Billabex:

Week 1 coaching email from Launchmap, subject 'Let's get you your first users', with an ACTIVATE — WEEK 1 label, a 'Your 3 tasks this week' heading, a 'how many users do you have right now?' check-in offering 0 / 1-10 / 11-50 / 51-100 / 100+ buttons, and a first task to write a problem-first Reddit post for r/SaaS

Three coherent products in sixteen days. I was very good at the part I was already good at.

The parts I sweated

I don’t want to pretend the build was sloppy, because it wasn’t, and the care is part of the story - it’s where all my attention went.

I ran a real evaluation on which model should write the plans. I put the same input through Claude Sonnet and Claude Opus side by side and read the outputs line by line. Opus cost roughly twice as much per plan but came back about 30-40% better on the things that actually mattered for this product: it cited real numbers, named specific communities with believable subscriber counts, and wrote Reddit posts that sounded like a person instead of a marketer. I paid for Opus. That was the right call. It was also a call about output quality for a product nobody would ever see.

Then there was the integration tax. The email provider had one quiet rule - transactional emails can’t use variable names that collide with contact property names - and I spent the better part of a week losing to it. Eight separate fixes across three days, each one revealing the next edge case: rename the properties, then an empty field breaks the fallback, then the template brackets are wrong, then the collision comes back from a different call. Classic whack-a-mole against an opaque external service. I reviewed my own design docs twice before writing code. I hardened the API routes, enabled row-level security, tested the Stripe checkout end to end with a throwaway route I deleted the moment it passed.

All of it real engineering. All of it in service of a launch that hadn’t happened yet.

Then I shipped it

By the 6th of April the thing was done. Payment flow validated, emails firing, deployed and linked, polished. And the very last thing I committed to the repo wasn’t code at all. It was a document titled Reddit warm-up plan for launch week.

Here’s what was in it. My plan to get users ran entirely through Reddit - because that’s where this audience is, and because the product’s own advice said Reddit was the highest-converting channel for indie software. But to post in the subreddits that mattered, you need karma. And my account didn’t have it. I needed something like ninety-nine more karma points just to be allowed to post in r/SaaS. So the final artifact of the whole project was a seven-day plan to leave five-to-seven genuine comments a day, grinding toward permission to launch.

That’s where the commit history stops. Not on a bug, not on a decision to quit. On a to-do list for the unglamorous work of earning the right to be heard.

The wall

Here’s the thing I knew and somehow hadn’t fully reckoned with: Reddit bans self-promotion. Hard. The whole platform is built to punish exactly the move I needed to make - showing up to say “I built a thing, here it is.” The product’s number-one prescribed channel was the one channel I couldn’t actually use to promote the product itself without getting banned.

The advice LaunchMap gives is good advice: don’t promote, contribute; give away the playbook, earn trust, let people find the tool. That works. It also takes weeks of patient, daily, low-status work - the precise opposite of the fast, high-craft building I’d just spent sixteen days doing. Faced with the choice, I did the small, safe version instead. I put a link in my Reddit bio. I mentioned it once in a Substack post. And then I waited for something I’d quietly arranged to never really start.

Here is the entire result of the launch, in three dashboards.

First, the plans table - every distribution plan LaunchMap ever generated, all of it:

Supabase plans table listing ten generated distribution plans with columns for app URL, description, category and a launch score of 90 to 100; several rows are my own test inputs, including Billabex and LaunchMap itself

Ten rows. And if you look closely, several of them are mine - test runs for my old company Billabex, and one row near the bottom where I ran LaunchMap on LaunchMap, the meta-launch I’d planned to write a triumphant Reddit post about. The actual strangers who generated a plan and never came back number in the single digits.

Then the traffic:

Vercel Analytics for launchmap.io over thirty days showing 7 visitors, 7 page views, a 100% bounce rate, only the homepage visited, and no referrers at all

Seven visitors in a month. A hundred-percent bounce rate. Every one of them landed on the homepage and left, and there’s not a single referrer in the list, because there was nothing anywhere referring anyone.

And the money:

Stripe billing overview for LaunchMap showing MRR of 0 euros, ARR of 0 euros, 0% growth rate, and a net volume of minus 0.39 euros

MRR: €0.00. ARR: €0.00 - euros, because I’m French and so was the Stripe account, though zero reads the same in any currency. Net volume: minus thirty-nine cents. I didn’t break even on my own launch; those are Stripe’s fees, the cost of having tested my own checkout. That dashboard has only ever shown one number, and it has a minus sign in front of it.

Under a hundred visitors. Ten plans, half of them mine. Zero subscribers. Zero - less than zero, really.

The honest part

The product, of course, had already diagnosed me. I had built an entire apparatus to fight exactly this failure - in other people. A two-email nurture sequence that would land in a free user’s inbox a day and two days after they got their plan, gently working on them. A weekly email so they’d never have to decide what to do. That one-tap check-in so showing up cost them a single thumb-press. I had thought hard about the execution gap, the precise distance between having a plan and doing it, and engineered a whole machine to close it for strangers. One of those nurture emails - the one meant to convince a free user to subscribe - opened with the line “a plan without a coach is just a PDF,” and went on about how most builders execute week one and stop. I’d written a whole funnel about the graveyard of plans people never execute, and then I filed my own launch plan straight into it. The coach I built for everyone else was the coach I needed and didn’t have.

I don’t think the lesson is “marketing is hard,” though it is. The lesson, the one I keep turning over, is that I’m drawn to the part of this work that has a clear finish line. Code compiles or it doesn’t. A flow works or it doesn’t. You can feel done. Distribution has no finish line - it’s showing up, slightly exposed, over and over, with no guarantee and no commit to mark the moment. Given a hard, ambiguous, status-risky task and a satisfying, well-defined one, I reliably reach for the satisfying one and call the motion progress.

LaunchMap wasn’t a failure of skill. The skill is the trap. I built the entire machine and never turned the crank, because turning the crank felt like the kind of thing you do later, once everything else is perfect. There is no later. The crank is the job.

I’m writing this partly so I can’t pretend otherwise next time. If you build things too - on your own, on nights and weekends - you probably know this shape. The repo full of polish. The launch plan you keep refining instead of running. The quiet conviction that one more clean feature will make the distribution unnecessary.

It won’t. I have a $0 product and a hundred and fifteen tidy commits to prove it.