This program is a simulation of a day's traffic flow through a polling place. It is based on simple queueing theory
and data from research projects regarding polling places and elections. Each time you run the simulation, voters arrive
randomly within a pattern based on data collected at polling places. There is randomness involved, just as in reality.
But as you will see, the randomness approximates the typical daily flow found at polling places, which should give you
an accurate range of possible wait times that might develop.
The basic design simulates a polling place with a number of check-in stations (or just one), where the first line will
form. Then there is a number of voting stations, for which the second line will form.
For those using optical-scan ballots that require voters to run their ballots through a scanner after completion
of the ballot, there is also an option to simulate lines for the scanner(s).
The simulation also has an option to handle same-day registration stations for those states to which they apply.
The simulation makes the assumption that arriving voters will be directed to a check-in station if
already registered, or a registration station if not. Both of those lines will feed
into the voting station line as the check-in or registration tasks are completed.
You will quickly discover that waiting times are surprisingly sensitive to the average amount of time to check-in and the
average time to complete a ballot.
As you know, time to complete a ballot depends greatly on the length and make-up of the
ballot. The voting technology used also has a minor impact. We can only provide a starting point for ballot completion time;
you must provide a reasonably accurate estimate for each election for this simulation to give you accurate
estimates of potential waiting times.
Likewise, the average amount of time to check-in depends on the process used and the people staffing that step.
When setting this value, remember to not assume that every voter will check in smoothly. Don't use a number for the
amount of time it ought to normally take. The average that you provide must include those who for whatever
reason take extra time at the check-in station. If one out of every ten voters takes a couple extra minutes to
check in because of some issue, that will affect the process, your average, and the waiting times.
Similarly, your average scanning time (for those who use that option), should consider those that do not go smoothly.
Don't just use a number that represents how long it should take if all goes well, because seldom does all go well for
Lastly, your average times must account for the turnover period between voters. If 30 seconds elapse between the time one
person completes a ballot and the next person settles in at the same voting station and begins voting, those 30 seconds
MUST be part of the average that you use.
Simulating All Your Precincts
When you upload a list of all your precincts (from an Excel spreadsheet or a similar source), along with turnout
estimates and resource deployment, you can run this simulation across all precincts at once to see which
have potential problems. A new table will appear at the bottom of the page with stats for each precinct, which can
then be sorted on any field and on which adjustments can be made. See the Load your own data section of
this help page for details.
Feedback, Suggestions, and Critiques
This simulation was written by Mark Pelczarski. Questions, comments, suggestions, and pleas for
help are welcome. E-mail Mark here.
The Five Key Inputs
Above the simulation graph you will see inputs for Expected Voters, Check-in Stations,
and Voting Stations. Below the graph are inputs for Average Minutes to Check in and
Average Minutes to Vote. These are the 5 values that will have the greatest effect on the
waiting times shown by the simulation.
Expected Voters is the number of voters expected to vote in person that day. Absentee and early
voters should not be included in this number. Although designed by default for election-day voting, potential
waiting times during early-vote days can also be simulated if you can estimate the turnout for the day in question.
The number of check-in stations and the number of voting stations are your inputs for the resources
you deploy. For our purposes, the way lines may be split for check-in stations won't matter much; the average
wait times will only differ when a polling place is relatively quiet and some check-in stations are open while others
have a short wait. During busy times when all check-in stations are in use, the average waiting time is not affected.
Minutes to Check in and Minutes to Vote are critical values for which you should supply
realistic values. It is very worthwhile to take some sample times if you are able to do so prior to an
election, once the ballot is known. If you are able to research and document your own check-in and voting times,
it would be very useful if you could share your results (with a sample of your ballot for the voting time) so we
can perhaps refine this simulation with more predictive data.
(E-mail link) Remember to include your "turnover time"
in your averages, or the time between one person leaving a station and the next person arriving and starting the process.
Another way to look at it is that the average should include the entire time from one person leaving a station through
the next person leaving that station.
What You See on the Graph
Each time you run the simulation, you will see the resulting average, maximum, and minimum wait times throughout
the day. The graph shows the time of day, from left to right. The height of the graph shows the waiting-time results.
The yellow area in the graph is the waiting time for the check-in stations. The violet area is the waiting time
for the voting stations. The total height of the graph at any time of day is the average total waiting time for
people who arrive at that time. (The solid line is the average; the dotted lines show the shortest and longest
waits. See the Settings section of this help document for more explanation.)
To see less yellow, add check-in stations or decrease the average check-in time. To see less violet, add voting
stations or decrease the average time to complete a ballot.
It's a Simulation
Instead of a straight mathematical computation which gives consistent results, this simulation gets a little
closer to reality by randomizing voter arrival within certain constraints each time you run it. If you click the
Run Simulation button again without changing any values, you will get slightly different results each time.
That's because of the random factor, and that's more like reality. Simply put, if just two people arrive 5 minutes
apart, neither will have to wait and the average wait time for those two people is zero. But if those same two
people arrive at exactly the same time (and there's just one check-in station), one of those two will wait,
and thus the "average" wait time is longer.
The dotted lines on the graph for the minimum and maximum wait times give you an idea of the range of possible
outcomes with the same data.
If your polling place has optical scanners that voters must use after completing the ballot at their voting station,
you can also simulate scanner lines by providing the number of scanners available and the average time it takes to scan
a ballot (including turnover time from one voter to the next!).
At the bottom of the graph, under the "Run Simulation" button, click the "Scanner lines" checkbox. Now, above the graph
you will see an input for the number of scanners available and below the graph you'll see an input for the "Average
number of minutes to scan". The graph will then show waiting time for all three stations next time the simulation
If same-day registration is allowed in your state, check the "Same-day Registration" box under the "Run Simulation"
button at the bottom of the graph. New inputs choices will appear above the graph for the number of registration stations
and below the graph for the average time to register.
This simulation assumes that already-registered voters will wait in the regular check-in lines and that those who need
to register will wait in a separate line for the registration station(s). Then it assumes that BOTH lines will feed into
the voting station line. That is, we assume the registration station also serves as a check-in station for those voters,
and after registering they will proceed to vote and will NOT get into the regular check-in lines.
In the results, the average check-in time (yellow area on the graph), will be the average waiting time for ALL voters,
regardless of whether they waited in the regular check-in line or waited in the registration/check-in line. A separate red
line will appear on the graph showing the average wait for registration. The way to interpret that is if the red line
is above the yellow area, people are waiting longer in the registration lines than the regular check-in lines, and that
pulling up your total average check-in waits. Adding a registration station will help. But if the red line is below the
top of the yellow area that means the average check-in wait is NOT due to registration lines; instead the regular
check-in waits are longer than the registration waits so you should add check-in stations.
You can set the times that the polls open and close. This will compress or spread out the arrivals, and thus
have some effect on the waiting times.
Below the graph, you can select an Arrival Pattern. These patterns were derived from arrival data sampled at
numerous polling places during several election cycles. (See the Settings section of this help document for
how you can view the arrival patterns on the graph.) Unless you use the "Saturday: steady" pattern, which perhaps
might describe a Saturday during early voting, the default "Composite" pattern gives a good indication of potential
wait times, although the time of day that waiting develops could vary with the arrival pattern of each particular
Early arrivals is the percentage of the day's voters who will be already waiting in line when the polling
place opens for the day. This is adjusted separately from the arrival pattern. The default used for all arrival patterns
is 1.2, which means 1.2% of the day's voters. The waiting times reported for early arrivals only include the amount of
time those voters wait in lines after the polling place actually opens.
The Cannot check in value describes a percentage of voters who are unable to check in for some reason, and thus
do not move on to the voting queue. Many of these voters will typically be given provisional ballots. The default value
used is 2.0, meaning 2%. This simulation currently uses this number only to decrease the waiting times for voting stations,
since these voters will not wait in the subsequent lines. Although voters with issues that might prevent checking in
can slow down the check-in lines, it is assumed that your "average minutes to check-in" already accounts for these occasional
The Simulate Walk-Offs checkbox adds a feature that "predicts" a possible number of voters who see that a line
of some length has formed and they choose to leave rather than wait. The longer the line gets, more potential voters
will walk off instead of wait. These projections are based on results of Marist polls that asked voters how long
they'd be willing to wait in line to vote prior to recent general elections. Since these numbers are based on what
people said vs. observations of what they actually did (which is probably impossible to accurately measure),
the "Walk-off" predictions should be taken in context: they might indicate the potential of a serious problem, but
they should not be taken as an accurate prediction of lost voters.
Looking at the Simulation Settings
If you want to dig deeper into how this simulation works, at the bottom of the page click on Show Simulation Settings
and more options will appear just below that. Here's where you can see a little more of the nitty-gritty of how
Number of Repetitions is how many times the simulation actually runs through a day randomly before giving you
its results. It simulates the same voting day with the same input data 20 different times (by default) with 20 random sets
of arrivals before computing the averages and telling you the maximum and minimum waits that it found. If you change "20" to "1"
and click the Run Simulation button over and over, you'll see just a single attempt at the simulation each time,
and the results will vary more. If you change it to "100", the computer might take a little longer running through
100 simulations of the same day, but your average will be more accurate and your minimum and maximum values will
The Show Range checkbox turns off and on those dotted gray lines that display the minimum and maximum results.
A less-cluttered graph is prettier; but it tells you less.
Lines are formed when a lot of people arrive around the same time of day. If they'd only cooperate and space themselves
out evenly throughout the day, our lives would be much simpler. But they don't.
Check Show Arrival Pattern to see a new gray line through the middle of your graph that displays the arrival
pattern used from the Arrival Pattern choice given above and discussed earlier. ("Composite" was the default.)
The right side of your graph shows a new set of numbers for that gray line. Those percentages are the percentage of
voters who show up during each 15-minute interval using this pattern. If you're looking at the "Composite" pattern,
you'll see that about 3% of the day's voters are expected to arrive around 5:30-5:45pm. Likewise, slightly more than
3% are likely to show up around 7:15am, whereas only 1.25% show up around 8:30am in this same pattern. This doesn't mean that
those are the exact percentages that will occur when you run the simulation. Those likelihoods inform the randomness, but
the arrivals are still random.
To get an even more accurate picture of what's going on, click Show Arrivals Used and set the
Number of Repetitions to "1", then click the Run Simulation button. A new green line appears that shows
the times that our simulated voters actually arrived. The graph of that green line looks a lot more like the data
that was collected while recording actual arrivals at polling places, which is to say that real people don't conveniently
follow our exact mathematical models. Click Run Simulation several more times
and watch how that green line changes. This is what we're actually feeding into the simulation to make our "wait time"
But notice also how the green line somewhat approximates the gray line that is the pattern we're using. That gray line
was derived from actual data that looked like all those green lines you just clicked through. Change
Number of Repetitions back to "20" and click Run Simulation again and you'll see that after 20 repetitions
the aggregate random arrivals approximate our pattern more closely.
And if all this random stuff bothers you, click Arrivals Follow Pattern and then even with only 1 repetition
you'll see that our simulated voters behave exactly like the pattern predicts.
Using your own data
If you create a table in an Excel spreadsheet (or similar application) with columns for precinct names,
turnout estimates, number of check-in stations, and number of voting stations, you can then save that spreadsheet
in a format that you can load right into the simulation and run then run the simulation across all precincts at once.
When you do so, a new table appears at the bottom of the simulation page with every precinct in your list
and predicted wait times and possible walk-offs for each. You can adjust the number of check-in stations and voting
stations for each and get immediate feedback about the potential results. You can then download the alterations and
feed them back into Excel or another program to remember your settings and adjustments.
Creating the data
We'll talk about the Excel spreadsheet application here, but any program that can create "tab-delimited text files"
or "CSV files" can be used.
The first row of your spreadsheet will be headings that MUST match the names we list here, because the simulation will
look for exactly those headings when it reads the file you load in. The order of the columns does not matter at all.
The headings themselvers are used for sorting your data into the right place.
The only required heading and column is "Precinct". In this column you will list the names or designations you want to use
for each precinct you'll want to run in the simulation. Please avoid commas in those names, since commas will mess up
our use of the CSV file format.
Each of the other columns is optional, although if omitted we'll add default values that you'll almost certainly want to
change, so it's probably faster for you to do that in your spreadsheet. Note also that the columns "Registration" and
"Scanners" have special meaning that cannot be altered in the simulation. If you plan to use the same-day registration and/or
scanning stations options with your data set, you must include these columns in your spreadsheet.
An important note is that you CAN include additional columns in your spreadsheet if you want to generate some of the data
using spreadsheet formulas. Any column headings you use that are not listed below will simply be ignored. So if it is easy to
generate a column for "Registered Voters" (which is not listed below), and you estimate voter turnout at 60% for an election,
the "Turnout" column below can just contain the formula for Registered Voters * 0.6 for each row. Similarly, you can use
formulas in columns such as "Voting Stations" and "Check-in Stations" to set some initial values.
Here is the complete list of column headings you can provide. Capitalization, spaces, and hyphens don't matter. Spelling does.
"County" is for grouping precincts by county when using the simulation on a larger scale. However it can also be used
to create named subsets of your precincts if you have many and wish to work with smaller sets. Each precinct that you want
grouped together should have the same county name. In the simulation a "county" list will appear, and when you select a
county only the precincts within that county will be shown in the precinct list and in the table at the bottom of the page.
This column will contain the identifiers you will use for each precinct or vote center. It is the only required column,
but it's strongly suggested that you include as many of the others as pertain.
"Turnout" is the number of in-person voters expected on the election day. You should not include absentee and early voters
in this number, nor should this be the total number of registered voters. You can also use "Turnout" to simulate arrivals on
an early-voting day.
Use this if and only if your state allows same-day registration on the day you plan to simulate. The existence of this
column will set the same-day registration option to true for all your precincts. If you omit this column, the option will
be set to false for all precincts and you will not be able to change it in the simulation. Values in this column will be the
estimated numbers already included in "Turnout" above who will also need to register on election day. For example, if
you expect 500 voters on election day, and 100 of those 500 will need to register, put 500 in the "Turnout" column and 100
in the "Registration" column. (You might also use a formula here, such as "Turnout" * .2 for 20%)
These columns should contain the number of each that you plan to deploy in each precinct. "Registration Stations" is
only applicable if you are using the same-day registration option and have including the "Registration" column described
about. If you do not supply columns with these headings, we'll use our own calculation to suggest a starting point
for what you might want to supply.
Use this if after filling out a ballot there is another station where each voter must scan the ballot to
complete the voting process. If you include this column, the option can vary by precinct. The values in this column
will be the number of scanning stations (usually just 1). However, you can set this to 0 (zero) or leave this entry
blank for a precinct, either of which designates that the precinct does not use scanners. This column sets the
"uses scanners" option to true or false for each precinct, and the option cannot be changed in the simulation. However
you will be able to change the number of scanners for those precincts that use them. Omission of this column sets
"uses scanners" to false for all precincts.
Minutes to Check In
Minutes to Vote
Minutes to Register
Minutes to Scan
It is strongly recommended that you include these columns with reasonable estimated averages for each of the
applicable times. The default times in the simulation are only broad estimates. Your times will almost certainly
vary from the defaults we provide, and reasonable estimates for each of these averages are essential for any kind
of reliable results in this simulation. If you doubt that, run the simulation with just all the default values
and try slight adjustments to the average minutes to vote and watch the changes; they can be drastic. Different
ballot lengths can have a significant effect on "Minutes to Vote", so this number may vary in groups of precincts.
"Minutes to Register" and "Minutes to Scan" are only pertinant if you are using the same-day registration
and "scanners" features. Please enter your values in minutes and fractions thereof. For example, don't use "4:30" for
"4 minutes and 30 seconds". Instead, use "4.5".
This option lets you change a precinct from using the default "Composite" arrival pattern to any of the other 9
patterns listed in the simulation. If used, the value in this column should simply be a number from 0 to 9, corresponding
to the position of the desired pattern in the simulation's list. 0 is the "Composite Pattern", 1 is "Early, Mid-Morning,
After Work", and so on. This is not a critical option, as the pattern is not as important in the simulation as other
factors in showing what might happen during the largest surge, no matter what time of day that may be.
Although part of the overall arrival pattern at a polling place, this is adjusted separately and tells the percentage
of the day's voters who will already be waiting in line when the polls open for the day. If unchanged, this percentage
defaults to 1.2 (meaning 1.2%) for all arrival patterns. Enter this value as a percent but omit the % symbol, such
as '5' for 5%.
Cannot Check In
This is the percentage of voters who wait in the check-in line, but are unable to check in to vote at one of the voting
stations. Many of these voters are offered provisional ballots, but they will not wait for a voting station and thus will not
influence those lines. The default is 2.0, meaning 2%. Provide a percentage, but omit the % symbol.
Saving your spreadsheet to use in the simulation
When you've completed your spreadsheet, save it once in regular Excel format if you've used formulas and you want
to be able to edit it with those same formulas. Then choose "Save As" followed by "Save As Type" and select
"Text (Tab delimited)". Alternately you can use "CSV (Comma delimited)", but only if you've managed to avoid using
commas in your data.
Load your data into the simulation
Near the top of the simulation there is a Load Precinct Data button. Click it. Choose the tab-delimited or
CSV file that you saved. Click Okay.
If all went correctly, you should now see new County and Precinct lists at the top of the simulation.
If you select a precinct from the list, the values for that precinct should appear from the data you provided.
Remember to set Minutes to Check-in, Minutes to Vote, Minutes to Register, and Minutes to Scan
if you did not provide these in your spreadsheet. The values you set become the defaults for each precinct in the data
for which these values were omitted in the upload.
Precinct data table
Scroll to the bottom of the simulation and you'll see a new choice, Edit Precinct Data. Click that, and a table will
appear below with a list of all your precincts, and columns for check-in stations, voting stations, peak wait time, average wait time, and
walk-offs. If your data enables same-day registration or includes scanners, columns for registration stations and scanners will
be included also. Above the table is a button that says Compute Wait Times. Click that and the simulation will be run
for each precinct in your data set and the peak and average waits time will be shown for each. At the top of the table you can
click the Precinct, Peak Wait, Avg. Wait, or Walkoff column headings to sort the table by the selected
You can also edit the numbers in the Check-in, Voting, Registration, and Scanner station
columns to recompute the wait times for that row with the new values. These changes will be remembered, and you can click
the Download Current Data button at the top of the simulation to save your changes back to a CSV file that will load
right back into Excel.
Note that changes made to Check-in Stations, Voting Stations, Registration Stations, and Scanners
above the simulation graph (near the top of the page) are exploratory only and are NOT recorded in the precinct table at the bottom.
If you want to save new values for check-in, voting, registration, and scanning stations, you should change the values
in the table instead.