Campaign Money as a Network

The FEC publishes edges, and leaves you to decide what the nodes are

Democracy’s Data

Last updated September 15, 2026 at 4:42p EDT

Outside money in an American election arrives as a ranking. The ten biggest spenders, the ten most-targeted races: that is how a news story tells you what super PACs did in 2024 — the committees that may raise unlimited sums so long as they spend them on their own, never in coordination with a candidate — and every number in it is correct.1 It is also half of what the file says.

The Federal Election Commission publishes independent expenditures — money spent to help or hurt a named candidate by someone other than that candidate’s own campaign, without the two of them coordinating — one row at a time, and a row is not a fact about a committee or a fact about a candidate.2 It is a fact about a pair. A spender, a target, a direction, an amount. A ranking is what you get when you add up one end of every pair, and the other end goes in the bin.

The question that needs the other end is one a citizen has a stake in. Is outside money a crowd of committees each minding its own private set of races? Or is it a small number of committees piling onto the same few people at once? Those are different accounts of how organised money works, and a ranked list cannot tell them apart. So: what does the money look like drawn as a network — every committee and every candidate a point, and a line between two points wherever one paid to help or hurt the other — and what does the web show that a table cannot?

The test

The data is the file of independent expenditures for the 2024 cycle that the Commission publishes whole, for anyone to download, at fec.gov (the address is under Sources). The 16 junk filings that this book’s independent-expenditures brief identifies are removed first, on the same rule; 73,433 rows remain, carrying $4.75bn.

This source can answer the question because each row names both ends and the tie between them. The committee that spent, the candidate it spent on, whether the money was for or against, and how much. Two named endpoints and a weight is exactly what a network is made of: in the vocabulary of the figures below, the endpoints are nodes, the tie between them is an edge, and the amount is the edge’s weight. Almost no other public record of political money carries all four. What the record does not carry is any checking. It is what filers said about themselves, for the reasons this cluster’s chapter on campaign finance disclosure sets out.

The test is to collapse the file into pairs, decide what a node is, and draw it.

The data

One row of edges.csv is one committee, one candidate and one direction, with every filing for that combination added up. The three largest:

Spender id Candidate id Side Amount
C00669259 P00009423 for $498,930,180
C00825851 P80000722 against $286,056,159
C00878801 P00009423 against $112,266,880

Four columns, and what each holds:

Column What it holds Measurement
sid the FEC identifier of the committee that spent the money categorical
cid the FEC identifier of the candidate it was spent on categorical
side S for supporting, O for opposing — written by the filer dichotomous
amount dollars, summed over every filing for that pair and side continuous

Collapsed that way, the cleaned file is 4,022 edges joining 879 committees to 745 candidates. Two cleaning decisions produced those three numbers, and both are decisions about what counts as one actor.

The file does not say what its nodes are. Here it is counted three ways on the candidate side and two on the committee side. Nothing changes but the rule for deciding when two rows are about the same thing.

Rule Side Nodes it produces
FEC candidate ID candidates 745
candidate name, upper-cased candidates 974
candidate name, letters only candidates 962
FEC committee ID committees 995
committee name committees 1,077

Counting candidates by the identifier the FEC supplies gives 745. Counting by the name the filer typed gives 974, nearly a third more. Both rules are defensible, and they disagree about how many people this money was spent on. Look at what happens to one candidate:

FEC candidate id Name as filed Committees Money for or against
P00009423 HARRIS, KAMALA 266 $966,596,407
P80000722 HARRIS, KAMALA 97 $337,422,895
S6CA00584 HARRIS, KAMALA D 2 $98,776
P90022716 HARRIS, KAMALA 1 $15,000
P90000423 HARRIS, KAMALA 1 $7,404
P00004523 HARRIS, KAMALA 1 $250

Those are 6 identifiers and one person. P00009423 is the identifier the Commission gave her when she first ran for President, in 2019, and it served again in 2024. P80000722 is not hers at all: it is Joe Biden’s presidential identifier, which filers went on writing beside her name after he withdrew in July and she took over his campaign.3 S6CA00584 is her Senate identifier, used by somebody filing a row about a presidential race. Merge on the identifier and she is two large nodes and four small ones. Merge on the name and she is one node, but so is every pair of different people who happen to share a name.

The second decision is about rows that name no candidate at all:

Rows Share Dollars Which
73,433 100% $4.75bn expenditures after the sixteen junk filings are removed
9,469 12.9% $587.1m of those, the ones naming no candidate identifier

