Methodology

Where the information on this site comes from, how the figures shown are calculated, and what the available records can and can't establish. See About Iowa First Check for who runs this project and why.

Where the information comes from

  • Candidate events — campaign websites, news coverage and campaign social media posts. Some events may be private or require registration, so confirm details with the campaign before attending.
  • Aircraft activity — public ADS-B flight data from the OpenSky Network for tail number N512MM, linked to Zach Lahn.
  • Campaign finance — reports filed with the Iowa Ethics and Campaign Disclosure Board. See the Money page's own methodology note for how totals, categories and treemaps are calculated from those reports.
  • Digital advertising — Google's Political Advertising Transparency Report, detailed below.
  • Policy positions — candidates' published platforms, advertisements and public statements, including debates and interviews.
  • Fact checks — public records, campaign statements and published reporting, cited individually on each fact check's own page.

How the county event map is counted

Events are included when they were publicly announced by a campaign, local organization or another public source—something an ordinary person had an opportunity to learn about. Private events are not counted.

Iowa First Check's own tracking of campaign events began sometime after the June 2026 primary. Events held before tracking began were backfilled where possible from each campaign's archived Facebook posts. This means coverage of the earliest months of the race, especially for events that were never posted to Facebook or whose posts have since been removed, may be less complete than more recent months.

Zach Lahn's campaign publishes its own map of counties it says he has visited. Where that map and the count shown here differ, it is usually because Iowa First Check was not able to independently verify a specific stop from a public source meeting the standard above by the time of publication—not necessarily an assertion that the campaign's own map is inaccurate.

The map, the county-by-county totals above it and the table below are all derived from the same underlying per-county count, so they will always agree with each other.

Limitations

The website can only track information that is publicly available or provided to us. Unpublished events may be missing. Aircraft data shows that a plane moved, but not who was aboard or why. Campaign finance information reflects reports as filed and is not a real-time record.

Donation classifications (ORG and FAMILY tags)

Every itemized donation on the donation records page is shown exactly as reported to the Iowa Ethics & Campaign Disclosure Board. Iowa First Check adds two of its own classification tags on top of that unchanged record, shown as badges next to the donor's name:

ORG marks a donor Iowa First Check has identified as a PAC, party committee, LLC, trust or other organization rather than an individual person, based on patterns in the donor's reported name (for example "PAC," "Trust," "LLC," or a committee ID number). This is an automated classification and is not itself a claim about who controls the entity.

FAMILY marks a donation from someone Iowa First Check has identified as a candidate's relative. This tag is never inferred from a matching surname, address or employer alone. It is only applied to a specific donation that already appears in that candidate's reviewed family-contributions record (the same figures used in the "Family contributions" category of the funding breakdown on the money page), matched by the exact donor name, date and amount — not by name pattern alone. The relationship shown (for example "Wife" or "In-law") is available on hover or focus over the badge. Family contributions are not treated as improper; the tag exists only to make an already-disclosed relationship easy to find. The same verification standard applies equally to both candidates, and a donation is never tagged FAMILY without a specific, reviewed match. As of this writing, Iowa First Check's internal review has not yet attached a public-source citation to each individual family relationship beyond the campaign finance record itself — if independent public sourcing for a specific relationship becomes available, it will be added.

Both tags can be filtered on the donation records page, including a "Family contributions only" filter for each candidate.

How overnight locations are calculated

For each night beginning November 6, 2025 — the date Zach Lahn entered the governor's race — Iowa First Check uses the aircraft's last reliably identified arrival airport in the available flight record. The airport's state determines whether that night is listed as Iowa, Kansas or another state. Nights for which the aircraft's location cannot be established are listed as unknown.

An overnight location is a property of the aircraft record. It does not indicate who was aboard, who used the aircraft, the purpose of a trip or where any person stayed. ADS-B coverage can be incomplete, and some departures or destinations may not be identified. Overlapping ADS-B records that appear to describe the same movement are treated as one flight, not counted twice. The tracking period ends at the last night the available data actually covers — an incomplete or not-yet-collected period is reflected by a shorter tracking period, not by assuming the aircraft stayed put. Figures reflect the records available at the time of the site's latest data refresh, and the same figures are shown on the homepage and on the full flight log.

How Google digital-ad figures are calculated

Source: Google's Political Advertising Transparency Report, via its public BigQuery dataset (bigquery-public-data.google_political_ads.creative_stats). "Direct-campaign ads" covers only ads bought through each candidate's own confirmed Google advertiser account, starting from that candidate's own campaign-announcement date — it is not a count of all Google advertising in the governor's race. Google reports spend and impressions only as ranges; Iowa First Check always shows Google's own range and never converts it into a single estimated number.

Each row in Google's dataset is one ad record (one distinct creative upload), not one unique message — the same script or footage is often uploaded as several ad records with minor edits, so a "total ad records" figure overcounts distinct messages, and an impression range counts displays, not unique people. An ad record is shown as "active" if its own reported date range extends through Google's most recent reporting date; the spend figure attached to an active ad is the cumulative total Google reports for that ad since it began running, not a current daily or weekly rate.

Outside spending by parties, PACs, or other groups is included in governor-race totals only after a specific ad ID has been individually reviewed and classified as being about this race — an advertiser's own identity or general targeting is never treated as sufficient by itself, since the same national organization can run ads about many unrelated races that happen to also target Iowa. Message-content figures (what an ad argues, its tone, its topics, and any fact-reviewed claims) likewise appear only for ads that have actually been reviewed; an unreviewed ad is never assumed to have any particular purpose or tone.

How we calculate the polling average

Our polling average combines the qualifying Sand-Lahn polls listed on Iowa First Check. Newer polls receive more weight because public opinion can move. Likely-voter polls receive slightly more weight than registered-voter polls because they make an additional effort to identify who may participate in the election.

