# Fundraising Intelligence — Methodology

**Module:** `/fundraising.html` (+ `js/fundraising.js`)
**Document date:** 2026-10-01 · **Maintainer:** SiLobbyist data layer
**Data-as-of:** campaign-finance profiles built from `data/money/money-index.json`
(build 2026-10-01, cycle 2023-01-01 → present, feed current through ~May 2026)

This document describes exactly how every fundraising figure on the site was
produced, what each label means, and — critically — what the data cannot support.
It is written for a working lobbyist who has to defend every number in front of
a client or an investigator.

---

## 1. The ethics guardrail (binding, on-page and in Goldie)

Fundraising buys a **seat at the table, never a vote.** Nothing in this module
implies — or may be read as implying — that any contribution, ticket purchase,
or hosted event purchases an official act. Quid pro quo (a contribution given
or received in exchange for an official act) is a crime under state and federal
law; contributions coordinated with official action are investigated and
prosecuted as such.

Practical consequences inside the module:

- Profiles describe **filing patterns** (who gives, when, how much) — never
  "price of access," "donation-to-vote" ratios, or any language suggesting a
  contribution causes a legislative outcome.
- ROI tracking measures **her own relationship outcomes** (meetings secured,
  calls returned, introductions made) against **her own spend** — framed as her
  private bookkeeping, never as a claim about what donations buy.
- Strategy copy states trade-offs honestly: when a fundraiser's optics or
  donor-fatigue cost exceeds its relationship value, the module says so.
- Goldie's fundraising answers carry the same guardrail in the brain prompt
  (`FUNDRAISING INTELLIGENCE` section, functions/api/chat.js).

---

## 2. Sources

### 2a. Legislator fundraising profiles (real data)

Source: `data/money/money-index.json` (118 sitting legislators; 2 seats vacant:
AD-3, SD-10). Ultimate authority: **Cal-Access**, CA Secretary of State, accessed
via the CalMatters Digital Democracy public record feed. Full provenance and
dataset limits: `kb/money-map-methodology.md`. The same caveats apply here —
they are repeated on the page because this module draws different inferences
from the same file.

What each profile is built from (per-legislator fields available):

| Field in file | Used for |
|---|---|
| `total_raised` | Cycle total (monetary contributions received, 2023-01-01 → present) |
| `n_records` | Filed contribution records behind the total |
| `top_donors[]` (up to 12, with `donor`, `type`, `amount`, `n_contributions`, `filing_dates[]`) | Donor-base composition, cadence timing, concentration |
| `source_url` | Per-legislator traceability (every profile links out) |

### 2b. Fundraiser directory (coverage limits)

Public fundraiser invitations are **ephemeral**: they are faxed/emailed to
invitee lists, rarely archived publicly, and carry no filing requirement that
would surface them in a dataset. As of 2026-10-01 **no public fundraiser
invitation meeting the verification bar** (named officeholder, dated event,
published by the committee or a credible press account) could be sourced for
current-cycle Sacramento events — so the directory ships **empty by design**.
It is user-extendable: she adds invitations she receives, stored browser-local
(`silobbyist_fundraising_v1`). This is the honest state of public coverage, and
the page says so.

### 2c. Cost intelligence

Two evidence tiers, always labeled:

1. **Verified anchors** (labeled VERIFIED): FPPC 2025–2026 per-election
   contribution limits — Legislature $5,900/person ($11,800 small-contributor
   committee), statewide non-governor $9,800, Governor $39,200 (FPPC chart,
   fppc.ca.gov/learn/campaign-rules/state-contribution-limits-and-voluntary-expenditure-ceilings/;
   GT Alert Jan 2025). Ticket asks cannot exceed these caps, so they bound
   every estimate.
2. **Labeled estimates** (labeled ESTIMATE + methodology): hosting budgets and
   ticket-ask ranges. Methodology:
   - Catering: published Sacramento-market menus — SAFE Credit Union Convention
     Center (Sodexo Live, 2024 menu: plated dinner $63–$84/person), Zinfandel
     Grille banquet packet ($46–$48/person + tax + 20% service), Plate 38
     3-course plated ($48/person), Circa Restaurant catering ($19–$41/person).
     All-in planning figures add tax + 18–22% service.
   - Venue tiers: published Sacramento private-room/buyout conventions
     (restaurant private rooms, hotel ballrooms, golf/resort events); ranges
     cross-checked against documented fundraiser formats in press accounts
     (Consumer Watchdog archives of 2000s-era Sacramento fundraiser pricing:
     $500-and-up norm, tier structures host/patron/ticket — historical pattern
     reference only, not current pricing).
   - Ticket asks: anchored to the FPPC caps above and the filing-derived
     medians (median per-record contribution $882 cycle-wide; Assembly $1,104,
     Senate $568 — see §3).

Every estimate carries its methodology on the page. **Price history:** no public
price-history series exists for fundraiser tickets; the module does not invent
one. The closest verifiable time series is the contribution-limit history
(2023–24: $5,500 legislature → 2025–26: $5,900), shown as cap context.

### 2d. Compliance cross-links

Gift/contribution rules cited from `kb/compliance-self-guide.md` and the
verified limits in `js/compliance-self.js` (lobbyist $10/month gift ban,
Gov. Code §86203; general gift limit $630/source/year 2025–2026, §89503).
The page links to `/checker.html` (rule engine) and `/compliance-self.html`
(her FPPC log, localStorage `silobbyist_compliance_v1`); "Log it" buttons write
entries into that store in its own schema so the autopilot picks them up.

---

## 3. Profile derivation methods

For each of the 118 legislators, computed client-side from `money-index.json`:

