Play Live Radio
Next Up:
0:00
0:00
Available On Air Stations
Watch Live

Attendees stand in line next to a “Tax the Ultra-Rich Now” bus parked outside the Curran Theater before the start of a "Ballots Over Billionaires" rally in San Francisco on Oct. 3, 2026.
Manuel Orbegozo
/
CalMatters
Attendees stand in line next to a “Tax the Ultra-Rich Now” bus parked outside the Curran Theater before the start of a "Ballots Over Billionaires" rally in San Francisco on Oct. 3, 2026.

How we classified nearly $900 million in contributions from individuals, companies and PACs

This story was originally published by CalMatters. Sign up for their newsletters.

Millions of campaign finance contributions poured in over the 2025-2026 election cycle to fund California candidates, proposition committees that support or oppose ballot measures, political action committees (PACs) and other political committees. Due to the scale of contributions and the fact that a large sum of this money is wrapped up in ambiguously named PACs, the raw data alone offers limited insight into what types of people and institutions are funding political campaigns.

In order to uncover patterns behind who is bankrolling the candidates and propositions on the ballot this year, CalMatters classified and published financial contributions to the gubernatorial, insurance commissioner and statewide proposition official campaign committees (for example, Proposition 39, which would have required identification for voting). We did this by determining the industry affiliations of the largest contributors to each of those campaigns during the 2025-2026 election cycle. All results are published on our Voter Guide.

Advertisement

Our team classified nearly $900 million in contributions raised by these campaigns and proposition committees and processed tens of thousands of contribution records. We analyzed raw data on state-level campaign contributions maintained by the California Secretary of State, accessed by using its Power Search tool.

Methodology

Contributor Selection

CalMatters focused on the largest contributors to the gubernatorial, insurance commissioner and statewide proposition official campaign committees. We assigned one of 20 classifications to contributors that gave at least $5,000 to each candidate or proposition across the 2025-2026 election cycle. Contributors who gave less than $5,000 in the same period were not categorized. (See: Entity resolution)

Industry Categories

CalMatters designed a custom schema of industry categories to better serve our readers. The categories largely align with the North American Industry Classification System (NAICS) codes, which is the standard used by federal agencies. We consolidated NAICS codes where appropriate and based some of our categories on more granular NAICS subsectors.

In several cases, we grouped certain contributors into a custom category based on shared interests not reflected well with NAICS:

Major Donor categoryThis category was a fallback for individuals who didn't clearly provide an employer we could categorize. Individuals who listed their employer as retired, student, homemaker, unemployed, self employed, or some variation of none automatically fell into this category. When an individual listed employers from different industries across multiple contribution records, they were also placed in the “Major Donor” category if we could not determine that they were primarily aligned with a single industry. (See: Multiple possible classifications)

Advertisement

Technology categoryGiven reader interest with technology companies in the state, and that NAICS does not provide a distinct code, we created a custom category to represent the technology industry.

We classified entities whose business centered around apps or websites to facilitate business as “Technology,” even though those entities could be categorized differently. This includes companies such as Uber, AirBnB, Amazon, Netflix, Meta and Google, as well as companies engaged in artificial intelligence, cryptocurrency and software.

Additional custom categoriesOther custom categories not reflected in NAICS include “Self-Funding,” “Candidates/Political Parties” and “Small Donors.”

See: Appendix: CalMatters campaign finance categories

Classification Overview

CalMatters assigned contributors to a category through a multi-step process. We tried to match contributors to NAICS codes or our unique categories, by using five different techniques.

In order, we attempted to match contributors by:

  1. Comparing existing NAICS codes and similar categories from multiple external data sources
  2. Comparing contributors’ names, employers or occupation to a custom list of keywords that highly correlated with specific industry categories  
  3. Using a CalMatters machine learning classifier to assign codes using the semantic meaning of a contributor’s name or employer (company) and occupation
  4. Using two large language models (LLMs) to assign a classification to each unique contributor
  5. Manually reviewing the data

Throughout these steps, CalMatters code flagged for manual review any instance of doubt. For example, if classifiers disagreed on a contributor’s category or if a contributor was only able to be classified by an LLM, it was flagged for manual review. CalMatters also performed manual spot checks on contributors who had been successfully classified without manual review.

When we could not reliably identify the industry of a contributor, that contributor was left uncategorized.

