What ranking a news feed actually costs you
We built a news product, so we had to answer a question most news products answer by accident: what is the ranking actually for?
There is no neutral option. An unranked reverse-chronological list is itself a ranking — it optimises for recency, which rewards whoever publishes fastest and punishes whoever checks first. Choosing not to decide is deciding.
The three things you can optimise for
Engagement. Show what gets opened. This works, in the narrow sense that the metric goes up, and it converges everywhere it has been tried: outrage, conflict, and the same story told at increasing volume. Not because anyone wanted that, but because engagement is a proxy for arousal long before it is a proxy for value.
Recency. Show what is newest. Easy to build, easy to explain, and it produces a feed in which a minor update at 14:02 outranks the thing that actually happened at 09:00. It also rewards republication, which is how the same event arrives in your feed nine times.
Completion. Show what the reader needs in order to be done. This is the one almost nobody builds, because the successful outcome is that the user closes the tab.
We chose completion. The commercial consequence is direct: our best day is one where people spend less time in the product.
What that forces you to build
Optimising for completion means the unit cannot be the article. If the unit is the article, fifteen outlets covering the same development produce fifteen units, and no ordering of fifteen near-duplicates is ever finishable.
So the unit became the event. That sounds like a modelling problem and it mostly is not — it is a definitions problem wearing a modelling problem's clothes.
The hard cases are not the obvious duplicates. They are:
- A development and its follow-up. A resignation and the successor's appointment two days later: one event or two? We decided two, linked, because a reader who has seen the first still needs the second.
- A correction. An outlet retracting a number is not new coverage of the event; it changes the event. It has to be able to rewrite what we already said.
- Coverage in two languages that disagree. This is the interesting one. A Nepali source and an English wire report frequently differ on detail, and the difference is often the most informative thing available. Averaging them destroys exactly the signal worth having.
That last case settled our architecture. We keep sources distinct all the way through, and the summary is a view over them rather than a replacement for them. Every claim can be traced to the outlet that made it, including when two outlets contradict each other — especially then.
The cost we accepted
Grouping by event is slower than grouping by article. We are minutes behind a pure recency feed, sometimes longer when coverage is thin and the grouping is uncertain.
We took that trade deliberately. A reader who wants to be first already has a tool for it. A reader who wants to be right is being served badly by almost everything, and would rather wait four minutes.
The general version
You cannot optimise a ranked system without stating what you want. Most teams skip that step, ship whatever the default library does, and then find themselves defending an editorial position they never consciously took.
The ranking is the product. Deciding it late means someone else decided it for you.