A price alert is a promise: open me, you'll learn something new. This week BinderDex was breaking that promise daily, and the push-open numbers made it impossible to ignore. So we fixed the promise in three places.
The same alert, every day
The worst offender was repetition. A card that jumped 23% would say so on Monday, then say the exact same thing on Tuesday, Wednesday, and Thursday. The cause was a mismatch between two timers: the selector re-qualifies a card every day its trailing week still looks hot, but the dedupe key reset daily too. Nothing ever remembered what had already been said. The fix was a novelty gate, and it's small enough to paste:
def is_new_information(card, last_alert, now):
if last_alert is None:
return True
if now - last_alert.at < timedelta(days=3):
return False
flipped = card.direction != last_alert.direction
big_move = (abs(card.price - last_alert.price) >= 5
and abs(card.change) >= 0.15)
return flipped or big_move
A card can come back after three days, but only if the story changed: the direction flipped, or it moved at least 15% and $5 from the price at the last alert. Everything else stays quiet.
Day one has no history
The second problem hit new collectors. Our main price-alert push needs a big trailing move on a card worth $10 or more, which someone who joined yesterday with three cards in their binder almost never meets. So day one was silence. The fix: a dedicated first-day push that looks at the collector's own cards, added 18 to 42 hours ago, and reports the biggest mover among them if it moved at least 3% or $0.25. Small bar, personal data, exactly one per member.
Track cards before you know you track cards
The third gap was silent too. The cards you pick during onboarding lived only on-device, so most new members had nothing on their watchlist in their first day and nothing to alert on. Now those picks land on the server watchlist automatically: idempotent, failures logged and counted, and onboarding never blocks on it. You finish picking Charizard and Pikachu, and the price desk is already watching them for you.
Three changes, one theme: an alert earns its open or it doesn't ship.