How do you audit web-to-app subscription parity with adapty or revenuecat without touching native code?

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.