1. **Average contribution size** = `total_raised ÷ n_records`. This is the mean
   per filed contribution record (itemized + unitemized buckets). Cycle medians:
   **$882** overall, **$1,104** Assembly, **$568** Senate. It is a scale proxy,
   not a ticket-price estimate — contributions include max-out checks that no
   fundraiser ticket would approach.
2. **Large-donor reliance** = (sum of top-12 donor amounts) ÷ `total_raised`.
   Cycle median: **17.5%**. Framed as *concentration in the top 12 filed
   donors* — not a "small-donor share," which this dataset cannot measure
   (unitemized sub-$100 buckets are excluded from donor rankings by design).
3. **Donor-base composition** = top-12 amounts aggregated by heuristic `type`
   (labor/corporate/trade/pac/individual/party/tribal/candidate/other). Types
   are the dataset's heuristic labels from filed names — **not official
   designations**; spot-check before citing. Cycle-wide top-12 slots are
   labor-heavy (742 of 1,416 slots), a filed-record fact, not a claim about
   any legislator's politics.
4. **Fundraising cadence** = per-quarter counts of `filing_dates` across the
   top-12 donors, 2023 Q1 → 2026 Q2. This is a **sample-based timing signal**
   (top donors only), not a full transaction timeline. Election-year Q3/Q4
   clustering is shown where observable; the label says what the sample is.
5. **Event-format preferences** (breakfasts vs. dinners etc.): the dataset
   contains no event-format field. Every profile states **"not publicly
   documented"** — never inferred from donor types.

Every profile card carries the label: *"Built from public filings + observable
patterns — never private knowledge."* Every figure links to the legislator's
`source_url`.

---

## 4. What this module never does

- Never invents a fundraiser event, ticket price, host committee, or venue.
- Never presents estimates as verified figures; estimates carry methodology.
- Never implies quid pro quo or access-for-dollars causation (§1).
- Never routes client data anywhere: events, spend, budgets, and ROI all live
  in this browser (localStorage `silobbyist_fundraising_v1`) with JSON export
  and one-tap delete. Nothing is filed with any agency by the site, ever.

---

## 5. Rebuild & refresh

- Profiles recompute live from `data/money/money-index.json` on every page
  load — when the money dataset is rebuilt, profiles update with it.
- Cost estimates are hand-maintained; re-verify catering anchors annually and
  contribution-limit anchors each FPPC biennial adjustment (next: limits
  effective 2027–2028, published ~Jan 2027).
- The fundraiser directory is only as current as her own inbox — the page's
  empty state is the coverage disclosure.

---

## 6. Fundraiser Map module (`/fundraiser-map.html`, `js/fundraiser-map.js`)

The map is a **planning surface over the same directory** — map / calendar / list views plus five intelligence layers. It is a **planning tool, never a donation solicitation tool**: it never tells her to give; it tells her what's on, what it intersects, and what the compliance rules say. The ethics guardrail (§1) binds every layer: timing flags exist to plan attendance *or deliberate absence* with eyes open, never to time money to action.

**Views:** Leaflet map (OpenStreetMap tiles, CDN; pins never guessed — events without a mappable city appear in List/Calendar only), month calendar with click-to-day detail, and a filterable list. Filters: free text, legislator, chamber, leadership tier, committee assignment, event type, region/city, price tier (by min ticket), host committee, year, month, session status, and "my tracked only" (her tracked legislators + watchlist bill authors).

**Intelligence layers (all degrade gracefully on a sparse directory — they say "nothing to analyze" instead of guessing):**

1. **Timing intelligence** — each event cross-referenced against her watchlist: committee overlap (legislator's committees × committees her tracked bills sit in) and session status that day from the official legislative calendar (`data/legislative-calendar.json`, approximate day-level). Flags are for planning attendance or deliberate absence — never to time money to action.
2. **Blackout-period compliance** — researched 2026-10-01 from primary sources; reuses `SLFUND.blackoutChecks()` shared core. The honest headline is displayed first: **California has no statutory in-session contribution blackout** (some states do — California is not one of them). The four real landmines checked per event: (1) Gov. Code §85702 lobbyist contribution ban — auto-checked against her saved registration scope, hard-blocks at bar level; (2) Gov. Code §84309 / SB 852 (Ch. 331, Stats. 2025, operative 1/1/2026) — no receiving or personally delivering contributions in the Capitol/state office buildings (extended to local gov buildings, district-office exemption removed); (3) Senate Resolution 44 (2015) — a Senate-only *convention*, not statute, around the budget window + 30 days before final adjournment — flagged as "verify current Senate rules," never presented as a violation; (4) 90-day pre-election 24-hour reporting for $1,000+ (Gov. Code §84204, Form 497), informational. Every flag cites its rule and cross-links to her FPPC log.
3. **Donor-fatigue heatmap** — event density by week for the selected year, from her directory; quiet heatmap = quiet inbox, not a quiet Sacramento.
4. **Suggested slate** — client-side scoring heuristic, labeled as such: tracked legislator/bill-author +3, top leadership +2, leadership/committee chair +1, committee overlap with a tracked bill +2, within 30 days +1; contribution-bar flag excludes entirely (surfaced in a separate "excluded by compliance" box). Top 6 shown with why-bullets and a per-event compliance check line. Heuristic only — her judgment controls.
5. **Her history layer** — attended events (spend log marks `eventId`), outcomes, and CRM fundraiser interactions; overlaid on the map as gold pins; read-only, private to her browser.

**Sources:** the fundraising directory + her watchlist, tracked legislators, spend, outcomes, and CRM. Session windows: `data/legislative-calendar.json` (reconvene/adjourn; 2025: reconvene Jan 6, adjourn Sep 12; 2026: reconvene Jan 5, adjourn Aug 31 — approximate). Verified 2026-10-01. Rebuild rule: re-verify blackout checks if the four rules above change; re-derive session windows annually from the official calendar.
