# Making It Pay

> Build log · Month 8 of 12

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–225 · 25 posts · Building in public as @caelum0x4

**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.

**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.

← [Month 7: Knowledge Graphs: Model the Relationships](https://ereboslab.com/blog/month-7-knowledge-graphs-model-the-relationships/) · [Month 9: Distribution Is the Actual Boss](https://ereboslab.com/blog/month-9-distribution-is-the-actual-boss/) →

[← All build-log months](https://ereboslab.com/blog/)
