124
services catalogued
~2 min
to a recommendation
17
config versions in 6 weeks
5
career profiles
The Problem
NTUC offers members 33 of its own programmes, 74 member deals, and 17 government and partner schemes. They lived in separate places, and a member had no quick way to find the few that fit their situation.
The NTUC Strategy Team wanted a low-effort way in: answer a few questions, get a short list you can act on.
Design Decisions
The quiz is simple on purpose. The work is in the scoring engine behind it.
Scoring lives in config, not code
Questions, weights and profile definitions sit in versioned JSON with a changelog. Stakeholder feedback became a weight change that shipped within hours, with no code change and no deployment risk.
Three tiers of routing
Some profiles own services outright, some are filtered by eligibility, and the rest are ranked by quiz score. Clear ownership stopped every user being shown everything.
Two taxonomies, never mixed
Services are tagged by life stage (protection, progression, transition). Users are matched to profiles (Crisis Navigator, Skill Builder). Keeping them apart meant service data never had to know about quiz logic.
A 30% threshold for second profiles
A secondary profile only shows if it scores at least 30% of the primary. “You’re a bit of everything” is not a useful answer, and one clear profile is a valid result.
17 Versions in 6 Weeks
Every round of user testing produced scoring changes, and the quiz got shorter each time. Four examples of what we heard and what changed:
Heard
Freelancers in genuine crisis were being labelled Independent Professional.
Changed
Cut the worker-type bonus from 100 to 40 points so need-based profiles win when the need is real.
Heard
“Lost in my career” was triggering Crisis Navigator, but these users were not in crisis.
Changed
Moved that answer to Skill Builder scoring. Crisis now means an urgent workplace or money problem.
Heard
Users aged 26–35 kept getting Young Explorer when Skill Builder fit better.
Changed
Stepped the age weight down from 40 to 15 to 0 points for that band. Age informs, it does not decide.
Heard
People picked “financial assistance” but there was no service to send them to.
Changed
Removed the option and added “I’m not sure”. Every answer must map to something actionable.
What Shipped
- Two quizzes: a career quiz routing to NTUC programmes, and a financial quiz routing to member deals and government schemes.
- Service catalogue: 124 services scraped with Firecrawl, cleaned, and enriched so every one carries the fields the engine scores on.
- Stack: Next.js, React and TypeScript on Vercel, with static JSON as the single source of truth. No database was needed at this size.
- Quality: an automated test suite over the scoring rules. Built with Claude Code, with me owning the product and scoring decisions.
Results
Launched in December 2025 after a four-month engagement. In user testing, members rated the recommendations positively on every statement: relevant, personalised, clearer about NTUC's services, likely to click through, and likely to recommend.
The lesson I carry forward: put anything that might change in config, start with fewer questions than you think, and keep the user taxonomy apart from the service taxonomy.
“Dave's rapid and collaborative prototyping approach helped us create our solution in a flexible way. Within days, we had a working artifact that we could refine through multiple iterations, adapting quickly as new insights emerged. Instead of getting stuck in theoretical debates, we tested our ideas directly with users, refining the design based on their feedback. This speed-to-insight was what we needed to make quick, confident decisions.”
— Jodi Quek, Strategy