1
100%
u/TheAIPunter
13 hours ago
Solo-built a horse racing analysis app. The hardest part wasn’t the AI, it was subscriptions. Here’s the stack and what broke
**Backstory:** I’m a tradie by day. I built Signalix on nights and weekends. You screenshot any horse race from any bookmaker and it returns an AI breakdown (favourite, danger, roughie, confidence scores, form notes). Live on iOS and Android with a free tier and paid plans.
**Stack:**
* **App:** FlutterFlow (iOS + Android from one build)
* **Brain:** Supabase edge functions. The screenshot gets matched to the live race, then live market data and form data are combined to produce the analysis.
* **Users:** Firebase / Firestore
* **Payments:** RevenueCat on top of Apple and Google subscriptions
**The part nobody warns you about: keeping “Pro” in sync**
Purchases flipped users to Pro automatically, but nothing ever flipped them back when a sub expired or a card failed. So I built a RevenueCat webhook → edge function that:
* never trusts the webhook alone. It asks RevenueCat’s API for the user’s current entitlements before changing anything
* never downgrades protected users (lifetime members, comps, admins)
* logs every event, with a **dry-run mode**, so I could watch what it *would* do in production before letting it write anything
Running it in dry-run first was the best call I made. It showed me cancellations, expiries and billing issues I’d never have spotted by hand.
**Now building: referrals on top of app-store billing**
“Give the referrer a free week” sounds easy until you realise you don’t control billing. The flow:
1. A friend signs up with your personal code
2. The reward is only counted on their **first real payment** (not a trial), with self-referrals and double-counting blocked
3. The referrer’s next renewal gets pushed back 7 days via RevenueCat. That’s an “extend” on Apple and a “defer” on Google. Apple only allows 2 extensions per customer per year, so anything over that gets queued.
It’s sitting in dry-run while real users test it.
**Lessons:**
1. Ship payments with a dry-run switch. Watching real production events before acting on them saves you from nuking a paying customer’s access.
2. App-store billing makes “simple” promos hard. Design rewards around what Apple and Google actually allow.
3. Honest marketing wins. I post every result from the app’s picks publicly, losses included.
**Question for other solo builders:** how are you handling referral or loyalty rewards when billing goes through the app stores? Has anyone found a cleaner way than renewal extensions?
*(18+ product. It’s an analysis tool, not a bookmaker.)*