Beauty listings are full of technically relevant products. Filters help — but filters are binary. They can tell you a product is "for dry skin." They can't tell you it's the wrong choice for your dry skin, because your concerns aren't equally weighted and your skin isn't a tag. The result: a user scrolls 296 moisturisers with no signal about which ones to trust, and no way to know when to stop.
The question wasn't how to build a better filter. It was: how do you make the scroll itself meaningful?
A filter tagged "for dry skin" returns the same 80 products regardless of whether your dryness is more pressing than your sensitivity, or whether a product carries an ingredient your skin reacts to. Everything in the filtered set looks equally valid. The ranking is price or popularity — not fit.
A deterministic score changes that. It reads the user's full profile — concerns weighted by importance, not just present or absent — against 50+ expert-tagged attributes on every SKU. Positive fit adds points. Ingredient conflicts subtract. A hard incompatibility — a formula type contraindicated for the user's skin — overrides the score outright. The result is a continuous 0–100 signal per product that lets the listing mean something: products are ranked by how right they are for this user, not for users in general.
Every beauty platform runs a quiz. Most map a few answers to broad tags. Ours resolved to a Baumann skin type — the 16-type dermatological classification — expressed as a code like DSPW that the system used to score every product in the catalog. Ten plain-language questions covered skin character, sensitivity, reactivity, concerns, and behaviour. No clinical vocabulary. No long-form intake. Specific enough to score against 50+ attributes per SKU.
That attribute depth is the part standard ecommerce teams rarely have. Knowing a product is "for dry skin" is easy. Knowing its comedogenicity, its ingredient conflicts for a sensitised skin type, its richness against a specific Baumann classification — that's what lets a score be right, and lets it say no with a reason.
I chose deterministic scoring over a model because trust required explainability. When a product scores 96, the user can see why. When it scores zero, the reason is specific — not a black-box output. The logic was defined once and applied consistently: the fit bands, the conflict rules, the override conditions, and the cases where an incomplete profile meant no score should show at all rather than a misleading one.
As a profiled user moved through a category, the listing resolved into explicit bands. Best fits first — each with a score and a reason. Good fits below — tagged to the specific concern they addressed. Then, at the bottom: "Not for you" — shown, not hidden. The DSPW Baumann code stayed visible in the band header throughout, anchoring every product judgment to the same profile.
Scroll depth became meaningful. Users knew exactly where they were in the relevance gradient. The products they needed to look at were at the top. Everything below was context, not noise.
Showing low-fit products explicitly — including on hero SKUs from major brands — was a decision I made against real pushback. Brands didn't want a zero-score band on their listings. The counter-argument: a "not for you" only fires when a product could harm the user's skin. At that point, showing it is the right brand experience — it routes the user to a product from the same brand that actually fits, instead of a purchase they'll regret.
The deeper bet: a system that only ever says yes isn't trusted. Showing "not for you — and here's exactly why" is what made "best for you" worth believing. The metrics confirmed it. Demand concentrated tightly around high-fit products. "Not for you" products almost never sold to profiled users.
A listing band gives a user the gradient. The product page gave them the specific argument — why this product works or doesn't work for their skin in particular. For a "not for you" product the panel named the actual conflicts, not a category label, so the user understood the call instead of just seeing a rejection.
A routine's score derived from its constituent products judged as a set — not each item in isolation, but whether the combination made sense for the user's full profile. That mattered commercially: confidence is what makes someone willing to commit to a full regimen, not just a single item.
Measured among profiled users in the weeks after launch — directional signal, not isolated A/B attribution. The strongest result wasn't that high-fit products performed well. It was that demand concentrated around them while low-fit products were meaningfully suppressed — exactly the pattern you'd expect if users trusted what the bands were telling them.
Filters tell you what a product is. A score tells you whether it's right for you — and it has to be willing to say when it isn't.