<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Washington Post Engineering - Medium]]></title>
        <description><![CDATA[Posts from The Washington Post’s engineering teams. - Medium]]></description>
        <link>https://washpost.engineering?source=rss----671ad4334cb2---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Washington Post Engineering - Medium</title>
            <link>https://washpost.engineering?source=rss----671ad4334cb2---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 07 Mar 2026 06:08:29 GMT</lastBuildDate>
        <atom:link href="https://washpost.engineering/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[How and Why We Built “Ask The Post AI”]]></title>
            <link>https://washpost.engineering/how-and-why-we-built-ask-the-post-ai-7d728178e0d6?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/7d728178e0d6</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[media]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[journalism]]></category>
            <category><![CDATA[large-language-models]]></category>
            <dc:creator><![CDATA[Jason Langsner]]></dc:creator>
            <pubDate>Thu, 28 Aug 2025 00:20:06 GMT</pubDate>
            <atom:updated>2025-08-28T00:20:06.341Z</atom:updated>
            <content:encoded><![CDATA[<p>The Washington Post may be best known for our world-class and award-winning reporting, but we also pride ourselves on being industry leaders in technology and innovation. In addition to producing journalism, we also develop products and solutions in house to improve our users’ experience, including through our expanding AI Pod Research &amp; Development (R&amp;D) lab and<a href="https://www.washingtonpost.com/pr/2025/06/09/office-cto-announces-sam-han-chief-ai-officer-creation-wp-incubator/"> newly launched</a> WP Incubator.</p><p>One such product is “<a href="https://www.washingtonpost.com/ask-the-post-ai/">Ask The Post AI</a>,” The Post’s in-house generative AI chatbot tool that uses Retrieval Augmented Generation (RAG) to answer user questions grounded in our journalism:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3YpAmw27Jummj6VH" /></figure><p>As AI tools matured fast, in 2022, we hosted an AI hackathon, in which we took the collective energies and ingenuity of our engineering and product teams — in partnership with our newsroom — across five days to rethink how we leverage AI and machine learning tools for media. That hackathon was a major success, leading to the creation of the AI Pod R&amp;D lab and pointing us towards several exciting new experiments.</p><p>One of those experiments evolved into Ask The Post AI, The Post’s way of connecting readers to a library of our reporting. To test this feature, we started with focus. Before releasing Ask The Post AI across our entire newsroom, we released<a href="https://www.washingtonpost.com/climate-environment/climate-answers/"> Climate Answers</a> in partnership with The Post’s Climate Desk. This chatbot pulls from a Large Language Model (LLM) that answers readers’ questions based entirely on The Post’s extensive climate and environmental coverage. This was a success, but only a first step.</p><p>We scaled Climate Answers with the help of <a href="https://about.fb.com/news/2025/01/organizations-using-llama-solve-industry-challenges/">Meta’s open-source Llama LLM models</a> to create<a href="https://www.washingtonpost.com/ask-the-post-ai/"> Ask The Post AI</a>. The tool takes questions from readers and collects relevant information from across our reporting library to answer them. In other words, rather than stringing together bits of information yourself from a variety of Post articles, Ask The Post AI does it for you. This is an alternative approach to needing to use Post search to find those articles and then get to an answer, the tool provides an answer with citations to the original journalism.</p><p>Ask The Post AI’s answers are as trustworthy as our award-winning journalism. You will find no random sources or unwarranted assumptions, as you might with other LLMs. Each answer is based only on a library of Post reporting from the last eight years. Feed Ask The Post AI a question — like “Will tariffs impact me?” — and you’ll get an answer back in seconds, based only on credibly sourced, fact-based journalism.</p><p>Of course, like many of our developing products, this is a work in progress — and like all LLMs, Ask The Post AI is improving through time and iterations. For transparency, each answer from Ask The Post AI is accompanied by links to the articles that served as sources, and we encourage readers to further verify responses by checking those articles.</p><p>Ask The Post AI continues to evolve and improve with every question our readers ask. User research and feedback allows us to improve and tailor how it responds. For instance, we work hard to establish when the LLM should make clear to readers that there isn’t sufficient Post coverage to offer a solid answer. Additionally, we’re working towards where and how Ask The Post is contextually available — such as recent experimentation to add the tool on some articles. And as we iterate for external needs, the AI Pod R&amp;D lab supports internal customers — leaning into our own tooling as creators and as staff users before we make features available externally to Post subscribers and users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YDAzPHf0Qp6TgVwi" /><figcaption>The Washington Post LLM — an internal R&amp;D tool</figcaption></figure><p>Although Ask The Post AI is our main reader-oriented AI tool, it is only one of several that our team is working on — and the team is getting bigger. <a href="https://www.washingtonpost.com/pr/2025/06/09/office-cto-announces-sam-han-chief-ai-officer-creation-wp-incubator/">The Post just named its first Chief AI Officer, Sam Han, who will guide us to innovate and expand within a strict ethical and journalistic framework</a>. Sam will also support WP Incubator, modeled after successful incubators in Silicon Valley in design to develop cutting-edge products. .</p><p>Try <a href="https://www.washingtonpost.com/ask-the-post-ai/">Ask The Post AI</a> to interact with the news or head to<a href="https://www.washingtonpost.com/"> washingtonpost.com</a> to play our games, listen to our podcasts, watch our videos, and — of course — read our award-winning journalism.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7d728178e0d6" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/how-and-why-we-built-ask-the-post-ai-7d728178e0d6">How and Why We Built “Ask The Post AI”</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How the Washington Post Uses Smart Metering to Target Paywalls]]></title>
            <link>https://washpost.engineering/how-the-washington-post-uses-smart-metering-to-target-paywalls-8fc18a1961d6?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/8fc18a1961d6</guid>
            <category><![CDATA[smart-metering]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[paywall]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <dc:creator><![CDATA[Janith Weerasinghe]]></dc:creator>
            <pubDate>Tue, 10 Dec 2024 21:04:42 GMT</pubDate>
            <atom:updated>2024-12-10T21:55:17.633Z</atom:updated>
            <content:encoded><![CDATA[<p><em>by </em><a href="https://medium.com/@janith.weerasinghe"><em>Janith Weerasinghe</em></a></p><h3>Introduction</h3><p>The Washington Post, like most subscription-based newspapers, employs paywalls to nudge users to purchase subscriptions. We want to ensure that we allow our non-subscribers to sample enough content so that they will be more likely to purchase a subscription the next time they see a paywall. We also want to encourage users to engage with us, consume our content frequently, and build habits. However, we also want to ensure that we do not relax our content access policy too much, causing a negative impact on subscriptions.</p><p>One lever we can use to control the subscriptions and engagement across our products is our “metering policy.” This policy controls the level of content access we give to non-subscribers. When a non-subscriber attempts to access an article, it determines whether to let the user read the article or to display some type of wall. This policy is influenced by several factors, including our business goals (in terms of engagement and subscriptions) and editorial policies.</p><p>In this blog post, we present how we migrated from a rule-based metering policy to an automated “smart metering” policy, which resulted in a significant improvement in key metrics and also reduced the manual overhead needed to maintain metering policies.</p><h3>Some Background</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/946/0*uUUrd13_mAqUEeBH" /><figcaption>User types and the subscription funnel</figcaption></figure><p>Let’s start by defining some terms and concepts we will use throughout this blog post. We have three types of users:</p><ul><li><strong>Anonymous users</strong>: are users who have not created an account with us. The only information we have about these users are their interactions with the Washington Post that are tied to their cookies.</li><li><strong>Registered users:</strong> are users who have created an account and have signed in. These users do not have an active subscription. We have slightly more information about these users including their reading history across different devices. They can receive newsletters and other emails that are aimed at nurturing engagement. Therefore, having a large pool of registered users will be beneficial in generating new subscriptions in the future.</li><li><strong>Subscribers:</strong> These are paying subscribers who get access to all the Washington Post content without any limits.</li></ul><p>Our smart metering model only focuses on anonymous and registered users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5ezDIeJXXx52cGWucFhooA.png" /><figcaption>(a) An article with no walls (a pageview), (b) An article with a Multi-offer wall prompting a user to register or subscribe, (c) A paywall prompting a user to purchase a subscription</figcaption></figure><p>A good metering policy should find the right balance between engagement, lead generation (user registrations), and subscriptions. As shown in the figure above, when a non-subscriber is attempting to access an article, we have three choices:</p><ul><li>We can let the user read the article. This will increase user engagement and habit building. With enough chances to explore our content, we hope that this user will eventually become a registered and/or subscribed user.</li><li>We can show a multi-offer wall (MOW). When presented with a multi-offer wall, the user has several options: they can purchase a subscription or they can create an account with us in order to access the article. The primary goal of a MOW is to generate leads.</li><li>We can show a paywall. When presented with a paywall, a user can purchase a subscription from a few different subscription options.</li></ul><p>As you can see, choosing which action to present to a user at each article access attempt will directly impact our three goals.</p><p>Previously, we approached this problem by hand-curating a set of rules that were updated regularly with A/B testing. Domain experts designed rules and tested them out. This approach is time-consuming and resource-intensive. Furthermore, it is hard to manually create fine-grained rules that can target users and content in a granular manner. These rules must also be tuned to meet the dynamic pace of news, special events such as sales, and business priorities.</p><p>Therefore, we wanted to employ a model to decide, under certain guardrails, which action to take when a user attempts to access an article. There are a few different ways of approaching this problem:</p><ul><li>Build separate “propensity models” that will predict a propensity score for each action. For example, three models could predict a user’s likelihood to engage, register, and subscribe. Then stakeholders will create a set of rules to determine the different thresholds at which different metering actions should be made.</li><li>Train a reinforcement learning model that assigns metering actions to optimize for some long-term reward. We can use a combination of content and user signals, and the signals from propensity models as input to the model.</li></ul><p>In order to minimize the need for hand-crafted rules and setting multiple thresholds, we opted to use a Reinforcement Learning (RL) approach. A well-trained model with an appropriate rewarding strategy should be able to assign metering actions to maximize long term rewards.</p><h3>Data Collection</h3><p>To use any machine learning approach, we must gather a dataset showing users’ behavior patterns under different metering policies. To this end, we ran a randomized control trial (RCT) in which we randomly assigned different metering actions when a user requested to read an article. For an anonymous user, we could assign three possible actions: let the user read the article, display a multi-offer wall, or show a paywall. Similarly, for a registered user, we could let the user read the article or show a paywall. During this RCT, for each article access attempt, we randomly chose a metering action among the eligible actions.</p><p>The resulting dataset gave us a treasure trove of data indicating how likely a user is to register or subscribe at different points in their journey. It allowed us to slice and dice the data across different dimensions to answer questions like, “Are users more likely to subscribe after reading three articles or four?”</p><p>With the RCT data, we were able to create granular user segments and analyze user behavior under various metering actions. It became clear that, in order to improve our metering policy, we would have to make metering decisions at a more granular level rather than a one-size-fits-all metering policy. This observation emphasized the need for a model that can learn a more fine-grained metering policy.</p><h3>Metering as a Reinforcement Learning (RL) Problem</h3><p>Before moving on to how we approached metering as a RL problem, we will briefly introduce reinforcement learning.</p><p>RL algorithms are a class of machine learning algorithms that specifies how an <strong>agent, </strong>operating in a dynamic <strong>environment, </strong>takes different <strong>actions</strong> to maximize a <strong>reward</strong>. Unlike supervised machine learning algorithms, RL algorithms assume that the environment will change as a result of the agent’s actions. Furthermore, the objective of RL algorithms is to learn a <strong>policy</strong> that maximizes the <strong>cumulative </strong>rewards over sequences of actions (called <strong>episodes</strong>). A RL policy determines which action to take at any given state. RL has been successfully used in a number of domains including in robotics (locomotion, grasping, navigation), in gaming (to automatically play games like Atari from video input, and games like Go), and in self-driving cars.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a78Prh4MJFv1w60y" /><figcaption>Metering as a Reinforcement Learning System</figcaption></figure><p>We noticed that our metering problem fits neatly into the reinforcement learning paradigm. Here, the <strong>agent</strong> would be our metering agent. The <strong>environment</strong> is the state that describes the user and the content that they are trying to access. Given this state, the agent can take up to three <strong>actions</strong>, and after an action is executed, the agent will receive a <strong>reward</strong> based on the user’s reaction. Each <strong>episode</strong> would be an individual user’s sequence of article accesses until they become a subscriber or until we see no further access attempts from the user (as shown in the figure below). The agent’s goal would be to assign actions at each step of a user’s journey such that it maximizes the cumulative reward of each episode.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6Daq-doc5JoEwQIj" /><figcaption>Two example episodes</figcaption></figure><p>Our reward policy assigns a reward to each metering action based on the corresponding user reaction. For example, if the agent decides to show an article (which leads the user to engage with the article), a certain reward is added. Similarly, if a paywall is shown and the user subscribes, a (much larger) reward is assigned. Defining the right reward policy is a crucial step to ensure that the metering agent’s optimizations align with our business needs. Therefore, we worked with our business stakeholders to define our reward structure carefully.</p><h3>How the RL Algorithm Works</h3><p>After formalizing metering decision-making as a RL problem, our next step was to determine the type of RL algorithm we want to implement.</p><p>Most reinforcement learning algorithms are designed for “online” settings, in which the agent can actively explore the environment and receive instantaneous feedback from the environment to improve the policy iteratively. While online RL has been very successful in domains such as games and virtual environments, where the agent can be allowed to explore the environment without any risk, in other settings, online data collection is impractical because it is costly and/or risky. Furthermore, most online RL algorithms are unable to use previously collected data. Therefore, any changes to the model would require retraining from scratch.</p><p>In our setting, it would be costly for us to implement the infrastructure to figure out the appropriate reward based on user actions immediately as the agent makes a prediction. It is also risky for us to let an agent explore the state space on live production traffic at a large scale. We also wanted to be able to iteratively improve and change our models easily, without having to retrain models in a live environment. Furthermore, we wanted to be able to use the rich dataset we gathered from our previous RCT.</p><p>As a result of these requirements and constraints, we decided to look at offline RL algorithms. Offline RL algorithms learn policies from a static dataset without needing to interact with an environment. One downside of this approach is that most online reinforcement learning algorithms are usually able to find the optimal policies faster and can find better optimal policies.</p><p>Most online and offline RL algorithms learn an action-value function, usually referred to as a Q-function. The Q function, <em>Q(s, a)</em>, predicts the expected cumulative reward that we can achieve if we started from state <em>s</em>, took action <em>a</em>, and then followed the current policy. The Q-function can be defined recursively using the Bellman equation as follows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uo7pbY75yM4Q3MgS2hnLVg.png" /></figure><p>Where:</p><ul><li><em>r(s, a)</em> is the immediate reward that is gained by being in state <em>s</em> and taking action <em>a</em></li><li>γ is the discount factor which determines how much we want to favor early rewards as opposed to later rewards</li><li><em>s’</em> is the next state reached after taking action <em>a</em> from state <em>s</em></li><li>The term <em>maxₐQ(s’, a’)</em> is the maximum reward that can be achieved from being in state <em>s’</em></li></ul><p>Once we have a learned Q-function the agent operates at prediction time as follows: given a state that represents the user and the content that they are trying to access, apply the Q-function on all possible actions that can be taken from the given state and output the action with the highest Q value.</p><p>Both online and offline are trained on <strong>state transitions</strong>. Each transition contains a particular state <em>s</em>, the action taken <em>a</em>, the resulting state <em>s’</em>, and the reward <em>r(s, a)</em>. In offline RL, we assume the data is static and generated from another process (an older model, a manual rule based system, etc).</p><h4>First approach: A Q-Table with Q Value Iteration</h4><p>In our first version of the smart metering model, we opted for a simpler model with a limited state space and trained a model using Q value iteration. Here, the Q-function is simply represented by a table (a Q-table) with a value for each state-action pair. Then we used the training data to iteratively update the Q table as follows, where α is the learning rate:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zd1H-w4fSF9OIjXyq2Hapg.png" /></figure><p>This simpler model allowed us to deploy a smart metering solution faster and it significantly outperformed our previous rule-based approach on key metrics. Having this simpler model also allowed us to iterate and improve our reward strategy.</p><p>While the Q-table-based approach was easier and faster to implement, it had a few downsides. Primarily, because the state-action values are stored as a table, adding new signals to the state space causes this table to grow exponentially. Furthermore, for the learning to be effective, our training dataset needs to have a fair coverage of data points for all unique state-action pairs. Unlike a neural network, a table-based approach cannot generalize using data from other state-action pairs in the state-action-space. We are also limited to using discrete features in our state space since the table-based approach cannot handle continuous values.</p><p>Another common issue that arises when training an offline RL model is that due to the inability to explore, the learning algorithms run the risk of overestimating the values of states that are not well represented in training data. Online RL avoids this issue because it allows those spaces to be explored and values to be updated. However, the risk of this occurring in our table-based approach was low because we ensured our state space was small and had good coverage.</p><h4>Second Approach: Deep Reinforcement Learning with CQL</h4><p>After we were confident with our initial table-based model and the reward function we used, we moved away from the table-based approach to a neural network-based approach in order to support a more complicated state space. We used Conservative Q Learning (CQL)¹, a deep reinforcement learning (DRL) method, to train a neural network to estimate the state-action values. CQL mitigates the overestimation of Q values of out-of-distribution state-actions by regularizing and ensuring that the learned policy does not deviate too much from the dataset.</p><p>With CQL, we were able to incorporate more features into our state space and our tests showed that CQL was able to learn better policies than the table-based approach.</p><h3>Evaluating Models</h3><p>While we use A/B testing to validate our new models and ensure we are comfortable with their performance before they are fully adopted, we also wanted a way to test our models offline, before even running an A/B test. This allows us to train multiple models, evaluate them offline, and pick a few candidate models for A/B testing.</p><p>Unlike supervised machine learning, where offline testing is straightforward and standard practices (creating train/validation/test datasets) and metrics (such as precision and recall) exist, evaluating RL models offline is difficult. This is because the actions from RL models change the environment, and we do not know what a user’s reaction to an action would be or their next actions. For example, our static datasets may contain an episode where a user was shown a multi-offer wall after reading three articles and registering. However, the trained model may predict that showing a paywall at this instance would be the best course of action. Because we do not know how this user would have reacted, we have to make estimations with the existing static data we have.</p><p>We used two approaches to evaluate the performance of our models offline. Both approaches provide an estimate of the average cumulative reward that can be expected from all the episodes:</p><p><strong>Importance Sampling:</strong> We can estimate what the cumulative reward of an episode from our static dataset would have been under a new model by computing the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h2XBpHQagdM9HiGPtSJh0Q.png" /></figure><p>The probabilities of episodes can be computed as the product of each state-action pair in the episode. One downside of computing importance samples as above is that if the probability of a certain state-action pair is very low in the dataset but very high in the new model, the reward values will be massively over-estimated. To avoid this, we used the approach suggested by Thomas et al.² to come up with a lower bound with a confidence interval for the predicted rewards.</p><p><strong>Fitted Q Evaluation (FQE)³: </strong>FQE iteratively learns another Q-function based on a given trained policy. The trained Q-function in FQE produces a more accurate estimation of the learned Q-function than the learned Q-function itself. We can then compute the average Q value from all the initial states we see in our training dataset to arrive at an estimate of the average cumulative rewards.</p><p>In our experiments we found that both FQE and importance sampling results largely matched each other.</p><h3>Conclusion</h3><p>In this blog post, we discussed how we approached implementing a smart metering approach to replace our previous rule-based metering strategy. After deploying the smart metering approach, we were able to make significant improvements in key metrics, and have noticed that the smart metering model can target walls with much greater accuracy. Apart from the improvements made to the conversion metrics, using an automated approach helped cut down on the significant overhead that was required to maintain manually curated metering rules. While we use machine learning to make metering decisions, we have a number of guardrails, including business rules and editorial decisions, that apply on top of the smart metering decisions. We also ensure that we only use first-party data to train our models and that we adhere to our <a href="https://www.washingtonpost.com/policies-and-standards/#ai">AI Policy</a> when using machine learning in our products.</p><h3>Acknowledgements</h3><p>The author would like to thank everyone who worked on this project, including James Nance, Meng Ling, Himanshu Jahagirdar, Sophie Katasi, Shuguang Wang, Sam Han, our Subscriptions Engineering team, and our Analytics team.</p><h3>References</h3><ol><li>Kumar, Aviral, et al. “Conservative q-learning for offline reinforcement learning.” <em>Advances in Neural Information Processing Systems</em> 33 (2020): 1179–1191.</li><li>Thomas, Philip, Georgios Theocharous, and Mohammad Ghavamzadeh. “High-confidence off-policy evaluation.” <em>Proceedings of the AAAI Conference on Artificial Intelligence</em>. Vol. 29. No. 1. 2015.</li><li>Le, Hoang, Cameron Voloshin, and Yisong Yue. “Batch policy learning under constraints.” <em>International Conference on Machine Learning</em>. PMLR, 2019.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8fc18a1961d6" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/how-the-washington-post-uses-smart-metering-to-target-paywalls-8fc18a1961d6">How the Washington Post Uses Smart Metering to Target Paywalls</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Analyzing Voter Behavior Patterns: Insights from The Washington Post]]></title>
            <link>https://washpost.engineering/analyzing-voter-behavior-patterns-insights-from-the-washington-post-07284ee5cd77?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/07284ee5cd77</guid>
            <category><![CDATA[elections]]></category>
            <category><![CDATA[voter-behavior]]></category>
            <category><![CDATA[united-states]]></category>
            <category><![CDATA[primaries]]></category>
            <category><![CDATA[caucus]]></category>
            <dc:creator><![CDATA[Diane M. Napolitano]]></dc:creator>
            <pubDate>Mon, 01 Apr 2024 20:56:45 GMT</pubDate>
            <atom:updated>2024-04-01T21:07:36.489Z</atom:updated>
            <content:encoded><![CDATA[<p><em>by </em><a href="https://medium.com/u/dde5780592fc"><em>Diane M. Napolitano</em></a><em> and </em><a href="https://medium.com/u/ac6fa0f5b7ff"><em>Lenny Bronner</em></a></p><p>With any election, we might be interested in not only <em>who</em> won, but <em>how</em>. Who are the people who cast votes for any one candidate? Are they young? Do they live in small towns or big cities? And, maybe most interestingly, who did they vote for in previous elections?</p><p>Exit Polls often provide us with answers to these questions. Pollsters wait outside polling locations or call early voters at home and ask a (hopefully) representative sample of voters about themselves and who they voted for. For example, when pollsters asked voters at the New Hampshire Democratic Primary in 2020 both who they voted for in the current election, as well as who they voted for in the 2016 Primary, they responded:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ECYVF8FMQEE82cm6xCktpw.png" /><figcaption>Source: Edison Research via <a href="https://www.cnn.com/election/2020/primaries-caucuses/entrance-and-exit-polls/new-hampshire/democratic">CNN</a></figcaption></figure><p>According to these results, roughly 13% of voters who voted for Hillary Clinton in the 2016 Democratic Primary voted for Joe Biden in 2020, approximately 25% of the same pool of voters voted for Pete Buttigieg, and so on. We can also look at these results visually:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UIZEfbVamjRNCMhGN9zkJg.png" /></figure><p>But what if this Exit Poll wasn’t conducted? Or what if it was, but this particular question wasn’t asked? Or, what if we have reasons to believe that the Exit Polls might not be capturing the full story? Ideally, we’d look at individual voters and count how many of them voted for any given candidate in each election, but access to individual-level data such as this would violate the right to a secret ballot. (When elections are conducted by Caucus, individual-level votes aren’t even recorded — the final tallies are taken by counting heads or hands.)</p><p>Here at The Washington Post, we have developed models that infer what we call <strong>Voterflow</strong>, patterns in the way votes “flow” from one election to the next between candidates. These kinds of models are quite common in multi-party electoral systems, but haven’t seen much use in the United States so far.</p><p>Let’s think through how this might work:</p><p>Imagine you voted in the 2020 New Hampshire Democratic Primary. There are a number of possibilities for what you did in the 2016 primary: maybe you voted for Hillary Clinton, maybe you voted for Bernie Sanders, or maybe you voted for neither (because you were not old enough for voting, you didn’t live in New Hampshire at the time, or maybe you just simply didn’t vote). In fact, we know that one of these options had to have applied to you in 2016. That means that the total number of votes that each candidate received in the 2020 primary, <em>tⱼ</em> (Joe Biden, Pete Buttigieg, Bernie Sanders, etc.), can be thought of as a weighted sum of the votes received by all 2016 primary candidates:</p><figure><img alt="tⱼ = β₁ⱼ * Hillary Clinton (2016) + β₂ⱼ * Bernie Sanders (2016) + β₃ⱼ * Neither (2016)" src="https://cdn-images-1.medium.com/max/1024/1*M3sXn0oy6FVvhu3wS9oLkw.gif" /></figure><p>We can interpret <em>βᵢⱼ</em> as the fraction of Hillary Clinton voters that voted for candidate <em>j</em> in 2020. This means if we can estimate <strong><em>βᵢⱼ</em></strong>, we have an answer to our question.</p><p>To estimate the parameters of interest, let’s assume that <em>βᵢⱼ</em> is constant over an entire state. Then for every geographic unit 1,… ,<em>g</em> that we have results for:</p><figure><img alt="Switching out of dark-mode recommended (sorry!)." src="https://cdn-images-1.medium.com/max/1024/1*bB5qsXOdTdRHa7NONKrgeA.png" /></figure><p>We can see that we need election results in order to do this. Ideally we obtain these results in the smallest geographic unit in that state into which voters are organized, as close to individual voters as possible. In New Hampshire, this happens to be individual towns and cities, but in most states, these are precincts. You can read more about geography, precincts, and how these relate to the way election results are tallied and reported <a href="https://washpost.engineering/what-the-washington-post-elections-engineering-team-had-to-learn-about-election-data-a41603daf9ca">here</a>.</p><p>It’s important that we use data from the smallest geographic unit available so that we reduce the extent to which we commit the ecological fallacy. This fallacy occurs when we make assumptions or inferences about every individual within a group based on aggregate behavior. More information on, and examples of the ecological fallacy can be found in Freedman (1999, below) and also <a href="https://helpfulprofessor.com/ecological-fallacy-examples/">here</a>.</p><p>How does this apply to our Voterflow models? In New Hampshire, in 2016, Bernie Sanders won the Democratic Primary with about 60% of the vote, and also won again in 2020, but this time with only 26% of the vote. To assume that entire 26% came from the 2016 pool of Sanders voters would be committing the ecological fallacy: in 2020, some voters voted differently, or not at all, while others became Sanders supporters. Our task is to estimate how many voters fall into each of these groups, and using data from the smallest geographic units available gets us as close to understanding individual voter behavior as possible.</p><p>To do this, we need a data set reflecting the election we want to see votes flow from (<em>F</em>):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zGgL6Q4mc1eFfA0HadTCfQ.png" /><figcaption>Source: AP</figcaption></figure><p>And a corresponding data set with the same geographic units reflecting the election we want to see votes flow to (<em>T</em>):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XWW0iuZcXyRHaepwkAMUVg.png" /><figcaption>Source: AP</figcaption></figure><p>Using these results, we can now re-write our equations from above as:</p><p><em>T = F ·β</em></p><p>and it becomes clear that if we want to estimate <strong><em>β</em></strong> we can use our favorite optimization library.</p><p>We also need data on the number of registered voters who were able to participate in the same election as our <em>T</em> data set (in this case, registered voters in New Hampshire by the time of the 2020 Democratic Primary):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8eBT7X4QGQS4bkUaao5ybg.png" /><figcaption>Source: New Hampshire Secretary of State</figcaption></figure><p>We’ll use this to weight each geographic unit by the number of registered voters. This helps our model learn the importance of larger geographic units, which are otherwise represented equally with only one row in <em>F</em> and <em>T</em>.</p><p>Now that we have our data, our next step is to normalize it. We’ll convert both <em>F</em> and <em>T</em> from raw vote counts to percentages by summing each row and dividing the number of votes received by candidate <em>i</em> in each row by this sum.</p><p>We’ll also normalize the number of registered voters (RV) in every geographic unit <em>u</em> such that:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/200/1*xv7YtT-442QVMN_8wZNR0w.png" /></figure><p>Let’s refer to the entire set of normalized <em>RVᵤ</em> values as <em>W</em>, our model’s weights.</p><p>Now, our normalized <em>F</em>, <em>T</em>, and <em>W</em> are going to be used to solve a matrix regression. We set the following constraints:</p><ul><li><em>β</em> &gt;= 0 and <em>β </em>&lt;= 1 will ensure that our inferences stay in the non-negative percentage space, same as our Exit Poll; but also,</li><li><em>∑βᵢ</em> = 1 will guarantee that, like the rows in our Exit Poll data, the inferred <strong><em>βᵢⱼ</em></strong> terms will sum to 1 for every candidate in our <em>F</em> data set; in this case, every candidate in the 2016 New Hampshire Democratic Primary. The intuition here is that that every person who voted in 2020 needs to have done something in 2016: either they voted for one of the candidates or they didn’t vote at all.</li></ul><p>And we solve the following loss function subject to these constraints:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/206/1*GTsHbWyJ-fDc5UbCkuOMXQ.png" /></figure><p>You can find our Python implementation of this Transition Matrix Solver in our <a href="https://github.com/washingtonpost/elex-solver">elex-solver</a> package.</p><p>We now have a matrix of <strong><em>β</em></strong> terms that contain a solution similar to our Exit Poll example: for every candidate <em>i</em> in our <em>F</em> data set, what percentage of their vote went to candidate <em>j</em> in our <em>T</em> data set? Or, to follow our example, what percentage of Hillary Clinton’s, Bernie Sanders’s, and the other 2016 candidates’ votes in the New Hampshire Democratic Primary went to each of Joe Biden, Pete Buttigieg, Bernie Sanders, and so on, in the 2020 primary?</p><p>But wait! This is just one set of voter-flows for an entire state. Is it reasonable to believe that the same fraction of Hillary Clinton voters went to Pete Buttigieg in every single part of New Hampshire? Should we not allow our model some flexibility?</p><p>We know that different areas within each state tend to vote similarly, for instance:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3721rOANov-EfmFMkIW02w.png" /></figure><p>These three maps illustrate some interesting properties about New Hampshire:</p><ol><li>Most of the state is rural, but becomes more “suburban-y” in the southeast. This happens to be where New Hampshire’s capital is located (Concord) as well as its largest cities (Manchester and Nashua).</li><li>The first map, showing the percent of registered voters per township that voted for Bernie Sanders in 2020, is almost the inverse of the second map, showing the percent of residents per township that have at least a Bachelor’s degree.</li></ol><p>In fact, voting for Bernie Sanders in 2020 and having at least a Bachelor’s degree in New Hampshire has a Pearson correlation (<em>ρ</em>) of -0.51, indicating a moderately inverse relationship: in 2020, places with a larger proportion of formally higher educated voters gave less of their support to Bernie Sanders. We can even look at this relationship by County Classification:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TCzOt_9_A-ilCJvfWf4dDg.png" /></figure><p>In other words, voters in more rural parts of New Hampshire with at least a Bachelor’s degree were more likely to vote for Bernie Sanders in 2020 than their equivalents in more suburban parts of the state. If it’s true that voters in areas with more formal education are less likely to vote for Bernie Sanders, it might also be true that these voters have a different propensity to choose Bernie Sanders or Pete Buttigieg in the next election.</p><p>We can use this to improve our Voterflow model by stratifying on each of these three pieces of information. Each geographical unit in our data falls into one stratum <em>s</em> for a given strata <em>S</em>, where <em>S</em> is either categorical (Rural townships, Suburban townships) or continuous (percent of registered voters per township that voted for Bernie Sanders in 2020, percent of residents per township that have at least a Bachelor’s degree), in which case we’ll create <em>s</em> by dividing <em>S</em> into quantiles. We’ll solve our weighted matrix regression separately for each <em>s</em>, combine each of these into a single solution <strong><em>β</em>ₛ</strong> for each <em>S</em>, and take the mean across all <strong><em>β</em>ₛ</strong>.</p><p>As a result, instead of assuming the same percentage of voters that picked both Bernie Sanders in 2016 and Joe Biden in 2020 across the entire state, our model is now only assuming that this is true within each stratum. A more reasonable assumption.</p><p>Here’s what our final weighted stratified model’s output looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GpeK014EzmvTXtmiTxkQsQ.png" /></figure><p>How do we make sure that our model’s output is reasonable? Ideally, our output and Exit Polls should be telling the same story since they are trying to answer the same question. To be sure, we can review our Exit Poll:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ECYVF8FMQEE82cm6xCktpw.png" /></figure><p>The output from our model, our inferred voter-flows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IpgzV8p7eU3Tlaewi3wuMQ.png" /></figure><p>And examine the difference between them:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gfBJyBRrLBU2kCwaF5tAzQ.png" /></figure><p>This tells us that, for instance, our model’s inferences for the percentage of 2016 Bernie Sanders voters who voted for:</p><ol><li>Joe Biden in 2020 are lower than those in the Exit Poll by 2.6%;</li><li>an “other” candidate in 2020 are <em>higher</em> than those in the Exit Poll by 23%!</li></ol><p>How could this difference be so large?</p><p>This Exit Poll only includes 952 respondents. By contrast, our model uses aggregate data from 236 townships comprised of 712,216 registered voters in 2020. To compensate for this and other ways in which this survey could be off, including sampling variability, we’ll compute a 95% confidence interval around the percentage every candidate pair received in the Exit Poll. This way we can ensure that if the same Exit Poll were conducted multiple times, the true value of the population surveyed would be captured within this confidence interval 95% of the time.</p><p>We’ll use this 95% confidence interval along with the survey question’s answers themselves to measure the extent to which our inferences tell the same story as the Exit Poll. The Mean Absolute Error (MAE) over all candidate pairs is 8.5%, and if we look at the upper and lower bounds of the confidence interval we get a range of MAEs of 8.5–8.8%.</p><p>Ideally, MAE should be as close to zero as possible, so why isn’t it here? This is likely because:</p><ul><li>The “Neither (2016)” option includes not only voters who voted for a candidate other than Clinton and Sanders in 2016, but also non-voters. Our data contains more information on non-voters than the pollsters were able to gather, probably because most of the 2016 non-voters weren’t at their poll site in 2020 — most non-voters tend to remain non-voters.</li><li>Given the small sample size, it’s likely that pollsters interviewed more voters who voted for one of the major candidates than for a candidate that falls under the “Neither” or “Other” options. Not only that, but between elections, people tend to misremember if they voted and who they voted for, mistakenly thinking they voted for one of the major candidates.</li></ul><p>This isn’t the only election and Exit Poll combination we’ve used to evaluate this modeling approach. We also use the <a href="https://apnorc.org/projects/ap-votecast-2020/">2020 Democratic Primary VoteCast survey</a> produced by the Associated Press and the National Opinion Research Center at the University of Chicago (AP-NORC). This survey provides responses to a question similar to the one in our Exit Poll example for 17 states.</p><p>Unfortunately, we aren’t able to run our stratified model on all 17 states due to a lack of available precinct-level data and an insufficient number of counties, cities, and towns, a.k.a. Reporting Units (RUs). When measuring MAE, we’ll take this into account and compare what happens when we don’t use precinct-level data.</p><p>As you can see, using a large number of geographic units that are as close as possible to individual voters makes a big difference:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CkPNEmpAuIgjItb4G-UXlg.png" /></figure><p>Averaged across all states, MAE compared to the mean AP-NORC VoteCast survey response ranged from 3.8% to 7.0% when precinct-level data was used and 6.0% to 7.9% when RU-level data was used.</p><p>The bottom plot shows the relationship between the number of geographic units and MAE with a regression line: in general, as the number of small geographic units increases, MAE decreases. Our model performs best on states with a large number of precincts, data as close to the individual voter as possible.</p><p>It’s also worth noting here that every state’s strata are slightly different. In our 2020 New Hampshire Democratic Primary example, we selected three strata based on domain knowledge. In general, we typically combine this with the measured variance of every possible strata we could use. For instance, per state, we’ll query either the <a href="https://www.census.gov/programs-surveys/acs/data/data-via-api.html">American Community Survey</a> or the <a href="https://l2-data.com/">L2 Voterfile</a> for all available demographic data relating to education-level, select the one with the largest variance, and repeat this for other demographic categories such as age or ethnicity. Our use of variance here helps us identify strata that combat the ecological fallacy — a high variance tells us these variables cover a wide spread of geographic units. Whether or not this is the absolute-best approach remains an open question.</p><p>Regardless, so far we’ve used our Voterflow modeling approach to analyze two elections in the 2024 Republican Primary/Caucus cycle:</p><ul><li><a href="https://www.washingtonpost.com/elections/2024/01/16/trump-iowa-results/">See how Trump more than doubled his support in Iowa since 2016</a> by Lenny Bronner, Derek Hawkins, Luis Melgar, and Diane Napolitano</li><li><a href="https://www.washingtonpost.com/politics/2024/01/24/new-hampshire-results-republican-voters/">See how Trump pulled support from his 2016 rivals to fuel New Hampshire win</a> also by Lenny Bronner, Derek Hawkins, Luis Melgar, and Diane Napolitano</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e-xty8WBJr6AmRQkZsqj3g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*03kWYkgAmN7s05G2_Bs7oA.png" /></figure><h3>Related Work</h3><p>When developing our weighted stratified Voterflow model, we drew on prior work from:</p><ul><li>the <a href="https://www.sora.at/en/topics/electoral-behavior/election-analyses/voter-transition-analyses.html">SORA Institute</a> described as in:<br>· Hofinger, C., &amp; Ogris, G. (2002). Orakel der Neuzeit: was leisten Wahlbörsen, Wählerstromanalysen und Wahltagshochrechnungen? <em>Österreichische Zeitschrift Für Politikwissenschaft</em>, <em>31</em>(2), 143–158. <a href="https://nbn-resolving.org/urn:nbn:de:0168-ssoar-59937">https://nbn-resolving.org/urn:nbn:de:0168-ssoar-59937</a></li><li>David Freedman’s work on ecological regression and the ecological fallacy, specifically:<br>· Freedman, D. A. (1999). Ecological Inference and the Ecological Fallacy. <em>International Encyclopedia of the Social &amp; Behavioral Sciences</em>, <em>6</em>(4027–4030), 1–7. <a href="https://statistics.berkeley.edu/sites/default/files/tech-reports/549.pdf">https://statistics.berkeley.edu/sites/default/files/tech-reports/549.pdf</a><br>· Freedman, D. A., Klein, S. P., Ostland, M., &amp; Roberts, M. R. (1998). Review: A Solution to the Ecological Inference Problem. <em>Journal of the American Statistical Association</em>, <em>93</em>(444), 1518–1522. <a href="http://www.jstor.org/stable/2670067">http://www.jstor.org/stable/2670067</a></li></ul><p>As we continue to refine our approach, we’re also looking into Bayesian solutions to the ecological inference/regression problem, including:</p><p>Rosen, O., Jiang, W., King, G., &amp; Tanner, M. A. (2001). Bayesian and Frequentist Inference for Ecological Inference: The RxC Case. <em>Statistica Neerlandica</em>, <em>55</em>, 134–156. <a href="https://gking.harvard.edu/files/em.pdf">https://gking.harvard.edu/files/em.pdf</a></p><h3>Acknowledgements</h3><p>We are grateful for the feedback and support from our colleagues at The Post and our external collaborators, including John Campbell, John Cherian, Scott Clement, Reuben Fischer-Baum, Sarah Frostenson, Sam Han, Derek Hawkins, Luis Melgar, Ashlyn Still, Rachel Van Dongen, and Shuguang Wang.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=07284ee5cd77" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/analyzing-voter-behavior-patterns-insights-from-the-washington-post-07284ee5cd77">Analyzing Voter Behavior Patterns: Insights from The Washington Post</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Rethinking Content Insights at The Post]]></title>
            <link>https://washpost.engineering/rethinking-content-insights-at-the-post-02e0a323179d?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/02e0a323179d</guid>
            <category><![CDATA[self-service]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[analytics]]></category>
            <dc:creator><![CDATA[Jason Langsner]]></dc:creator>
            <pubDate>Thu, 28 Mar 2024 18:04:12 GMT</pubDate>
            <atom:updated>2024-03-28T18:04:12.093Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="A Washington Post Senior Data Engineer speaks about GRAHAM and Article 360 in a Tech Demo Day." src="https://cdn-images-1.medium.com/max/1024/0*_VP7jhg16SOwuqE4" /><figcaption><em>A Washington Post Senior Data Engineer speaks about GRAHAM and Article 360 in a Tech Demo Day.</em></figcaption></figure><p>The Washington Post makes countless data-informed decisions daily. As the lights never turn off in our newsroom and content is produced through 24/7/365 global operations — we have a lot to measure. And we have a lot of opportunities to turn those measurements into insights that inform.</p><h4><strong>What was the problem?</strong></h4><p>Post stakeholders — whether in the newsroom or on our business side — were lacking a centralized source of truth for article analytics that were aggregated across all platforms. They needed a fully self service system that was easily accessible to both technical teams and business users.</p><p>While we had built tools over the years, which had article data, none of them were comprehensive enough to meet the needs of <strong><em>ALL</em></strong> stakeholders at scale. A gap in a holistic approach also meant that the Data and Analytics teams spent a lot of time building one-off self-service tools and dashboards for reporters, editors, leadership, and business stakeholders to see or get alerted to compelling content insights. These tools worked as targeted and data analysts closed the gap, but the scale was off. It was time for The Post to zoom out: looking at the whole forest and not just specific trees. It was time to rethink content insights at The Post.</p><p>Work was getting done. But there was duplication across these workstreams and both news and business leaders wanted to streamline and centralize article analytics.</p><p>Team members needed a way to quickly look up lifetime performance data of all of our content — including article metadata, performance data, conversions data, revenue data, video metrics, and <a href="https://washpost.engineering/developing-a-new-washpost-content-taxonomy-system-8203988d4026?source=collection_home---4------6-----------------------">news topic level insights that aggregate the “aboutness” of content (e.g. all articles related to “Artificial intelligence”) across Post</a>. But they also needed to look at different time-based granularities for these metrics. They needed it in one place. The data had to be sourced and normalized across all the platforms where our readers consume content, including off-platform, like on Apple News; or what query terms in Google led to referral track from search.</p><p>Data needed to be accessible, highly QAed, well defined, and on-demand.</p><h4><strong>What did we do?</strong></h4><figure><img alt="How data flows through A360 to GRAHAM and other consumer applications" src="https://cdn-images-1.medium.com/max/1024/0*RnepQsATKWDmD8kV" /><figcaption><em>How data flows through A360 to GRAHAM and other consumer applications</em></figcaption></figure><p>The Post’s WaPo 360 and Analytics teams began to evaluate approaches to centralize all article insights into a new service called Article 360 (A360). Discovery kicked-off. And lessons learned from the team’s very successful implementation of Customer 360 (C360), a centralized data warehouse that stitches together hundreds of key reader insights to provide faster analytics, were used and applied in developing a complementary service for articles — thus the inspiration of A360 — for content insights.</p><p>Net-net, we consolidated four tools into one and we deprecated two other analytics tools. This Post retooling changed how data-informed decisions about content are made. The User Experience is cleaner and perhaps equally as important, the new A360 data service approach rethinks earlier work streams by centralizing over 100 unique content signals on every article that our talented authors write and our smart editors publish — bringing together five separate data sources and other internal Post metadata into a new home that provides a 360 degree view for content insights.</p><p>We are building something once to use it 100 times versus building 100 things to use them each once.</p><p>On day 1 of A360, the WaPo 360 and Analytics teams exposed article insights in daily, weekly, monthly, and lifetime granularities. Users and Pageviews were grouped across geographies (DC Metro area, the broader U.S., and International). Insights were broken out by devices (desktop, mobile, and app), audience referral channels (email, search, social, etc.), and were split out between user types — subscribers and non-subscribers. Based on the user feedback, we additionally took views from Post content getting republished on Apple News and made that available side-by-side to how the same content performed on washingtonpost.com and our mobile app.</p><p>Do the math: 100 unique signals, available in four different time-based metrics, accessible by all readers or those in three specific geographic regions, by customer status, and by device type for every single piece of content produced daily (plus going back into our library for years). <strong>That’s a prism of content insights for newsroom, subscription, and ads decision makers.</strong> And as a data service, data engineers made sure to make all critical signals accessible via API for other Post applications to call by other engineering and product teams.</p><p>Data is sourced from Google Analytics, Adobe Omniture (The Post’s previous analytics tool), Google Ad Manager, Google Search Console, and Apple News.</p><p>That data is then augmented by internal Post systems. But Product and Engineering did not stop there as centralized data sitting in a data warehouse, only accessible for technical users, would only solve part of the problem.</p><h4><strong>Why was it innovative?</strong></h4><p>The Washington Post is both a media and a technology company. Our Product and Engineering teams paired up with thought leaders in the newsroom and elsewhere to develop the architecture and build out A360. The Post’s Product Design team ran a series of user interviews to inform the work. And that led us to build a new centralized home for article and topic insights: GRAHAM.</p><p>While the benefits of centralizing concrete data assets and defining them to act as the source of truths is not new, the fundamentals get lost very frequently. AWS <a href="https://aws.amazon.com/data-warehouse/">notes the benefits of a data warehouse</a> as:</p><ul><li><em>Informed decision making</em></li><li><em>Consolidated data from many sources</em></li><li><em>Historical data analysis</em></li><li><em>Data quality, consistency, and accuracy</em></li><li><em>Separation of analytics processing from transactional databases, which improves performance of both systems.</em></li></ul><p>These were our north stars in this project with Article 360 (zooming into our content) and Customer 360 (zooming into our readers) — the bread and butter of a media company — feeding into GRAHAM.</p><p>Some of what was built simply couldn’t have been done in our legacy architecture — for instance it is 2024: a U.S. Presidential Election year. To compare election results of previous Presidential Elections, the Analytics team would get section and subsection content from Google Analytics in 2020 and earlier election data from 2016 from Omniture. Data would need to be normalized on the fly and the inventory of available signals would be an apples-to-oranges comparison. Additionally, as primary and general election reporting span over a year, there would also need to be further analysis and remediation of data spanning across years in our Google Analytics flat export. This created a lot of friction and slowed down insights. Now all data is normalized, centralized, and perhaps most-important-of-all: it is pre-processed and pre-aggregated so there isn’t a need to join different tables with SQL and wait, and wait, and wait, for queries to run and analysts to come up with answers.</p><p>The A360 approach uses a modularization pattern with the Spark DataFrame API. It allows us to experiment with new data groupings and create new metrics on the fly when ideas come from stakeholders. And it allows GRAHAM pageload time to be very fast.</p><p>The updated data engineering approach using Spark Execution Engine and Elastic Map Reduce on AWS has led to some huge performance gains. Processes that previously would take hours or days can now be done in minutes. And some processes that just weren’t comprehensible before can be done in seconds now. This results in performance improvements, time saved, but also far less computational credits getting billed — so insights aren’t just faster, they actually cost less to generate in direct people-hours and processing costs.</p><p>We took the principled approach of meeting the data consumers where they were.</p><p>Article 360 data brings insights to where different teams operate — with technical teams accessing data in S3, Parquet files, Redshift, and directly in the data warehouse. Technical teams are leveraging these data service assets to create their own applications — sourcing data from our newly formed Data + AI team; which consolidated WaPo 360 and three other engineering teams into one team that harnesses data, AI, and ML to drive growth and personalization.</p><p>For business and newsroom users, data that was previously available in separate reports are now one-click away in GRAHAM — a web-based REACT app that pays homage to our newspaper’s history and our future:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YsoRx2BKtbIlmMDX" /></figure><p>The Graham family played an important part in who we are as an institution. And our Product team was proud to pay homage to them, with permission from the family, in surfacing A360 data in GRAHAM, which is an acronym for <strong>G</strong>raphical <strong>R</strong>eporting of <strong>A</strong>rticle <strong>H</strong>ealth and <strong>A</strong>nalytics <strong>M</strong>etrics.</p><p>GRAHAM as a tool and A360 as a centralized data service have become our source of truth.</p><p>GRAHAM delivers over 100 pre-processed, pre-aggregated, and thoroughly QAed article signals. A user management system in GRAHAM also gates what different team members should see based on their responsibilities. Stakeholders have found it transformative. Users can easily request or create new signals and A360 can easily scale and make them available in GRAHAM.</p><p>The tools and services also simultaneously remove strain on querying Google Analytics’ raw files.</p><p>WaPo 360 are big believers that technology alone will fail. By following a process that puts people and process first and second — we made sure to add definitions for all of the data signals in a user-friendly data dictionary and in Swagger Docs for accessing A360 data via a GRAHAM API for technical users across The Post.</p><h4><strong>Conclusion</strong></h4><p>Article 360 unlocks insights and unlocks potential, but data sitting in a table collecting dust does nobody any good. The Post moved quickly to enhance the democratization of our content data — improving how analysts and business users consume information in GRAHAM. Adoption is on-target and with rolling out the tool in 2024, we’ve aligned our roadmap to user-feedback. We have plenty of more innovation to come, but we’re excited for the change realized to-date and the change that will be coming following a product roadshow event for our newsroom.</p><p>If content and customers are the bread and butter of a media company, The Post is now in a much better place to serve some gourmet sandwiches. We broke down stove-pipes, consolidated tooling, and improved workstreams. Early feedback has been highly positive and speaking of sandwiches, we look forward to supporting many data hungry stakeholders through more automation and more self-servicing.</p><p>It was The Post’s time to rethink former approaches to content insights. Our answers may remain the same from when we were finding them in far more manual ways, but through stitching content signals together and making smart repeatable cuts of that data occur through automation, we can rededicate time, and work smarter rather than harder.</p><figure><img alt="A screenshot from GRAHAM from an article published in January 2024. Performance data blurred for publishing in The WashPost Engineering Blog." src="https://cdn-images-1.medium.com/max/1024/0*QHDtgfMEhLLIhSF7" /><figcaption><em>A screenshot from GRAHAM from an article published in January 2024. Performance data blurred for publishing in The WashPost Engineering Blog.</em></figcaption></figure><p><strong>Read earlier WaPo 360 articles in the WashPost Engineering Blog:</strong></p><ul><li><strong>April 2023:</strong> <a href="https://washpost.engineering/personalized-subscriber-onboarding-results-in-higher-engagement-retention-for-washington-post-d5e1450821b8">Personalized subscriber onboarding results in higher engagement, retention for Washington Post</a> (republished from the International News Media Association)</li><li><strong>July 19, 2022:</strong> <a href="https://washpost.engineering/developing-a-new-washpost-content-taxonomy-system-8203988d4026">Developing a New WashPost Content Taxonomy System</a></li><li><strong>March 8, 2022:</strong> <a href="https://washpost.engineering/doubling-down-on-personalizing-the-reader-experience-2c6d7d620eeb?gi=46aa1bd9d06a">Doubling down on personalizing the reader experience</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=02e0a323179d" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/rethinking-content-insights-at-the-post-02e0a323179d">Rethinking Content Insights at The Post</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Personalized subscriber onboarding results in higher engagement, retention for Washington Post]]></title>
            <link>https://washpost.engineering/personalized-subscriber-onboarding-results-in-higher-engagement-retention-for-washington-post-d5e1450821b8?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/d5e1450821b8</guid>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[personalization]]></category>
            <category><![CDATA[user-research]]></category>
            <category><![CDATA[journey-maps]]></category>
            <category><![CDATA[customer-experience]]></category>
            <dc:creator><![CDATA[Jason Langsner]]></dc:creator>
            <pubDate>Fri, 30 Jun 2023 18:37:42 GMT</pubDate>
            <atom:updated>2023-06-30T18:37:42.725Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>Note:</strong> <a href="https://www.inma.org/blogs/digital-subscriptions/post.cfm/personalised-subscriber-onboarding-results-in-higher-engagement-retention-for-washington-post"><em>The WashPost Engineering Blog is republishing this blog post from Anjali Iyer, Head of Lifecycle Marketing at The Washington Post, in The International News Media Association</em></a><em>. WaPo 360 served as a technical partner with the Lifecycle Marketing team to implement the below journeys.</em></p><p>Retention begins the moment a consumer expresses interest and becomes a subscriber.</p><p>It is at this early stage where The Washington Post establishes its relationship with subscribers and can make a positive first impression.</p><h3>Investing in subscriber onboarding</h3><p>Prior to launching The Post’s new subscriber onboarding journey in fall 2022, our practice was to send a single welcome email immediately after subscription purchase. While the email highlighted important subscriber benefits, it was one touchpoint that could easily be missed or overlooked in a subscriber’s inbox.</p><p>In 2022, we revamped the subscriber onboarding journey considering feedback from consumer research and analytical insights. We built a comprehensive onboarding journey with tailored email messages over the course of multiple months utilising customer 360 signals and a journey builder.</p><p>This was a game changer as it unlocked personalisation capabilities at the subscriber level. Consumer research also indicated an interest in comprehensive news and interaction with our products and newsroom beyond the dominant headlines from the past few years, such as the COVID-19 pandemic.</p><p>Subscriber onboarding is important in achieving subscription marketing goals for growing consumption, reducing churn and increasing customer lifetime value (CLV). It sets the tone on the overall relationship with new subscribers to achieve the several key objectives:</p><ul><li><strong>Positive subscriber experience:</strong> Onboarding is a way to introduce new subscribers to benefits and features, establish a relationship and build loyalty.</li><li><strong>Reduce churn:</strong> Churn is the rate at which subscribers cancel their subscriptions. Effective onboarding can help reduce churn by providing new subscribers with the information and resources to build repeat habits and realise the value of their subscription.</li><li><strong>Increase customer lifetime value:</strong> Subscribers who visit often tend to use multiple features and benefits, read newsletters and have increased satisfaction and a high net promoter score (NPS), thus leading to higher retention rates, which is a key driver of CLV.</li></ul><p>In this journey, we are focusing on consumption since it is a key driver of both subscription revenue and ad revenue. It directly impacts the willingness of subscribers to spend time with our premium content, drive higher traffic, interact with ads and likely renew as they start to value content.</p><h3>Our approach</h3><p>We leveraged internal and external research combined with machine learning to build an automated new subscriber journey with defined success metrics. The journey has algorithm triggers to proactively engage subscribers to visit us and build everyday habits so we can increase frequency and recency of visits to drive revenue and lifetime value.</p><p>We know, based on internal research, that subscribers who have zero to two visits have a 15% lower retention rate compared to subscribers with more than 15 visits. Also, subscribers who use the app and visit more than 14 times have a higher NPS than others.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/760/0*e3Pj7v9-LFGpMeWV.jpg" /></figure><h3>Guiding principles on the subscriber journey</h3><p>We identified three key guiding principles on the subscriber journey:</p><ul><li><strong>Be subscriber-centric.</strong> It’s about them. In other words, we get to know their interests and their preferences about when they want to receive communications from us.</li><li><strong>Be relevant.</strong> This builds strong relationships and loyalty.</li><li><strong>Ensure consistent messaging across channels and devices.</strong></li></ul><figure><img alt="Examples of pop-ups on the Washington Post website asking readers about the types of content they like and when they like to read newsletters" src="https://cdn-images-1.medium.com/max/760/0*xz3UDRkKd6oJtf0X.jpg" /></figure><p>Our current subscriber journey includes multiple email messages designed to educate, engage and inspire subscribers to act. Subscribers are given engaging content as they go through the journey in the first few weeks to drive recency and frequency of visits and, ultimately, build habits and loyalty. We have refined the journey to ensure that the right combination of actions work together at the right time.</p><p>The journey starts with recommended on-site onboarding actions and then smoothly transitions into triggered email communications. The first step in on-site onboarding is for subscribers to select their interests, time of day, newsletter recommendation and app download.</p><p>This is important personal data collection, as it helps us better understand customer needs and preferences to later make informed decisions to provide personalised experiences.</p><p>The first email is a personal welcome note from our authors to build connections with subscribers by sharing the mission of The Post. It is powerful and a chance to share with subscribers what we believe in and an affirmation for why they are with us.</p><p>As the email series continues, each subscriber receives tailored messages based on their individual actions. Our goal is to ensure that subscribers only receive information that is most relevant to their personal interaction with us thus far.</p><figure><img alt="Examples of Washington Post subscriber onboarding emails, including a signed welcome letter and follow-up emails asking how users want to peruse the news and informing them of ways to read our content" src="https://cdn-images-1.medium.com/max/760/0*ayXArrxMI-GUfFLx.jpg" /></figure><p>For example, in Week 1, the automated journey checks to see which onboarding actions different subscribers have completed. Subscribers who have not initiated or completed the recommended actions get targeted emails.</p><p>In the same week, premium subscribers who haven’t shared their associate subscription receive an email encouraging them to do so.</p><p>In both scenarios, behavioral data is used to tailor the onboarding experience for personalisation at the subscriber level.</p><p>Over the next few weeks, emails are deployed highlighting content ranging from exclusive investigations and opinions to educating subscribers on Washington Post (WP) Live events, gifting articles and exploring The Post via other platforms like a podcast or TikTok.</p><h3>The subscriber journey</h3><p>This diagram is an example of what the subscriber journey might look like:</p><figure><img alt="A road passes through the following landmarks: onsite onboarding, personalized welcome letter, algorithmic triggers, reinforce benefits and relevant content" src="https://cdn-images-1.medium.com/max/760/0*JSkyutPQtbMeHxrm.jpg" /></figure><p>Many of these benefits and features were selected based on analytical insights. There is a strong correlation between these actions and retention. Analysis showed that subscribers who gift articles or attend WP Live events are less likely to churn. Our goal is to educate subscribers about these benefits in their early tenure to positively impact retention and customer lifetime value.</p><h3>Measurement plan</h3><p>We have identified our primary and driver metrics to gauge increase in engagement and retention to measure its effectiveness by implementing a control group.</p><p>Primary metrics are:</p><ul><li>Article pageviews</li><li>Total visits and days visited in 30 days</li><li>Habit adoption (newsletter engagement, app downloads, interests and author follows)</li><li>Retention over 90 days</li></ul><h3>Results</h3><p>Since launch, our new subscriber onboarding journey has resulted in a 2% lift in retention and an increase in three-year CLV after 12 weeks.</p><h3>Next iteration</h3><p>To be relevant, journeys must constantly be reevaluated and enhanced. Our immediate next step is expanding to on-site and in-app messages, since not all subscribers can be reached via email. To be effective, subscribers must be communicated to in their preferred channel.</p><p>Further experimentation is planned to understand what messages resonate on which channels, such as podcasts or audio listening.</p><p><strong>Read earlier WaPo 360 articles in the WashPost Engineering Blog:</strong></p><p>July 19, 2022: <a href="https://washpost.engineering/developing-a-new-washpost-content-taxonomy-system-8203988d4026">Developing a New WashPost Content Taxonomy System</a></p><p>March 8, 2022: <a href="https://washpost.engineering/doubling-down-on-personalizing-the-reader-experience-2c6d7d620eeb?gi=46aa1bd9d06a">Doubling down on personalizing the reader experience</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d5e1450821b8" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/personalized-subscriber-onboarding-results-in-higher-engagement-retention-for-washington-post-d5e1450821b8">Personalized subscriber onboarding results in higher engagement, retention for Washington Post</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Here’s how The Washington Post verified its journalists on Mastodon]]></title>
            <link>https://washpost.engineering/heres-how-the-washington-post-verified-its-journalists-on-mastodon-7b5dbc96985c?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/7b5dbc96985c</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[journalism]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[social-media]]></category>
            <category><![CDATA[mastodon]]></category>
            <dc:creator><![CDATA[Chris Zubak-Skees]]></dc:creator>
            <pubDate>Mon, 06 Mar 2023 14:19:36 GMT</pubDate>
            <atom:updated>2023-03-07T06:52:02.934Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Screenshot shows what the new verification looks like on Drew Harwell’s Mastodon account. Underneath his bio and the date he joined Mastodon, there is a dark green box with light green text that says “Post,” shows a checkmark and the link to Harwell’s bio page on The Washington Post’s website." src="https://cdn-images-1.medium.com/max/1024/1*aYk3YuiqVnI6wj5g5G1kFA.png" /><figcaption>Drew Harwell’s new Mastodon verified status</figcaption></figure><p>A small cross-disciplinary team of engineers worked together to add a feature so journalists at The Washington Post could link their Mastodon profiles from The Post’s website and verify themselves on the social network.</p><p>In mid-November, we started thinking about how to best support our journalists as they explored Twitter alternatives. Engineering director Jeremy Bowers put out a <a href="https://journa.host/@jeremybowers/109362893129821565">public call for ideas</a> on his Mastodon profile, and received a range of responses, including hosting our own Mastodon instance or verifying our journalists. After Twitter suspended several Post journalists in December, we activated a small team of engineers and identified specific technical projects we could build relatively quickly.</p><p>Hosting our own instance would be a major long-term commitment, which requires time to evaluate and would put our eggs in one basket. We wanted to find something we could do today and support journalists now.</p><p>Verification, on the other hand, supports our journalists who are engaging with audiences in various corners of the Fediverse, as the distributed network behind Mastodon is known, regardless of which instance they choose. It lets Mastodon users know if they’re interacting with someone who writes for The Post, which encourages trust in the source of the information they’re reading.</p><p>Verification on Mastodon isn’t dependent on a central authority like Twitter. No one person can sell verification or revoke it. Like the rest of the Fediverse, it’s built on open standards. The distributed nature of Mastodon poses unique challenges. But the distributed nature of the network also lets us build on it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uLiIl3xKpkXdc1F5rnaA1Q.png" /><figcaption>A Mastodon link on Merrill’s <a href="https://www.washingtonpost.com/people/jeremy-b-merrill/">author page</a>.</figcaption></figure><p>In some ways, verification is simple: We added a special link on author pages that Mastodon could check to verify that a particular Mastodon user is who they say they are. When a reporter adds the author page to their Mastodon profile, Mastodon fetches the page and looks for a link back to the reporter’s account. If it’s found, Mastodon adds a verification checkmark. This tells Mastodon users the account they’re looking at is actually the Washington Post author they claim to be.</p><p>Thankfully, this isn’t specific to Mastodon alone — this method is a standard supported by other networks, which means The Post can support verification elsewhere in the future.</p><p>Post engineer Holden Foreman, who is now The Post’s <a href="https://www.washingtonpost.com/pr/2023/01/25/first-ever-accessibility-engineer-named-washington-post/">first accessibility engineer</a> and had been contributing to the Mastodon project in his spare time, authored a code change to show the links on the pages. Rob Cannon and Tyler Fisher drafted a way for authors to add their own profile links in the website’s backend.</p><p>We were able to verify our first test accounts. So far, so good, but even a seemingly simple system can pose unexpected challenges when distributed across the internet.</p><p>The first hurdle came when Mastodon failed to verify some of our first adopters, including technology reporters Jeremy B. Merrill and Drew Harwell. We examined the verification code but couldn’t find an obvious explanation.</p><p>To debug this, Cannon searched the logs from our content delivery network, Akamai. It turns out that each Mastodon instance on which Merrill has followers requests the author page separately. In his case, that added up to more than 60 instances in a small sample, each independently requesting the page! Aspects of these requests tripped some of the anti-bot filtering that Akamai uses to protect our web site, which occasionally blocked verification.</p><p>But after addressing that, verification still failed. We were stumped until Dylan Freedman <a href="https://mastodon.social/@dylan@journa.host/109558740029078267">asked his followers</a> on Mastodon for help. A user responded that Mastodon had a one megabyte limit on pages it requested while verifying. Most of our author pages were larger than a megabyte!</p><p>I authored a change to the Mastodon open source project’s verification code which looks at the first megabyte, instead of limiting the page to one megabyte, while Christian Stroh shrank our author pages down by cutting excess page weight. Cannon built a <a href="https://mastodon-link-debugger.vercel.app/">public tool</a> to check that all the requirements for Mastodon verification have been met, which made this easier to debug.</p><p>At last, most journalists could successfully verify!</p><p>We hope you’ll follow our newly-verified <a href="https://mastodon.social/@drewharwell/109711258904364441">reporters on Mastodon</a>, especially those who have been at times suspended or hidden from search on Twitter, including <a href="https://mastodon.social/@drewharwell">Drew Harwell</a> and <a href="https://journa.host/@jeremybmerrill">Jeremy B. Merrill</a>.</p><p>Wherever Post journalists go next, engineers will be working behind the scenes to support them.</p><p><em>This was a team effort by Rob Cannon, Holden Foreman, Tyler Fisher, Jeremy Bowers, Dylan Freedman, Christian Stroh, Jeremy B. Merrill and others. Special thanks to the Mastodon community for their contributions.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7b5dbc96985c" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/heres-how-the-washington-post-verified-its-journalists-on-mastodon-7b5dbc96985c">Here’s how The Washington Post verified its journalists on Mastodon</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leveraging AMP email to deliver real-time midterm election results]]></title>
            <link>https://washpost.engineering/leveraging-amp-email-to-deliver-real-time-midterm-election-results-5123928f9fd?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/5123928f9fd</guid>
            <category><![CDATA[elections]]></category>
            <category><![CDATA[email-marketing]]></category>
            <category><![CDATA[news]]></category>
            <category><![CDATA[html]]></category>
            <category><![CDATA[amp-email]]></category>
            <dc:creator><![CDATA[Benjamin]]></dc:creator>
            <pubDate>Wed, 15 Feb 2023 21:19:21 GMT</pubDate>
            <atom:updated>2023-02-15T21:19:21.356Z</atom:updated>
            <content:encoded><![CDATA[<h3>What is AMP email and how can it be used?</h3><p>AMP (Accelerated Mobile Pages) for email is a <a href="https://amp.dev/about/email/">framework</a> that enables interactive app-like behavior and dynamic content within the inbox. Through the use of specific amp-components, users can fill out and submit forms, view content in real-time and engage in interactive modules such as games and quizzes all within an email.</p><p>Although it was released back in 2019, AMP for email has not become widely adopted for a number of reasons. At the time of this writing, AMP support remains limited to four email clients: Gmail, Yahoo! Mail, AOL Mail, and Mail.ru. Depending on the makeup of the email clients within a subscriber list, this can potentially leave out many users from the AMP email experience.</p><p>Also, there are many tech requirements that need to be addressed before AMP emails can be sent. Companies need to use an email service provider (ESP) that fully supports AMP on the backend, email addresses for senders need to undergo a time-consuming registration process to become whitelisted and approved to send AMP emails, and developers need to complete double the amount of work by coding an AMP email template as well as a separate HTML template for email clients that do not support AMP. These are some of the reasons why many companies have decided against using this technology in their email programs.</p><p>However, if companies are able to plan for and move past these obstacles, AMP has the potential to create valuable user experiences and improve upon certain limitations of standard emails. For example, standard email content cannot be updated or modified after it is sent. During rapidly changing situations such as fluctuating stock markets, live sporting events and fast-moving election results, emails sent in these environments can become outdated and less relevant by the time they’re opened by the users.</p><p><strong>Can AMP email be leveraged to create more useful and informative experiences during a rapidly changing event such as election results coverage?</strong> Yes, this blog post will discuss how teams at The Washington Post leveraged AMP to deliver live, up-to-date midterm election race highlights whenever the email is opened.</p><h3><strong>Preparing and Building the AMP Template</strong></h3><p>In preparation for the 2022 midterm elections, the project team decided to build a live updating feed (LUF) that displayed the latest election headlines and placed it into the <a href="https://www.washingtonpost.com/newsletters/politics-news-alerts/">politics news alert email campaign</a>. By using a preexisting email campaign, users with email clients that do not support AMP would continue to receive the same alert email in future campaigns. Their email experience would remain consistent and unchanged.</p><figure><img alt="A sample of the breaking politics news alert HTML email campaign." src="https://cdn-images-1.medium.com/max/1024/1*XmnfMwWwfRdyJ5c06fyyZA.png" /><figcaption>A sample of the breaking politics news alert HTML email campaign.</figcaption></figure><p>For the AMP email version, a new and separate email template was built following the <a href="https://amp.dev/documentation/guides-and-tutorials/learn/email_fundamentals/?format=email">AMP specifications and requirements</a>. The AMP template design copied the overall HTML alerts email design to maintain a similar experience. Then progressive enhancements were built into the AMP template using the following <a href="https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-components/?format=email">amp-components</a>:</p><p>1. The date in the alerts bar was replaced with a timestamp using the amp-timeago component. This switch was made to provide users with a clearer sense of how much time passed since the alert message was delivered.</p><pre>&lt;amp-timeago layout=&quot;fixed-height&quot; width=&quot;auto&quot; height=&quot;28&quot; datetime=&quot;{{ LUF_TIMESTAMP }}&quot; locale=&quot;en&quot; style=&quot;font: normal 22px/120% &#39;FranklinLight&#39;, sans-serif; font-size: 15px; color: #ffffff;&quot;&gt;{{ LUF_TIMESTAMP }}&lt;/amp-timeago&gt;</pre><figure><img alt="An arrow pointing to the amp-timeago component displaying how much time has passed since the AMP email was sent" src="https://cdn-images-1.medium.com/max/1024/1*JfkJqidwIRv_er0IPm1L7A.png" /></figure><p>2. The LUF module consisted of a title, three news headlines with individual timestamps, and a link at the bottom that directed users to the main Washington Post elections coverage. Users were able to click on the headlines and read the full article in a separate webpage. This module was built using the amp-list, amp-mustache, and amp-anim components. The amp-list component connected the module to a secure JSON endpoint bringing in headline text, timestamp data, and URLs. The amp-mustache component rendered this JSON data in the email. Whenever the email is opened, the JSON data would load with the latest election headlines.</p><pre>&lt;amp-list layout=&quot;container&quot; src=&quot;{{ JSON_DATA_URL }}&quot; template=&quot;LUFheadlines&quot; id=&quot;LUFmodule&quot; style=&quot;height:400px;&quot;&gt;&lt;div class=&quot;loadingText&quot; placeholder&gt;Loading ...&lt;/div&gt;&lt;div class=&quot;loadingText&quot; fallback&gt;Failed to load data.&lt;/div&gt;&lt;/amp-list&gt;<br>&lt;template type=&quot;amp-mustache&quot; id=&quot;LUFheadlines&quot;&gt;<br>  &lt;ul&gt;<br>    &lt;li&gt;&lt;a href=&quot;{{ ARTICLE_URL }}&quot;&gt;&lt;amp-timeago layout=&quot;fixed-height&quot; width=&quot;auto&quot; height=&quot;22&quot; cutoff=&quot;86400&quot; datetime=&quot;{{ TIMESTAMP_DATA }}&quot; locale=&quot;en&quot;&gt;{{ TIMESTAMP_DATA }}&lt;/amp-timeago&gt;{{ HEADLINE_TEXT }}&lt;/a&gt;&lt;/li&gt;<br>  &lt;/ul&gt;<br>&lt;/template&gt;</pre><figure><img alt="A red outline highlighting the LUF module at the bottom of the AMP alerts email template." src="https://cdn-images-1.medium.com/max/1024/1*w4dlrTDN3QU3SdMf7yXZEw.png" /></figure><p>3. Lastly, the team used the amp-anim component to display a blinking red dot at the top of the LUF module to indicate a real-time, live experience and to draw the user’s attention.</p><pre>&lt;amp-list layout=&quot;responsive&quot; height=&quot;10&quot; width=&quot;10&quot; style=&quot;height:10px;width:10px;&quot; src=&quot;{{ JSON_DATA_URL }}&quot; template=&quot;LUFdot&quot; single-item items=&quot;lufSection&quot;&gt;&lt;/amp-list&gt;<br>&lt;template type=&quot;amp-mustache&quot; id=&quot;LUFdot&quot;&gt;&lt;amp-anim width=&quot;10&quot; height=&quot;10&quot; src=&quot;{{ RED_DOT }}&quot; alt=&quot;Blinking red dot&quot;&gt;&lt;/amp-anim&gt;&lt;/template&gt;</pre><figure><img alt="An arrow pointing to the amp-anim component featuring a blinking red dot at the top of the LUF module." src="https://cdn-images-1.medium.com/max/1024/1*qP04TdasifTevHK97sH23g.png" /></figure><h3>AMP Email Demos</h3><p>On Nov. 3, the AMP email campaign for breaking news alerts was launched and users were able to view and engage with the LUF module. The AMP email below was sent on Nov. 10 at 9:28 p.m. ET and is shown opened on the Gmail website:</p><figure><img alt="The breaking news alerts AMP email opened in Gmail and slowly scrolling from top to bottom and back to the top" src="https://cdn-images-1.medium.com/max/800/1*jkCjsjKDGz0UqRL-25S1Eg.gif" /></figure><p>Below, the AMP email opened on the Gmail app in iOS:</p><figure><img alt="The breaking news alerts AMP email opened in the Gmail iPhone app slowly scrolling from top to bottom and back to the top" src="https://cdn-images-1.medium.com/max/400/1*C0C_Q-bk9uGY8Q8fi7_duQ.gif" /></figure><p>If this AMP email is opened at a later time, the most up-to-date headlines with corresponding timestamps will display in the LUF module. Users are able to click on these new headlines to read the full article on a separate webpage. This AMP email creates a dynamic news experience for users at the time of opening while also adding value to past breaking news alert emails that would have otherwise contained stale content. After 30 days, the AMP email expires and the HTML fallback version is displayed in its place.</p><h3>What’s Next</h3><p>AMP for Email requires rigorous planning and preparation before a single email campaign can be launched. However, once those steps are fulfilled, there are vast opportunities to experiment and innovate on new email experiences that could benefit users.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5123928f9fd" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/leveraging-amp-email-to-deliver-real-time-midterm-election-results-5123928f9fd">Leveraging AMP email to deliver real-time midterm election results</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My goals as The Washington Post’s first-ever Accessibility Engineer]]></title>
            <link>https://washpost.engineering/my-goals-as-the-washington-posts-first-ever-accessibility-engineer-453adeb13d51?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/453adeb13d51</guid>
            <category><![CDATA[accessibility]]></category>
            <category><![CDATA[journalism]]></category>
            <category><![CDATA[disability]]></category>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Holden Foreman]]></dc:creator>
            <pubDate>Wed, 25 Jan 2023 15:52:34 GMT</pubDate>
            <atom:updated>2023-01-25T15:52:34.380Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="A stick figure stands inside a dark blue circle with arms outstretched. There is another, thinner blue circle outlining the one in which the stick figure stands. The background color, including the stick figure’s body and space between the circles, is white. This icon is commonly associated with web accessibility." src="https://cdn-images-1.medium.com/max/615/1*3UiFA7Zg_LERUyEbrTSZTA.jpeg" /><figcaption>Image by <a href="https://commons.wikimedia.org/wiki/User:Dave_Braunschweig">Dave Braunschweig</a> (<a href="https://en.wikipedia.org/wiki/en:Creative_Commons">Creative Commons</a> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Attribution-Share Alike 4.0 International</a> license)</figcaption></figure><p>Note: To make this blog post understandable to more readers, we also published <a href="https://washpost.engineering/my-goals-as-the-washington-posts-new-accessibility-engineer-in-plain-language-492c7c61ae9e?source=collection_home---4------0-----------------------">a shorter version in plain language</a>. If you have questions regarding either post, please contact me via <a href="mailto:holden.foreman@washpost.com">email</a>, <a href="https://twitter.com/hsforeman">Twitter</a>, <a href="https://www.linkedin.com/in/holdenforeman">LinkedIn</a> or <a href="https://twitter.com/hsforeman">Ma</a><a href="https://mas.to/@hsforeman">stodon</a>.</p><p>The Washington Post is furthering its commitment to accessibility, and the work employees are already doing to make our content more accessible, by naming its first-ever dedicated Accessibility Engineer. I’ve long cared about accessibility, and I’m excited to serve in this new role.</p><p>So what do we mean by accessibility?</p><p>According to <a href="https://accessibility.iu.edu/understanding-accessibility/">Indiana University</a>, “Accessibility is the degree to which a product, device, service, environment, or facility is usable by as many people as possible, including by persons with disabilities.” A common example of accessibility in practice is including wheelchair-accessible seats at event venues, which may be reachable via ramps and/or elevators instead of only stairs.</p><p>At The Post, we care about the accessibility of our digital products. We have <a href="https://www.washingtonpost.com/accessibility/">a statement on our website</a> outlining some of our goals. We aim to include <a href="https://support.microsoft.com/en-us/topic/df98f884-ca3d-456c-807b-1a1fa82f5dc2">alternative text (alt text)</a> on images, captions on videos and transcriptions of audio content such as podcasts. We also know that accessibility considerations stretch far beyond these fundamental measures. The underlying code of our products should be written with accessibility in mind. There are extensive guidelines to consider, such as <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">the Web Content Accessibility Guidelines (WCAG) international standard</a>. I’ve blogged in the past about some of our steps toward <a href="https://washpost.engineering/improving-screen-reader-and-keyboard-accessibility-on-election-results-pages-e6f6cdbab25f?source=collection_home---4------2-----------------------">screen reader</a> and <a href="https://washpost.engineering/keyboard-focus-helping-users-navigate-the-post-without-a-mouse-83c572385240?source=collection_home---4------8-----------------------">keyboard</a> accessibility.</p><p>We know at The Post that everyone must care about accessibility in order for it to happen. Having an engineer dedicated to accessibility will help us align our efforts, maintain up-to-date standards and explore new opportunities in research and feature development. The Accessibility Engineer will also help educate others on the latest accessibility practices and will be a resource for internal support.</p><p>I like Indiana University’s definition of accessibility because it emphasizes two things:</p><ol><li>Accessibility is not something you either “have” or “don’t have.” There are levels to it. Your website may have appropriate alt text for some images but not all of them. You may have considered certain forms of color blindness, but not others, when choosing your color palette.</li><li>Accessibility is important for everyone. <a href="https://ssir.org/articles/entry/the_curb_cut_effect">“The curb-cut effect”</a> describes how cutting ramps into sidewalk curbs made the sidewalks more accessible not just to people in wheelchairs but to many others as well: people pushing strollers or carts, for instance.</li></ol><p>Parts of WCAG relate to assistive technology, which is used primarily by people with disabilities to help them navigate digital content. An example of this is a screen reader, which may be used by people who are blind or low-vision to hear digital content described to them. They use controls to move between elements on a page, and the associated text and/or function is read aloud. This is one purpose of alt text; it is read by a screen reader to describe an image for those who cannot see it clearly. Similarly, interactive elements should often be labeled in code using <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label">aria-labels</a>.</p><p>While standards are helpful, accessibility is more than meeting a checklist and calling it a day.</p><p>We want to create a dialogue with our users to better understand how you interact with our products and how we can make your experiences not only accessible but also user-friendly and efficient. Some changes may be as simple as adjusting labeling and page structures, while others may involve developing brand new features and experiences. And others may require updating the internal products that are used by The Post’s employees.</p><p>An essential part of my new role is doing my research and listening to you, The Post’s users. So please send any questions, feedback and thoughts that you have to accessibility@washpost.com. We can’t promise a response to everyone, but we will monitor our inbox carefully as we continue along this never-ending journey.</p><p>If you have questions for me personally or notice any errors in this blog post, please don’t hesitate to contact me via <a href="mailto:holden.foreman@washpost.com">email</a>, <a href="https://twitter.com/hsforeman">Twitter</a>, <a href="https://www.linkedin.com/in/holdenforeman">LinkedIn</a> or <a href="https://twitter.com/hsforeman">Ma</a><a href="https://mas.to/@hsforeman">stodon</a>. Thanks so much for reading.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=453adeb13d51" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/my-goals-as-the-washington-posts-first-ever-accessibility-engineer-453adeb13d51">My goals as The Washington Post’s first-ever Accessibility Engineer</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My goals as The Washington Post’s new Accessibility Engineer (in plain language)]]></title>
            <link>https://washpost.engineering/my-goals-as-the-washington-posts-new-accessibility-engineer-in-plain-language-492c7c61ae9e?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/492c7c61ae9e</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[journalism]]></category>
            <category><![CDATA[accessibility]]></category>
            <category><![CDATA[disability]]></category>
            <dc:creator><![CDATA[Holden Foreman]]></dc:creator>
            <pubDate>Wed, 25 Jan 2023 14:51:53 GMT</pubDate>
            <atom:updated>2023-01-25T15:54:21.691Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="A stick figure stands inside a dark blue circle with arms outstretched. There is another, thinner blue circle outlining the one in which the stick figure stands. The background color, including the stick figure’s body and space between the circles, is white. This icon is commonly associated with web accessibility." src="https://cdn-images-1.medium.com/max/615/1*3UiFA7Zg_LERUyEbrTSZTA.jpeg" /><figcaption>Image by <a href="https://commons.wikimedia.org/wiki/User:Dave_Braunschweig">Dave Braunschweig</a> (<a href="https://en.wikipedia.org/wiki/en:Creative_Commons">Creative Commons</a> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Attribution-Share Alike 4.0 International</a> license)</figcaption></figure><p>Note: This is the plain language version of <a href="https://washpost.engineering/my-goals-as-the-washington-posts-first-ever-accessibility-engineer-453adeb13d51">my Accessibility Engineer blog post</a>. If you have questions, please contact me via <a href="mailto:holden.foreman@washpost.com">email</a>, <a href="https://twitter.com/hsforeman">Twitter</a>, <a href="https://www.linkedin.com/in/holdenforeman">LinkedIn</a> or <a href="https://twitter.com/hsforeman">Ma</a><a href="https://mas.to/@hsforeman">stodon</a>.</p><p>I am The Washington Post’s new Accessibility Engineer. I am excited to serve in this new role.</p><p>To me, accessibility is about making something useful to as many people as possible. This includes people with disabilities. Some examples of accessibility are:</p><ul><li>ramps and elevators for people in wheelchairs</li><li>braille for people who are blind or have low vision</li></ul><p>I am a software engineer. I focus on the accessibility of things online. Some of those things are:</p><ul><li>alternative text, also called alt text or image descriptions</li><li>captions for videos</li></ul><p>Accessibility includes a lot of other things. There are standards that software engineers should consider, like <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">the Web Content Accessibility Guidelines international standard</a>. It is often called WCAG.</p><p>The Washington Post cares about accessibility, and it is helpful to have an Accessibility Engineer. This job will give me time to focus on accessibility. I will help teach my coworkers about accessibility, too.</p><p>Accessibility is not only about standards and checklists.</p><p>We want to understand how you use The Washington Post’s products. Some of our products are:</p><ul><li>our website</li><li>our mobile apps</li><li>our newspapers</li></ul><p>Do you have accessibility questions, ideas or feedback for The Washington Post? Please send them to accessibility@washpost.com. We might not respond to everyone. But part of my new job is listening to you.</p><p>If you have questions or feedback just for me, then please send them to my <a href="mailto:holden.foreman@washpost.com">email</a>, <a href="https://twitter.com/hsforeman">Twitter</a>, <a href="https://www.linkedin.com/in/holdenforeman">LinkedIn</a> or <a href="https://twitter.com/hsforeman">Ma</a><a href="https://mas.to/@hsforeman">stodon</a>. Thank you so much for reading.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=492c7c61ae9e" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/my-goals-as-the-washington-posts-new-accessibility-engineer-in-plain-language-492c7c61ae9e">My goals as The Washington Post’s new Accessibility Engineer (in plain language)</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We’re open sourcing our live election night model!]]></title>
            <link>https://washpost.engineering/were-open-sourcing-our-live-election-night-model-a21bcb2a46c6?source=rss----671ad4334cb2---4</link>
            <guid isPermaLink="false">https://medium.com/p/a21bcb2a46c6</guid>
            <dc:creator><![CDATA[Emily Liu]]></dc:creator>
            <pubDate>Wed, 14 Sep 2022 17:32:30 GMT</pubDate>
            <atom:updated>2022-09-14T17:32:30.500Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>We’re open sourcing our live election night model</strong></h3><p><em>by </em><a href="https://twitter.com/_emilyliu_"><em>Emily Liu</em></a><em> and </em><a href="https://twitter.com/lennybronner"><em>Lenny Bronner</em></a></p><p>We have model news again! We’ve spent the last six months re-implementing our election night model in Python and are excited to finally open source this version and share it with the community.</p><p><a href="https://github.com/washingtonpost/elex-live-model">GitHub - washingtonpost/elex-live-model: a model to generate estimates of the number of outstanding votes on an election night based on the current results of the race</a></p><p><a href="https://github.com/washingtonpost/2020-election-night-model">Our original election night model</a> was written in R. While this was good as a first approach, it led to a few constraints around deployment, maintenance and flexibility. We decided it was time to merge our model with our existing infrastructure.</p><h3><strong>But what is the model?</strong></h3><p>At the Washington Post, we use our model to generate estimates of the number of outstanding votes on an election night. We also generate more granular estimates — for general elections, we estimate the partisan split of outstanding votes; for primaries, we split these estimates by candidate.</p><p>Our election model provides useful context on where the final vote may end up at the conclusion of the race. Raw vote totals are often misleading when presented independently, due to factors such as a rise in absentee and mail-in voting and that geographic areas report results at different rates (e.g., rural areas often report results earlier than urban areas). You may have seen the output of our model on our results pages as these fuzzy bars.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wyatrZt7fi5ssnxx" /><figcaption><em>Example of our model visualization from November 2020</em></figcaption></figure><p>We estimate the turnout and vote total numbers by comparing live tallies to previous election results. We then extrapolate the difference between the live and historical results for geographic subunits (counties or precincts) that have yet to report results. The model is an implementation of quantile regression with demographics as features, and we use <a href="https://en.wikipedia.org/wiki/Conformal_prediction">conformal prediction</a> to quantify the associated uncertainty.</p><p>For the sake of this blog post, we’ll focus on the architecture decisions we made from an engineering perspective. For more information on how we calculate the estimates, you can read more <a href="https://www.washingtonpost.com/politics/2022/05/17/post-election-night-model/">here</a> and read a graphic explainer of how election models work <a href="https://www.washingtonpost.com/elections/interactive/2022/how-election-models-work/">here</a>. Further reading is linked at the end of this post.</p><h3><strong>From R to Python</strong></h3><p>In 2020, we built and open-sourced <a href="https://github.com/washingtonpost/2020-election-night-model">an election model</a> that was written in R. The model was hosted on a server via Amazon EC2 that our election pipeline could access via an API. Unfortunately, R is not a very popular language on our team (sorry!) and we were severely constrained by the response time from pinging the model API. Additionally, it was not as fast, scalable, or interoperable with AWS as we wanted, and it was hard to share code written in R with the rest of our codebase. Similarly, it was also difficult to parse errors and debug whether errors came from the API or the model implementation itself, especially under a time crunch during an election. We wanted a better way to deploy the model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DJAGOrLd9PbVsx45" /><figcaption><em>Simplified diagram of our former pipeline</em></figcaption></figure><p>As a result, after the November 2021 general election, we began the process of rewriting this model from R to Python.</p><p>A lot of the model re-write simply meant translating code written in the R tidyverseto the equivalent in pandasand numpy. But one larger issue was the reliance of our R implementation on the quantregpackage for quantile regression. Unfortunately we couldn’t find a numerically stable Python implementation of quantile regression. (Numerical instability can lead to inconsistent results.)</p><p>As a result, we decided to write one ourselves, and we’ve open-sourced that too. You can find our implementation (as elex-solver) below. It uses the cvxpy optimization library. We hope you might find it useful as a stand-alone package if you need to do quantile regression in Python.</p><p><a href="https://github.com/washingtonpost/elex-solver">GitHub - washingtonpost/elex-solver</a></p><h3><strong>From a Hosted API to a Serverless Lambda</strong></h3><p>Now, the model is deployed as a Python package that we invoke via a serverless Lambda function.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8TEpn3v3AP2ZPbTi" /><figcaption><em>Simplified diagram of our updated election pipeline with the model implemented as a Lambda</em></figcaption></figure><p>We deployed this model as a Python package because this makes it easy for collaborators both inside and outside of the company to install and use it. Our formatters from various election results vendors are Python packages as well, so this follows our existing architectural norm and simplifies our infrastructure.</p><p>When the model was formerly deployed as an API hosted on an EC2 instance, we pinged the API at a set rate of once every minute. However, we often ran into timeout issues. Invoking each model run as a serverless Lambda function solves this, because the Lambda maximum timeout is 15 minutes, which is well over our needs. Additionally, we have future plans to further align the model with our existing architecture by invoking the model only when new results come in instead of at a fixed rate. The architecture diagram above reflects this.</p><p>Importantly, we are able to run Lambdas independently of the rest of our pipeline (staging and production state machines). As a result, we preserve the flexibility of testing model runs with varying input parameters on election night, so we can tweak these parameters as we see fit as more information trickles in throughout the night. We provide ample logging per invocation of the model and use AWS CloudWatch to monitor the model throughout election nights.</p><p>This model is a continuous work in progress. You can browse the code yourself here. Installation instructions are included in the README.</p><p><a href="https://github.com/washingtonpost/elex-live-model">GitHub - washingtonpost/elex-live-model: a model to generate estimates of the number of outstanding votes on an election night based on the current results of the race</a></p><h3><strong>Additional Reading</strong></h3><p>Over the course of the last two years, we have published multiple resources to share our progress. We will continue to share our work publicly, and we welcome feedback!</p><ul><li><strong>October 2020: </strong><a href="https://s3.us-east-1.amazonaws.com/elex-models-prod/2020-general/write-up/election_model_writeup.pdf">“How The Washington Post Estimates Outstanding Votes for the 2020 Presidential Election”</a><strong> </strong>by John Cherian and Lenny Bronner</li><li><strong>November 1, 2020: </strong>“<a href="https://www.washingtonpost.com/politics/2020/11/01/post-election-model-results/">What the Post’s election results will look like”</a> by Jeremy Bowers, Lenny Bronner, and Terri Rupar</li><li><strong>November 2020: </strong><a href="https://github.com/washingtonpost/2020-election-night-model">Github repository for the original election night model</a> used in the 2020 elections</li><li><strong>December 2020: </strong>“<a href="https://s3.us-east-1.amazonaws.com/elex-models-prod/elex-models-prod/2020-general/write-up/election_model_writeup_update1.pdf">An Update To The Washington Post Election Night Model”</a> by John Cherian and Lenny Bronner</li><li><a href="https://github.com/washingtonpost/2020-election-night-model">2020 General election night model open sourced repository</a></li><li><strong>February 21, 2021: </strong><a href="https://washpost.engineering/how-the-washington-post-estimates-outstanding-votes-for-the-2020-presidential-election-3f82f8415eda">“How The Washington Post Estimates Outstanding Votes for the 2020 Presidential Election”</a> by Lenny Bronner</li><li><strong>November 2, 2021: </strong><a href="https://www.washingtonpost.com/elections/2021/11/02/election-model-explained/">“How The Washington Post will model possible outcomes in the Virginia governor’s race”</a> by Lenny Bronner</li><li><strong>May 17, 2022: </strong><a href="https://www.washingtonpost.com/politics/2022/05/17/post-election-night-model/">“How the Washington Post’s election night model works”</a> by Lenny Bronner</li><li><strong>May 24, 2022: </strong><a href="https://www.washingtonpost.com/elections/interactive/2022/how-election-models-work/">“How election modeling can help us understand who might win”</a> by Adrian Blanco and Artur Galocha</li></ul><p>If you’re interested in this work and want to learn more, we recommend reading <a href="https://washpost.engineering/what-the-washington-post-elections-engineering-team-had-to-learn-about-election-data-a41603daf9ca">this starter guide</a> on what our team had to learn about election data or reaching out to us.</p><h4><strong>Acknowledgements</strong></h4><p>This work would not be possible without the many, many people who have collaborated with us and supported us along the way. Thank you to the elections engineering team for their contributions to this project: Jeremy Bowers, Dana Cassidy, John Cherian, Holden Foreman, Dylan Freedman, Chloe Langston, Brittany Mayes, Anthony Pesce, Erik Reyna and Chris Zubak-Skees.</p><p>Thank you to Dylan Freedman for editing this post.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a21bcb2a46c6" width="1" height="1" alt=""><hr><p><a href="https://washpost.engineering/were-open-sourcing-our-live-election-night-model-a21bcb2a46c6">We’re open sourcing our live election night model!</a> was originally published in <a href="https://washpost.engineering">Washington Post Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>