Skip to content

Commit d63381d

Browse files
feat(articles): add 2 high-priority guides — onboarding + payment
User feedback: 'strong onboarding flow' and 'how to take payment' were the two biggest gaps in the article set. Shipping both. content/articles/onboarding-that-actually-converts.md - The 60-second rule (value moment before anything else) - Three failure modes (premature permissions, tour walkthroughs, empty states) - The 3-screen structure that works - How to find your value moment - Metrics that matter (time-to-first-action, D1, completion rate) - Real receipts table from Slothy + Excuse Caddie D1 improvements - When to add gates back (sessions 1 → 7+) content/articles/taking-payment-as-an-indie-dev.md - Four options compared (Stripe, Apple IAP, Play Billing, Lemonsqueezy/Paddle) - Pricing-as-signal table ($1 → $99+ implications) - Stripe Checkout integration overview - Apple's 2026 link-out ruling (SaaS apps can move to web checkout) - Free tier vs trial vs paid-only (with industry conversion rates) - Annual vs monthly default (10x with 14-day refund) - Refunds + disputes handling - Discount codes warning (don't, mostly) Both articles categorised as 'growth'. Headers, tables, code-snippets follow the existing voice and structure. Remapped 5 list-problems to point at the new articles: - refunds-week-one → onboarding (was: after-launch-troubleshooting) - priced-too-low, free-tier-converts-zero, iap-30-percent, annual-price-arbitrary, discounts-attract-churners → taking-payment (was: launching-on-google-play) Workflow step 08 'Launch' related list extended to include both new articles + the priced-too-low and free-tier fixes. Workflow step 09 'Iterate' now includes onboarding + refunds-week-one.
1 parent 31d5bab commit d63381d

4 files changed

Lines changed: 329 additions & 8 deletions

