Skip to content
Archive
← r/microsaas
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.)*
2 comments held Reddit says 0 on reddit ↗
  1. u/JoyouslyHarsh 1 13 hours ago
    dry run before real writes is the move, caught a few edge cases in my own stuff that wouldve been real annoying to fix after. the 2 extension limit on apple is such a pain though, feels like they want you to build a whole separate credit system just to hand out a free week. have you looked at doing promo codes through app store connect instead of extending the existing sub, or is that even more of a mess to track
  2. u/TheAIPunter OP 1 12 hours ago
    Yeah, the dry-run saved me from a couple of things that would’ve been a nightmare to unwind with real customers. I did look at offer codes. From what I’ve read, they can work for existing subscribers, with the free period applying from their next renewal. But it felt messier for referrals: * someone has to actually **redeem** the code, so the reward isn’t automatic anymore, and you’re relying on people to tap a link and follow through * you’re generating and handing out codes yourself, then matching redemptions back to referrers. That’s basically the separate credit system you mentioned, just with extra steps * Google Play has its own promo system, so you end up running two flows anyway With extensions, the referrer does nothing. The friend pays, and their renewal just quietly moves back a week. The Apple cap of 2 a year is annoying, but I’m queuing anything over the limit for now. Honestly, if someone’s referring more than 2 paying friends a year, I’d rather sort them out with something bigger like a free month or lifetime discount, handled personally. Have you shipped offer codes in your app? Curious how the redemption rate looked in practice.