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 (2)
The friction in adopting boilerplates usually isn't the code quality itself, but the hidden environment setup and native module linking that catches buyers off guard. When integrating Supabase into a React Native template, I found that handling deep linking for OAuth and managing the initial session state across iOS and Android requires a lot of boilerplate-specific documentation to prevent early churn. Did you find that the low initial sales were more about the template's technical complexity deterring beginners, or was it primarily a distribution and audience alignment issue? Rebuilding with a stricter focus on the first five minutes of the developer experience usually yields much better conversion and fewer refund requests.
The useful lesson is not simply “ship more,” but “define what the buyer believes is already finished.” The refund email exposed a scope contract failure. I would add a pre-launch test where someone must complete the promised happy path from a clean clone without asking the maker for help; every intervention becomes either missing product work or missing documentation.