File tree

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
---
2+
title: "Onboarding That Actually Converts: The 60-Second Rule"
3+
description: "Most indie apps lose 80% of new users on day one. The reason isn't your product — it's that you asked them to do too much before they saw it work. Here's the onboarding pattern that survives contact with real users."
4+
date: "2026-05-20"
5+
image: "https://images.unsplash.com/photo-1521737604893-d14cc237f11d?w=1200&q=80"
6+
imageAlt: "Two people looking at a phone, onboarding moment"
7+
author: "vibeprompt"
8+
category: growth
9+
---
10+
11+
You spent three months building the app. Someone installs it. They have your icon on their home screen. Sixty seconds later, they're gone — and they never come back.
12+
13+
This is the reality for ~80% of new app installs across every category. The first session decides whether you ever see that user again. Get the first sixty seconds right and your D1 retention triples. Get it wrong and no marketing budget on earth saves you.
14+
15+
The good news: most indie onboarding flows fail in the same three ways, and the fix is mechanical.
16+
17+
---
18+
19+
## The 60-second rule
20+
21+
A user gives you 60 seconds to deliver one specific thing: a moment where they understand, viscerally, that your app does something useful for them. Not a tour. Not a feature list. The actual moment.
22+
23+
For Slothy (todo + planner): tap one button → first todo created → see it on tomorrow's screen. That's the moment.
24+
25+
For Excuse Caddie (golf excuse generator): tap → excuse appears → laugh or share. That's the moment.
26+
27+
For a B2B SaaS: paste one URL → see the audit result → that's the moment.
28+
29+
If your onboarding takes longer than 60 seconds to reach the moment, every extra second is a cliff. Real measurement: 7-second drop-offs at every screen until they hit value.
30+
31+
---
32+
33+
## The three failure modes
34+
35+
Almost every onboarding flow fails one of these:
36+
37+
### 1. Asking for permissions before value
38+
39+
Login, email signup, push notification permission, location access, paywall — anything that interrupts the path to value before the user has seen value.
40+
41+
The fix: defer everything. Show the value first. Ask for permissions when the user does the action that needs them, not as the opening move.
42+
43+
Example: a meditation app that asks for push permission on screen 2 ("so we can remind you") will get ~20% accept rate. Same app asking for push permission AFTER the user completes their first session ("want a reminder for tomorrow?") will get 60%+.
44+
45+
### 2. Tour-style walkthroughs
46+
47+
Five-screen tutorials with "Tap here, then tap here, then tap here." Users skip them, dismiss them, or worse — sit through them and forget everything by screen 3.
48+
49+
The fix: no tour. The app teaches itself through use. If your UI needs explanation, the UI is the problem, not the user.
50+
51+
The only exception: a single contextual tooltip when a user reaches a screen for the first time and the most-important action isn't obvious. One tooltip. Not five.
52+
53+
### 3. Empty states that say "nothing yet, get started by..."
54+
55+
This is a tax. Every empty state asks the user to do work before they get anything back. The user has zero context for what "good" looks like.
56+
57+
The fix: pre-fill the first thing. Show a sample todo. Generate a sample excuse. Auto-populate the first chart with demo data they can delete. The user's first session has content from second one.
58+
59+
---
60+
61+
## The structure that works
62+
63+
A working indie onboarding has at most three things:
64+
65+
```
66+
1. Hook screen (5 sec)
67+
- 1 sentence on what the app does
68+
- 1 primary button to start
69+
70+
2. Value moment (15-30 sec)
71+
- User does the action
72+
- Sees the result
73+
- Aha
74+
75+
3. Permission ask (5-10 sec, optional)
76+
- Only if needed for the next action
77+
- Framed as "want X? we need Y"
78+
```
79+
80+
That's it. No accounts. No email capture. No tour. Account creation can come later (after session 2, after the third action, after they've explicitly invested something).
81+
82+
Three screens, sixty seconds, one moment.
83+
84+
---
85+
86+
## How to find your moment
87+
88+
If you don't know what your value moment is, here's the test:
89+
90+
> If a user does exactly ONE thing in your app and you had to pick what it would be, what is it?
91+
92+
That action is your moment. Everything in onboarding should drive toward it.
93+
94+
For most indie apps the answer is obvious within 5 minutes of thinking. If you can't answer it, your app might not have a value moment yet — which is a deeper product problem, not an onboarding problem.
95+
96+
---
97+
98+
## Metrics that matter
99+
100+
Track these from day one (PostHog free tier handles all of it):
101+
102+
- **Time to first action.** From app open to first meaningful tap. Goal: under 30 seconds. If it's over 60, your onboarding has friction.
103+
- **D1 retention.** Percentage of new installs who come back the next day. Indie baseline: 20–30%. Above 40% means onboarding is working.
104+
- **Onboarding completion rate.** Percentage of new installs who reach the value moment in the first session. Goal: 70%+.
105+
- **Permission accept rate.** Percentage who allow push/location/etc. when asked. Goal: 40%+ for push. If yours is below 20% you're asking too early.
106+
107+
If you only track one: D1 retention. Everything else is upstream of it.
108+
109+
---
110+
111+
## The receipts: what we did
112+
113+
| App | First version onboarding | After fix | Δ D1 |
114+
|---|---|---|---|
115+
| Slothy | 4 screens, email signup on screen 2 | 1 screen, demo todo pre-filled | +18% |
116+
| Excuse Caddie | Splash screen → empty state | Splash → first excuse auto-generated | +24% |
117+
118+
Both fixes were under 2 hours of work. Both moved D1 retention more than any feature we added in the following month.
119+
120+
---
121+
122+
## When to add the gates back
123+
124+
Eventually you need accounts, email capture, paywalls. The point isn't to never ask — it's to ask AFTER value has been delivered, not before.
125+
126+
A reasonable progression:
127+
128+
- **Session 1:** value moment only, zero asks
129+
- **Session 2:** optional account creation, framed as "save your progress"
130+
- **Session 3:** push permission ask in context
131+
- **Day 7+:** paywall for advanced features (if applicable)
132+
133+
This sequence assumes the value moment landed. If your D1 retention is below 20%, no progression in the world will save you — fix the moment first.
134+
135+
---
136+
137+
## The one thing to test this week
138+
139+
Reset your app on a fresh device. Time yourself from icon tap to value moment. Anything over 60 seconds: cut.
140+
141+
Most indie devs find this exercise reveals one specific screen that's eating 20-40 seconds for no reason. Removing that one screen often beats months of feature work for retention.
142+
143+
The product is good. The marketing brought them in. Don't lose them in the first 60 seconds because of an onboarding flow you wrote at 2 AM the week before launch.
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
---
2+
title: "Taking Payment as an Indie Dev: Stripe, IAP, and the 30% Tax"
3+
description: "Charging for software used to require a sales team and a year of integration. In 2026 it takes an afternoon — but the decision tree (Stripe vs IAP vs subscriptions) is where most indie devs lose money they didn't have to lose. Here's how to pick."
4+
date: "2026-05-20"
5+
image: "https://images.unsplash.com/photo-1556742031-c6961e8560b0?w=1200&q=80"
6+
imageAlt: "Phone with payment app interface"
7+
author: "vibeprompt"
8+
category: growth
9+
---
10+
11+
The moment you charge for something, three things change: your tax setup, your refund obligations, and your relationship with whichever platform serves your customers. Most indie devs default to whatever feels easy in the moment and pay for it later in margin and migration cost.
12+
13+
The good news: in 2026 the decision is genuinely simple if you know the four real options. Here's the breakdown.
14+
15+
---
16+
17+
## The four real options
18+
19+
You'll see a hundred "payment providers" advertised. They mostly fall into four buckets:
20+
21+
| Option | Fee | Use when | Don't use when |
22+
|---|---|---|---|
23+
| **Stripe Checkout** (web) | ~2.9% + 30¢ | Web app, B2B, anything where users sign up on a website | You distribute exclusively on App Store / Play Store |
24+
| **Apple IAP** | 30% (15% after year 1 for subs) | iOS-only consumer app, you must use it for digital goods | Subscription business + you want margin |
25+
| **Play Billing** | 15% under $1M revenue, 30% above | Android consumer app, mandatory for in-app digital goods | Same as IAP |
26+
| **Lemonsqueezy / Paddle** | ~5% + 50¢ | EU customers, you want VAT/sales-tax handled, web only | You're price-sensitive AND in a low-VAT region |
27+
28+
Important 2026 update: Apple's recent court rulings now allow you to **link out from your iOS app to a web checkout** for digital subscriptions. If your customers buy on the web, you keep 100% (minus Stripe). For SaaS-shaped apps, this is the answer.
29+
30+
---
31+
32+
## The pricing-as-signal layer
33+
34+
Before payment integration, price the thing. The price is a positioning signal more than it is a number.
35+
36+
| Price | What it signals |
37+
|---|---|
38+
| Free | Hobby project, will disappear |
39+
| $1–4 | Indie tool, low ambition |
40+
| $5–9 | Consumer app, freemium suspicion |
41+
| $9–19 | Real product, indie ambition |
42+
| $19–49 | Pro tool, B2B-adjacent |
43+
| $49–99 | B2B starter |
44+
| $99+ | Enterprise / serious |
45+
46+
Most indie devs price too low. The instinct is "people won't pay $19 for this" — but the people who would pay $19 read your $5 price as "not worth bothering with" and bounce. Test the same product at 3x your current price for new signups. Existing customers grandfather in. If conversion stays flat, you were leaving money on the table.
47+
48+
---
49+
50+
## Stripe Checkout: the indie default
51+
52+
If your app is web-first or you can drive customers to a web signup:
53+
54+
1. Stripe account → live mode (15 minutes, get business verification done early)
55+
2. Stripe Checkout link or embedded checkout (no card form to build)
56+
3. Webhook handler in your backend listens for `checkout.session.completed`
57+
4. Update your `users` table with `subscription_status`
58+
5. Done
59+
60+
The full integration is ~150 lines of code for a single-product SaaS. AI-coded in a session. Don't over-engineer it — Stripe handles cards, taxes (with Stripe Tax), receipts, dispute flow, customer portal.
61+
62+
Watch out for:
63+
- **Stripe Tax.** Enable it on day one. Sales tax for digital goods in the EU/UK/CA/AU is non-optional. $1500/year tax penalty is worse than the 0.4% Stripe Tax fee.
64+
- **Webhook signing.** Verify webhook signatures. Without it, anyone can fake a "checkout completed" event and grant themselves access.
65+
- **Test mode card.** `4242 4242 4242 4242` for happy path, `4000 0000 0000 9995` for "card declined" to test your error states.
66+
67+
---
68+
69+
## Apple IAP: when you have to
70+
71+
If your app is iOS-only consumer (games, productivity, lifestyle), you must use IAP for digital goods. Apple is strict about this — selling a $5 unlock through Stripe from inside your iOS app gets you removed.
72+
73+
The 30% tax hurts, but two things soften it:
74+
- **Subscriptions drop to 15% after year 1** if a user stays on IAP
75+
- **The Small Business Program** drops IAP fees to 15% if your annual proceeds are under $1M (most indie devs)
76+
77+
What kills indie apps on IAP isn't the tax — it's the conversion drop. Apple's payment sheet adds 1–2 seconds of friction and a feeling of "ugh, Apple is involved" that depresses conversion vs Stripe Checkout by maybe 15–25%. It is what it is.
78+
79+
If your app is hybrid (web + iOS), the new ruling lets you direct iOS users to web checkout. Most subscription SaaS should take advantage:
80+
81+
```
82+
iOS app screen:
83+
"Upgrade on the web →" (opens Safari to your /pricing)
84+
85+
Same app, also keeps:
86+
"Or upgrade in-app →" (uses IAP, you pay 15-30%)
87+
```
88+
89+
Some users will prefer IAP (it's frictionless). Some will prefer web (you keep 100%). Offer both, let them choose.
90+
91+
---
92+
93+
## Free tier vs trial vs paid-only
94+
95+
A choice that matters more than the payment integration:
96+
97+
### Freemium (free tier exists)
98+
- **Conversion rate:** 1–5% over the lifetime of a user
99+
- **Pro:** lower friction acquisition, viral effects
100+
- **Con:** most users will never pay, support cost on free users, free tier scope creep
101+
- **Use when:** the value scales with usage (more users = more value to remaining users) or the free tier seeds your distribution
102+
103+
### Trial (e.g. 7–14 days)
104+
- **Conversion rate:** 10–30%
105+
- **Pro:** captures users at the moment of intent, narrows your support cost to people who'll pay
106+
- **Con:** higher acquisition friction, "credit card required" depresses signups
107+
- **Use when:** your product needs 2–3 sessions before the value is clear
108+
109+
### Paid-only
110+
- **Conversion rate:** depends entirely on positioning
111+
- **Pro:** every user is a paying user, support cost is justified
112+
- **Con:** requires real trust (reviews, brand) before launch
113+
- **Use when:** you have a clear B2B audience or your brand is already strong
114+
115+
For most indie products: **trial beats freemium**. The "free tier converts at 0.3%" problem is a freemium problem, not a conversion problem.
116+
117+
---
118+
119+
## Annual vs monthly
120+
121+
Industry-default: annual = 10x monthly (~16% discount). Anything more aggressive than that is leaving cash on the table — annual users have higher LTV anyway, you don't need to discount that hard.
122+
123+
What annual gets you:
124+
- 12 months of cashflow on day one
125+
- Lower churn (committed users churn less)
126+
- Less monthly support overhead per customer
127+
128+
What it costs:
129+
- Higher refund risk in month 1–2
130+
- Some customers feel locked in and resent it (mitigated by a 14-day no-questions refund policy)
131+
132+
Default position: offer both, lead with monthly on the pricing page (lower commit) but show annual as "save 2 months" next to it.
133+
134+
---
135+
136+
## Refunds and disputes
137+
138+
Refund rate above 3% is a red flag. Above 5% is a fix-now problem.
139+
140+
The two reasons indie SaaS gets refund-spiked:
141+
142+
1. **Onboarding didn't show the value in 60 seconds.** User pays based on the promise, gets confused on first use, refunds. See [onboarding fix](/articles/onboarding-that-actually-converts).
143+
2. **Pricing tier was confusing.** They picked wrong, feel ripped off. Simplify your tiers. Three is the max.
144+
145+
Watch the first 5 refund recordings (PostHog session replay catches this). The pattern is usually the same screen. Fix that screen and refund rate drops 50%+ within a week.
146+
147+
For Stripe disputes: respond within 7 days, attach the user's session log, attach their email receipt, attach the screen they saw at signup. Win rate ~60% if you respond, ~10% if you don't.
148+
149+
---
150+
151+
## Discount codes
152+
153+
Avoid for the first 6 months unless:
154+
- You're rewarding annual upgrades from monthly customers
155+
- You have a clear vertical that's price-sensitive (students, nonprofits)
156+
157+
Generic "30% off everything" campaigns attract coupon-hunters, not real customers. They churn at 3x the rate of full-price customers and cost you LTV you'll never see.
158+
159+
If you must run a launch discount: time-cap it (48 hours), require an email for the code, and tag those customers in your DB so you can measure their retention vs full-price.
160+
161+
---
162+
163+
## Bottom line
164+
165+
For 90% of indie SaaS in 2026:
166+
167+
```
168+
Web app → Stripe Checkout, $19–49/mo, trial-first, annual at 10x monthly
169+
iOS-only consumer → IAP (Small Business Program for 15%) until you can offer
170+
web signup with link-out, then move users to web
171+
Android consumer → Play Billing (15% under $1M revenue)
172+
```
173+
174+
The payment integration is the smallest part of this. The pricing decision, the trial-vs-freemium call, the refund-rate watchpoint — those are where indie devs win or lose. Get those right and the integration is an afternoon.

src/lib/list-problems.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,42 +255,42 @@ export const LIST_PROBLEMS: ListProblem[] = [
255255
title: "Priced at $5 and nobody trusts it",
256256
category: "earn",
257257
answer: "Price is a signal. $5 SaaS reads as \"hobby project, will disappear\". $19-29 reads as \"actual product\". For B2B tools, $49 minimum. Test by 3-4x your current price for new signups; existing customers grandfather in. If conversion stays flat, you were leaving money on the table. If it tanks, ratchet down — but most indie devs are too low, not too high.",
258-
articleSlug: "launching-on-google-play",
258+
articleSlug: "taking-payment-as-an-indie-dev",
259259
},
260260
{
261261
id: "free-tier-converts-zero",
262262
title: "Free tier too generous, paid converts at 0.3%",
263263
category: "earn",
264264
answer: "0.3% is industry-typical for freemium SaaS. The fix isn't \"shrink the free tier\" — most users on free aren't going to pay no matter what. The fix is targeting paid users from the start with a trial (7-14 days, full features), not freemium. Trial converts 10-30%, freemium converts 1-5%.",
265-
articleSlug: "launching-on-google-play",
265+
articleSlug: "taking-payment-as-an-indie-dev",
266266
},
267267
{
268268
id: "iap-30-percent",
269269
title: "Apple takes 30% via IAP",
270270
category: "earn",
271271
answer: "Three legal options: (1) Stay in IAP — simplest, pay the tax. (2) Subscriptions get 15% after year 1 if you stay on IAP. (3) For digital subscriptions outside the app (link from your website), you keep 100% — Apple's recent ruling allows linking out. SaaS-shaped apps usually have customers sign up via web, then use the app.",
272-
articleSlug: "launching-on-google-play",
272+
articleSlug: "taking-payment-as-an-indie-dev",
273273
},
274274
{
275275
id: "annual-price-arbitrary",
276276
title: "Annual price feels arbitrary",
277277
category: "earn",
278278
answer: "Common pattern: annual = 10x monthly (16% discount). Anything more aggressive than that and you're discounting cash you can use. Anything less and customers feel punished for committing. Don't overthink it — pick 10x, observe for 90 days, adjust if needed. Mostly it doesn't matter as much as you think.",
279-
articleSlug: "launching-on-google-play",
279+
articleSlug: "taking-payment-as-an-indie-dev",
280280
},
281281
{
282282
id: "discounts-attract-churners",
283283
title: "Discount codes attract people who churn",
284284
category: "earn",
285285
answer: "Coupon hunters are not your buyers — they're a separate audience that costs you LTV. If you must discount, restrict to: (1) Annual upgrades from monthly (rewards commitment), (2) Specific verticals where price is genuinely a blocker (students, nonprofits). Avoid generic 30%-off campaigns — they pull in the worst cohort.",
286-
articleSlug: "launching-on-google-play",
286+
articleSlug: "taking-payment-as-an-indie-dev",
287287
},
288288
{
289289
id: "refunds-week-one",
290290
title: "Refund requests start in week 1",
291291
category: "earn",
292292
answer: "Almost always one of: (1) Onboarding didn't show the value in 60 seconds, they got lost and gave up. (2) Pricing tier was confusing — they picked wrong and feel ripped off. Watch the first 5 refund recordings (Hotjar, PostHog). The pattern is usually the same screen. Fix that one screen and refund rate drops 50%+.",
293-
articleSlug: "after-launch-troubleshooting",
293+
articleSlug: "onboarding-that-actually-converts",
294294
},
295295

296296
// ── Stay ──────────────────────────────────────────────────────────────────

src/lib/workflow-related.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export const WORKFLOW_RELATED: Record<string, WorkflowRelated> = {
4545
"launching-on-google-play",
4646
"getting-your-first-app-reviews",
4747
"instagram-for-indie-apps",
48+
"onboarding-that-actually-converts",
49+
"taking-payment-as-an-indie-dev",
4850
],
4951
fixIds: [
5052
"reddit-removed-post",
@@ -53,10 +55,12 @@ export const WORKFLOW_RELATED: Record<string, WorkflowRelated> = {
5355
"twitter-12-impressions",
5456
"five-stars-three-reviews",
5557
"rank-brand-only",
58+
"priced-too-low",
59+
"free-tier-converts-zero",
5660
],
5761
},
5862
"09": {
59-
articleSlugs: ["after-launch-troubleshooting"],
60-
fixIds: ["60-visitors-zero-conv", "metrics-anxious"],
63+
articleSlugs: ["after-launch-troubleshooting", "onboarding-that-actually-converts"],
64+
fixIds: ["60-visitors-zero-conv", "metrics-anxious", "refunds-week-one"],
6165
},
6266
};

0 commit comments

Comments
 (0)