All thoughts
Aug 2026 / product AI / Archit Gulati

Spotify Knows What You Played. It Doesn't Know Why.

The recommendation engine isn't a music feature. It's a switching cost. And the misses are more interesting than the hits.

Published Aug 2026
Read time 4 min read

The catalogue isn't the moat.

Any streaming service can license the same catalogue. The songs aren't the moat.

The moat is discovery. The moment Spotify surfaces a song that becomes one of your favourites, something you wouldn't have found without it, it creates a memory attached to the platform. That memory is the switching cost. Not the catalogue, not the interface, not the price. The irreplaceable moments of finding something you didn't know you needed.

Discover Weekly launched in 2015 and drove a measurable jump in weekly active users within months. What the product team had built wasn't a playlist feature. It was an emotional attachment loop. Every hit recommendation made the platform incrementally harder to leave.

The recommendation engine is retention infrastructure dressed as a music feature.

The signal problem at the centre of it.

The play log is complete. The intent behind it isn't recorded anywhere.

Play-through rate, whether you listened to a song to completion, is the cleanest signal available at scale. It's also a poor proxy for what you actually want to know: did the user love this, or did they just not dislike it enough to reach for their phone?

A song played in full while cooking dinner means something different from a song played in full with headphones in at 11pm. Both register as positive signal. The model can't separate them without context it often doesn't have.

The explicit feedback surface, heart and skip, is too binary and too infrequent to fill that gap. Most listening generates no explicit signal at all. The model is working primarily from implicit behaviour, and implicit behaviour is ambiguous. That ambiguity doesn't go away. You design around it or you don't.

Why the misses aren't random.

When I look at my own Spotify misses, they cluster around three failure modes. I suspect the pattern is consistent across users.

The gift problem. You play something for someone else: background music at a gathering, a friend's request, a playlist you didn't choose. The session gets absorbed into your taste graph with no way to distinguish "I played this for someone" from "I chose this for myself." The model learns the wrong thing and there's no signal to correct it.

Context contamination. You listened to high-tempo EDM for a gym session and now it's leaking into your morning focus playlist. The model learned that you like this, but not when. Context that should be segmented gets averaged.

The one-off curiosity. You went deep on an artist you don't actually want to hear regularly, maybe for research, a conversation, nostalgia, and the recommendation graph weighted it heavily because the session was long. Depth of listening read as strength of preference. It wasn't.

In all three cases, the behaviour the model observed meant something different from what the model assumed. That's not an ML problem. It's a product problem, and it's fixable at the surface level.

The context collapse Spotify is managing.

The same person needs completely different music for a gym session, a focus block, a commute, and a dinner party. Those are four listening modes with four different definitions of what a good recommendation looks like.

Spotify has context signals: time of day, device, recent playlist selections. The product surface makes clean capture difficult. When you open the app and tap shuffle, there's no lightweight way to say "I'm working" without explicitly building a focus playlist or navigating to a context-specific feature. The signal has to be inferred, and inference is lossy.

AI DJ and contextual playlists are Spotify's attempt to close this gap using inferred context rather than explicit signals. They work well in the average case. They generate the memorable misses at the edges: when your inferred context is a gym mood and you're actually trying to wind down.

Ask for more explicit signals and you add friction. Rely purely on inference and you accept the misses. There's no clean answer here, just a calibration Spotify is constantly making and occasionally getting wrong.

How I'd instrument recommendation quality.

Skip rate and play-through rate measure disengagement and passive acceptance. Neither measures delight.

The metric I'd anchor on is post-discovery saves: when a user hears a recommended song and adds it to a personal playlist or their library. That's the closest thing to "did this actually work" that the data can give you. It's also more durable. A save persists, a play doesn't.

The problem is sparsity. Most good recommendations never get saved because the user enjoyed the song in context without feeling the need to keep it. The signal skews toward intentional, music-focused listening and under-represents background and passive modes.

The instrumentation I'd want: a weighted signal combining skip rate as a strong negative, library/playlist saves as a strong positive, and play-through as a weak positive that decays with session length. Long-session plays should be discounted. They're more likely ambient than attentive.

The guardrail metric is Discover Weekly return rate: are users who opened last week's edition opening this week's? That's the stickiness the algorithm is ultimately optimising for, and it should be tracked explicitly rather than inferred from overall WAU.

What would actually reduce the misses.

Not a smarter model. Better conditions for the model to work with.

The gift problem is a product surface problem: a lightweight shared or guest listening mode that opts the session out of taste graph updates. The context contamination problem is a segmentation problem: playlist or session tagging by listening mode so recommendations can be context-aware rather than averaged across all modes. The one-off curiosity problem is harder. You'd need the model to detect when a deep session diverges significantly from established taste patterns and discount it accordingly, rather than treating it as a strong new signal.

None of those are ML investments. They're instrumentation and surface decisions. The model is doing what you'd expect given the signals it has. Whether it ever gets better ones is a product decision, not a modelling one.

The hits feel like magic. The misses are just the model doing its best with an incomplete picture.

Written by Archit Gulati · GitHub · LinkedIn · back to thoughts