Default: calm_utility (“More detail, less typing.”) is compiled into the app and appears whenever no valid running experiment is assigned.

Launch checklist

  1. Open the Paywall Experiment console and connect with the Conversion admin token.
  2. Select an existing experiment or create a new experiment/app; every app gets a stable lowercase app_id.
  3. Edit in draft. Keep a control, make weights total 100%, and set enrollment conservatively.
  4. Preview the exact plan, copy, and SHA-256 hash; apply only that reviewed plan.
  5. Change the state to running and apply another reviewed plan when traffic is approved.
  6. Read views and checkout intent from the app; count trials and paid starts only from verified RevenueCat receipts.
  7. Pause to stop new enrollment. Use a new experiment ID for new copy after exposure.

What the background Worker guarantees

  • HMAC-pseudonymous, deterministic, sticky installation assignment.
  • Strict schemas, exact plan hashes, immutable exposed experiments, and fail-safe fallback.
  • No remotely supplied prices, trial terms, renewal claims, arbitrary code, or new native SDKs.
  • Durable RevenueCat receipt processing and scheduled retry of attribution dispatches.

Reuse in another app

  1. Compile the reviewed paywall layouts into that app.
  2. Send its app_id, placement, installation ID, platform, and app version to the shared assignment contract.
  3. Render only schema-valid copy and retain store/RevenueCat commerce truth.
  4. Create app-specific experiment IDs, run the same plan/apply review, and test before enrollment.

Required tests

Run node server/test/paywall_experiment_test.mjs and the Flutter paywall service, surface, and screen tests; preview both layouts at narrow width and 200% text before traffic.