Which polls count

A poll may count toward the average when:

  • It tests the statewide Sand-Lahn general-election matchup.
  • Its field dates and toplines are publicly available.
  • It identifies the population surveyed, such as registered voters or likely voters.
  • It publishes enough information about recruitment, collection or weighting to evaluate the result.
  • Its reported figures can be traced to a source.

Sponsorship alone does not determine inclusion. Cygnal remains included despite its conservative-aligned sponsor because its methods and questionnaire are published. Global Strategy Group is excluded because the publicly released campaign memo lacks essential methodological details. Wedgewood is excluded because key parts of its recruitment, weighting benchmark and ballot-question documentation remain unavailable. YouGov is included with a disclosure caveat because its core methodology is available even though the sponsor and question order weren't disclosed.

We say "publicly released polls" when referring to all nine polls found for this race, since that doesn't imply the Sand campaign's internal poll was independently commissioned.

Why straw polls do not count

Straw polls ask people who are already at an event to choose whether they want to participate. That is different from selecting a sample intended to represent voters across Iowa. People who stop and vote may differ from those who do not.

Iowa First Check may list a straw poll as part of the public record. We keep it out of the polling average, charts and summary statistics because its results cannot be projected to the statewide electorate. See the Roper Center's explanation of self-selected surveys for more on why this distinction matters.

The formula

For each poll:

poll weight = voter-type weight × 0.5^(age in days ÷ 30)

Where:

  • Likely-voter weight = 1.00
  • Registered-voter weight = 0.75
  • Age begins on the final day of fieldwork.
  • The model uses a 30-day half-life.

Formal notation: wi = ei × 2-ai/30, where ei is the electorate-type weight and ai is the poll's age in days.

For each candidate:

candidate average = sum(candidate topline × poll weight) ÷ sum(all poll weights)

Formal notation: P̄ = Σ(wipi) ÷ Σwi

The same poll weight applies to both candidates. Undecided, other and wouldn't-vote responses remain as published. We don't reallocate them between the candidates.

Worked example

For the Sept. 17, 2026 calculation, using the published toplines:

PollPopulationAgeRaw weightShare of average
co/efficientLV1 days0.97721.9%
CygnalLV6 days0.87119.5%
YouGovRV9 days0.60913.7%
Emerson College PollingLV16 days0.69115.5%
Suffolk UniversityLV25 days0.56112.6%
Emerson College PollingLV44 days0.3628.1%
Beacon Research / Shaw & Company ResearchRV82 days0.1132.5%
Siena College Research InstituteLV82 days0.1503.4%
CygnalLV90 days0.1252.8%

The raw weights total approximately 4.459.

Unrounded results:

  • Sand: 48.076% → 48.1%
  • Lahn: 43.194% → 43.2%
  • Margin from the unrounded averages: Sand +4.882 → Sand +4.9

Candidate averages and the margin are calculated from the full underlying values and rounded only for display. Subtracting two separately rounded toplines may occasionally differ by one-tenth of a point from the displayed margin.

How the historical average is reconstructed

The "Polling average" view of the Movement Over Time chart on the polls page shows how this average would have read at each point a qualifying poll became publicly available. It uses the current formula and current inclusion rules throughout — it is not a record of what was actually published on those earlier dates.

  • Each snapshot includes only the polls publicly available by that date, using each poll's verified public release date, not its fieldwork end date.
  • A poll's age is measured from its final fieldwork date through the snapshot date, the same as in the live calculation above.
  • Excluded polls never enter the historical average, at any point in the reconstruction.
  • Every figure uses the current, corrected source values for each poll — not whatever an earlier version of this page may have shown.
  • Because the same weighting formula is used throughout, the line is flat between poll releases: scaling every included poll's age forward by the same number of days multiplies every poll's weight by the same factor, and that common factor cancels out of the weighted average. The average only moves when the set of qualifying polls changes, not with the passage of time alone.

These figures are reconstructed for illustration and were not necessarily published on the dates shown.

Choices built into the average

  • The 30-day half-life gives recent polling substantially more influence.
  • Registered-voter polls receive three-fourths of the weight of likely-voter polls.
  • Polls are not additionally weighted by sample size.
  • Iowa First Check does not assign pollster grades.
  • The calculation does not estimate house effects.
  • Multiple polls from the same pollster remain separate observations.
  • A partisan sponsor is disclosed and does not automatically disqualify a poll.
  • The average does not model historical Iowa turnout or crossover voting.
  • The average does not have its own calculated margin of error.
  • It summarizes the available polling record. It is not an election forecast.

All polls age at the same rate. Their relative influence is based on the distance between their field dates. With no new poll or corrected source value, the normalized average stays the same as the calendar advances.

Why these settings were chosen

Iowa First Check uses a simple calculation that readers can reproduce. Recent polls count more, likely-voter polls receive a modest boost, and the method stops there. More complicated models require judgments about pollster quality, turnout and house effects that are difficult to establish reliably for a single Iowa race.

Updating the average

The average is regenerated when a qualifying poll is added, a source publishes corrected figures, a poll's disclosure status changes, or the reviewed-through date changes as part of a new poll update. The underlying poll data is available as a JSON file.

Fact-check ratings

Each fact check is scored on four "kernels," measuring how much of the claim the available record supports: none, a little, about half, mostly or fully. The kernel score is a measure of evidentiary support, not a rating of the candidate who made or is the subject of the claim. See the full rating scale on the fact-check scorecard.

How it's built

Iowa First Check uses HTML, CSS and JavaScript to organize public records and other publicly available information. Much of the collection process is automated through APIs and Python-based tools. Google Analytics tracks aggregate traffic (page views, general location, device type) — no accounts, no personal profiles.