Method notes

Where each number in the Corporate Ledger comes from, how records are tied to a company, what is left out and why, and how the totals were checked.

Updated (loading) Back to the Corporate Ledger

This ledger starts in fiscal 2010 (July 2009), the first year Massachusetts put its spending records online. Penalties, donations and lobbying before then are left out so every comparison covers the same years.

How penalty amounts are counted: each row counts the cash the defendant actually paid (penalties, restitution, damages, fees). Press-release headline figures are often larger because they include debt relief, forgiven debt or rent, bill credits, conditional amounts, or proposed penalties that can still be contested. Those parts are not counted here. Every one is listed under Amounts not counted, with the headline figure, what we counted, the reason and the source. Where a release does not state the split between cash and relief, the case is left out of the totals and listed there.

A company enters the ledger with at least $1 million in government penalties dated July 2009 or later, and a Massachusetts tie: the penalty covers conduct in Massachusetts (the "Massachusetts case" lens) or the company had its headquarters here when it was penalized (the "Massachusetts headquarters" lens). Suffolk Construction is in the ledger below that threshold because it has a case file. Every record on the page links to the document or data file it came from.

Sources, by stream

StreamWhere the records come fromRead as
PenaltiesAgency releases and orders: Massachusetts Attorney General, U.S. Attorneys and the Justice Department, SEC, Massachusetts Securities Division, Division of Banks and Gaming Commission, federal regulators (HHS Inspector General, OFAC, OFCCP, Wage and Hour Division, Employee Benefits Security Administration and others) and a few other states' regulators. EPA ECHO enforcement cases. Criminal agreements from the Corporate Prosecution Registry (University of Virginia and Duke Law).One row per agency action: date, agency, civil or criminal, agreement type, amount, whether fault was admitted.
State paymentsCTHRU (the Comptroller's spending records), plus the MBTA, Massport and the Massachusetts School Building Authority from their own payment records.Net payments to the vendor, summed by fiscal year and payer.
Employee donations, stateOCPF bulk contribution files: gifts to state legislators, governors and lieutenant governors, sitting or running since July 2009.Each gift with donor name, town, state, reported employer and occupation. Street and ZIP are not shown.
Employee donations, federalFEC bulk individual-contribution files, kept to the committees of Massachusetts's U.S. senators and representatives and candidates since July 2009.As for state gifts. State and federal money sit in separate columns and are never added together.
LobbyingSecretary of the Commonwealth lobbyist disclosures. Firm fees from 2010; in-house costs for 2025 and 2026 only.What the company paid outside lobbying firms (firm fees) and what it reported for its own staff lobbyists (in-house), by calendar year.
Disclosed tiesOfficials' Statements of Financial Interest, filings for 2019 to 2025.A row where an official names the company, for example as an employer of the official or a spouse. A tie carries no amount and is not a payment.

Source: Corporate Ledger build (pipeline in the project repo); each stream's rows carry a source URL and a retrieval date.

Violation Tracker was read one company page at a time as a cross-check (see Checks). It is never a source of rows.

How the 2010 to 2015 lobbying pages were read

Lobbying firm fees from 2016 on come from files the Peoples-Audit project had already built from the Secretary of the Commonwealth's Lobbyist Public Search. For 2010 to 2015 the project read the same public search itself, on 2026-10-11, in a browser session. For each registration year the search page's year selector was set, with the type "Lobbyist or Lobbying Entity" and all results shown. Each lobbying firm's summary page (listed as "Lobbyist Entity") was then opened one at a time, at least 2 seconds apart: 1,223 firm pages over the six years. From each page the client list was copied as filed: client name, amount paid to the firm, employment dates and the purpose text, and the page address is kept as the source of every row. One 2010 firm page (Entity One) returned the site's own error page on two reads and is not in the table. The site's robots.txt file disallows the lowercase paths /lobbyist and /lobbyists; it does not list /LobbyistPublicSearch, the case-sensitive path these pages are on. The copied pages are in the project repo under sources/lobbying-2010-2015, with their sizes and checksums in sources/manifest.csv.

Match rules and tiers

Each company has a canonical name and a list of aliases: former names, spelling variants, subsidiaries and the other entities named in its penalty records. Names are compared after normalization (upper case, punctuation and legal-form words such as Inc., LLC and Corp. removed).

Donations are gifts by people who report the company as their employer. They are not company money. An employer bundle flag marks three or more matched donors giving to the same official within 30 days; it describes timing only.

What is left out, and why

How penalty amounts are counted

Each penalty row counts the cash the defendant pays: penalties, restitution, damages, fees and payments into funds the order names. A release's headline often adds things that are not cash from the defendant: loan modifications and principal reduction, forgiven or waived debt, forgiven rent, credits on accounts or bills, amounts that are owed only if the company breaks the agreement, "up to" amounts, and proposed penalties that can still be contested. Those parts are not in any row or total.

Every part left out is a row of the Amounts not counted register (repo file data/manual/excluded-amounts.csv), with the headline figure, the amount counted, the difference, a category, the reason quoted from the release, the source link and the date the source was read. Where a release does not say how much of a payment is cash and how much is relief, that part is left out and listed. Where it is the whole case, the row stays in the ledger at $0 so the company and the case remain visible. Cases skipped before entry under the same rule are listed too, with the headline the primary release states.

Refunds are read as cash unless the release says they are credits. A cash payment the release does not split between several companies is listed as a shared payment and is in no company's total. The register also lists a few cash parts left out for other reasons (amounts paid by individuals, a fee or a project payment the row did not add), so they are visible.

Duplicates and shared totals: counted and gross penalties

Gross is every penalty row on record. Counted leaves out a row when its dollars are already counted on another row, or cannot be given to one company. Two rules decide it. Every row they touch is listed under Amounts not counted with the document behind the call, and no source row is ever deleted.

How duplicates are counted: when two records describe the same payment, it is counted once. A record is left out only when a primary document read for this ledger shows the dollars are the same. When that document cannot be read, a strong match is still counted once and is marked 'possible duplicate, counted once until verified'. Records for different payments are all counted, even when the amounts are equal. Every record left out stays in the gross figure and is listed under Amounts not counted, with the document behind the call.

How shared totals are counted: when several defendants pay one total, each company counts only the share its primary document states. If the document gives a total and no split, and the payers include anyone outside the one company (another company, or individuals such as owners), the total is counted for no company: it stays in the gross figure and is listed under Amounts not counted. Where every payer named belongs to the one company, the whole total counts once, in full, for that company.

How the duplicate rule was applied

A program (pipeline/dedupe_audit.py) reads every pair of penalty rows, counted or not, and lists each pair that could be one payment: equal amounts within about a year, the same docket, case or release, a note that states another row's amount, a plea and the agreement that goes with it, a total beside its parts. A person then reads the primary document for each candidate and records the call, with a short quote, a link and the date read, in review/penalty-dup-decisions.csv. The build stops if a candidate has no decision, if a decision has no evidence, or if the counting does not follow the decision. Where the Justice Department's own site blocks scripted reads, the copy that was read (the U.S. Attorney's archive, HHS-OIG, Oversight.gov, the Wayback Machine) is named in the decision.

How the shared-total rule was applied

Every row whose source total covers more than one defendant was listed (review/penalty-shared-candidates.csv) and read against its primary document. The result for each row is in data/manual/shared-allocations.csv, with the document, a short quote and the date read.

The lens totals above the ledger table also count once a payment shared by several companies in one joint settlement.

Co-defendant groups

When a penalty names several companies in one case, the ledger keeps them together under the first-named company and credits that group with the state payments, donations and lobbying of every entity the case names. A company row then shows "Includes:" with each entity's name, and its expanded records show a "matched as" tag where a record was filed under a name other than the row's name.

Read these groups as the defendants of one case, not as one corporate family. Some examples from the current build:

Coverage, by stream

The spans below are read from the ledger file each time this page loads. The newest fiscal year of state payments is partial.

StreamFromToNote
Loading the coverage from the ledger file (data/ledger.json).

Source: corporate ledger table (ledger.json), coverage block.

Checks against other tallies

The full notes, with every table, are in the project's repo file checks/reconcile.md. In plain terms, as of the 2026-10-10 build:

Known limits

Opinion

The page states records, dates, amounts and sources. It does not state motive, intent or cause. The owner's opinion appears only inside a box labeled "Opinion"; until he writes one for a case file, the box is not shown. Pay-to-play appears only as a regulator's own finding, quoted and attributed, or as the table of donations near case dates, which lists dates and amounts and gives no reason.