Skip to content
← All work

Web & API development · 2026

Niiche

A curated beauty platform that looked perfectly healthy. Eight products were invisible, the skin-type filter offered 55 options that matched nothing, and dozens of links had quietly gone stale.

invisible products restored
8invisible products restored
filter options, nonsense to real
55 → 17filter options, nonsense to real
dead links across 143 checked
0dead links across 143 checked
01

What I walked into

The platform was live and, to anyone looking at it, working. Underneath, three things were wrong, and not one of them threw an error.

Eight products never appeared at all. The product sheet spelled two brands as single words while the brand sheet spelled them properly. The slug generator turned those into different IDs, the rows failed to join, and the site dropped them without complaint. Five products from one brand and three from another simply did not exist as far as any visitor was concerned.

The skin-type filter was worse, because it looked like it worked. The parser split values on a middot; the source data used commas. Not a single row contained a middot. So "all, dry, sensitive" was read as one skin type, and the filter rendered 55 options, every one of them matching zero products. A visitor filtering for dry skin got an empty page and concluded the site had nothing for them.

And 58 product links had gone stale since launch, including one malformed as "hhttps://" that had been broken for every visitor since the day it went live.

02

What I did about it

The client sent three spreadsheets and asked whether refreshing them fell inside the original scope. Before answering that, I diagnosed what was actually in them against what was actually live, and wrote the comparison down: row counts, what matched, what differed, what was ambiguous.

The notes sheet was the dangerous one. It carried a brand column and a written note, but no product name, which meant the only way to line 143 notes up with 143 products was row order. Row order is exactly the assumption that silently corrupts a database and is not noticed for months. So before importing anything I verified that the brand sequence in the notes sheet matched the links sheet row for row, spot-checked individual notes against the products they landed on, and only then ran the import, keyed on brand plus product name rather than position.

One product in her sheet did not exist in the database at all. I did not guess which row she meant. I asked, and it turned out to be a rename plus a price change. Guessing would have put the wrong note and the wrong price on a live product page.

The rest was cleanup with verification attached: all 143 links checked for dead ends, the authored bullet structure preserved rather than re-derived by a regex that would have split on "Dr.", and the filter parser taught to handle both separators plus a couple of one-off spellings.