A number about a public official has to be right
Every year, Club for Growth publishes a scorecard showing how each member of Congress voted on the bills it tracks. It has done so for a long time, and the scorecards stay online, so the record now runs to twenty-one years. It is also one of the most visited parts of their website.
The people responsible for it are the staff who assemble each year's votes and the digital lead who publishes them. Their position is an exposed one. Every figure is attached to a named public official and will be quoted by people who agree with it and people who do not. It has to be correct, and it has to be there on the day the organization announces it.
Two decades of votes do not fit in web pages
A scorecard for one year covers every member of the House and Senate and every vote that was scored. Multiply that by two decades, and it stops being content in the usual sense. Nobody could maintain it as pages, and no visitor would find anything if they tried.
What a visitor wants is simple. They want their own representative, or one state, or one year, without wading through the rest. A reporter on a deadline wants the same thing, faster.
What staff wanted was harder. Each new year arrives as a set of data and a set of written explanations. They needed to load it, look at it exactly as the public would, and fix what needed fixing, all before anyone outside could see it. On announcement day, there is no room to discover a problem in front of an audience.
What we built, and who each piece was for
We built the scorecard's database from the ground up. The data is theirs, and the system that holds it is ours: the votes, the legislators, and the scores live in tables built for the purpose, inside the same website. A visitor chooses a party, a chamber, a year, a state, or types a name, and gets to the record in a few clicks.
Every legislator has a page. It shows how they voted, year by year, with the explanation for each vote. Someone looking up their own representative lands on one page that answers the question and can share that page with someone else.
A new year can be seen before it is published. Staff load the year's data, and it stays hidden from the public until they give it a publication date. In the meantime, they review it on the real site, in its real layout. Announcement day becomes a matter of publishing something already checked.
Room for the explanation. For the 2025 scorecard, the written explanations grew from a line or two into full paragraphs. We gave the legislator pages room for them and cleaned up the formatting that comes along when text is pasted from a word processor. We applied the change only to the years written that way, so older years look as they always did.
The foundation's site uses the same approach for its scorecards of state legislatures, with a map for finding a state.
How a new year goes now
When a session's votes have been scored, staff load them and read through the results in private. When they are satisfied, the year is published, and it joins the twenty that came before it. Visitors use the same filters they used last year, and the new year simply appears in the list. Every earlier year is still there beside it, back to the first one online. Nobody on staff edits a web page to publish a vote, and nobody waits on a developer to see what the public is about to see.
Our part is to keep the database and the pages around it working, to make room when the scorecard needs to say more than it used to, and to be on hand when a new year goes up. The judgments in the scorecard are entirely theirs. Our job is that the number on the screen is the number they published.
What changed
- A visitor filters by party, chamber, year, state, or name and gets to a record in a few clicks
- Every legislator has a page showing how they voted
- A new year is loaded and reviewed in private, then published when staff are satisfied
- Longer vote explanations appear for the years written that way, and older years look as they always did
Under the hood
For the developer evaluating us
- 2005earliest scorecard year online
- 2025latest scorecard year online
- 8purpose-built database tables
- 2chambers, one interface
What We Built
- Purpose-built scorecard database inside the WordPress site
- Filterable scorecard by party, chamber, year, state, and name
- Individual legislator pages with voting records
- Private review of a year before it is published
- Long-form vote explanations for recent years
- State-level scorecards on the foundation's site
The database
The scorecard does not use WordPress posts. Scores, legislators, offices, individual votes, roll calls, and publication status live in purpose-built MySQL tables, queried directly by theme functions, which keeps filtering fast across two decades of records.
Filtering and legislator pages
The scorecard template filters by party, chamber, year, state, and name. Each legislator page is built from a query on that person's identifier and shows their votes by year.
Publishing a year
A year is public only when its status record carries a publication date. A loaded year without one is invisible to visitors, and staff can review it on the production site before it is published.
Vote explanations
The votes table has a short description field and a long one. The legislator template renders the long field for the years listed as using it, passes it through WordPress's HTML sanitizer to strip word processor markup, and falls back to the short field everywhere else.
Figures current as of September 26, 2026