Work / Imposter / Wiki / Surfaces
paywall
Surfacecanonicalverified 2026-09-23
SURFACE.MOBILE.STORE.PAYWALLSummary
Seven more packs, one payment, and none of the category's dark patterns.
Raw wireframe
- .context/designs/mobile/store/paywall.html
Why it is drawn this way
One price, once, and the promise above it. Every dark pattern this category runs on is deliberately absent: no countdown, no strikethrough "was $19.99", no "3 days free then billed weekly", no pre-selected annual plan, no delayed close button. That absence IS the product — Fakeit's reviews say "$15.99 a week is insanity"; Imposter Up's say a lifetime purchase re-locked itself. Any urgency device under our sentence would make the sentence a lie. See promise.
It is stated with the confidence the competitors state theirs with. An earlier version was a white page with a $4.99 and three ticks, and it looked apologetic. Same offer, full-bleed stage, ten tiles you can actually see, one enormous price.
One SKU, one entitlement. imposter_pro_lifetime and pro. Charades ships
32 SKUs and the App Store half of that is what blocked its iOS paywall; this app
deliberately has a single non-consumable so there is nothing to misconfigure.
No fallback price. paywall.tsx prints the store's priceString and drops
the number when the store has not answered. A guessed price on a paywall is the
one number you cannot be wrong about.
Restore is in the header, above the fold. App Store review requires it for a non-consumable, and it is the first thing a locked-out payer hunts for. The close button is a 44pt target.
Four views, one route. offer, bought, purchaseFailed, restoreFailed.
purchaseFailed is this screen's error state because it is the money one;
purchased and restore-failed are their own screens, because a purchase
that succeeded and a restore that found nothing are different outcomes rather
than two shades of one.
cancelled deliberately has no screen. The user chose to back out, and an
error screen would be scolding them for it.
Related
Sources
- .context/designs/mobile/store/paywall.html
- src/app/paywall.tsx
- src/data/categories.ts — PRO_PRODUCT_ID, PRO_ENTITLEMENT
Every project of mine is written down like this.
Read the résumé