Brian Keegan is a regular opinion columnist for Boulder Reporting Lab. His “Charting Boulder” column uses public data to make sense of how the city is changing — from housing and politics to income and population — with clear explanations and a focus on equity.

Nov. 4 marked the last odd-year campaign for Boulder’s city council. The race was notable both for having all four incumbents running for reelection and for another dramatic finish. As in other recent elections, the first batch of results looked different from the final outcomes.

When the first results dropped just after 7 p.m. on election night, the top four candidates (and their share of votes) were Matt Benjamin (17.9%), Mark Wallach (17.0%), Rob Kaplan (15.3%) and Jennifer Robins (14.7%). But 24 hours later, the order had changed: Robins slipped to fifth with 13%, while Nicole Speer surged from fifth (12.5%) to third (14.2%). 

I cannot imagine what it is like for candidates to watch an early lead evaporate after months of campaigning. But this pattern is now familiar: Progressive-backed candidates often start behind with the first results and climb steadily as later ballots are counted. 

In 2021, Michael Christy began in third place before dropping to sixth, while Nicole Speer and Lauren Folkerts rose from fifth and seventh to third and fourth. In 2023, Terri Brncic started third and fell to fifth as Taishya Adams and Ryan Schuchard climbed the ranks. 

So is there something to this pattern, in which candidates backed by Boulder’s more conservative groups perform well in early returns but fade as later ballots are counted, while progressive-backed candidates gain ground over time?

Some might jump to dark conclusions about fraud or manipulation. But the real explanation is mundane: Ballots are counted roughly in the order received. The first batch of results after 7 p.m. on election night reflects ballots returned through Monday. 

These early votes tend to skew conservative because early voters are more motivated, less persuadable and more likely to plan ahead. Later ballots, often from voters who spend more time researching endorsements and candidates, or simply procrastinate, tend to lean more progressive. 

That timing difference is not a flaw. It’s a reflection of how diverse voters’ behaviors and beliefs can be. We can all agree democracy is healthiest when more voters participate, which is why I am excited about the shift to higher-turnout, even-year city council elections.

These patterns are more than an administrative novelty, they also allow us to extrapolate trends and forecast election outcomes. Using a simple statistical model, I’ve been able to predict and share the final candidate rankings and vote shares in both the 2023 and 2025 elections, hours before the results were released. 

The method is straightforward: If a candidate’s support rises or falls at a steady rate across successive ballot data releases, I can use those trends to project final vote shares for an expected total turnout. To run the model, I only need two batches of election results to establish each candidate’s trajectory and an estimate of the final number of ballots cast. 

Recently, Boulder’s city ballot count in odd-year elections has ranged between 34,000 and 35,000: 34,466 in 2023, 34,046 in 2021 and 35,231 in 2019. I chose 34,500, which turned out to be close to the clerk’s reported cast ballot count of 34,355 for the city in 2025.

The linear regression model predicts where each candidate’s vote share will likely end up for a given turnout. By the third batch, typically around 11 p.m. on election night, the model’s predictions are usually within a tenth of a percent of the final numbers. In 2025, for example, this model correctly anticipated after the fourth data batch that Speer would likely end up in third place, Kaplan would drop to fourth, and Robins would finish in fifth.

With five batches of results now released, here is my table of predicted vote shares by candidate assuming 34,500 ballots in Boulder.

The errors in the table reflect the model’s expectation that candidates like Benjamin, Folkerts, and Speer would continue to gain strength as the final ballots were counted, while the vote shares for candidates like Kaplan, Robins and Wallach would continue to fall.

A number of slates endorsed only two or three candidates in this four-seat council race. As I discussed with Bob Yates in our “Across the Aisle” conversation last week, these “incomplete slates” could be one explanation for the differences of Speer vs. Folkerts and Kaplan vs. Robins, who were often paired together by campaign slates.

Voters who backed a slate might have “undervoted,” choosing only three of four possible candidates to avoid boosting the “other” side. Others might have backed a three-candidate slate and then thrown their support behind either crossover picks like Benjamin or chose unslated, down-ballot candidates.

If we give any weight to the positive or negative trends as indicators of early vs. late voters’ political values, the model implies that candidates like Rachel Rose Isaacson and Maxwell Lord drew support from the progressive end of Boulder’s political spectrum, while Montserrat Palacios Rodarte, Aaron Stone and Rob Smoke were backed by more conservative voters.

While the casting of ballots is over, the election process isn’t: Voters still have an opportunity to confirm their ballots were counted and cure any mistakes, participate in the risk-limiting audit of results, and watch as the new city council formally certifies the results at their first meeting in December.

Other election-related data I will be following as part of these post-election processes include the cast vote records (which provide anonymized ballot-level results), the campaign finance data (which summarizes the contributions and expenditures of candidates and committees), and precinct-level results showing how Boulder’s neighborhoods voted on the candidates and issues.

One way or another, we will be back here in less than 12 months!

The data and code for replicating these analyses can be found on GitHub.

Brian C. Keegan, Ph.D., is a computational social scientist and an associate professor in the Department of Information Science at the University of Colorado Boulder. He teaches courses on data storytelling, network science, and web data science, and his research examines high-tempo online collaborations, the governance of online communities, and public-interest data science. He is the vice chair of the City of Boulder’s Cannabis Licensing and Advisory Board, a board member of Boulder Progressives, and serves on the editorial board of the Boulder Housing Network.

Join the Conversation

5 Comments

  1. Lol Brian! Rob Smoke was most certainly not backed by conservative voters – unless they also somehow happened to be primarily motivated by the war on Gaza. I think Aaron Stone, reading the room, also tried to appeal a bit to more conservative voters, but I doubt many went that direction. And the “progressives” that won reelection have been progressively moving toward the mushy middle where nothing besides mundane administrative tasks gets done since they were last elected (like the meaningless BVCP update, or approving the equally meaningless new homelessness plan).

    A little tidying things up with minor changes is what we have gotten so far from this crew. A year long expensive consultant report must be undertaken before any change to anything can even be considered, and then issues are scheduled another year out on the agenda. In the end, everything is left up to staff to decide.

    But this election was also a great test of the justification city council members put forth for their new big pay raise. Water under the bridge now, but they all insisted that it was for the benefit of all those “barista” types who could not afford to run for council if they did not receive a decent paycheck. (Never mind the fact that “running” for council is not the same as being elected – running is not the problem.) Well, now we know! Those hungry young people under 40 (plus Rob) wanting to serve on council poll in the single digits.

  2. You write “These early votes tend to skew conservative because early voters are more motivated, less persuadable and more likely to plan ahead. Later ballots, often from voters who spend more time researching endorsements and candidates, or simply procrastinate, tend to lean more progressive. ”
    There is no need to suggest that early voters are blindly dogmatic. In reality, most early voters have the motivation to review the candidates and ballot issues and vote on their preferences. In contrast, the majority of voters who show up on election day have not taken the time to take an in-depth consideration of what they are voting for – the resources are not at the voting booth and time is limited.

    1. Interesting how you took umbrage at Brian’s theory that those who vote early are less persuadable, then contended that those voting late do not take the time for in-depth consideration of the candidates and issues. As an obvious early voter, do you really study ALL the candidates and consider them all before deciding which ones you will vote for?

      1. Roxanne, I did. I took notes on their positions and then summarized them in recommendations on Next Door and a text chain to my neighbors.

Leave a comment
Boulder Reporting Lab comments policy
All comments require an editor's review. BRL reserves the right to delete or turn off comments at any time. Please read our comments policy before commenting.

Your email address will not be published. Required fields are marked *