Skip to content

Work / Imposter / Wiki / Entities

plans

Entitycanonicalverified 2026-10-12

PURCHASE.PLANS

Summary

What is sold in 2.0: packs once, or hosting by the month or the year.

Canonical values

Key Value Source
Free 3 packs — Everyday, Food & Drink, Animals; every one-phone game; joining any room; 1 room of your own FREE_ROOMS in src/constants/plans.ts
Pro imposter_pro_lifetime, non-consumable, USD 4.99 live on both stores since 1.0
Pro entitlement pro — all 10 packs, for good RevenueCat
Online, monthly imposter_online_monthly, USD 2.99 proposed — not created in any store
Online, yearly imposter_online_yearly, USD 14.99 proposed — not created in any store
Online entitlement online — making rooms, and all 10 packs while it runs proposed
Who pays online the host only —
India about ₹149 a month, ₹799 a year proposed
Packs in the app 10, 749 words src/data/packs/
The player's own words free —

In code, and still to do

In code (T031, 2026-10-12, none of it exercised against real RevenueCat):

  • services/revenuecat.ts prices, buys and restores all three plans from the default offering, reports { pro, online }, and logs in with the Firebase uid as the RevenueCat user id. A plan with no package has no price and shows "Not available yet".
  • purchase-store holds both entitlements, a price per plan, and a saved freeRoomUsed. The "Save N%" badge is worked out from the two Online amounts and is absent when either is missing.
  • functions/src/entitlements.ts asks RevenueCat's REST API what a uid owns, using the Functions secret REVENUECAT_SECRET_KEY; any failure grants nothing.
  • scripts/revenuecat-api.mjs (pnpm rc:plan, rc:bootstrap, rc:verify) builds the three products, two entitlements, default offering and three packages, in the App Store and Test Store apps.

In RevenueCat (done in the dashboard, 2026-10-12): the two Online products in the Test Store, App Store and Play Store apps, the online entitlement on all six, and $rc_monthly and $rc_annual in the default offering. A v1 secret key named functions-server is in .env.local. On Play a subscription is imposter_online_monthly:monthly: the product id, then the base plan.

Still to do, and the owner's to run: pnpm store:subs:android and pnpm store:subs:ios (scripts/store-subscriptions.mjs creates the group, the two subscriptions, their prices and where they sell), then firebase functions:secrets:set REVENUECAT_SECRET_KEY and a deploy of the functions. After that, in App Store Connect only: a review screenshot on each subscription, the Terms link in the app description, and "Add for Review" from the group page with a version.

Rules

  • Joining a room is never sold.
  • No weekly plan, no countdown, no strikethrough price, no delayed close.
  • No price is a literal in the app. It comes from the store.
  • When Online ends: rooms are off, the 7 extra packs re-lock unless Pro is owned, and every table and score is kept.
  • A subscription needs a Terms link in the store description, and a new subscription group means a new submission.

Related

Sources

  • src/constants/plans.ts
  • .context/designs/mobile/store/paywall.html