Developing BERN, the app that powered the largest relational organizing campaign in history
Working on the Bernie 2020 campaign’s tech team was undoubtedly the highlight of my career and possibly my entire life. The experience of working around the clock in our DC campaign headquarters on a talented and hardworking team towards an ambitious, shared vision of the future was unlike anything I’d ever experienced. It completely shifted what I viewed as important in my career and life.
As illuminating as the experience was on a personal level, it was equally insightful on a professional level. I wrote this piece for other tech professionals to share what worked and what didn’t while developing organizing tech for a presidential campaign. You can find similar write ups from the Bernie 2020 Organizing Team here and other musings on the Bernie Tech Team here.
A presidential campaign is like a faster-paced, higher-stakes version of a tech startup. Over the course of about 18 months, the organization must grow from a handful of people to thousands of paid staff and volunteers while building a national brand and raising about a billion dollars. Fail to do any of those things and it’s over.
Political campaigns aren’t driven by tech, but tech plays an important and intersectional role. The campaign’s Tech Team, led by CTO Chris Mabry, was in charge of IT as well as product engineering. Our main products were berniesanders.com and a custom built mobile organizing app for iOS and Android called BERN. Chris and myself both played hybrid product/design/engineering roles on these projects and there were 2–5 other engineers working with us. I ended up focusing most of my eleven months on the campaign working on the BERN app. It should be noted that smaller, non-presidential campaigns generally don’t have the resources to build custom apps.
Scaling Relational Organizing
BERN was mostly used for “relational organizing”, which is a tactic of asking supporters to reach out to their friends to persuade them to vote and volunteer. Several studies show that this kind of “friend to friend” outreach is far more effective at turning out votes, especially among young people, than strangers calling, texting or knocking on doors. However, it’s notoriously difficult to scale. Volunteers only know so many people, so campaigns have to scale horizontally across a large group of users.
We were able to scale relational organizing more than any other campaign in history, at least in a political context:
- User base: Nearly 300,000 registered users, many of whom had never given their contact information to the campaign — so this was their entry point to our lists. About 100,000 used relational features and about 200,000 of them were active in the key month of February.
- Voter identification: 1.4M “relational IDs” (voters identified through a friend), which we found were about twice as accurate as other kinds of IDs. Reached a disproportionately high amount of young people thanks to our student program.
- Voter turnout: Effect on turnout data is still coming in, but so far it looks like BERN has outperformed the already high effect on turnout in studies of relational programs.
- Content: Thousands of user generated videos uploaded via #MyBernieStory. Hundreds of thousands of video and livestream viewed and shared in app.
- User Rating: Five star average rating in the App Store and Play Store with nearly 4,000 reviews between them. To be fair, the majority of reviewers were rating the candidate the app was named after.
Relational organizing is a relatively new tactic in electoral politics that doesn’t require an app, but it’s commonly done using one. Our campaign’s organizing strategy drove our decision to create our own app instead of utilize an existing one. The National Organizing Team, led by Bernie 2016-veteran Claire Sandberg, decided the best way to achieve that scale was to fully integrate relational organizing, “street canvassing” and “door-to-door canvassing” into a single custom app. Instead of onboarding volunteers into three separate apps, we would integrate them into one experience. Given that organizing channels for our hundreds of thousands of volunteers would change throughout the cycle, a single platform with multiple channels promised to help keep volunteers engaged. Additionally, there was an argument to be made that developing our own app was a significantly cheaper option given the pricing structures of off-the-shelf apps designed for smaller statewide campaigns.
Like all product plans, the plan for BERN evolved. Through a sprint-based estimation and prioritization process, we figured out the priority of the next most important features and, not surprisingly, things were added and cut. The door-to-door canvassing feature, for example, was cut early on as existing systems (VAN and MiniVAN) were deemed good enough and were immediately available. Through this collaborative roadmap process with the organizing team, we were able to deliver smaller changes with immediate ROI as well as features laddering up to a long term vision — all on agreed upon timelines. The organizing team’s trust in this development process was fundamental to the project’s success. Although it didn’t follow the initial formula, BERN eventually achieved the fundamental goal of one platform for multiple kinds of volunteer work.
Initial Web Launch
The first version of the app, a Django web-app running on AWS Lambda, was launched in April of 2019 shortly before I came onboard the campaign. The app supported both relational organizing and street canvassing and was put together very quickly in time for a big volunteer kickoff call.
There were a few issues at launch, but it did drive tens of thousands of relational IDs matched to the voter file which our data team, led by Jeremy Meadow and Ariane Schang, used for various organizing and modeling purposes. There wasn’t a terribly compelling reason for users to stay engaged, though, and retention was poor. As a result, questions arose around whether we launched our custom built app too early and whether we should have rolled out an off-the-shelf solution first.
When I joined the team about a month after this launch, my take was that we didn’t launch too early if we were learning from our volunteers via analytics. Unfortunately, we weren’t doing that yet. We addressed that shortly thereafter by implementing Mixpanel for user-based analytics, which we used extensively to analyze behavior funnels, retention, as well as to segment our user base for push notifications, in-app messages and general analysis. This system made BERN usage data far more accessible to organizing and digital stakeholders and took pressure off of the data team to pull reports and cut lists.
Expanding into Native Mobile with #MyBernieStory
A common piece of feedback we got about the BERN app was “why can’t I download it?” We sensed that by being web-only, we were missing an opportunity to acquire new users via the App Store and engage them via push notifications. No one on the team other than myself had worked on a native mobile app before, so we tested the waters with a very simple initial release that wrapped our existing web UI in native navigation.
We launched BERN as a native app alongside a major feature called #MyBernieStory. This feature prompted users to use the app to record their personal reason for supporting Bernie for president. It then prompted the user to share it with their friends, which embedded it on a survey page to capture their information. Launching the app in conjunction with the #MyBernieStory social media campaign was a great success due to an extremely effective launch strategy from our surrogates and student organizing teams—who coordinated hundreds of videos to be ready for launch. When we launched on August 12th, it started trending faster than anything our social team, led by Georgia Parke and Hamid Bendaas, had ever seen. That day #MyBernieStory became the number one trending hashtag in America and #3 worldwide while BERN spiked in usage and remained at a higher plateau of engagement throughout the campaign.
That amazing moment aside, the native mobile platform with push notifications ended up being a bigger long-term driver of engagement than #MyBernieStory or the survey. Even though the native UI was the same if not worse than the web UI, the push notifications and screen real estate of a native mobile app seemed to result in more repeat usage. We realized this a couple months after launching the native app and also saw that 85% of our user base was already using it.
At this point, we decided to build all new features specifically for native mobile using React Native. It was a decision I don’t regret for a minute, but I don’t think we would have been able to make it without the cohort analysis in Mixpanel to decisively compare platform usage.
Building features to scale relational engagement
Months later, users weren’t recording #MyBernieStory videos at nearly the same rate as when we launched the program, but it had generated extremely persuasive user generated content that could be used for organizing purposes. We also had a growing library of top-notch video content, produced by Mia Fermindoza and Sara Pearl Kenigsberg, with hits like the AOC endorsement video. We knew this video content could help the app’s persuasive content, so we leveraged these two resources by creating a filterable video section of the app centered around a sharing ask. Technically, we kept it very simple by using the Wagtail CMS in berniesanders.com to power the content and a simple YouTube embed for the player. The killer feature turned out to be push notifications announcing live streams that drove immediate engagement back into the app.
By late fall with the Iowa Caucuses just a couple months away, the campaign shifted focus towards GOTV (“Get Out The Vote”) strategy. Up until this time, the BERN app was just about capturing friend information in the form of “relational IDs”, which included matches to the voter file and a score indicating the degree to which they support Bernie. It was now time to ask BERN users to follow up with their friends and urge them to volunteer, register to vote, attend an event or take another action to help the campaign.
We implemented these asks by creating server-side “follow up campaigns” to target specific relational contacts with specific asks that added the most value to our campaign. Our National Relational Organizing Director, Emily Isaac, and our Constituency Organizing Director, Yong Jung Cho, entered the content of the action into the system as well as the filter criteria (states of residence, support status, voting status, etc). The campaigns would automatically generate actions for relational contacts who matched the criteria, pass the prioritized action to Mixpanel and then notify the user in a very personalized way that included the friends they needed to take action with.
Initially, the mobile user interface for these actions was through a friends list, which we made the default home screen. We took this queue from other relational apps in the space and it was surely an improvement over our initial multi-ask dashboard. However, the actions were buried in the detail view of each friend and there wasn’t enough context for what made them important.
We came up with a new design that instead centered the campaigns using what we called “Action Flows.” Each campaign appeared on a full-screen carousel slide one at a time in order of priority and included a couple sentences to sell the user on why it was important for the campaign that they take this action—which I learned is an organizing best practice. Once they clicked the CTA on the campaign, the user would be taken through a rapid-fire sequence of actions for that friend by either sending a message or specifying a support ID. The result of this feature was an astounding 400% increase in user actions per session, which was probably the most satisfying product improvement we made on the campaign.
Around the same time, we experimented with a contact import feature. Other relational apps do very fancy things with contact import like uploading all of your contacts and attempting to automatically match them to the voter file. We decided to let people hand select a more manageable amount of contacts and did not import their contact information.
We did, however, glean the state of a contact’s residence from their area code, which apparently is a 90% accurate indicator. This combination of features was helpful in the context of a primary as it helped filter out which contacts were most relevant (i.e. located in states voting soon). It also minimized the number of steps required to reach out to a friend as we were able to remove the step to match people to the voter file. While matching to the voter file is great data to have, far more relational contacts were reached when we removed that step, especially on the first run. Ultimately, our campaign leadership and organizing team decided those conversations were more important than a pristine collection of relational IDs matched to the voter file.
Driving app installs
In December 2019, we had about 100k registered BERN users. Over the next two pivotal months, we were able to triple that number through various install tactics — none of which included paid ads:
- Social Media — I got to dust off my screenwriting skills from college and wrote a promo video for the 2.0 release of BERN, including a great voiceover from Senator Nina Turner. These and other social campaigns seemed to be very effective for brand awareness. However, they needed to be used in conjunction with other channels to drive downloads.
- Email — We did various segmented email campaigns to drive installs and re-engagement. While the re-engagement campaigns performed well, the install ones did not and had a steep opportunity cost considering the money that could have be raised fundraising off of them.
- SMS — Texting supporters a link to download BERN, either via broadcast or peer to peer, was a far more effective ways to garner downloads than email, so we focused more on that over these months.
- Referral — Some of our follow up action campaigns included a referral action, which performed well despite not including any tangible incentives or even a notification that their friend signed up.
- Podcasts — Briahna Joy Gray promoted the BERN app on our campaign’s Hear the BERN podcast as well as on appearances on Chapo Trap House. This, alongside dedicated events from our organizing team, drove the highest quality downloads.
We tracked and compared installs across various sources using smart links from branch.io that would send people directly to the appropriate App Store on their mobile device or to the BERN website on desktop.
These learnings came at just the right time. Just as another app that we had nothing to do with was derailing the Iowa Caucus, the BERN app was taking off. Like other organizing channels, BERN capitalized on a wave of post-Iowa volunteer frustration and enthusiasm in the weeks that followed, leading to big wins in New Hampshire and Nevada.
Every app metric was hockey sticking into the stratosphere and we were sending over a million push notifications a week, thanks to the finely tuned system developed by Kirsti Gorringe, who ran the push program as liaison to the campaign’s Digital Team. Relational IDs and conversations had grown so much that it was turning heads of senior staff who were skeptical of this newfangled relational app. It was growing far more than other channels in the campaign’s national data report. Perhaps most surprisingly the Mobilize-powered events feed in the app (which was put in as an afterthought and I was very skeptical of) was now generating over 6,000 event sign ups a week.
The early state results were encouraging, but we knew Super Tuesday and beyond would be the ultimate test. Part of our relational organizing strategy was that it would be most important in the March-voting states that didn’t have much—if any—field staff. Thanks to our event-based onboarding led by the Distributed Organizing Team, we had a concentrated base of BERN engagement in key states like California and Texas. Yet with the polls shifting after Biden’s big win in South Carolina, would it be enough?
My anxiety grew the night before when our Relational Organizing Director told me she was going through her phone contacts app, instead of BERN, to follow up with her friends in California. I tried that as well and was depressed to find it more natural in a lot of ways. “Why had we not spent more time giving people more customizability over our placeholder messages?” I asked myself. The sinking feeling in my stomach deepened as the disappointing results rolled in on Super Tuesday, and again the following week.
While I understand political forces were a larger driver of the result than a single organizing program or piece of tech, I couldn’t help but consider how I could have approached these challenges differently.
- Focus of features — As a product team, we were too narrowly focused for too long on gathering relational IDs and not focused enough on conversations. In hindsight, I would have focused more on message-specific features like a customized templating system or in-app education on how to have effective conversations.
- Maintaining a voter file — It was a huge effort for both the Tech Team and the Data Team to maintain and update the 200M row voter file powering some of the features in the BERN app. I estimate it was several months of one person’s time and required continued focus from the tech and data teams at critical junctures. Looking back, only 3% of our follow up actions required an updated voter file and we eventually cut out voter file match from the onboarding flow. I would have done a more thorough cost-benefit analysis in hindsight. For the next cycle, there seems to be a suite of APIs coming out of alloy.us that may replace the need for campaigns to do this.
- Systems for accountability — Emily Isaac and Jess Newman on the relational organizing team created their own system to keep BERN users accountable using software called QuickBase. They did an amazing job with that, but I regret not bringing those systems more to the forefront of the BERN experience to help volunteers push past the discomfort of reaching out to their contacts. This would potentially be similar to the turnout captain-based model that Turnout Nation just did a promising study on and will hopefully make a big impact this November.
- Tie into other initiatives— Our senior staff had no experience with relational organizing and their focus was on other metrics. While we diversified the app with video content and events, we could have better tied into initiatives they cared more about like breaking news and controlling the media narrative. The app showed huge promise as a fundraising device when we tried it.
- Focus of resources — The Tech Team spent the first two thirds of the campaign as a shared resource working for multiple stakeholders and multiple projects. While our sprint process generally kept stakeholders happy and in the loop, the context switching for engineers made it tough to focus, especially for a team of engineers who had never done native mobile apps before. Over the last third of the campaign, Bridger Rossiter, Sam Faynzilberg and I focused on BERN while Chris Mabry, Alan Mih and Sukhada Kulkarni focused on the website. Both teams increased velocity during this period, largely thanks to “Free Safety” Eric Broder who supported both teams.
- Launched too early —In hindsight, I believe the initial web release we rushed out was misguided. We didn’t learn enough and we gave tens of thousands of our most committed volunteers a lackluster first experience. We should have rolled out some sort of off-the-shelf solution like Team, Reach or Empower for that first kickoff call and thought through the long term vision of the app more before we released it. Given that every relational app is focused on native mobile to take advantage of features like push notifications and contact import, we probably should have assumed that was our platform from the beginning. Switching from web to native mobile was a huge effort and resulted in less than ideal technology choices.
- Learned too late — Ideally we wouldn’t have had to build a custom app ourselves and there would have already been a battle-tested app that piggybacked on the learnings and network of prior grassroots campaigns. Hopefully the next generation of BERN style relational organizing will take place using more evergreen technology that can support multiple campaigns and initiatives, growing an engaged group of users between campaigns. That’s a problem I may try to help solve after the 2020 cycle.
All that said, it was a historic effort that I’m incredibly proud of being a part of. My focus now is making sure the learnings are channeled to benefit progressivism and not fascism. According to CNN, Trump’s Digital Director Brad Parscale used BERN as an inspiration for the Trump 2020 app that was released earlier this year. The Trump app has already surpassed BERN in reviews and possibly user base. It is currently ranked #5 in the “News” category of the App Store, but has relational organizing features as well. As of the time of this writing, the Biden Campaign’s Team Joe app has less than 6% of the reviews of the Trump app and presumably a similar proportion of users and engagement. I truly hope the Biden campaign invests more in their app given what BERN has shown to be possible.
Apps may not be the biggest driver of campaigns, but with BERN we saw how they can play a key role by converting casual supporters into productive volunteers. The magic of the BERN app wasn’t in its features or our product roadmap. It was in the movement Bernie’s vision created and our organizing staff and volunteers tirelessly supported. Bold ideas and our organizing team’s trust in volunteers are what drive “big organizing” initiatives like BERN. It’s inspired many of us to keep building on the learnings one way or another to promote the progressive agenda, myself included. Our campaign has ended, but as Bernie says, “the struggle continues.”
Acknowledgement, in alphabetical order, of all Bernie 2020 staffers who made the success of the BERN app possible:
Alan Mih — Full Stack Engineer — https://www.linkedin.com/in/almih/
Ariane Schang — Deputy Data Director — https://www.linkedin.com/in/ariane-schang-2b0a7993/
Becca Rast — National Field Director — https://www.linkedin.com/in/becca-rast-a7288237/
Bridger Rossiter — Full Stack Engineer
Chris Mabry — CTO — https://www.linkedin.com/in/cmabry/
Claire Sandberg — National Organizing Director
Daniel Bravo — Data Engineer — https://www.linkedin.com/in/daniel-bravo-546515167/
Emily Isaac — National Relational Organizing Director — https://www.linkedin.com/in/emily-k-isaac/
Eric Broder — Full Stack Engineer — https://www.linkedin.com/in/ericbroder/
Georgia Parke — Deputy Digital Communications Director — https://www.linkedin.com/in/georgia-parke-73a61788/
Gus Sanchez — Data Engineering Director
Hannah Fertig — Distributed Organizing Director — https://www.linkedin.com/in/hannahfertig/
Jeremy Meadow — National Data Director — https://www.linkedin.com/in/jeremymeadow/
Jessica Newman — National Relational Organizer — https://www.linkedin.com/in/jessica-newman-8533609/
John Culver — Full Stack Engineer — https://www.linkedin.com/in/jonculver/
Kirsti Gorringe — Digital Organizing Manager — firstname.lastname@example.org
Mia Fermindoza — Director of Video — https://www.linkedin.com/in/miafermindoza/
Michael Futch — Director Of Analytics — https://www.linkedin.com/in/michael-futch-aaa91740/
Misty Rebik — National Organizing Director
Nina Turner — Co-Chair — https://www.linkedin.com/in/nina-turner-9651b837/
Peter Marks — Head of Product — https://www.linkedin.com/in/petertmarks/
Sam Faynzilberg — Full Stack Engineer — https://www.linkedin.com/in/sam-faynzilberg-62266995/
Sara Pearl Kenigsberg — Supervising Producer — https://www.linkedin.com/in/sarakenigsberg/
Shana Gallagher — National Student Organizing Director — https://www.linkedin.com/in/shana-gallagher-4b095b89/
Sukhada Kulkarni — Full Stack Engineer — https://www.linkedin.com/in/sukhadak/
Spencer Weiss — Mixpanel — https://www.linkedin.com/in/spencer-weiss-a0654a93/
Yong Jung Cho — Constituency Organizing Director — https://www.linkedin.com/in/yong-jung-cho-55846811/