In the 1950s, B.F. Skinner was running animals through boxes with a lever and a food dispenser, and he found something that has haunted product design ever since. If you reward the lever every time it’s pressed — a fixed, predictable payoff — the animal presses at a moderate, sensible rate, and the moment you stop the rewards, it gives up almost immediately. But if you reward the lever unpredictably — sometimes on the third press, sometimes the twentieth, sometimes not for a long stretch — the behavior changes character entirely. The pressing becomes fast, relentless, and astonishingly hard to extinguish. Take the reward away completely and the animal keeps going far longer than it ever would have on the predictable schedule, because it can never be sure the next press isn’t the one. Skinner called this a variable-ratio schedule of reinforcement, and it produces the highest, most persistent rate of behavior of any schedule he tested.
The reason it grips so hard is the same prediction machinery underneath dopamine: an unpredictable reward keeps the “is it coming now?” signal permanently live. A predictable reward gets anticipated, and anticipation dampens the response — the brain stops being surprised. Unpredictability never lets the signal settle. Every pull is a fresh, unresolved bet. That’s the whole engine of a slot machine: not the payout, but the maybe. The lever is cheap, the outcome is uncertain, and the uncertainty is doing the work.
Now look at your phone with that lens and the pattern is everywhere, because it works. Pull to refresh is a lever with a variable payoff — sometimes new content, sometimes nothing, you can’t know until you pull. An infinite feed is the same bet re-armed after every scroll: the next post might be great. A notification badge is a wrapped box that’s occasionally worth opening. None of these were necessarily designed by someone quoting Skinner, but they converged on his schedule anyway, because the schedule is a local maximum of engagement and A/B tests roll downhill toward it on their own. That’s the uncomfortable part: you can build this accidentally. Optimize hard enough for “sessions per day” and you will reinvent the slot machine whether or not anyone at the table ever intended to.
Here’s where I want to be honest instead of clever, because this is a mechanism with a body count of wasted human hours, and pretending it’s a neutral “growth tactic” is how builders let themselves off the hook. The variable-ratio schedule doesn’t care whether the behavior it’s driving is good for the person doing it. It will make someone pull a feed they don’t enjoy, past the point of any real reward, resistant to their own intention to stop — that “I didn’t mean to spend forty minutes here” feeling is not a personal failing, it’s the schedule working exactly as designed. So the question a serious builder has to sit with isn’t can I install this loop (you can, easily, maybe by accident) but should the thing on the other side of the maybe be worth the pull?
That gives you a usable line, and it’s sharper than “engagement good / addiction bad.” Ask whether the uncertainty is wrapped around real value the user actually wants, or around manufactured scarcity that exists only to keep them pulling. A messaging app where “pull to refresh” might surface a message from a friend is variable-ratio too — but the payoff is something the user genuinely came for, and when there’s nothing new, an honest empty state (“you’re all caught up”) lets them leave. A feed engineered to never be caught up, to always dangle one more maybe, has taken the same mechanism and pointed it away from the user’s goals and toward yours. Same schedule. Opposite ethics. The tell is what happens when there’s nothing good to show: a respectful product lets the loop end; an extractive one manufactures a reason to pull again.
So the build decisions are real ones, not hand-wringing. Give the loop an honest floor — a “you’re all caught up” that actually stops, instead of an infinite scroll that never admits emptiness. Make the payoff worth the bet — if the maybe behind the pull is usually junk, you’re not engaging users, you’re conditioning them, and they’ll eventually feel it and resent you. Add friction back deliberately where you’ve noticed the loop overriding intent — batching notifications instead of dripping them, a natural stopping point at the end of a session, a setting that lets someone turn the slot machine off. And the quiet meta-move: watch your own metrics for the signature. If sessions-per-day is climbing while satisfaction, or time-well-spent, or the sheer number of “why am I still here” moments is getting worse, your optimizer may have found the variable-ratio maximum without telling you. That’s the moment to decide on purpose what an experiment found by accident.
None of this is an argument against reward, or surprise, or delight — unpredictable good things are a real part of what makes products feel alive, and a world where every interaction is perfectly predictable is a boring one. It’s an argument for knowing which lever you’re pulling on your users, and pointing its considerable power at something they’d thank you for if they could see the whole machine. The slot machine and the messaging app run the same code. The difference is entirely in what you decided to put behind the maybe.
Liked this? Get the next one in Working Theory.
Going weekly in August (it's in beta now). One genuinely interesting read on building, the brain, and the science most people missed.