We categorized organizations and businesses directly and we classified individuals by the employer listed in their contribution record with a few exceptions. For example, we grouped individuals who listed their employer or occupation as retired, student, homemaker, self employed or some variation of none into the “Major Donor” category. We also manually evaluated how to classify contributors that reported more than one employer across multiple contributions, or if they could be classified in multiple ways. (See: Major Donor category)

Campaign finance tends to be a web of interconnected political committees that contribute to one another before using that money for independent expenditures or landing in the coffers of an official campaign committee. To account for this, we categorized contributions from a political committee based on the classifications of all contributors that gave it $5,000 or more and, in certain cases, smaller contributions when we could reasonably determine it came from employees of a single company, a union or an association's membership. (See: Political Committees)

Data Sources

H1B Employer Hub
CalMatters collected data from the H1B Employer Data Hub, which provides a list of employers that have submitted petitions to hire foreign workers and the NAICS code associated with the employer. If the name of a contributing organization or a contributor’s employer was identical after basic data normalization (e.g. stripping out extra whitespace, converting names from uppercase) to an employer listed in this database, that contributor was assigned the corresponding NAICS code.

EDDCalifornia’s Employment Development Department (EDD) also maintains a search tool to find California businesses and their associated NAICS codes. CalMatters developed a program to search each contributing entity's name. If company names matched exactly after basic data normalization, the contributor was assigned the corresponding NAICS code. If we found a likely partial match, such as comparing “KAISER” to “KAISER PERMANENTE,” we assigned the company’s corresponding NAICS code. In cases where we found multiple partial matches, we matched with the company with the highest number of employees.

Open SecretsOpenSecrets is a nonprofit organization that collects and analyses data on money in politics, including classifying campaign finance contributors according to its custom industry coding system. CalMatters looked for contributors in our data that also appeared in classified data we received from OpenSecrets. When a match was found, we translated the OpenSecrets category to the CalMatters schema.

To match individuals to the OpenSecrets data, we built a record linkage algorithm to determine when individuals were the same across datasets based on their name, employer, occupation, city, state and zip code. Organizations were linked across the contribution data and OpenSecrets data using two methods: a fuzzy matching algorithm and name variant matching. For example, we created processed versions of organization names by stripping text in parentheses and removing corporate suffixes. If the processed names were shared across both datasets (e.g. Google vs. Google, Inc. and Affiliated Entities), they would be linked.

Matching Using Custom Keywords

CalMatters developed a custom list of keywords, each one exclusively associated with one of our custom categories. Categories were assigned based on keyword matches to the contributor’s name, employer or occupation (all of which are fields listed in the contribution record).

For example, “law office” and “cattle rancher” are keywords. If a keyword is frequently associated with the contributor being always categorized into a specific category, we use the keyword to indicate they are likely in that category.

Matching Using a Custom Machine Learning Classifier

For remaining contributors that were not assigned a code using the methods above, CalMatters developed a machine learning classifier to assign a custom code using the semantic meaning of a contributor’s name or employer (company) and occupation.

The classifier begins after encoding each existing entity (e.g., a contributor’s employer/occupation in the case of individuals, name in the case of organizations) into an embedding vector using Microsoft’s all-MiniLM-L6-v2 sentence transformer (chosen for its plain English corpus). A logistic regression was then trained on each entity’s embedding vector and its associated category code.

This model is then applied on the sentence-transformer embeddings for remaining unmatched entities, to generate a code and associated confidence score for each embedding of unmatched entities. These classifications were all cross-referenced against other classification methods.

For the machine learning classifier, individuals’ occupations were used as an additional signal for the model, providing context for cases when an employer’s name may not include words that help infer industry. For example, if a contributor listed their employer as “Altais,” a word with no semantic meaning associated with the company’s industry, and their occupation was “physician,” the model could still infer the contributor is likely associated with healthcare.

We also tried to guard against cases in which an entity may contain words with semantic meaning unrelated to its industry, like State Farm, or in which an entity’s name contains many words in common with an entity from a different industry (e.g. Credit Union of Southern California vs. American Civil Liberties Union of Southern California) through the keyword matching step, described in the section above. Common employers (e.g. State Farm, Airbnb, Google, Meta, Comcast, and many more) and entities with strong single-token signals that were already assigned categorizations through keyword matches, were not processed by the machine learning model. Common business endings that are unrelated to a company’s industry, like “and affiliated entities”, “corporation”, “and its subsidiaries” were also removed to minimize unmeaningful token overlap between entities.

