Menu
Media

Subscription mobile golf game with full Apple and Google entitlement sync

A Laravel API and React Native golf scoring game funded by recurring in-app subscription, with a complete entitlement-reconciliation subsystem across Apple and Google — server-side receipt verification, real-time store notifications, queued re-verification and a scheduled reconciliation sweep — alongside a game engine whose difficulty and scoring rules are tuned as data.

Client — a consumer mobile gaming studio
Concept visuals — not actual screenshots
01 — Challenge

Subscription state doesn't live in the app's own database — it lives with Apple and Google, and it changes constantly without the user ever opening the app: renewals, cancellations, billing retries, refunds, grace periods. An app that treats entitlement as something the client reports will eventually either give away access it isn't being paid for or cut off customers who are, and the two stores use entirely different notification mechanisms — Apple posts to a webhook, Google publishes to a Pub/Sub topic requiring a pull consumer — that both have to collapse into one internal model.

02 — Approach

Built the subscription layer as its own subsystem with five independent entry points converging on one state model: purchase verification at the moment of sale, Apple's webhook notifications, Google's Pub/Sub notifications, a queued re-verification job, and a scheduled sweep that reconciles regardless of what arrived through the other paths — deliberate redundancy, since each path covers the others' failure modes. Every transaction retains the full raw platform payload alongside typed fields including the original transaction identifier, and expiry is stored with its timezone rather than as a naive timestamp, eliminating a whole category of access bugs that only show up at the boundary.

On the game side, built difficulty, distances, pars, terrain, break and putting-outcome tables as administratively managed reference data rather than hard-coded constants, and virtual opponents the same way — each with its own scoring profile and applicable game formats — so balancing the game against real player behaviour became a configuration change instead of a release.

03 — Impact

Revenue is protected in both directions: the platform never grants access it isn't paid for, and never revokes access from someone who is paying, because entitlement is reconciled continuously rather than checked once at purchase. Billing questions can be answered from stored evidence months later, store-side pricing changes take effect without an app release since plans are fetched live from the platforms, and the game itself gets rebalanced from real player data in minutes rather than a development cycle.

Stack
LaravelMySQLReact NativePHPLaravel 10MySQLLaravel PassportGoogle Cloud Pub/SubReact NativeRedux ToolkitTwilio
More work
Location-based treasure hunt with real cash and merchant prizes→Token-economy social platform with live video battles→Live video streaming that connects citizens to their nearest police force→

Something holding you back?

New build, rebuild, or adding AI to what you already have — I'll take a look and give you an honest perspective.

Get in touch ↗