TL;DR
- v1 launch: $29 template, 180 hours of work, $87 revenue, 40% refund rate.
- Root cause: shipped a UI kit, marketed as "full-stack."
- Rebuild fixed: real Supabase backend, real docs, demo videos, agent-readiness, price tripled, refund policy surfaced.
- Refund rate on v2: ~4%.
The setup
We built a React Native template. Twelve screens, Expo, TypeScript, NativeWind, tab navigation, auth screens that looked like Instagram's. What we did not ship:
// src/services/mockApi.ts
export async function getNotes(): Promise<Note[]> {
return HARDCODED_NOTES;
}
export async function signIn(email: string, password: string) {
return { user: FAKE_USER, session: FAKE_SESSION };
}
That was our "backend." A .env.example referenced Supabase but nothing in the app actually called it. The landing page used the phrase "full-stack" four times.
What happened at launch
| Metric | Value |
|---|---|
| Launch surface | X, Indie Hackers, small subreddit |
| First-4-hour visits | 231 |
| Sales | 5 at $29 |
| Refunds | 4 |
| Revenue after refunds | $87 |
| Hours invested | ~180 |
Effective hourly rate: about $0.48.
The angry email
The refund email that mattered, paraphrased:
I thought this was going to save me a week. It saved me maybe an evening. The auth doesn't connect to anything, the API returns hardcoded data, and I still have to build the entire backend. Why did I pay $29 for what's basically a Figma export in TypeScript?
He was right. We had shipped a UI kit and called it full-stack.
The six fixes
1. Real backend, not mockApi.ts
The rebuild replaced every mock with real Supabase. Migrations, seed data, RLS policies, Auth flows (email + Apple + Google), Storage with signed URLs, and Edge Functions proxying AI calls.
-- Example: real RLS policy shipped with every table
create policy "Users read their own notes"
on notes for select
using (auth.uid() = user_id);
create policy "Users insert their own notes"
on notes for insert
with check (auth.uid() = user_id);
If your buyer has to write their first RLS policy after unzipping your template, you have shipped an unfinished product. Reference: Supabase RLS docs.
2. Tripled the price ($29 → $79)
Counterintuitive but repeatable across cohorts. $29 attracted price-shopping customers whose expectations were miscalibrated. $79 attracts senior indies buying back time at a $100+/hour opportunity cost. Refund rate dropped from ~40% to ~4%.
3. Demo video per template
40 seconds, silent, showing:
git clone git@github.com:applighter/ai-voice-notes.git
cd ai-voice-notes
pnpm install
npx expo start
Then sign-up, hero action, data landing in Supabase. Screenshots let skeptical devs assume the worst. Video removes the doubt.
4. 12,000-word docs per template
We wrote 800 words for v1 and 12,000 for v2. The 15× increase doubled conversion. Buyers do not care how many screens you ship. They care whether they can be shipping their version inside 24 hours. That's a docs problem.
5. Ship for agents
The single biggest architectural change. In 2026, buyers point Claude Code, Codex, or Cursor at your repo before they read a file themselves. If the repo doesn't ship:
- A
CLAUDE.mdat the root - Slash commands / skills for the common workflows (add screen, add table, add AI provider)
- Real TypeScript types (no
any) - Predictable file layout an agent can grep
…the agent flails, the buyer concludes your template is bad. Every current Applighter template ships with skills and slash commands pre-installed, tested against Claude Code, Codex, Cursor, and Windsurf.
6. Refund policy above the buy button
"7-day refund, no questions asked." Refunds went up slightly (the ones we should have honored anyway). Chargebacks went to zero. Chargebacks cost more than refunds — both financially and to your Stripe account health.
v1 vs v2 at a glance
| Dimension | v1 ($29) | v2 ($79) |
|---|---|---|
| Backend | mockApi.ts |
Real Supabase (Postgres + Auth + Storage + Edge Functions) |
| RLS | None | Per-table policies + seed users |
| Docs | 800 words | ~12,000 words + video |
| Demo | Screenshots | 40-sec walkthrough |
| Agent readiness | None | Skills + slash commands |
| Refund rate | ~40% | ~4% |
What I'd tell 2025-me
- Write the docs first. If they're hard to write, the product is wrong.
- Price at $79 minimum for anything with a real backend.
- Ship a real backend from day one. Mock nothing a buyer would reasonably expect to be real.
- Record one 40-second video per template. Silent. Happy path.
- Ship for agents.
CLAUDE.md, slash commands, real types. This is a moat. - Refund policy above the buy button.
The gap between "nice UI I built in a week" and "template a senior indie will pay $79 for" is roughly three months of unglamorous infrastructure work. Skip any of it and the launch dies quietly.
The longer version of this postmortem — including the comparison against building from scratch — is on my Hashnode blog.
What's the worst launch you've had, and what did it teach you? Drop it in the comments — misery loves company and I'd genuinely like to read them.
Top comments (0)