Recipes / Build a morning digest someone will actually read

Build a morning digest someone will actually read

/stories in recent mode. The parameters matter less than the reasoning behind them, so that is most of what is below.

The request

GET /stories
  ?mode=recent
  &language=eng
  &from=<yesterday 06:00>
  &to=<today 06:00>
  &limit=20

Why these parameters

A digest lives or dies on whether the reader trusts it to be complete without being repetitive, and story collapsing is what makes that possible. Bound the window to the actual period rather than using a rolling "last 24 hours", so the digest is reproducible and two people reading it are reading the same thing. Language-scope it to what your readers read; an unscoped digest is not more informative, just less usable.

What comes back

Twenty distinct events ordered by recency, each with the outlets that carried it. Sorting the result by outlet count rather than time gives you a rough importance ordering for free, with no model and nothing to tune.

How this goes wrong

A digest built on article search reads as twenty variations of the top three stories, and people stop opening it within a fortnight. By the time anyone reports it as a problem the habit is gone and getting it back is much harder than never losing it.

Adapting it

For a team digest rather than a personal one, scope by outlet to the publications that team actually trusts — it shortens the digest and raises the hit rate more than any ranking change. For a multilingual audience, run one query per language and label the sections, rather than blending languages into one list where readers skip most of it.

Running it for real

Generate at a fixed time from a fixed window so the digest is reproducible and two readers see the same thing. Cache the result rather than querying per reader. Sort by outlet count instead of recency to get a rough importance ordering with nothing to tune. The metric to watch is not open rate but whether anyone clicks through — a digest people open and never act on is a digest that has quietly become noise.

When this is the wrong tool

A digest is the wrong format for anything urgent. By the time a scheduled digest is generated, an urgent story is hours old, and readers who need to know immediately will already have found out elsewhere — at which point the digest is reporting the past rather than informing. Run alerting separately, with a much tighter loop and a higher escalation bar, and let the digest do what digests are good at: comprehensiveness over speed. This recipe also degrades badly for very broad audiences. A digest that tries to serve several teams with different interests ends up relevant to nobody, and the usual failure is quiet — open rates stay respectable while nobody acts on anything in it. Narrower digests for narrower audiences outperform one broad digest every time.

Related recipes