12.9% of the rows, carrying $587.1m, cannot be attached to a candidate node. They are not missing money, because the amount is right there. They are missing an endpoint, and an edge with one end is not an edge. Every figure below uses the FEC identifier and drops those rows. sid, cid, side and amount are the whole of what the figures read.

Take one committee and follow its edges. MAKE AMERICA GREAT AGAIN INC., the main super PAC supporting Donald Trump, is 7 rows of edges.csv, and those rows are everything the graph knows about it:4

Candidate id Name as filed Side Amount
P80000722 HARRIS, KAMALA against $286,056,159
P80001571 TRUMP, DONALD for $57,719,742
P40010977 HALEY, NIKKI against $9,898,082
P40011991 DESANTIS, RONALD against $9,188,675
P40013039 DESANTIS, RON against $3,096,691
P60008521 CHRISTIE, CHRISTOPHER against $115,310
P40011793 KENNEDY, ROBERT against $6,200

Read down the rows and you have read the node. It has 7 edges, so its degree — the count of edges touching a node — is 7. $286,056,159 of its $366,080,859, 78.1%, is a single edge, and its far end is P80000722: Joe Biden’s identifier, the one filers kept writing after Harris took over his campaign. So that one edge holds the committee’s spending against Biden before July and against Harris after it, added together, and the name beside it is only the one filed most often. One edge is for Donald Trump. The other 5 are against his rivals for the Republican nomination and against Robert Kennedy, and Ron DeSantis is among them twice, under two identifiers, which is the identity problem above inside one committee. A ranking would report this committee as one number, $366,080,859. The graph reports it as a shape: one thick red edge, one green one, and a fan of thin red ones. A node with far more edges than most, like the 114-edge committee that turns up below, is called a hub.

Before you read on, commit to a number. Of the 879 committees in this graph, how many do you think spent on exactly one candidate? Write down a share of the total, not a feeling. Then do the same for the candidates: how many had exactly one committee spending on them?

What it says about democracy

Figure 1. The thirty largest committees and every candidate they spent at least a million dollars on. 153 nodes, 248 edges, 70.6% of all cleaned independent expenditure. A node-and-link drawing is the only form that keeps both ends of a row, which is what the question is about. A bar chart of the same money would have to pick an end and add it up. Squares are committees and circles are candidates, area is money, and edge colour is direction. Hover a node to isolate its neighbourhood; drag one to feel what it is attached to.

Position in this figure is not data. The coordinates come from a force-directed layout: a simulation in which every edge pulls its two nodes together like a spring and every node pushes all the others away, run until it settles, then frozen. Run it again from a different random start and you get a mirror image, or a rotation, or a differently tangled version of the same graph. Only two things on the page mean anything: which nodes are joined, and how thick the joins are.

What the picture shows that a ranked table cannot is the overlap. The large committees do not each sit above a private set of races. They share targets, in clusters, and a candidate at the centre of a cluster is being spent on by many committees at once. HARRIS, KAMALA is the extreme case, reached by 266 separate committees: a hub, in the sense above, and the largest in the graph. Nothing in the file records that as a fact about her; it is a property of the pairs, and only appears when you keep them.

Now the rest of the graph, which is mostly the opposite.

Figure 2. How many nodes have how many connections, both sides of the graph on one pair of log axes. On a log scale each step along the axis multiplies by ten instead of adding a fixed amount, so 1, 10 and 100 sit evenly spaced. That fits here because the interesting part is the tail: on ordinary axes the handful of nodes with a hundred connections would flatten everything else onto the floor. Hover a point for who is there.

356 of the 879 committees spent on exactly one candidate, and 321 of the 745 candidates were touched by exactly one committee. The median on both sides — the node in the middle, with as many nodes above it as below — is 2. At the other end, NATIONAL RIFLE ASSOCIATION OF AMERICA POLITICAL VICTORY FUND reaches 114 candidates. That shape, nearly everyone at one or two and a few nodes far out on their own, is the heavy tail the distributions brief argues about, and it has the same consequence here: a mean number of connections would describe nobody.

Two committees can look identical in a ranked table and sit in completely different places in this graph. The ones with many connections are mostly doing one thing:

Committee Total Against Candidates
PRESERVE AMERICA PAC $112,321,880 100.0% 2
AB PAC $86,042,846 100.0% 1
DSCC $43,754,853 100.0% 5
Vote Alaska Before Party $10,100,649 100.0% 4
PROJECT RESCUE AMERICA $8,531,652 100.0% 1
Republican Accountability PAC $22,787,964 99.8% 3
American Crossroads $60,227,819 99.6% 5
NRSC $21,361,847 99.6% 6

