OkCupid: Stacks


Most people are familiar with the idea of “swiping” user cards in the context of a dating app to say whether or not you like someone; this interface allows for quick voting, and is generally expected by the users of any app. And OkCupid has used this mechanic on its home page for years, across all of our clients (iOS, Android, desktop, and mobile web).

But, this style of interface could be seen as superficial; there is a premium put on a photo, and users often move through too quickly to read a person’s profile. In addition, it doesn’t show off much of the fantastic information that people add to OkCupid — the questions they’ve answered, their essays, and more.

Stacks was a reworking of the home page to still let users see and vote on others, while putting some of what makes OkCupid special front and center. I was the tech lead on this project, so I wrote the tech design for the new GraphQL API fields and how they would talk to the back-end, helped to manage the communications between product and engineering, and implemented the API updates and the React/Redux application shared between desktop and mobile web. We ran a geo-test to validate this large, cross-platform project, and got some interesting, positive results.

The Stacks

The name Stacks comes from the idea that we can present not just one “stack” of user cards, but many! To draw attention to some of the rich profile data that OkCupid has, we created a Questions stack (people who have answered a ton of questions) and a Match % stack (top matches, as ranked by our match algorithm). We also added stacks for people nearby, people online recently, new users, and popular users. And we built in the ability to create temporary stacks for our marketing team to use, like the Voter 2020 stack, which was rolled out in the month leading up to the 2020 presidential election.

The stacks menu, and switching stacks

Daily Limiting

The stream of users in our default “Recommended” stack goes on for as long as there are people to show. But we decided to add a limit to each of the other stacks (10 votes per stack), which refreshes daily. From a product perspective, limiting the stacks encourages people to take their time looking at profiles, and adding a sense of scarcity makes the app a little more game-like and keeps people coming back.

When a stack runs out, the user sees a notice explaining what happened, and the exhausted stack shifts to the back of the stacks menu until it refreshes the next day.

Making the last 3 votes in a stack

This does have some tricky technical ramifications, though: since each stack is calculated on the fly by the backend as the user switches from one to another, then stored in client state, it is possible for the same user to appear in two stacks. So to make sure that the user doesn't see duplicates while getting their 10 votes per stack, the clients have to check each stack for repeated users when voting, and fetch a new user to replace any that were found.

Paid stacks

We added a small paid component to this project, as well: the ability for some stacks to require payment. The idea here was to add a cheap, non-subscription product that would unlock a paid stack for a week. To make these upsells more enticing, we showed a real user in the Stacks menu and paywall; upon unlocking the stack, that user would be the first person in the stack.

A stack paywall


We tested this feature before releasing it to the entire userbase using a geo-test (similar to an A/B test, but putting entire US metro areas in either the test or control group to make sure people near each other have the same experience). We looked at it mostly as a defensive test: can we completely change the format of the biggest generator of votes on the site?

Stacks performed admirably in this test: we didn't see any drops in our core metrics (e.g., voting, messaging, retention). And, we saw a consistently higher rate of likes vs. passes in stacks than in our default “Recommended” stack; for example, the like rate in the Questions stack was double that of the Recommended stack! We also saw our paid stacks bringing in a higher retention rate (people voting in the stack multiple days in a row) than the other stacks, suggesting that people found those stacks useful.

We rolled out this feature to all of our clients, and since then it has continued to drive a huge amount of votes on OkCupid, as well as serving as a platform for new Stacks, both topical and fun.

Thanks for reading.