Two-System Thinking for Notification Delivery
Daniel Kahneman’s Thinking, Fast and Slow describes two modes of cognition: a rapid, automatic System 1 and a slower, deliberate System 2. That same split appears in engineering domains from robotics to LLM agents, where a long-horizon planner coexists with a reactive control loop. Netflix’s messaging platform, which handles hundreds of millions of personalized push messages, emails, and in-app alerts daily, has adopted this dual-process pattern for its notification engine.
The core challenge is a familiar trade-off. Optimizing each individual notification for near-term engagement can undercut the long-term member experience. Send too many messages and fatigue drives opt-outs; send too few and members miss content they would value. The hierarchy Netflix describes separates strategic frequency planning from tactical message selection, letting each layer focus on its own objective.
Where a Single Policy Falls Short
The previous production system used a causal model to estimate the short-horizon incrementality of a single message. It worked as a baseline but carried structural weaknesses.
First, single-message outcome models train on immediate actions like opens or clicks taken shortly after delivery. That optimizes near-term engagement while ignoring cumulative effects such as growing notification fatigue or graduate opt-out risk — signals that only surface over weeks.
Second, when one system decides both whether to send and what to send, weekly frequency becomes an emergent by-product rather than a controlled variable. The older system imposed frequency limits only through a relevance threshold calibrated to an aggregate send rate. That constrained the system to a single global frequency regime rather than per-member pacing. Worse, send eligibility and message ranking were entangled in one decision rule: changing the threshold to control volume also shifted the mix of messages sent.
Decomposing the Problem
Press enter or click to view image in full size
At the top of the hierarchy sits the Slow policy, a planner that decides a personalized cadence over a defined horizon, typically weekly. Its output — a “Pacing Plan Action” — specifies independent push and email frequency targets on a discretized action space. That action set amounts to roughly one hundred distinct cross-channel pacing combinations.
The Slow policy optimizes a utility function that explicitly balances positive engagement signals against the long-run cost of messaging:
U(member, action) = Σ wₖ·Reward_k(member,action) — Cost(action)
The reward side includes positive signals (a member finding value in the platform) plus negative signals (fatigue or channel opt-out propensity). In an ideal world, the negative signal alone would discourage over-messaging. In practice those signals are sparse, so incremental predicted cost approaches zero and the model drifts toward maximum frequency.
Netflix corrects for this with a universal message cost applied to every send on top of the personalized negative-feedback forecast. That term keeps the objective concave and prevents degenerate always-send policies. Its value is set by empirical tuning across online experiments and offline evaluation.
The two-layer split also opens room for deliberate pacing, beyond a simple average frequency. The baseline strategy is uniform random pacing: convert the frequency target into a per-opportunity send probability and draw a coin at each eligible event, yielding an organic send pattern whose expectation matches the target. The framework permits non-uniform profiles as needed — day-of-week structure, activity-conditioned sends, or launch-aligned bursts — when product requirements call for them.
Communicating Intent Down the Stack
The decoupling only works if the two policies can exchange state cleanly. Slow-plan decisions are treated as events; those plans land in a low-latency feature store. When a notification opportunity occurs, the Fast policy simply reads the stored pacing plan as a feature and executes the tactical send under those guardrails.
Press enter or click to view image in full size
Two properties fall out of that design. The plan has “stickiness,” meaning the member receives a consistent experience across the planning cadence rather than drift from daily re-decisions. And the layers can evolve independently: the weekly pacing strategy can be retrained or A/B tested without touching the real-time ranking logic.
Results and Takeaways
Adopting the hierarchical architecture produced one of the largest production metric lifts the team has recorded to date. The gains concentrated among lighter viewers — the cohort most sensitive to timely, relevant awareness of new titles. The structural lesson, however, was as significant as the modeling win: separating frequency planning from content selection turns two entangled decisions into independent, clean variables. With a dedicated strategic layer now managing cadence, the system can explicitly control opt-out risk and long-term fatigue.