Of the 97 committees that spent more than five million dollars, 26 spent more than ninety per cent of it against somebody. The graph shows why that is structural rather than a matter of taste. A committee spending for a candidate is tied to that candidate, so its reach is bounded by how many people it is willing to endorse. A committee spending against has no such loyalty and can spread itself across every opponent it dislikes. The widest committees in Figure 1 are mostly red for that reason.

What this brief cannot tell you

This is not a picture of who funds whom. Independent expenditure is money a committee spends on its own, and the file records the committee rather than the people who gave it the money. The arrow runs from a PAC — a political action committee, the vehicle through which outside money is spent — to a candidate. The arrow from a donor to the PAC is in a different file with a different structure, and joining the two is a project rather than a step.

The nodes are a decision, and this brief made it. Every figure uses the FEC identifier, which puts Kamala Harris on the page twice and drops the 12.9% of rows carrying no identifier. Merging on the name would give a different graph with different degrees. Neither graph is the true one, which is what the identity table above is for.

sup_opp is one character, written by the filer and checked by nobody. The whole red-and-green reading of Figure 1 rests on it. A committee that mislabels an attack as support moves an edge from one colour to the other, and nothing anywhere fails.

Finally, Figure 1 is 70.6% of the money and a much smaller share of the graph, 153 of the 1,624 nodes. It was chosen to be legible. The full graph drawn honestly is an unreadable ball of 4,022 edges, and that is not a failure of drawing. It is what the object is.

What you should have learned

Extensions

None of these is answered above, and every one can be answered from the tables the Sources section hands over.

Two stretch ideas point past the spreadsheet. Take one of the clustered candidates in Figure 1 and look up the committees around her on fec.gov. Do any of them share a treasurer or an address? The edge list will not tell you, but the filings behind it might. Second, download the 2022 cycle’s file and build the same edge list, to see whether the shape of the tail belongs to 2024 or to the category.

Sources

Data

The data itself

Every figure above is drawn from these tables. They are plain CSV, they open in a spreadsheet, and they are yours to take further.

candidates.csv, committees.csv, edges.csv, graph_edges.csv, graph_nodes.csv, identity.csv

One more file is not data about the subject – it is how this chapter checked its own numbers: facts.csv, the individual numbers the text above quotes.

Rebuild this data yourself, with an AI assistant
I want to rebuild a public dataset from its original source, without any
starting files. Please do the following and show your work.

THE SOURCE. Federal Election Commission, bulk download of independent
expenditures for the 2024 cycle — money spent for or against a
candidate by groups forbidden from coordinating with them. One CSV,
about 19 MB, no account or key:
https://www.fec.gov/files/bulk-downloads/2024/independent_expenditure_2024.csv
Each row is one reported expenditure: the committee spending, the
candidate named, whether the money supports or opposes them, and the
amount. The FEC publishes what is filed and does not check that it is
true: sixteen rows of junk filings, each claiming over a hundred
million dollars, sit alongside the real ones and have to go before
anything is summed.

WHAT TO BUILD.
1. Drop the rows above a hundred million dollars — sixteen of them,
   fantasy filings plus one real filing exported nine times — and
   total what remains.
2. Collapse the rest to pairs: one row per committee, candidate and
   side, with the dollars summed. Count the distinct committees, the
   distinct candidates, and the pairs. This is the file as a network,
   which is the shape every published summary throws away.
3. Count the rows naming no candidate ID at all — money the file
   cannot join to anybody.

CHECK YOUR WORK. The copy this book used was downloaded in August 2026.
If your rebuild matches it, you should find:
- 73,449 rows raw; 73,433 after the sixteen-row cut
- $4,753,715,423.49 of cleaned spending
- 879 spending committees, 745 candidates, 4,022 pairs
- 9,469 rows carry no candidate ID
The FEC amends this file as corrections arrive; small movements mean
revision, not error.

  1. The Commission’s own account of independent spending and who may do it: https://www.fec.gov/help-candidates-and-committees/making-independent-expenditures/.↩︎

  2. The statutory definition is 52 U.S.C. § 30101(17): https://www.law.cornell.edu/uscode/text/52/30101.↩︎

  3. The Commission’s pages for the two identifiers: https://www.fec.gov/data/candidate/P00009423/ and https://www.fec.gov/data/candidate/P80000722/. Biden’s withdrawal and endorsement of Harris, 21 July 2024: https://www.npr.org/2024/07/21/nx-s1-5024253/biden-drops-out-2024-presidential-election.↩︎

  4. Its filings are at https://www.fec.gov/data/committee/C00825851/.↩︎