Work / Imposter / Wiki / Entities
plans
Entitycanonicalverified 2026-10-12
PURCHASE.PLANSSummary
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.tsprices, buys and restores all three plans from thedefaultoffering, 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-storeholds both entitlements, a price per plan, and a savedfreeRoomUsed. The "Save N%" badge is worked out from the two Online amounts and is absent when either is missing.functions/src/entitlements.tsasks RevenueCat's REST API what a uid owns, using the Functions secretREVENUECAT_SECRET_KEY; any failure grants nothing.scripts/revenuecat-api.mjs(pnpm rc:plan,rc:bootstrap,rc:verify) builds the three products, two entitlements,defaultoffering 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