Calculator teardown and rebuild spec
What was inspected
- Endowus: https://endowus.com/en-hk/investment-plan-calculator (inline on page)
- Bowtie: https://www.bowtie.com.hk/en/insurance/claim-calculator, which iframes the actual widget from https://app.bowtie.com.hk/claim-calculator/
Endowus teardown
Ten inputs, read straight off the DOM:
| Field | Type | Default | Problem |
|---|---|---|---|
investmentType | select | annualCashFlow | Jargon as the first decision the user faces |
targetAnnualPayout | text | none | Currency as free text, so no numeric keypad on mobile |
startingYear | number (YYYY) | none | Absolute year forces mental arithmetic from today |
yearsOfCashflow | number (0-99) | none | Requires the user to have already planned a drawdown period |
startingYearLumpSum | number (YYYY) | none | Second date field, same arithmetic problem |
assumedInflation | number | 2 | The one sensible default on the form |
expectedReturn | number | none | The killer field. A retail investor cannot answer this |
month | month | current month | Third date input, different widget type again |
initialInvestment | text | none | Currency as free text again |
endingAmount | number | 0 | Unexplained; unclear what "ending amount" means to a novice |
Structural findings beyond the form itself:
- Zero
<label>elements on the entire page. Screen readers get nothing bound to any input. - Roughly nine H1s, two of which are completely empty. Directly violates the one-H1 rule in
seo-geo-requirements.md. - Six H2s whose text is literally "1", "2", "3", "4", "5", "6." Meaningless to a crawler, an LLM, and a screen reader alike.
- Money entered as
type="text"in two places buttype="number"in another. Inconsistent keyboards on mobile.
Bowtie teardown
Four inputs. All of them are facts about yourself, not forecasts:
| Field | Type | Default |
|---|---|---|
gender | radio | unset, one tap |
age | select (0-80) | 23 |
smoker | radio | unset, one tap |
claimPredictionId | select, "Common Claim Examples" | Breast Cancer |
Output renders immediately with no submit step: a named real scenario with the actual procedures listed (PET-scan, MRI, fine needle aspiration, chemotherapy, radiotherapy), a total bill of $380,808, then three plans compared side by side at 101% / 41% / 35% coverage, and the number people actually came for stated plainly: out of pocket expense, $0. It closes on "Get Plan Recommendation" and grounds itself with "calculated based on the real claims data of Bowtie."
What Bowtie gets wrong, and what the rebuild should not copy: the widget is iframed from app.bowtie.com.hk, so the parent page carries almost no crawlable content (body text on the parent page is under 900 characters). For a GEO strategy that depends on being cited, that's a real cost. Its label coverage is also thin.
Rebuild spec
{
"id": "endowus-calculator-rebuild",
"principle": "Eliminate, automate, simplify. Ask only for facts the user already knows; model everything else.",
"inputs": [
{
"name": "goal",
"label": "What are you saving for?",
"type": "choice_chips",
"options": ["Retirement", "A home", "My child's education", "Just growing my money"],
"default": "Retirement",
"rationale": "Replaces investmentType. Plain language, tap not type, and it sets sensible downstream assumptions."
},
{
"name": "currentAge",
"label": "How old are you?",
"type": "select",
"range": [18, 80],
"default": 35,
"rationale": "A fact about yourself. Replaces all three date fields, since the model derives horizon from age and goal."
},
{
"name": "monthlyAmount",
"label": "How much can you put in each month?",
"type": "slider_with_numeric_entry",
"inputMode": "numeric",
"min": 1000,
"max": 50000,
"step": 500,
"currency": "HKD",
"default": 5000,
"rationale": "Slider gives an instant answer without typing; numeric entry stays available for precision."
},
{
"name": "startingAmount",
"label": "Anything to start with?",
"type": "slider_with_numeric_entry",
"inputMode": "numeric",
"min": 0,
"max": 2000000,
"step": 10000,
"currency": "HKD",
"default": 0,
"optional": true,
"rationale": "Explicitly optional so it never blocks a first result."
}
],
"modelled_not_asked": [
{ "field": "expectedReturn", "handling": "Derived from the selected portfolio's historical range. Shown as a disclosed assumption the user can open and change, never as a required input." },
{ "field": "assumedInflation", "handling": "Defaulted to the published HK figure, disclosed in the same assumptions drawer." },
{ "field": "yearsOfCashflow", "handling": "Derived from goal plus current age." },
{ "field": "endingAmount", "handling": "Removed. Reported as an output, not collected as an input." }
],
"output": {
"renders": "immediately on load with defaults, before any interaction",
"primary_number": {
"label": "What you could have by 65",
"note": "One headline figure, in HKD, no jargon. This is the Bowtie 'out of pocket expense: $0' equivalent — the single number the visitor came for."
},
"comparison": {
"type": "three_portfolios_side_by_side",
"columns": ["Flagship", "IncomeUp", "CashUp"],
"shows": ["projected value", "expected range", "risk level"],
"rationale": "Bowtie's strongest move: three plans compared at a glance rather than one abstract result."
},
"secondary": [
"Total you'd contribute vs projected growth, split visually",
"A plain-language sentence stating what the projection assumes"
],
"assumptions_drawer": {
"collapsed_by_default": true,
"contains": ["expected return", "inflation", "fee assumptions"],
"editable": true,
"rationale": "Meets the regulatory need to disclose without making disclosure the price of entry."
},
"grounding_line": "Modelled on Endowus's own published portfolio performance data.",
"cta": "See the portfolio behind this number"
},
"structural_requirements": {
"labels": "Every input gets a real bound <label>. Non-negotiable, and the single biggest a11y gap in the current build.",
"headings": "Exactly one H1. No numeric-only H2s. Section headings written as real questions so they are extractable by AI answer engines.",
"crawlability": "Rendered inline in the page DOM, server-side where possible. Do not iframe it from an app subdomain the way Bowtie does, or the content becomes invisible to crawlers and LLMs.",
"mobile": "inputMode='numeric' on every currency field so the numeric keypad appears.",
"schema": "Wrap the surrounding explainer copy in FAQPage schema so the calculator page can be cited in AI answers, not just used."
}
}
Sixty word paragraph
Endowus's calculator asks ten inputs, including an expected return figure most retail investors can't supply. Bowtie's asks four, all facts about yourself, and answers instantly. NN/g's cognitive-load research is blunt about why that matters: every field a user must interpret raises abandonment risk. The rebuild eliminates the guesswork fields, defaults the rest, and shows the number people actually came for.
Sources
What could your money look like?
Answers on load. Four facts about you, no forecasting asked of you.
Show the assumptions
Illustrative only. Figures are a compound-growth projection from the assumptions above, which you can edit. Not investment advice, and not a forecast of any specific product.