Build log · Month 8 of 12
Making It Pay
monetization plumbing. RevenueCat entitlements, AdMob placement, paywall design, free-trial psychology, and the bracketed post I most want to earn — the first paying customer.
- Day 201
Money month. The fleet has to eventually pay for itself or it's an elaborate hobby. This month: RevenueCat entitlements, AdMob for the free apps, paywall design, trial psychology. And somewhere in here, hopefully, the tweet I've wanted to write all year.
- Day 202
🧵 Thread: how I pick a monetization model per app.
- How often is it used? Daily tool → subscription. 90-second game → not a subscription.
- Games (Cipher, Vertex): free with ads + a one-time remove-ads IAP.
- Tools (Aether, Huddle, CalDesk): free core, subscription for the premium tier.
- Ads at natural stops, never mid-flow. Monetize the pause, not the peak.
- Match the model to how people actually use the thing, not to a spreadsheet.
- Day 203
RevenueCat entitlements keep me sane: I check
isPro, not "did they buy the $4.99 monthly on iOS via receipt X." The SDK maps a dozen products across platforms to one boolean my code cares about. Abstract the store's chaos behind one clean question. - Day 204
Paywall lesson: it must appear after the user feels value, not before. CalDesk's old paywall greeted you on launch — instant uninstall. New one: log a few meals free, hit the "healthier swaps" wall once you're hooked. Sell the upgrade to someone who wants it.
- Day 205
Free trial psychology: a 7-day trial with a reminder before it charges converts better AND generates fewer angry refunds than a silent auto-charge. Surprising a user with a charge buys one payment and zero trust. Trust compounds; resentment churns.
- Day 206
🧵 Thread: wiring monetization across a fleet without losing your mind (or trust).
- One entitlement abstraction (RevenueCat). Your code asks
isPro, not "which receipt." - Paywall AFTER value, never on launch. Sell to someone who already felt the benefit.
- Free trial = show a reminder before the charge. Fewer refunds, more trust.
- Ads at natural stops only. Interstitial mid-flow is a retention grenade.
- Always ship "Restore Purchases." New phone + no restore = 1-star + rejection.
- One entitlement abstraction (RevenueCat). Your code asks
- Day 207
AdMob placement is a retention decision disguised as a revenue one. I A/B'd an interstitial after every Cipher puzzle vs. every third. Every-puzzle earned more per session and cratered day-7 retention. Chose retention. Lifetime value beats today's RPM.
- Day 208
The rounding bug that could've been a scandal: a discounted annual plan pro-rated with floating point and occasionally charged a cent off. In money code, never trust floats — integer cents, always. I now have a test asserting no price calc produces a non-integer cent.
- Day 209
Subscription state is a distributed-systems problem in a trenchcoat: the receipt on Apple's servers, the entitlement in RevenueCat, the UI on the device — disagreeing for seconds. I treat it as eventually-consistent and default to "loading," never "locked."
- Day 210
Grace periods matter: a card fails to renew, and instantly revoking access punishes a loyal user for their bank's hiccup. A billing grace period keeps them in while the retry happens. Dunning done kindly retains more revenue than dunning done aggressively.
- Day 211
Pricing is guesswork until it isn't. I have no idea what these apps are "worth" yet, so I picked defensible round numbers and I'll let real conversion data move them. Pretending I've optimized pricing at [N] users would be theater. You can't optimize an empty funnel.
- Day 212
Opinion: ads and subscriptions aren't opposites, they're a funnel. Free-with-ads is the top; remove-ads and pro are the conversion. The ad is revenue AND a daily reminder a paid tier exists. Designed together they compound; bolted on separately they fight.
- Day 213
The receipt-validation footgun: never trust the client's word that it's pro. A jailbroken device can fake a local receipt. Validation happens server-side, confirmed against the store. Client claims of "I paid" get the same skepticism as "tests pass."
- Day 214
Refunds are a product signal, not just a loss. A spike after a specific screen means that screen over-promised. I tag refunds with where in the flow they converted. Angry refunds are expensive user research you already paid for — at least read the results.
- Day 215
[FIRST PAYING CUSTOMER — fill when true.] A stranger I've never met paid real money for something I built alone. Not a friend, not a favor. [App], [plan]. I've built for 215 days for this single data point: proof the value is real to someone besides me.
- Day 216
Whatever the first-sale number is, the lesson holds: one real paying stranger is worth more than a thousand vanity downloads. Downloads are curiosity. A payment is a verdict. The whole year has been a search for that one honest verdict.
- Day 217
Conversion reality check: free-to-paid on tools is typically low single digits, and I'm at [N]%. At my user count that's a handful of humans — statistically meaningless, emotionally enormous. You learn more from your first 5 payers than your first 5,000 installs.
- Day 218
Annual vs monthly: I default the paywall to annual (monthly available) because annual buyers churn less and fund runway. But I never hide monthly — dark-patterning someone into a yearly commitment earns a chargeback and a 1-star. Nudge, don't trap.
- Day 219
The "remove ads" IAP is underrated for games. Some players will never subscribe but will happily pay once to kill ads forever. It's a low-friction yes and it self-selects your most engaged players. One-time purchases still exist and still convert.
- Day 220
Localized pricing matters more than I expected. A price reasonable in one economy is absurd in another; store algorithms weight purchasing power. I let the store set price tiers per region, not one hardcoded global number. Meet buyers where their wallet is.
- Day 221
Honest money status: [N] MRR, [N] paying users, across the fleet. Bracketed and, when filled, almost certainly small enough to make a VC laugh. But it's real and it's mine and it went from literally zero. Zero to something is the hardest multiple there is.
- Day 222
Month 8 lesson: monetization is a trust exercise, not an extraction one. Paywall after value, trial reminders, grace periods, honest pricing, easy restore — every "nice" choice also converted better. Treating users well and making money were the same move.
- Day 223
Next month is the one I've circled since day 4: distribution. 0 users has been the boss fight the whole time and I finally stop building around it and attack it head-on. Landing pages, SEO, launches, the cold-start problem. The real final boss. No more dodging.
- Day 224
Before distribution month: none of this monetization matters at volume until the top of the funnel has water in it. A perfectly wired paywall in front of nobody earns nobody's money. I built the cash register. Next month I go find the customers.
- Day 225
Two-thirds through the year. The fleet can now take money — cleanly, honestly, cross-platform. A real milestone even at a tiny revenue number. But revenue is a function of traffic, and traffic is what I've most neglected. Time to fix the actual bottleneck.