How i kept subscription status in sync between web checkout and the app

Keeping subscription status aligned between a web checkout and the native app was tricky at first.

We created the subscription on the web, saved a server side record, then used a short lived token and deferred deep link to let the app pull that record after install. Server webhooks pushed events to our billing connector and we used RevenueCat to centralize entitlement state for the app.

Key lessons: always verify receipts server side, build retries for missed webhooks, and treat the web user id as the source of truth until the app confirms. Also plan for edge cases where the app opens offline.

How have you handled webhook failures or users who skip the install step?

We used RevenueCat to mirror the entitlement state. On web payment we hit our backend which then created a user and called RevenueCat via server API. The app asks RevenueCat for entitlements on first open so sync is immediate.

Web2Wave gave us a sample flow to wire the web hook and the calls which saved time.

Make the web checkout send a server side webhook to your subscription manager and also return a token to the client. The app consumes the token and asks the subscription manager for entitlements.

This two step confirm plus server side sync reduces mismatches and keeps the app state clean.

We used a short code the user pastes into the app.

It is simple but it works when deep links fail. We also run a daily job to reconcile missing receipts.

Reconcile nightly and use a fallback login code

Design for eventual consistency. On web payment write the subscription to your server. Push that record to your subscription provider via API and send a token to the user. When the app opens it exchanges the token and pulls entitlements.

Crucially build idempotent webhooks and a reconciliation job that runs hourly or nightly to catch failures. Track reconciliation metrics and alerts so you can respond before users complain.

For refunds we mark the entitlement revoked and push a notification to the app.

Users see immediate changes and we avoid access mismatches.

We log every webhook and run a script to fix failures.

It is boring but it keeps subscriptions accurate.