Recommendation engines have an intimidating reputation. In practice, a small online store can get most of the benefit with a few steps, each one building on the last, and each testable against the one before.
I worked on this for a luxury resale marketplace, where we ranked products by predicted click-through rate and built a recommendation system from product attributes. The page exit rate fell by about 6 percent, and the recommendations added around 4 percent to revenue. Neither used anything exotic. Here's the ladder I'd climb.
Rung 1: a sensible popularity baseline
"Most popular" is the baseline you must beat, so do it properly. Use recent sales or clicks, not all-time, and weigh them by how long an item has been available. Otherwise new arrivals never get a chance. If you rank by raw sales, you'll keep showing what already sells, which is a loop.
Rung 2: "people who bought this also bought..."
Count how often pairs of products appear in the same order. It needs nothing but order data.
WITH pairs AS (
SELECT a.product_id AS item, b.product_id AS also_bought, COUNT(*) AS orders_together
FROM order_items a
JOIN order_items b
ON a.order_id = b.order_id AND a.product_id <> b.product_id
GROUP BY 1, 2
)
SELECT *
FROM pairs
WHERE orders_together >= 5
QUALIFY ROW_NUMBER() OVER (PARTITION BY item ORDER BY orders_together DESC) <= 10
(The QUALIFY clause is BigQuery syntax; elsewhere use a subquery.) Raw counts favour bestsellers, so for better suggestions compare how often a pair occurs with how often you'd expect by chance. That adjustment, usually called lift, turns "everyone buys the popular thing" into "this goes with that".
Rung 3: use what you know about the products
Co-purchase counts fail for new or rare items because there is no history. Product attributes help here: category, brand, size, price band, colour, material. Describe each product as a vector of its attributes, and recommend items with similar ones. It's a decent fallback for the cold-start problem, and in a marketplace of one-off items, where each piece sells once, it's often the main method.
Rung 4: rank by predicted click-through
Once you have impressions and clicks, you can learn what makes people click. For each time a product was shown, record whether it was clicked, plus features of the product, the page position and the context. A logistic regression or gradient boosting model then predicts a click probability for each product, and you order by that.
Position effects matter. Items at the top get clicked more simply because they're at the top. If you train on raw click data without accounting for it, your model learns "things that were shown first are good". Including position as an input during training, and setting it to a constant when scoring, is a common simple fix.
Rung 5: personalise, if it earns it
Personalisation, using a person's own history, comes last. It needs more data, more engineering and more care, and for many stores the gains from the earlier rungs are larger. Add it when you can show the earlier steps have plateaued.
Testing, honestly
Offline scores are a guide, nothing more. A model that predicts clicks well on historical data may not improve sales when it goes live. The real test is an A/B test: half of visitors see the new ranking, half see the old, and you compare the number you care about, such as revenue per visitor or the exit rate, not just clicks. Run it for long enough to cover a full weekly cycle.
Watch for side effects too. A ranking optimised for clicks can push cheap, clicky items over profitable ones. Include guard-rail measures like margin and returns.
Where to start
If you have nothing today, start with rung 1 and rung 2. They take days, not months, and give you a baseline to measure the later rungs against. Then add the next rung only if the numbers justify it. We help teams do this under predictive modelling, and the experimentation work covers the testing side.