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:

FieldTypeDefaultProblem
investmentTypeselectannualCashFlowJargon as the first decision the user faces
targetAnnualPayouttextnoneCurrency as free text, so no numeric keypad on mobile
startingYearnumber (YYYY)noneAbsolute year forces mental arithmetic from today
yearsOfCashflownumber (0-99)noneRequires the user to have already planned a drawdown period
startingYearLumpSumnumber (YYYY)noneSecond date field, same arithmetic problem
assumedInflationnumber2The one sensible default on the form
expectedReturnnumbernoneThe killer field. A retail investor cannot answer this
monthmonthcurrent monthThird date input, different widget type again
initialInvestmenttextnoneCurrency as free text again
endingAmountnumber0Unexplained; 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 but type="number" in another. Inconsistent keyboards on mobile.

Bowtie teardown

Four inputs. All of them are facts about yourself, not forecasts:

FieldTypeDefault
genderradiounset, one tap
ageselect (0-80)23
smokerradiounset, one tap
claimPredictionIdselect, "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.

What are you saving for?
32
5,000
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.