Skip to content
Ritesh FirodiyaGet in touch

Work / Imposter / Wiki / Surfaces

promise

Surfacecanonicalverified 2026-09-23

SURFACE.MOBILE.ONBOARDING.PROMISE

Summary

The product's entire positioning, given a screen of its own.

Raw wireframe

  • .context/designs/mobile/onboarding/promise.html

Why it is drawn this way

Every imposter app above 1M downloads is disliked for one thing, and it is not the gameplay. "$15.99 a week is insanity", "$81.99 a year", accidental charges, lifetime purchases that silently re-lock. So this screen says the opposite, first, before asking for anything — three lines, each a direct answer to a complaint sitting in a competitor's reviews today.

Nothing may be added here that undercuts it. No countdown, no strikethrough price, no "limited offer". A fake urgency device under this sentence turns the sentence into a lie, and the lie is the only thing anyone would remember. The same constraint governs paywall.

The split is named, not implied. "Three packs are free" alone reads like a teaser. Naming them — Everyday, Food & Drink, Animals — and saying the other seven are one lifetime payment means nobody discovers the shape of the deal later and feels tricked. Competitors earn one-star reviews for exactly that discovery.

The purchase is deliberately the SECOND button. Somebody who has just read "three full packs are free" and wants to pay anyway should not have to hunt for the till. But it can never be the primary action: leading with a buy button on the onboarding of a game nobody has played yet is the paywall-before-play pattern this screen exists to argue against. An outline button under a solid one says "available", never "required".

The price is the store's, or absent. promise.tsx prints usePurchaseStore().priceString and drops the number entirely when the store has not answered. Never a guessed one.

The restore footnote is a link in the wireframe. It is the one element on the page whose subject is the already-owned case, so it is what opens restored — which is this same route with the entitlement already held.

Related

Sources

  • .context/designs/mobile/onboarding/promise.html
  • src/app/onboarding/promise.tsx

Every project of mine is written down like this.

Read the résumé