Work / Aakalan / Wiki / Surfaces
plans
Surfacecanonicalverified 2026-10-03
SURFACE.MOBILE.PLANSSummary
Free against Pro, monthly against yearly, with the auto-renew terms on the screen.
Raw wireframe
- .context/designs/mobile/store/plans.html
Why it is drawn this way
The comparison lists what Free GETS, not only what it lacks, and every limit is an exact number: vagueness reads as a trap.
A row may only describe something the app does today. This table is shown to somebody about to pay, so a row for an unbuilt feature is not a roadmap, it is a false claim — and one the stores reject builds over. "All 5 split types", "Simplify debts" and "Export CSV / PDF" were all here as free features while none of them worked. They came back when they were real.
A "10 expenses a day" row was here and had to go. It is the exact limit this app exists to not have. See pro-never-gates-the-core-loop.
Prices come from the store, never from a file. A hardcoded "₹749" is wrong on every non-Indian storefront and becomes a lie the moment the price is edited in the console. The canonical Indian figures are in pricing, for a reviewer to check against.
We divide for the reader. "₹749 a year" means nothing next to "₹99 a month" until somebody divides; both figures come from the store, so the comparison stays true in every currency. The savings badge is only claimed when it is true and both prices are known.
A free trial is never promised unconditionally. A returning subscriber has already used theirs and would be charged immediately.
Restore purchases is in the header, reachable without scrolling. App Store review requires it, and somebody who paid on another device and cannot find it asks for a refund rather than hunting.
Auto-renew terms are on the screen, not behind a link — a store requirement, and cheaper to satisfy than to appeal. Every number in that sentence is derived, so it cannot drift from what the user is charged.
Privacy Policy and Terms of Use are linked under the terms, in both states.
Guideline 3.1.2 wants both reachable from the screen that sells an
auto-renewing subscription, not only from the listing. The privacy URL is the
one the listings declare; with no custom EULA on the App Store record, the Terms
of Use are Apple's standard EULA. Both live in src/config/legal.ts, which
Account reads as well. The terms sentence also names the account that is
charged — Apple Account on iOS, Google account on Play.
The error state exists because an em dash where a price goes reads as a broken app, on the screen where hesitation costs the sale. It says WHY there are no prices rather than inventing some, and points out that the free column keeps working.
Related
Sources
- src/app/pricing.tsx
- src/services/purchases.ts
- src/config/legal.ts
- src/lib/plans.ts (renewalTerms)
Every project of mine is written down like this.
Read the résumé