← Binderdex dev log

2026-10-24

Three fixes that made price alerts worth opening

productmobiletcg

Flat editorial illustration of a phone showing a single amber price alert rising above a stack of ignored gray notification bubbles

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.

this is the build log of binderdex · www.binderdex.com · all entries · essays