What the product does.
1.1What TapMax is
TapMax is an AI-powered smart wallet: it knows every card you own, and at the moment you pay, its routing engine picks the mathematically best one — automatically.
Every card in a wallet earns differently — rotating category bonuses, brand multipliers, promo caps that fill silently, foreign-transaction fees, and points currencies whose real value ranges wildly. No human does that math at the register. TapMax does it on every transaction, and shows its work: every routing decision ships with a full, auditable breakdown of why the winning card won.
1.2The routing decision
When a payment happens, TapMax reads the transaction context and scores every card in the wallet:
- Inputs — merchant, merchant category code (MCC), spend category, brand (if the merchant belongs to a co-brand ecosystem like Delta or Marriott), currency, FX rate and amount.
- Per card — the best matching earn rule, live point valuations, any active promo (with remaining cap), foreign-transaction fees, and progress value toward the user's active goal.
- Output — a ranked list, a winner, the margin over the runner-up, and a plain-language explanation ("Why this card?") derived from the same numbers.
deterministic scoring — valuations, promos (cap-aware), FX and goal progress resolved into one currency-equivalent value per card. The exact weighting model is proprietary.
Multipliers alone are misleading — 6× of a point worth 0.85¢ can lose to 2% flat cash back. TapMax converts everything to a single currency-equivalent value per transaction, so a "3× dining" card and a "6× brand" card compete on actual value, not marketing.
1.3Goal modes
The best card isn't always the one that earns the most cash-equivalent today. TapMax lets the user declare what they're optimizing for, and the engine re-weights accordingly:
Maximize Value
Pure value-per-transaction — the most rewards value for this exact payment. The default.
Race to Status
Status currency (e.g. Medallion Qualification Dollars, Tier Miles) gets weighted heavily, so status-earning cards win close calls — the "goal flip".
Hit Spend Milestone
Spend toward a sign-up bonus or milestone is credited pro-rata, steering everyday spend to the card that's chasing a bonus.
The signature demo moment: at the hero dinner scenario, the brand-match hotel card narrowly beats the 3×-dining card on pure value — but switch the goal to Race to Status and the airline card flips to the top, because status miles are suddenly worth chasing. Same engine, same math, different objective.
1.4Screens & flows
| Screen | What it does |
|---|---|
| Wallet | Home. All linked cards with earn/perk chips, the active goal, and quick access to every flow. |
| PayFlow | The in-store tap simulation: pick a merchant, watch the engine read the context, score all cards live, and route to the winner with the full breakdown. |
| Checkout | Browser-extension mock for online spend: a themed merchant checkout page where TapMax overlays the routing decision at the payment step. |
| Insights | Where the earned value went — rewards captured, promo cap consumption, and what routing decisions added up to. |
| Goals | Configure the active goal mode; pace forecasts project when status or a milestone will land, with and without TapMax routing. |
| Ask TapMax | Concierge chat. Natural-language questions ("which card for groceries?") are matched to intents and answered by running the real engine — not canned replies. |
| Marketplace | Card discovery: what the engine would earn if a candidate card were in the wallet. |
| PromoScan | Promo-email ingestion animation: a promotional email is parsed into a structured, cap-aware earn rule the engine can route against. |
| Burn | Redemption optimizer: enter point balances and see every redemption and transfer route ranked by real value per point — including deliberate "value traps" the ranking avoids. |
| Settings | Point valuations (editable), AI explanation mode, demo reset, replay onboarding. |
| Onboarding | First-run flow for new visitors — see below. |
1.5Onboarding
A first-time visitor lands on onboarding before anything else. Four steps:
- Sign up — mock social logins (Apple + Google everywhere; UAE adds UAE PASS, Singapore adds Singpass) with a prefilled email and a regionally formatted phone number.
- Link your cards — connect the cards you already own.
- Scan to add — a camera-viewfinder mock detects a physical card and adds it.
- Tap anywhere — you're routed to the wallet, ready to pay.
Onboarding can be replayed any time from Settings.
1.6Demo scenarios
Every market ships the same five scenario archetypes, each engineered to showcase one dimension of the engine:
The close call
Hero dinner at a co-brand property: the brand-match card narrowly beats the 3×-dining card. Proof the engine resolves genuinely tight decisions.
The goal flip
Same dinner, goal switched to Race to Status — the airline card wins because status currency is now weighted heavily.
The promo cap
Grocery run against a quarterly 5% promo that's already 62% consumed: the engine applies the bonus partially, exactly up to the remaining cap.
The FX trap
Dinner in London (GBP): cards with a 3% foreign-transaction fee go net-negative and drop to the bottom of the ranking.
The milestone chase
Under a spend-milestone goal, everyday spend routes to the card chasing its sign-up bonus, with the bonus credited pro-rata per dollar.
1.7The four markets
| Market | Card lineup | Status race |
|---|---|---|
| 🇺🇸 US | Delta SkyMiles Reserve, Marriott Bonvoy Brilliant, Voyager Prime, Cashback Flex, Everyday 2% (fictional archetypes) | Delta Platinum Medallion (MQDs) |
| 🇮🇳 India | Air India SBI, Marriott Bonvoy HDFC, HDFC Infinia, SBI Cashback, Amazon Pay ICICI | Maharaja Gold (Tier Points) |
| 🇦🇪 UAE | ADIB Skywards Visa Infinite, Marriott Bonvoy World Elite (ENBD), FAB Elite, Mashreq noon, RAKBANK Elevate | Emirates Skywards (Tier Miles) |
| 🇸🇬 Singapore | Amex SIA KrisFlyer Ascend, The Platinum Card, DBS Vantage, Citi Prestige, UOB Visa Infinite | KrisFlyer Elite Gold (Elite Miles) |
Each market is fully localized: local currency and number formatting, local earn conventions (points per $1 vs. per ₹100 / AED 100 / S$100), local card ecosystems, and local sign-in options.
1.8Presenter tools
- Press
Dinside any demo for the presenter drawer — jump straight to any scenario with its talking-point hook. - Press
Pfor present mode. - Settings → reset demo restores the seeded state (promo caps, goal progress) at any time.
1.9The Rewards Leak Audit
The public top-of-funnel at gettapmax.com/audit: a 60-second, no-login tool that estimates how much value a visitor's current wallet leaks every year. Pick a market, pick your cards, describe how you pay today, set monthly spend — the audit compares your behaviour against your own wallet's ceiling (and the market's best cards) using public reward rates for 1,000+ tracked cards, entirely in the browser.
- Three result modes — a leak (default), a discipline dividend for self-declared optimizers, or a ceiling comparison against the market's best cards.
- Email-gated report joins the waitlist automatically; sharing generates a referral code that moves the sender up the list.
- The methodology line states every assumption on the result screen.
How TapMax makes money.
2.1The value we capture
TapMax monetizes a delta that already exists: the gap between the rewards consumers are entitled to and the rewards they actually collect.
Every suboptimal swipe leaves value on the table — the wrong card at dinner, a promo cap nobody tracked, a 3% FX fee that silently erased the points. TapMax recovers that value for the user on every transaction, and takes its economics from the surplus it creates and the transaction flow it now sits inside. The user never pays for routing out of pocket; the model is aligned — TapMax earns when the user earns more.
2.2Revenue streams
The planned model stacks four streams, sequenced from launch onward:
Transaction economics
TapMax sits at the moment of payment and decides where spend lands. Partnerships with payment networks and issuers monetize that routed volume — revenue that scales directly with the payments TapMax routes, without charging the user per transaction.
Premium subscription
Free tier: smart routing with a capped wallet. Pro tier: unlimited cards, goal engines (status races, milestone chasing), AI concierge, promo ingestion, and forecasting. Classic freemium — the routing hook is free, the optimization depth is paid.
Card distribution (Marketplace)
TapMax knows exactly which card a user is missing — computed from their real spend, not demographics. Issuer referral bounties on cards acquired through the Marketplace are high-margin, and the recommendation is provably in the user's interest because the engine's math is auditable.
Merchant-funded offers
Once routing volume exists, merchants and card ecosystems pay to place cap-aware promos in front of high-intent users — the same structured promo format the engine already routes against (see PromoScan).
Longer term, the routing engine itself is licensable: banks and issuers in rewards-dense markets can embed "best card" intelligence in their own apps as a B2B API.
2.3Why now
Rewards keep fragmenting
More co-brands, rotating categories, and status currencies every year, in every market — the optimization surface has outgrown human attention.
AI can read the fine print
Language models turn card terms, promo emails and fee schedules into live, structured earn rules — the data layer this product always needed.
Payments infra opened up
Real-time tokenized payments and open payments infrastructure make per-transaction routing possible at the point of sale, not after the fact.
2.4Market strategy
The four launch markets — US, India, UAE, Singapore — were chosen because each is rewards-dense with multi-card consumers, yet each breaks a naive one-market product in a different way:
- US — the deepest co-brand ecosystem and the archetypal status race (airline elite tiers driven by qualification dollars).
- India — explosive premium-card growth, distinct earn conventions (points per ₹100), lakh/crore formatting, and ecosystem cards (Amazon Pay, Air India).
- UAE — an expat, travel-heavy population where FX fees and Skywards tier miles dominate the math.
- Singapore — the most sophisticated miles-chasing culture in Asia; KrisFlyer elite currency and bank-specific dining ecosystems.
Building all four in parallel forced the engine to be genuinely market-independent from day one: same scorer, different data. Entering market five is a data exercise, not an engineering one.
2.5Current status
- A real native iOS app is live on TestFlight — real accounts, a grounded multi-market card catalog, on-device routing, and the Burn redemption optimizer (see Part 4).
- Four fully interactive market prototypes live at gettapmax.com, running the same deterministic routing engine on simulated data.
- Growth funnel live: the Rewards Leak Audit feeds a referral waitlist.
- The demos process no payments and collect no user data; demo state lives entirely in the visitor's browser.
- Waitlist open on the landing page — investors can flag themselves for the deck.
Under the hood.
3.1Architecture
Four market-localized client-side React apps plus a static marketing site, all
served from one domain. No backend: the engine runs entirely in the browser and
state persists in localStorage.
| Layer | Choice | Notes |
|---|---|---|
| UI | React 18 + TypeScript | No router — screens are React state in App.tsx, rendered inside an iPhone frame. |
| Build | Vite 6 | One build per market, deployed under /us/, /india/, /uae/, /singapore/. |
| Styling | Tailwind v4 | Via @tailwindcss/vite. |
| Motion | framer-motion | Routing animations, screen transitions, scan effects. |
| Tests | Vitest | 57 tests per market repo encoding exact engine outputs (routing + Burn). |
| AI (opt-in) | Claude via @anthropic-ai/sdk | Live LLM explanations; the default is always an offline template. |
| Hosting | GitHub Pages + custom domain | Static, CDN-cached, zero servers. |
The four market apps share an identical architecture; only
src/data/ (cards, merchants, valuations, goals) and localized
formatting differ. The engine code is market-agnostic by construction.
Runtime architecture. Screens hand a transaction to the engine, which scores it against the market's card data; nothing leaves the browser except the optional, user-keyed Claude call.
3.2The routing engine
src/engine/route.ts is a pure, deterministic scorer — no randomness,
no network, no hidden state. Same inputs, same ranking, every time.
earn rules · live point valuations · promos (cap-aware) · FX fees · goal progress
// exact weighting model: proprietary — kept out of public docs
Earn-rule matching. Each card carries a list of earn rules. When several rules could match a transaction, a strict internal precedence picks exactly one — rules never stack.
A Marriott dinner is simultaneously a brand match (marriott), an MCC
match (5812) and a category match (dining) — precedence
selects one. Every card has a base rule, so a match always exists.
Promo bonuses are cap-aware with partial fill. A quarterly "5% at grocery stores" promo has a spend cap. The engine tracks consumption; when a transaction would overflow the remaining cap, the bonus applies only to the portion that fits:
The engine tracks consumption and applies the bonus only to the spend that still fits under the cap — never all-or-nothing.
FX fees are subtracted, not footnoted. Foreign-currency transactions charge the card’s FX fee against the score — which is how a 2%-flat card with a 3% FX fee goes net-negative in London and falls to the bottom of the ranking.
Goal value has two components:
- Status currency — status units earned are valued at a per-mode weight; Race to Status boosts that weight substantially, which is what produces the goal flip.
- Milestone credit — under Hit Spend Milestone, spend toward the target earns a pro-rata share of the bonus, capped at the remaining need.
The final ranking sorts by total score; ties break deterministically by card order. The result object carries the winner, runner-up, margin and the full per-card breakdown that powers every explanation in the UI.
3.3Money units per market
All amounts are integers in local minor units; earn multipliers follow local conventions:
| Market | Minor unit | Earn convention | Formatting |
|---|---|---|---|
| US | cents | points per $1 | en-US — $1,500.00 |
| India | paise | points per ₹100 | en-IN lakh grouping — ₹1,50,000 |
| UAE | fils | points per AED 100 | AED 1,500.00 |
| Singapore | cents | points per S$100 | S$1,500.00 |
3.4Engine modules
| Module | Responsibility |
|---|---|
route.ts | The pure scorer: rule matching, promo caps, FX fees, goal weighting, ranking. |
types.ts | Shared types — Card, EarnRule, Txn, GoalConfig, ScoreBreakdown, RouteResult. |
explain.ts | Turns a RouteResult into the "Why this card?" narrative and formatted amounts — pure templates over the breakdown numbers. |
concierge.ts | Ask-TapMax chat: matches a natural-language question to an intent, then answers by running the real engine on real scenarios. |
forecast.ts | Status and milestone pace projections — when a goal lands at the current monthly pace, with vs. without TapMax routing. |
llm.ts | Opt-in live Claude explanations (@anthropic-ai/sdk, browser mode). Off by default; the offline template is always the fallback and requires no key. |
3.5Data model
Per-market demo data lives in src/data/:
cards.ts— the wallet. EachCarddeclares its points currency, FX fee rate, earn rules (with match kind + multiplier), cap-limited promos, optional status-earn rate, and card-face art. Also exports default point valuations (editable in Settings), the default goal config, and seeded promo-cap consumption.merchants.ts— the scenarios. EachScenariois a full transaction (merchant, MCC, category, optional brand, currency, FX rate, amount) plus a presenter hook and a flow tag (taporcheckout).
{ merchant: 'Marriott Essex House Grill', mcc: '5812', category: 'dining',
brand: 'marriott', currency: 'USD', amountCents: 12_000, fxRateToUSD: 1, … }
3.6Client state
Everything persists in the browser — there is no server-side state anywhere:
| Key (per region) | Holds | On demo reset |
|---|---|---|
tapmax[-region]-demo-v1 | Demo state — promo consumption, goal progress, activity. | Reseeded |
tapmax[-region]-onboarded | Whether onboarding has been completed. | Kept |
tapmax[-region]-ai-mode | Offline template vs. live Claude explanations. | Kept |
tapmax[-region]-anthropic-key | User-supplied API key for live AI mode (never leaves the browser except to call the API directly). | Kept |
3.7Testing
Each market repo carries 57 Vitest tests that pin the routing and Burn engines to exact outputs — not just "card A beats card B" but the precise value to the cent. The five scenario archetypes are encoded as invariants in every market:
- The hero-dinner close call (e.g. US: Bonvoy $6.12 vs. $5.76; SG: Platinum S$61.20 vs. DBS S$57.60).
- The goal flip under Race to Status (US: flips to Delta at $6.96; SG: to KrisFlyer at S$77.40).
- The grocery promo cap partial fill.
- The London FX scenario where fee-bearing cards go net-negative.
- The spend-milestone goal routing to the promo card.
Because the scorer is pure, the tests are the spec: any data or engine change that shifts a demo moment fails the build before it can break a live pitch.
3.8Repos & deployment
| Repository | Serves |
|---|---|
| tapMax (US app) | gettapmax.com/us |
| tapMax-india | gettapmax.com/india |
| tapMax-UAE | gettapmax.com/uae |
| tapMax-Singapore | gettapmax.com/singapore |
| gettapmax (site) | gettapmax.com — landing page, this docs page, and the built demo bundles |
Build & deploy pipeline. Each app repo builds with its per-market base path; the bundles land in the site repo, and a push rebuilds gettapmax.com in about thirty seconds.
Each app builds with a per-market base path (vite build --base=/us/
etc.); the bundles are copied into the site repository, which GitHub Pages serves
over the custom domain with enforced HTTPS. The landing page and this
documentation are deliberately hand-crafted static HTML — zero dependencies,
zero build step, nothing to break.
Beyond the demos: the shipping product.
4.1The iOS app — live on TestFlight
TapMax is no longer only a prototype. A native iOS app (SwiftUI, iOS 16+) is live on TestFlight with real accounts, a real card catalog, and the same deterministic routing engine running on-device — join the beta.
- Real accounts — email one-time code, Sign in with Apple, or Google. Each user's wallet lives in their own database row.
- Catalog-first wallet — add cards by searching the grounded catalog and multi-selecting; no card number required. Scanning is optional: camera, NFC tap, or typed entry, all validated on-device with only the last 4 digits ever kept.
- Multi-market — pick your country at sign-up (UAE, India, Singapore, US) and the catalog, currency and conventions follow; changeable in Settings.
- On-device routing — the engine scores the wallet locally; goals are wallet-derived (a status race is only offered when you own a status-earning card).
- Location nudges — with permission, arriving at a hotel, restaurant or store triggers a notification naming the best card for that merchant. Location is processed on-device and never uploaded.
- Pay-moment widget — a Lock Screen and Home Screen widget keeps the wallet's current best card visible right where you look before you pay (rolling out in the next TestFlight build).
- TapMax Pro — the free tier routes a capped wallet; Pro unlocks unlimited cards, via subscription or by referral rewards.
4.2The card catalog & data pipeline
Routing is only as good as the card data underneath it. TapMax's catalog is grounded, not guessed: earn rates, fees, exclusions and benefits are extracted from official issuer pages and terms documents across all four markets — a tracked universe of 1,000+ cards and issuer source pages.
- Deterministic validation gate — every catalog entry must pass a strict automated validator (rate plausibility, structure, market conventions) before it can be published. Nothing invalid can reach the app.
- Daily watcher pipeline — issuer pages are monitored for changes. Low-risk updates (benefits, promos) publish automatically at high confidence; anything touching fees or new cards is held for human review.
- Honest labeling — where a point's cash value isn't published by the issuer, the catalog stores it as a stated assumption, never as fact.
- The same catalog powers the app, the routing engine, and the public leak audit — one source of truth.
4.3Burn — the redemption optimizer
Earning points optimally is half the problem; most value dies at redemption. Burn ranks what your existing balances are actually worth: every direct redemption and transfer-partner route, ordered by real value per point.
- Deterministic and balance-independent — rankings come from redemption rates alone, so they never shuffle as your balance changes; balances only determine what you can afford today.
- Value traps flagged by math — a 3:1 hotel transfer that looks generous ranks exactly where its value puts it: last.
- No LLM anywhere in the ranking path, no auto-published rate changes — every catalog update is human-approved, and devaluations generate alerts.
- Live in the app and in all four demos; balances are always user-entered — TapMax never asks for loyalty-account credentials.
4.4Privacy & security posture
- No full card numbers, ever — scans and typed numbers are validated on-device and immediately reduced to the last 4 digits plus the issuing bank; the full number is never stored or transmitted.
- Per-user data isolation — wallet rows are protected by row-level security; a user can only ever read their own data.
- On-device intelligence — routing decisions and location processing happen on the phone.
- The demos collect nothing — no accounts, no analytics beyond the page itself, state in the visitor's own browser.
- Account deletion is built in and recomputes entitlements; subscriptions are managed through the App Store.