Each of 220 simulated users carries a private per-hour engagement profile — a single personal peak hour drawn from a realistic mix of chronotypes (early risers, lunch-break scrollers, night owls) plus a baseline "might glance at the phone anytime" floor. The probability a user opens a notification sent at hour h is a bell curve centered on their own peak:
P(open | h) = floor + (1−floor) · exp(−Δ(h, peak)² / 2σ²)
Δ = circular distance on a 24h clock
Every simulated day, two strategies run against the same population: Blanket sends to everyone at one fixed global hour; Personalized sends to each user near their own predicted peak — but the prediction is not perfect, it is offset by a random error scaled by the targeting-noise slider. A tighter σ (peakier users) rewards good targeting more; more noise erodes the personalized advantage until, at 100%, it converges back toward blanket performance.
- Blanket send hour — the one-size-fits-all time every user gets notified in the fixed-time strategy.
- Personal-peak sharpness (σ) — how narrow each user's true engagement window is; sharper peaks mean timing matters more.
- Targeting noise — how far a real send-time model's prediction drifts from a user's true peak; 0% is a perfect oracle, 100% is a coin flip.
Real-world relevance: this is exactly the lever behind FCM/APNs "smart delivery" and quiet-hours-aware scheduling — swapping a single global send time for a per-user predicted engagement window reliably lifts open rate without sending a single extra notification.