Bringing the Decade-In-Review Into the App
The 2019 Wrapped campaign marked a significant shift for Spotify: it was the first edition delivered natively inside the app, the first to cover a full decade of listening history, and the first to surface how artists and podcasters connected with their audiences over that span. Behind the scenes, the effort required processing a decade of data for over 240 million active users — handled by the data team — while multiple product groups coordinated on marketing, legal, design, and frontend and backend engineering.
The move from web-only to in-app was a company-wide push, and the engineering crew had to operate with startup-like autonomy to meet the deadline. The project team was deliberately lean and encouraged risk-taking, treating mistakes as learning opportunities. Engineers had to balance the product vision against technical risk and external dependencies, which demanded flexible problem-solving.
Setting Priorities That Everyone Can Follow
Before any code was written, team members from Insights, Design, Product, and Tech aligned on shared KPIs. That upfront process helped onboard engineers, gave them decision-making power, and kept the work focused. When questions arose — like whether to fix a bug in the sharing flow or in the stories experience — the team could answer without waiting for approval.
The core requirements for the native experience were defined early:
- Simple and intuitive
- Easy to share
- Consistent with Spotify’s look, feel, and function
Clear, measurable objectives made it possible for the engineering team to stay autonomous while still delivering against those standards.
A Milestone-Driven Development Cycle
With input from stakeholders, the team created a reverse timeline from the go-live date, marking key dates for code freeze, release candidate submission to the Apple and Google stores, and the point when real user data would be available. They deliberately scheduled milestones for Fridays to simplify communication and enforce accountability.
The product itself was built through incremental releases. Version 0.1 was the bare MVP: a stories container with audio and static stories — no animations. Features were then added based on team goals, with version 0.2 ship to market. This lean method kept the project on track under a tight deadline.
The Shift to Backend-Driven Image Rendering
The original plan was to build a native experience on iOS and Android with a small team of platform engineers. But the cost of generating personalized, shareable cards for every story and every user quickly proved too high. The initial architecture was re-scoped, and the focus shifted to a different approach.
The team prototyped a backend service that could render images in real time using CEF, a C++ library, with HTML templates and CSS. This solved the rendering problem, but it raised a new one: how to staff a service with sufficient backend and web engineers under rigid time constraints.
Localization and Edge Cases That Slowed the Rollout
This was Spotify’s biggest marketing push of the year, and the engineering began earlier than in prior years — still, several challenges complicated the process. Localization was a major hurdle. Line breaks in Japanese can change a sentence’s meaning, and the campaign supported right-to-left languages for the first time. Animated features such as genre bars and a spinning world globe introduced additional complications.
The sheer volume of data surfaced countless corner cases: what to show for users who only listened to podcasts, who listened to a single genre, or who had music history from just one country. More appeared constantly.
To handle last-minute translation fixes, localization was processed from the backend, which proved important when a Japanese string caused the iOS experience to crash for some users about an hour before launch.
Scaling Under Pressure
Three days before go-live, load testing revealed that traffic projections had to be raised. The team adjusted the GKE configuration, added another caching layer for the payload of downstream dependencies, and removed a race condition in the Image Generator component. As a safeguard, a data job pre-generated a batch of images to absorb the initial spike — a 42-hour job that produced roughly 535 million images and finished just two hours before launch.
The campaign landed as the final system below shows, and the in-app experience was well received — confirmation that the effort and pressure were worthwhile.
The 2019 Wrapped build was a shared project across the Edison Tribe under the Growth Opportunities Mission, Marketing, Brand + Creative, and many others who helped push it across the line.



