DEV Community

Cover image for Our failed React Native template launch, dissected
Nikolas M I
Nikolas M I

Posted on • Originally published at the-path.hashnode.dev

Our failed React Native template launch, dissected

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 };
}
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.md at 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

  1. Write the docs first. If they're hard to write, the product is wrong.
  2. Price at $79 minimum for anything with a real backend.
  3. Ship a real backend from day one. Mock nothing a buyer would reasonably expect to be real.
  4. Record one 40-second video per template. Silent. Happy path.
  5. Ship for agents. CLAUDE.md, slash commands, real types. This is a moat.
  6. 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)