Matching Using Large Language Models

CalMatters used large language models — Claude and Gemini — to assign a classification to each unique contributor. Gemini performed Google searches on the name of each organization that contributed, as well as on the name and employer of each individual that contributed, and provided a summary of each contributor and the industry they were associated with. As a second step, Gemini used these industry summaries to classify the contributor according to our custom schema.

Claude classified well-known entities, such as labor unions, automatically, and similarly performed web searches on all other contributors. The LLMs assigned confidence levels of low, medium and high to each industry summary and categorization. LLMs were never the sole source of a final classification; discrepancies between the LLM and other classification sources were flagged for manual human review as well as cases where the LLM was the only method that provided a high-confidence classification.

Matching Using Human Review

Finally, a human manually reviewed the generated classifications and corrected any discrepancies or addressed any flags produced by the system.

We flagged in any instance where we had reason to doubt. For example:

  • All instances where the LLM classification disagreed with other methods of classification were directed to manual review. 
  • Not all contributors had a match in the reference data from H1B Employer Data Hub, California EDD and OpenSecrets or were able to be classified via keyword. So any contributor for which a LLM was the only classification source was reviewed manually. 
  • Contributors for which we could not reliably determine an industry were left uncategorized and reviewed manually. 
  • We developed a system to flag disagreement between classification methods depending on the accuracy of the method and its confidence in the classification. For example, if the machine learning classifier and the LLM agreed on a category, but both cited low confidence, that classification would be flagged for review. If the category assigned by an EDD or H1B match aligned with the category assigned by an OpenSecrets match (both high-confidence methods), but disagreed with a low-confidence machine learning prediction, it would not be flagged.  
  • Contributors suspected of being the same entity, but received different categorizations, were flagged for manual review.

The reviewer would address each contribution flagged for manual review, verify the accuracy of the categorization and edit the results when required. Verification involved researching the individual, company or organization using business identity lookups, such as Cortera, company websites, ProPublica's awesome nonprofit explorer and news articles.

Contributions not flagged for review were also spot checked by the reviewer, and any categorizations that created uncertainty were verified using the process above. Because our manual review happened throughout our classification process, over time, the automated process became better at accurately classifying contributions.

Looping classifications

CalMatters conducted several rounds of classifications as new data came in. A regularly updated database of verified and categorized contributors helped avoid duplicating categorization efforts. If a new contribution record came in that matched an already-classified contributor or employer, that existing classification was assigned to the new contribution record.

Handling classification disagreements

When multiple sources provided an industry code for a contributor, these codes were compared for consistency. If high-confidence sources (e.g. H1B, EDD, OpenSecrets) agreed on a code for a contributor, that contributor was assigned that code. Cases where some, but not all sources agreed were treated on a case-by-case basis depending on the priority of the classification source. LLM and machine learning classifications were treated as the lowest priority, while classifications for an entity that had been manually reviewed previously overrode any contradicting classifications.

Political Committees

Most of the campaigns and propositions we tracked received a large amount of funding from political committees, including political action committees, political parties, candidate and ballot measures committees, and other recipient committees.As many political committees do not fit neatly into a single category due to receiving contributions from a wide variety of sources, CalMatters computed an industry breakdown for each committee. For example, if a committee received half of its funding from tech-affiliated contributors and the other half from insurance-affiliated contributors, 50% of the contributions made by this committee would be categorized under “Technology”, while the other 50% would be categorized under “Finance/Insurance.”

Similarly to how we classified candidate races and propositions, CalMatters determined which contributors gave $5,000 or more in total to each recipient committee over the course of the 2025-2026 election cycle and categorized each of these contributors individually.

Political committees that could not be entirely classified by their large donors were reviewed manually to determine whether or not they fit into a single industry. If the committee was closely aligned with a particular industry, think employee, union and association PACs, the proportion of funding the committee received from entities that contributed less than $5,000 was allocated to the manually assigned industry. If the reviewer determined the committee did not fit into a single industry category, the proportion that committee received in contributions less than $5,000 was marked as uncategorized.

In campaign finance data, political committee giving forms a complex web as committees often give to one another. To classify one committee, we also needed to classify all of the other committees that contributed to that original committee, which required processing the contributors to the second layer of committees as well. For each political committee that gave directly to one of the races or propositions we were classifying, CalMatters built a network of connected committees up to five layers deep. All connected committees were classified using the same method.

