Analyst Notes: Untangling campaign finance data
How we combined four FEC data sources to get accurate campaign finance data.
When I set out to write about how much federal candidates were raising and spending for the 2026 midterm elections, I thought it would be a cinch: campaign finance data, managed by the Federal Election Commission (FEC), has publicly available campaign, candidate, and finance data, all the way back to the 1980 election (an analyst’s dream!).
The FEC is an independent federal government agency that oversees campaign finance laws and public disclosure of campaign data. They even have pages dedicated to reporting aggregations of money raised and spent for this year’s midterms.
So, my first stop was the FEC’s campaign finance data page.
So much data!
I downloaded the 2025–2026 “Candidate summary” file. This file is a gold mine of a candidate’s finances, including critical data points to understanding candidate fundraising and spending:
- Total receipts: how much money a candidate has raised
- Total disbursements: how much they’ve spent
- Candidate name: for example, “Martha Washington”
- Candidate ID number: something like “H8VA01233,” which is a unique candidate identifier and indicates which race they are running in. “H” is for “House, “S” is for Senate, and “P” is for president.
- Candidate party affiliation: Democrat, Republican, Independent, Green, other
Wait a minute: seeing double
And struck gold, I had! Specific values for fundraising and spending as far as my mouse could scroll. But my excitement quickly hit a snag — I was seeing duplicate candidate names with identical values in multiple races. This data gold started to feel like fool’s gold.
Generally, I was noticing three kinds of duplicates:
1) A candidate, in a House AND Senate race, with identical financial information.
Duplicate names, different identification numbers
2) A candidate, in a House AND Senate race, with different financial information.
Duplicate names, different IDs and different financial info
3) A candidate, in a House OR Senate race, with identical financial information but different unique identifiers.
Duplicate names, different IDs in the same race
Duplicated candidate line items introduced data complications. It meant that I couldn’t simply aggregate the “total receipts” (aka total fundraised) column, because it would artificially increase the “total fundraised” or the “total spent” value. And it also meant that I didn’t know with certainty which race a candidate was running in.
So which, of all of these duplicate candidates, should I have kept? And was the FEC data wrong??
No, the FEC data wasn’t wrong. But it was trickier to navigate than I expected! I needed to figure out how to de-duplicate.
Finding more data
The FEC provides a lot of data files, all with different variations of campaign/candidate funding data. But I needed backup. This when my rockstar colleague Nicole (wearing huge sunglasses and a guitar slung over her shoulder, backlit by a spotlight and smoke machine fog) came to my aid.
She helped me identify another file that would aid in my effort: The “Candidate master” file, under the “Candidate files” section. This file had a column with information I was missing from the “Candidate summary” file:
- Election year: Candidate's election year from a Statement of Candidacy or state ballot list
The original file didn't have a year column; could it have been that some of the duplicates were the same candidates running in different election cycles?
The new file also had some familiar columns as seen in the “Candidate summary” file, like:
- Identification number
- Candidate’s name
- Party affiliation
If you’re a vlookup aficionado like myself (or a more sophisticated data mapper), you may have recognized the same thing I did: that I can use the unique “Identification” number from both files in order to map “Election year” into the “Candidate summary” file.
Here is a visual aid to show how I used the overlapping columns, from different files, to map an election year value to each candidate:
Combining two data sources
Great! With this addition, I could eliminate any candidates with an election year value that wasn't 2026.
But there were still duplicates: some candidates had multiple line items for the 2026 election.
Nicole (strumming a dramatic power chord on her guitar, holding her hand high in the air for emphasis) found yet another file, “Statements of candidacy,” that had yet another data point that would allow us to de-duplicate:
- Receipt date: filing date of candidate’s race
This column showed the filing date of each candidate’s race. In an instance where a candidate began a 2026 House campaign and later switched to a 2026 Senate campaign (or vice versa), this line item tells us which race is the current, active race.
I used "Receipt date” to de-duplicate candidates on when they entered their race.
This was the case with Colin Allred, who filed a Senate race in July 2025, but filed separately for a House race in December 2025. Knowing this, we could eliminate the Senate race.
I de-duplicated candidate line items on receipt date, aka the date a candidate filed for a race.
But there was one last consideration: a single candidate can have multiple committees that report funding. Which committee should we pick?
Campaign finance refresher: committees
Before I get into Nicole’s third and final data discovery, remember that candidates are required to have a principal campaign committee registered with the FEC to raise and spend campaign funds. A candidate can also authorize other committees, but only one is designated “principal” on the FEC paperwork.
Remember also that the “Candidate summary” file is a summary of all receipts and disbursements from all committees. So when Nicole found a file called “Candidate-committee linkages,” which included committee designations, it was her shredding guitar solo that was the third and final de-duplication solution.
This file gave us:
- Committee ID: A unique nine-character alpha-numeric code assigned to each committee by the FEC. The committee ID for a specific committee always remains the same.
- Committee designation: where “P” = principal campaign committee of a candidate
By filtering on principal committees, we could map principal committees to candidates and use the funding data associated with them.
With more data, I could de-duplicate candidates for the current 2025–2026 midterm.
Similar to the “election year” filter, we only included candidates in this analysis based on funding from their principal committee.
Voila! De-duplicated data
Okay, it wasn’t quite as simple as “voila,” but finding more data points, restricting data based on election year and principal committee, and de-duplicating based on receipt date allowed us to knock out the large majority of redundancies with high confidence.
Some candidates still did (and do, as we update these pages) require manual review to make sure we’re getting the correct candidate line item.
But this approach of data combination, filtering, automated duplication flagging, and review of low confidence duplications, allowed us to set up a system that gives us automated, up-to-date candidate campaign finance information.
Candidate finance data, without duplicates!