Skip to content
Ritesh FirodiyaGet in touch

Work / Imposter / Wiki / Surfaces

paywall

Surfacecanonicalverified 2026-09-23

SURFACE.MOBILE.STORE.PAYWALL

Summary

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é