A single committee may use multiple IDs depending on the type of campaign finance filing; the ID used for reporting received contributions may be different from the ID associated with the same committee when they are a contributor. CalMatters used data on filer information from the California Civic Data Coalition to map the IDs used by a committee so that when a committee showed up as a contributor, we could pull contributions received by this committee based on the mapped ID. Filer IDs that were not included in the reference data were mapped manually.

CalMatters did not process the contributions received by federal committees since they are not typically tracked by the California Secretary of State. For this reason, federal committees were not given an industry breakdown. They were reviewed manually and assigned a single industry category in cases where that committee was associated with a particular industry. Those that did not clearly align with a single industry were left uncategorized.

Similarly, the entire amount given by a candidate committee was allocated to the “Candidates/Political Parties” category, since the candidate was responsible for how it was spent.

CalMatters found that some committees received very little, or no funding in the 2025-2026 election cycle. If the total contributions received by a political committee over this election cycle was less than 75% of what the committee gave during this election cycle, the committee was reviewed manually, and when possible, assigned a single industry category.

Power Search does not identify which contributors are federal committees. CalMatters identified committees as federal if the contributor’s name contained its federal ID (very common for federal PACs) or language that indicated it was a federal PAC (e.g. “FEC”, “fed pac” or “federal political action”). Committees were flagged for review as likely federal PACs if the committee appeared to be based out of Washington, DC according to its contributions or if the committee's received contributions indicated some of the contribution records would be found in Federal Election Commission data. CalMatters flagged candidate committees if the name of the contributor followed the pattern typical for these committees by listing a name, office and year. These committees were manually reviewed for confirmation.

Entity resolution 

In order to determine which contributors met the $5,000 threshold for classification, CalMatters linked multiple contributions made by a contributor to calculate how much they gave in total.

Within each contest, we aggregated contributors according to the name listed on the contribution record. However, contributors often use a different name across records. For example, “Google” and “Google, LLC and Affiliated Entities” are clearly the same organization, but would not be grouped together based on a name match. CalMatters developed a custom record linkage algorithm to identify when multiple names were likely all referring to the same company. Results were manually reviewed and mapped to a standardized name.

When individuals have the same name, but are two different people, their contributions should not be aggregated. Our record linkage algorithm for individual names scored how similar two contributors were according to their name, employer, occupation, city and zip code. Then, it flagged the contributors for review.

During manual review, a CalMatters journalist ran the names through people directories to determine whether there were records of multiple people with the same name living in the city listed on the contribution record. The reviewer used name, city, zip code, employer, occupation and contribution amount to determine which contributions should be linked. If a single contributor used very different names or identifying information across contribution records, all of their records may not have been successfully linked.

This process allowed CalMatters to distinguish different people who share the same name and gave to the same committee. It also allowed us to standardize the donor’s name when multiple names referred to the same person.

Data processing

The Secretary of State assigns IDs to contributors that are a recipient committee (political committees that receive $2,000 or more contributions from others in a year) and to major donors that contribute $10,000 or more in a calendar year. However, some contributors in the data had missing or incorrect IDs.

To ensure we could classify these political committees correctly, we looked for patterns in the committee’s name – such as when the ID was included in the name itself or a name that contained terms like “PAC,” “political action fund,” etc. We also used data from the California Civic Data Coalition, which tracks contributors’ names and IDs, to identify names in our data that are known to be connected to a filer ID. We manually reviewed each contribution record to assign the correct ID to the contributor.

To our knowledge, there is not comprehensive data available on all existing names used by a committee. Since committees often use different names across contributions and not all committees contain language that indicates it is a political committee, we may not have been able to identify all cases where a committee was missing an ID.

Limitations

Individuals who contributed

This analysis concentrated on the largest contributors to each campaign and proposition. The industry breakdown of large contributors may not reflect the breakdown of smaller contributors.

We decided that if a company employee gave $5,000 or more, they likely aligned with the industry they worked for or there may have been coordination at the employer level to solicit contributions, which is not uncommon. That said, it is not possible to know what motivated each contributor to give.

Spotchecking successful classifications

Although we created a thorough system to flag classifications when there was doubt about the best industry code to use, if the sources were consistent with one another, there is a chance CalMatters would not have caught a classification error. To mitigate this, a CalMatters journalist manually reviewed a random sample of classifications that were not flagged for review. Those reviews helped identify any cases the models got wrong so we could work to update the classifiers accordingly.

