In standard beauty ecommerce, consideration is vertical: browse a listing, tap a product, scroll down a long PDP looking for information, go back to the listing, tap the next product, repeat. The PDP is the place users go to decide — but it rarely gives them enough to decide fast. Most users doing high-consideration research leave the app entirely to check Google, Reddit, or YouTube before coming back.
The goal was to change that in two ways: make the PDP rich enough that users didn't need to leave, and make moving between products fast enough that more sessions reached a PDP at all.
A user browsing lipsticks on any major beauty app follows the same path: listing → tap product → scroll long PDP → insufficient information → back button → next product. So the back-button loop continues, fewer products get a real look, and consideration happens off-platform.
If the PDP had enough — real shade intelligence, synthesised reviews, answered questions, concern-mapped highlights — the interaction model could change. Instead of vertical scroll per product, the PDP itself could become a browse surface: tap through a product's depth horizontally, then swipe to the next product directly. No back button. No lost context. More products considered per session, faster.
On an enriched PDP, all the content — product images, highlights, "Will it suit me?" module, review synthesis, Q&A — was navigated by horizontal tap, like a story. When a user had seen enough of one product, a right-to-left swipe opened the next product's PDP directly, inside the same loop. No returning to the listing. No losing your position. The next product was one gesture away.
This only works if the PDP earns the horizontal navigation. A thin product page with two images and a brand description has nothing to tap through. The enrichment wasn't a content project — it was the precondition for a fundamentally different consideration pattern.
The obvious move was generated copy on every page, or a chatbot answering questions live. I wanted neither. In a category where a wrong claim about a shade or ingredient erodes trust immediately, free-form model output going live unreviewed was the wrong risk.
So I treated model output as a catalog data layer, not a live answer. We generated structured fields once, verified them against a second model, routed disagreements to a human reviewer, and stored approved fields as catalog data. What the user saw was governed by product logic that decided how each field could appear — modules, sorting, collections. The intelligence was AI-made; the trust came from the verification layer.
The branch in the pipeline is the part that mattered. A straight generate-and-ship flow would have let shade errors through at scale — the first model's most common failure was confidently wrong shade descriptions, not vague copy but incorrect physical properties. The verification step existed specifically to catch that. Roughly 9% of outputs flagged to a human before approval; everything else stored as a reusable catalog field.
Quality enforced between the two models — not in the generation step.
Generating prose was the easy part. The hard work was defining decision-oriented fields that could drive modules, sorting, recommendations, and collections — and separating what the shade physically is (constrained, verifiable, schema-bound) from how to describe it (generated, human-checked where the models disagreed). Once the schema was right, deterministic rules could do the reasoning: a drying matte lip triggers a prep step, a long-wear formula triggers a remover, repeated berry-shade affinity assembles a collection. None of it merchandised by hand.
The 42→53% uplift in sessions reaching a color-cosmetics PDP reflects both effects: more users entering PDPs from listings and carousels, and more products viewed per session as the swipe-to-next pattern replaced the back-button loop. PDP-to-cart improved in step — the signal that users were finding enough on the page to decide, rather than stalling and leaving.
Enrich the PDP enough and it stops being a destination. It becomes the browse.