Every race-page comparison surface on this site (the at-a-glance battlecard, geography split, gift-size distribution, momentum chart, partisan signals) reads from a uniform data shape per candidate. A candidate who has filed but reported very little finance data sits oddly in those surfaces: a $200,000 campaign and a $0 campaign do not read as a meaningful comparison. The tier classification gives that case a named, sourced treatment.
The race page presents finance-derived comparisons that only carry signal when both sides have reported activity. A candidate who has not yet built a donor base or raised a meaningful sum cannot anchor a geography or gift-size comparison; presenting their column anyway would equate them visually with $50,000+ campaigns and misrepresent the race.
Tier 1 candidates participate in every comparison surface. Tier 2 candidates appear on the race page in a separate "Also on the ballot" section near the top, with a link to their full /candidates/[slug] profile where everything we have about them still renders. The page shows the complete ballot; the comparison surfaces show the comparable subset.
A candidate is tier 1 if, as of the latest NetFile filing shown on the race page, they have either:
Candidates below both thresholds are tier 2.
The dollar floor at $10,000 is low enough to include marginal-but-real campaigns and high enough to exclude vanity filings. The 25-donor floor filters the one-self-loan case (a candidate who put in $15,000 of their own money has crossed the dollar floor but does not anchor the donor-base surfaces). The two criteria are joined by or rather than and so a grassroots campaign with many small donors is not penalized for low total raised, and a self-funded campaign with significant money is not penalized for a narrow donor base.
The threshold constants live in scripts/build-race-stats.mjs as TIER1_MIN_RAISED and TIER1_MIN_DONORS. The script reads the latest NetFile filing window from public_site.race_bolder.filing_through and writes the computed tier back to public_site.candidates.tier on every run. Disclosure footnote text auto-inserts on any race that has at least one tier-2 candidate (migration 072).
A tier-2 candidate who crosses either threshold becomes tier 1 on the next stats run. Promotion is one-way during the election cycle: a candidate who passes the threshold and then drops below it (e.g., after a refund) stays tier 1 until the next reporting period naturally recomputes the value. Tier is a per-cycle classification, not a permanent property of the candidate; a tier-2 candidate in 2026 who runs again in a later cycle starts fresh.
After election day the race page becomes a historical artifact. Tier-2 candidates who never crossed the threshold remain in "Also on the ballot" in the archive; the disclosure footnote on the page is the editorial accounting of that decision.
/candidates/[slug] page that renders whatever editorial content we have for them (definitional intro, bio battlecard, endorsements, positions).What they do not appear in: the race-page at-a-glance battlecard, geography split, gift-size distribution, momentum chart, partisan-signals grid, or the home-page race switcher comparison surfaces. They are excluded from public_site.race_bolder_candidates by scripts/build-race-stats.mjs.
All finance values are sourced from NetFile committee filings at netfile.com/public/TOR/campaign. The per-race footnote on race pages with tier-2 candidates cites this source directly and names the filing-window date.
A short email when there's a new race breakdown, a candidate update, or Torrance civic news worth your time. A few sends a month, no filler.
We don't share your email. Unsubscribe any time.