Mapping issues

The NAICS and OpenSecrets categories did not always map cleanly to our custom schema, and in these cases the category code translation could have been unreliable. To mitigate this, we also used LLMs to categorize every contributor, and when there was a discrepancy, the match was flagged for review.

Multiple employers

In some cases, individuals listed multiple employers across contribution records. During manual review, we found that some individuals were indeed associated with multiple industries.

We typically classified these individuals in the “Major Donor” category, particularly if one of the disclosures by the contributor identified themselves as retired, or not employed, unless we were able to establish reasoning to apply to a specific category.

For example, Reed Hastings identified his employer three different ways — “Netflix,” “NA” and “Not Employed.” Since Hastings is the CEO of a major company whose business is related to technology, CalMatters categorized his contributions as "Technology" rather than "Major Donors." (Why not “Entertainment”? See: Technology category)

Similarly, businesses and organizations may span multiple industries, but were assigned a single classification according to their primary function.

Political committee looping

A small subset of committees had cyclical dependencies where a political committee received contributions from a committee it had also donated to. Since committees are classified by the industry of their contributors, this causes the classification process to break. For these cases, we determined which committee received less money from the other and classified that committee first, leaving the money received from the dependent committee unclassified. The industry distribution of the other committee was then calculated as usual.

Entity resolution scope

Due to the scale of the data, name variant resolution was not done on entities that did not have the potential to cross the $5,000 threshold. It is possible that some contributors may have contributed more than $100 in aggregate if they made contributions under different spellings of their name, but it is unlikely that they would aggregate to more than $5,000. Similarly, small contributors to a committee who shared the same name were treated as the same person.

While we built several safeguards to resolve similar entities, there may have been misaggregation that meant some donors were not included in our analysis.

Federal committees

While we made great effort to identify federal committees and identify committees with missing IDs, we may have missed some if they did not have language in their name that would identify them as a political committee or if the committee used a name variant not tracked in the California Civic Data Coalition ID maps.

Conclusion

In total, our team categorized nearly 60,000 contribution records from individuals and organizations and processed close to 1,000 political committees, amounting to nearly $900 million in campaign finance contributions raised by gubernatorial, insurance commissioner and statewide proposition official campaign committees and over $1 billion in contributions received by committees that were indirectly linked to those candidate and proposition committees.

Through our extensive manual review process, the CalMatters team reviewed more than 2,500 unique categorizations, more than 1,000 recipient committees and suspected PACs, and reviewed nearly 4,000 contributor names to determine how to link entities.

CalMatters analysis of campaign finance contributors helped uncover some of the major influences behind the propositions on Californians’ ballots this year. For example, the Building a Better California PAC spent nearly $400 million this cycle. More than $200 million of this went toward supporting Proposition 41 and 42, which would make it harder to pass new special taxes and ban new taxes on personal property. These propositions received virtually all of their funding from Building a Better California; in total, other sources contributed just over $200K to these two proposition committees. CalMatters classifications exposed that the Building a Better California PAC was principally funded by finance and tech donors, helping voters who use our Voter Guide understand what types of organizations and people may benefit if these props were to pass.

The industry classifications also aided CalMatters journalists in reporting on Big Tech spending this election cycle. Reporters found that tech money substantially or in part funded half of the top 10 spenders among PACs that sought to influence state legislative races.

Acknowledgements

Thank you to Foaad Khosmood, a computer science professor at California Polytechnic State University and co-founder of Digital Democracy, for reviewing an earlier draft of this methodology.

We would also like to thank Jeremia Kimelman, CalMatters data reporter, and Thomas Gerrity, engineering manager for Digital Democracy, for sharing their expertise in campaign finance data and for helping develop the methodology.

Appendix: CalMatters campaign finance categories

You can download all the classifications we made and review the campaign finance categories we used on our public Github repo.

This article was originally published on CalMatters and was republished under the Creative Commons Attribution-NonCommercial-NoDerivatives license.

Polls have closed, and election returns are still trickling in. Check out our Voter Hub for updates.

Fact-based local news is essential

KPBS keeps you informed with local stories you need to know about — with no paywall. Our news is free for everyone because people like you help fund it.

Without federal funding, community support is our lifeline.
Make a gift to protect the future of KPBS.