Live Vote Results
Business context
Live Vote Results is a website that provides real-time updates on the results of ongoing elections. To get data for ballot charts, Live Vote Results polling station commissioners used social surveys and manually added elections data to the website.
Our main goal was to reduce the operating time and get rid of manual data processing for two reasons:
Users need real-time updates on election results; if this information is late, it brings no value.
Competitors already supplied near real-time election results data and could draw users away.
One more of our client’s concerns was data credibility — our client wanted to secure election results from any possible fraud.
Solution scope
To help the client deliver real-time election result updates, we suggested automating ballot chart generation with a set of scripts that would also reduce the number of mistakes in charts.
For avoiding fraud related to election results, we implemented an employee monitoring system and a tool in the admin panel for distributing roles.
Solutions
Cutting operating costs
Our client wanted to reduce the number of iterations for presenting structured information and cut the time for processing and visualizing data. Generating 64,000 ballots for a single area would normally require 600 hours (15 people working for a week). The reason for this was the amount of manual work required to check CSV files with data and build ballot charts. To optimize this process, we automated business rules via scripts that cover all manual work and produce fast, error-free results.
Optimizing the tech solution
Just like on all of our projects, we performed a detailed analysis of functional and nonfunctional requirements in search of a well-balanced technical solution. We discovered that building our own API on Node.js for interacting with multiple data objects would be a better decision in the long run. But it wouldn’t let us meet the tight deadlines.
We searched for a compromise that would supply the basic functionality and take less time to implement than building our own API. We chose the GraphQL language, as it predefined the app architecture and supplied a broad range of templates. The Aurora MySQL database has data field limitations but won us an extra 25% of time for app development.
However, for the next app version, we’ve already agreed to create an API for working with data from scratch. This way we’ll bring more flexibility to the app architecture for future updates and improvements.
Ensuring website scalability
Live Vote Reports expected many views of filtered ballot charts, so we had to ensure the site could easily scale. For this purpose, we chose AWS Lambda and AWS AppSync for the GraphQL API, as they offer on-demand scalability. With these technologies, our client can add servers to power up the site for election time and disable unnecessary servers at other times. We also conducted load testing of Live Vote Results. Currently, the site can easily handle over 100,000 requests per second, while 450 users can simultaneously request filtered ballot charts and get them in less than two seconds.
Providing anti-fraud mechanisms
As polling station commissioners have access to initial election data, there’s a chance they can make a mistake or intentionally manipulate the results in ballot charts. That’s why we added a logging feature to the admin panel and implemented different roles for it. Polling station commissioners only have access to the area they’re responsible for, while the admin panel automatically logs their work. If any incorrect information is found in ballot charts, an admin can check the logs and roles to see who was the last to edit the chart and ask them to correct it.
Improving the website UX
Our client required us to add interactive maps to help users filter election results and implement a certain level of website customization so polling station commissioners can prioritize lists of ballot charts based on user’s interests.
Interactive maps
Our client supplied us with detailed district maps in the SVG file format, so we only had to make them interactive. First, our designers outlined the districts in the SVG images. Then we used React for parsing SVG source strings and rendering the results as React components to describe the SVG image fragments as ReactElements in JSX format. This is how we obtained clickable maps that let users view election results for a selected area.
Website customization
To prioritize election results based on a user’s interests, we added chart order customization. Polling station commissioners can display, say, mayoral election results before the presidential results if desired. We also allowed polling station commissioners to preview charts and lists of charts to see how they look before publishing. And to help polling station commissioners react to the political situation in the country, they can configure electoral district names and sizes as well as create new districts.
Results
Although we had limited time to complete the project, we managed to deliver a fully functional website by the April elections, and it worked flawlessly. Our team was available to support the site during the elections, but our help wasn’t needed, as Live Vote Results provided accurate election results in a timely fashion. In fact, the site operated so well with its new interactive map filters that some electoral area representatives purchased access to the website for their areas on election day.
Thanks to process automation, instead of taking workers 600 hours, it now takes the admin panel 3 hours to process and visualize data for ballot charts:
Old workflow: 600 worker-hours
Manually read / apply voting rules
Manually fill out ballot charts
New workflow: 3 hours’ work of the admin panel
Run a script to apply voting rules
Run a script to generate ballot charts