Campaign Finance methodology
Campaign Finance turns public campaign-finance filings into a plain-language funding profile for each member of Congress. This page documents exactly how every number is computed, so anyone can audit it. The design goal is bipartisan defensibility: objective, denominator-transparent figures with no values judgment baked into a score.
Source
- Federal: U.S. Federal Election Commission — OpenFEC API
/candidate/{id}/totals/(aggregate, public domain). One call per member; no raw individual-contributor rows are stored or displayed in v1. Each figure links to the exact underlying FEC query. - Member ↔ FEC crosswalk: the community-maintained
unitedstates/congress-legislatorsdataset. - Cycle selection: the member's most recent labeled election cycle. FEC returns per-cycle rows plus a null-cycle "full-election" summary row that duplicates them; Campaign Finance ignores the null-cycle row so no figure is ever attributed to the wrong year.
The verification floor (why you can trust the numbers)
Before any profile renders, computed receipts must reconcile against the FEC's own Form 3 summary total: receipts must equal the sum of its eight receipt categories (individual, party, other committee, candidate self-funding, transfers, loans, other receipts, offsets). If a category field is renamed or goes null (schema drift), the residual balloons and the build fails loudly rather than publishing a wrong number about a named person. On real data this residual is 0.00%.
What we compute
Every figure is labeled with its cycle, an "as-of" date, and its denominator caveat.
| Figure | Formula | Note |
|---|---|---|
| Direct-contribution share | (itemized + unitemized individual + PAC + party) ÷ (receipts − self-funding − loans) | Share of receipts that arrived as direct contributions vs. transfers and other receipts. A low value is a transfer-funded structure (leadership PACs / joint-fundraising committees), not a disclosure failure — transfers are themselves disclosed (see below). Scoped to the candidate's own committee; does not cover outside Super-PAC / 501(c)(4) spending (true "dark money" — a separate, later figure). |
| Small-donor share | unitemized (<$200) ÷ total individual $ | Proxy with a known limit (below); shows "—" when a committee itemizes everything. Size-based measure via schedule_a/by_size supersedes it. |
| PAC share | PAC ÷ (PAC + individual) | Neutral structure, not a judgment. |
| In-state share | itemized in-state $ ÷ itemized individual $ | Itemized-only denominator (unitemized carry no address). Ships once a real OpenFEC key is wired. |
| Donor concentration | top-20-donor-by-raw-name-string share | Exact and auditable; no fuzzy dedup. One raw Schedule A pull, current cycle only. Ships with a real key. |
The #1 bias guard: unitemized money is NOT dark money
Contributions under $200 are disclosed in aggregate — the FEC does not require itemization, but the money is fully reported. Campaign Finance counts unitemized dollars as accounted-for in the numerator of disclosure completeness, and never folds them into a "dark / undisclosed" bucket. Folding them in would systematically penalize small-dollar-heavy campaigns — the single largest source of partisan bias in a naïve completeness score. Self-funding and loans are tracked as their own labeled category, never merged into "individual" or "traceable."
Known limitation: small-donor share and all-itemizing committees
A contribution is itemized once a donor's cycle total passes $200 — but a committee may itemize every contribution regardless of size, and the major processors (ActBlue, WinRed) itemize each transaction by default. Such a committee reports $0 unitemized even when it has many sub-$200 donors; that money sits inside the itemized total. So unitemized ÷ individual understates grassroots support for all-itemizing committees, and a raw 0% would falsely read as "no small donors" — the same asymmetric-bias failure as the guard above, in reverse.
Until the size-based measure ships, Campaign Finance shows "—" (not 0%) whenever a committee reports $0 unitemized against nonzero itemized. The correct fix, planned for v1.1, sources small-dollar share from the schedule_a/by_size aggregate (the under-$200 size bucket), which counts contributions by dollar size independent of itemization status. Note this supersedes an earlier plan to read the split from /committee/{id}/totals/ — that endpoint carries the same unitemized field and the same blind spot (confirmed: Whitehouse 2024 reports $0 unitemized at both the candidate and committee level).
What we deliberately do NOT do
- No blended composite score. Any weighting across figures encodes a values judgment and is the prime bias-attack surface. Campaign Finance ships one objective completeness number plus an unweighted profile — never a single ranked "grade."
- No donor-propensity / likelihood-to-give modeling. Modeling is scoped strictly to transparency, completeness, and diversity.
- The auto-generated "notable context" line is derived only from figures already shown on the page, is machine-labeled as such, and never imputes wrongdoing.
Versioning
Campaigns will optimize to whatever Campaign Finance measures (Goodhart's law), so the methodology is versioned; material changes are dated here. The Transparency Score/stamp (provisionally named "HillTrack") and outlier flags are held until after the November 2026 midterm — pre-election filings are incomplete and constantly amended exactly when demand peaks, and a scoring tool shipped mid-election compounds perception risk.
- 2026-09-05 — Small-donor share now shows "—" instead of 0% when a committee itemizes every contribution (reports $0 unitemized against nonzero itemized). Planned v1.1 source for the metric changed from
/committee/{id}/totals/toschedule_a/by_size(the earlier plan shared the sameunitemizedblind spot). See "Known limitation" above. - 2026-09-05 — Renamed the completeness metric to "Direct-contribution share" and reframed its copy. A full-chamber build surfaced transfer-funded committees (e.g. leadership at ~18% under the old label) whose money is disclosed transfers, not hidden — the word "completeness" wrongly implied the remainder was undisclosed. The formula is unchanged; only the label and framing changed so a transfer-funded structure is not read as a transparency failure.