In-app ads and ad-free support

Fan support (first launch)

Scrollable chooser before sign-in:

  • Free with ads — Google AdMob banners (nonPersonalizedAds where supported)

  • Ad-free · fixed price$15/year via Adapty / store IAP

  • Pay what you want — user enters amount; $15+ unlocks ad-free for a year after checkout (same Adapty flow today; true variable IAP later)

Owner support (after sign-in)

Owners choose Business billing:

  • Ads on my account — same banners as fans (staff on shift exempt via work mode)

  • Per-truck subscription$25/truck/year (Starter tier) for each active truck; archived trucks are not billed

Full competitive mixed stack (GMV graduation + FTN-attributed order fees): Owner monetization strategy.

Trucks can be archived and re-enabled from the app (ownerAccountStatus on Convex foodTrucks). Archiving pauses per-truck billing without deleting the listing.

Who sees ads

Audience Ads?

Fans / personal use

Yes, unless ad-free or qualifying donation

Truck owners (ads model)

Yes, unless personal ad-free or all active trucks subscribed

Staff work mode

No

Staff fan mode

Yes (unless personally ad-free)

Backend

  • Convex: ownerBillingPreferences, foodTrucks.ownerAccountStatus, truckSubscriptionPaidUntil

  • API: GET/PATCH /api/owner/billing, PATCH /api/owner/trucks/[truckId]

Code map

  • lib/services/ad_policy.dart — rules

  • lib/screens/support_model_screen.dart — fan chooser + donation dialog

  • lib/screens/owner_billing_screen.dart — owner model + archive trucks

  • lib/screens/settings_screen.dart — calm access toggles

  • lib/screens/calm_games_hub_screen.dart — calm games catalog + local stats

  • lib/screens/focus_quest_screen.dart — Focus Quest mini-game (Focus Champion badge)

  • lib/screens/truck_jam_screen.dart — Truck Jam sliding-block puzzle (Truck Jam Master badge)

  • lib/screens/spatial_skills_screen.dart — mental rotation mini-game

  • lib/screens/menu_rush_screen.dart — rapid menu matching (processing speed)

  • lib/screens/order_memory_screen.dart — order recall (working memory)

  • lib/models/cognitive_game_profile.dart — local gameplay scores (device-only)

  • lib/services/cognitive_guardrails.dart — storage/analytics guardrails (no diagnosis)

  • lib/state/work_mode_controller.dart — staff on-shift toggle

  • lib/state/calm_access_controller.dart — calm access prefs + badge persistence

Calm access (sensitive ads mode)

Optional, dignity-first settings when ads are still on (paid ad-free and work mode still win).

  • Basic sensitive mode — always available in Settings. Muted theme, reduced motion (also respects platform reduce-motion), banner-only ads with compact sizing.

  • Enhanced sensitivity — locked until the user earns any focus badge via a calm mini-game, meets a silent asymmetric gameplay profile, or tries every game once. When enabled, banner ads are hidden entirely while other ad-free rules still apply.

Copy uses self-ID language (“Ads are hard for me to focus with”) — not medical diagnosis labels. No sensor profiling in this release.

Calm games catalog

All calm games are optional, food-truck themed where natural, and use calm UI (no flashing, simple motion).

Game Skill domain (gameplay metric)

Focus Quest

Focus / sustained attention (grid chase)

Truck Jam

Spatial (sliding-block puzzle)

Spatial Skills

Spatial (mental rotation)

Menu Rush

Processing speed (rapid symbol matching; truck menu picker)

Order Memory

Working memory (sequence recall)

Badges: Focus Champion, Truck Jam Master, Pattern Spotter (varied gameplay profile), Calm Explorer (every game attempted once).

Local-first cognitive scores

  • Scores (spatialScore, processingSpeedScore, memoryScore, focusScore) are stored only on device via secure storage — never uploaded as a cognitive profile.

  • Used only to unlock in-app calm-access features (enhanced sensitivity). Not diagnosis, not analytics dashboards, not health labels.

  • Asymmetric gameplay patterns (e.g. strong spatial + lower processing speed on mini-games) may silently qualify for Pattern Spotter — same enhanced toggle as badge games, different stated intention. This is not clinical validation; it is a dignity-first unlock path for users who prefer gameplay over badges.

  • Persistence path: complete all five games at least once with minimum effort to qualify without asymmetric scores.

  • Guardrails: lib/services/cognitive_guardrails.dart — whitelisted storage keys, forbidden diagnostic vocabulary, boolean-only export to ad policy.

Roadmap (calm access)

  • Bug hunt easter egg — subtle UI flaw + in-app report unlocks badge (Sharp Eyes); same enhanced toggle, no medical framing.

  • Menu Rush truck menusreal truck menus + Gemini extraction; demo trucks shipped.

  • Art quest (13+) — optional creative unlock path; avoid trademarked “style” names in UI.

  • AdMob limits — calm mode controls app chrome and banner policy; third-party ad creative may still animate; enhanced mode hides banners where policy allows.