About Iowa Ledger
This site publishes Iowa's political money and voting record as the government files it — 1,403 committees, 661 bills of the 91st General Assembly, 72,810 lobbyist declarations, and the 136 races on Iowa's 2026 ballot. Every figure links back to the filing it came from, so you never have to take my word for it.
Why "Ledger"
A ledger is a boring word, and that's the point. Every row has a date, an amount, and a filing standing behind it. Nothing here gets to make a claim it can't back with a line somebody already signed and sent to the state.
Iowa publishes all of this already. Contributions, expenditures, roll-call votes, lobbying declarations. It publishes them in formats that are technically public and practically unreadable, spread across agencies that don't talk to each other. This is the same record with the arithmetic done and every number linked back to where it came from.
How the numbers get here
Nothing on this site is typed in by hand. Public data is downloaded from the sources below, loaded into a database, and every published figure is recomputed from that database before it can ship. A number that stops reconciling fails the build, and the page does not update.
That is a deliberately higher bar than "I checked it." Reading a page finds nothing; recomputing it has found every defect this project has ever shipped — including in-kind gifts counted as cash donations, a candidate's lobbying record missing more than half its filings, and 7 vetoed bills that were being displayed as though they had merely had a floor vote.
I publish what the record says and stop there. Where the record is silent I say so rather than inferring: a candidate whose committee I cannot find is shown as unknown, never as $0, because those are different claims and only one of them is mine to make.
Where it comes from
| Source | What we take from it |
|---|---|
| Iowa Ethics & Campaign Disclosure Board ↗ | Every state committee's contributions, expenditures and DR-2 filings. |
| Iowa Legislature ↗ | Bill text and status, recorded floor votes, and every lobbyist declaration. |
| Iowa Secretary of State ↗ | Candidate lists and certified election canvasses. |
| Federal Election Commission ↗ | Congressional candidates, who file federally rather than with the state. |
| Federal statistical agencies and state records ↗ | The Where Iowa ranks measures, cited on every card. |
What this data does not cover
Every dataset has holes. Mine are measured rather than described, because a gap nobody has measured gets rounded to zero:
- Voice votes leave no record. Only recorded roll calls name individual members. "No recorded vote" is a fact about the record, not about the legislator.
- Most lobbying happens on bills that die. About 70% of declarations are filed on HF/SF bills that never reached a floor vote — those are fetched, though they have no bill page of their own. One class is not collected: declarations filed against HSB/SSB study-bill numbers, the committee-stage designations bills carry before renumbering. Lobbying filed after a study bill becomes an HF/SF number is captured under the new number; anything filed only against the study-bill number is a hole in this data, not an absence in the record.
- Not every dollar can be traced. Iowa requires itemized detail only above a threshold, so some money is reported in totals but never broken out. Where that happens I show the size of the untraceable share instead of quietly leaving it out.
- A ZIP code is not a district. Donor addresses are placed by ZIP code, and 442 of Iowa's 970 ZIP areas cross a House district line by more than a sliver (339 cross a Senate line); a sliver is 2% of the ZIP's area or less. So a race page gives the share of a candidate's money that came from inside the district as a range, from the ZIPs wholly inside up to those plus the ZIPs that cross the line, and it counts post office box ZIPs, which have no area on the map, separately.
- Some votes belong to a member no page can name. 1,007 recorded votes were cast by members who left the Legislature mid-assembly and carry a name but no legislator ID. They count in every chamber tally and appear on no legislator page.
- An empty seat is not an absent member. 232 roll-call rows mark a seat that was vacant when the vote was taken. They are left out of every absence rate, since counting them would charge a member who did not exist.
- Federal money is a different system. Congressional candidates file with the FEC, not Iowa. State and federal figures are never added together.
- Polling is thin. Iowa gets very few public statewide polls. The average here is a plain unweighted mean of the polls shown, and a single poll is never called an average.
- Not every rank could be recomputed. Where Iowa ranks carries 39 measures. 7 of them come from a source that prints a rank and no full state table, so the rank could not be recomputed here and is quoted as printed; the page names each one. 15 more measures were held back entirely, each with its reason listed on the page, and nothing quantitative from a held-back measure is printed.
Corrections
If a number here is wrong, I want to know, and I'll say so publicly when I fix it. Email brett@mohlerforiowa.com.
The fastest way to get a correction made is to name the page, the figure as it appears, and what you think it should be. If you can point at the filing, better still. That's the same evidence I'd go find.
When a published figure changes, I record what it said before, what it says now, and why. A transparency site that quietly edits its own numbers is asking for exactly the trust it refuses to extend to anyone else.
Who publishes this
I do. My name is Brett Mohler. I live in Albia, in Monroe County, and I've been in House District 26 for 23 years. I design tools for a living in agricultural manufacturing. My wife and I are raising our son here.
This is a personal project. There's no organization behind it and nobody paying for it. I built it because I wanted Iowa's campaign money and the actual roll-call votes in one place I could check without taking anyone's word for it, and I couldn't find that anywhere.
You should also know I'm a candidate. I'm running as a Democrat for Iowa House District 26 in 2026, against the incumbent, Austin Harris. My own race is on this site like every other one, and my fundraising is broken out by the same rules his is. Go look at House District 26 and judge it yourself.
Here's why I think you can still use this. I can't put my thumb on a number without breaking something that leaves a mark. Nothing here is typed in by hand. Every figure is recomputed from the state's own files before the site will publish, and a figure that stops matching its source fails the build, so the page just doesn't update. Making myself look better would mean editing the code that checks me, in public, in a repository with a history.
Respectfully, don't take that on faith either. Every number on this site links to the filing it came from. That's what those links are for.