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 (2)

Collapse
 
publiflow profile image
PubliFlow

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.

Collapse
 
officialmailkr profile image
오피셜메일

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.