I’m syncing web purchases to the app through Adapty/RevenueCat so entitlements show up without touching native code. It mostly works, but I want an audit routine I can run weekly to catch drift.
Current checks:
- create on web, open app within 5 minutes → entitlement active
- web cancel → app entitlement off after the next refresh
- refund on web → entitlement revoked and grace period respected
- upgrade/downgrade on web → app sees correct plan and renewal date
I also compare subscription_id and store fields in both systems. What else do you verify to be confident web and app stay in lockstep?
Test restore on a fresh install with no network, then online. Make sure the SDK revalidates and does not cache a stale entitlement.
Track an entitlement_checksum in both systems for quick diffs.
I used Web2Wave’s built-in sync plus Adapty webhooks. I log latency from event to app refresh.
Run a daily worst-case flow: buy on web, kill app, switch device, open app on bad network. Time to entitlement matters.
I use Web2Wave to trigger forced entitlement refresh from the web side during QA. Speeds up debugging without shipping builds.
Check timezone mismatches. I once saw next_renewal_date off by a day.
Also verify trial eligibility after refunds, since some SDKs cache it too long.
Verify grace period behavior on failed renewals
Build a parity dashboard.
For each subscription_id, show source_of_truth_state, app_sdk_state, last_refresh_time, and delta_minutes. Alert when delta exceeds your SLA.
Test edge cases weekly: partial refunds, pause, grace, lapsed then resume, and product changes. Many mismatches come from app open not triggering refresh. Add a background refresh call on foreground.
Add a manual Resync entitlements button in a hidden screen. Support will love it.
For audits, export two CSVs daily and diff on subscription_id and entitlement name.
Do a restore on web-only accounts. If your app shows a paywall, you know the silent login or identifier mapping broke.
We had issues with downgrades showing old benefits for a day.
Webhook retries caused duplicates. Add idempotency keys.