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
| Stream | Where the records come from | Read as |
|---|---|---|
| Penalties | Agency 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 payments | CTHRU (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, state | OCPF 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, federal | FEC 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. |
| Lobbying | Secretary 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 ties | Officials' 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).
- Confirmed. The vendor name, the donor's reported employer, the lobbying client or the disclosed name equals an alias exactly after normalization, or a reviewer confirmed the name with a logged reason. Only confirmed records count toward any total.
- Probable. A name that starts with an alias or matches it loosely. It goes to a review file and stays out of every total until a reviewer confirms it.
- Held. A reviewed name that may be an affiliate, a parent or an unrelated business sharing a word, for example "General Electric Capital" against General Electric, or "State Street Global Advisors" as a donor's employer. It needs an ownership source before it counts, and until then it is out of every total.
- Named individual. A person is linked to a criminal case only when a primary document names them in that case and a donation under their name matches on name plus town or employer. These links are listed beside the company's records and never added into a company total.
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
- Probable and held matches, in every stream, as above. A wrong match would put a stranger's money in a company's column.
- Memo entries (FEC memo code X). The same money appears on another line of the filing, so counting the memo would count it twice.
- Pass-through donations: gifts routed through a joint-fundraising committee and passed on to a candidate. The receiving committee reports them again.
- Conduit copies and refunds. ActBlue conduit rows restate gifts the receiving committee already reports; refunds to donors are not gifts.
- In-kind contributions, which have a stated value but are not cash.
- Private lawsuits, which are not government penalties, and anything dated before July 2009.
- In-house lobbying before 2025. What a company spent on its own staff lobbyists is entered only for 2025 and 2026. Before 2025 a lobbying figure is firm fees only, not a full lobbying total.
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 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.
- Counted once: the same payment. State Street 2010: the Attorney General's recovery (about $310 million for investors plus a $10 million penalty, $320 million in the ledger) and the SEC's $313.3 million settlement (which includes more than $255 million in investor payments) repay the same investors in State Street's subprime-exposed funds. The Attorney General row is counted and the SEC row is not. The SEC's own $50 million penalty and $8.3 million disgorgement are not restated in the Attorney General row, so the counted figure can be low by up to $58.3 million. State Street 2019: the Attorney General's restitution (expected to exceed $48 million) and the SEC's $48.78 million disgorgement both repay the same custody overcharges. The SEC row ($88.78 million) is counted and the Attorney General row ($53.5 million) is not, which can understate the total by up to the Attorney General's $5.5 million penalty. OneBeacon 2010: one release entered twice, counted once. The Corporate Prosecution Registry sometimes records one criminal resolution twice, as the plea and as the agreement that goes with it, with the same dollars: GlaxoSmithKline 2010, Ortho-McNeil 2010, Aegerion 2017, Insys 2019 and NiSource with Bay State Gas 2020 are counted once, and the $3.6 million forfeiture on the Elan Corp. plc record is part of the Elan Pharmaceuticals plea row and is counted once there.
- Possible duplicate, counted once until verified. State Street 2016: the Massachusetts Attorney General's $75 million disgorgement equals the $75 million of profits the SEC's order finds, and the Attorney General calls its agreement part of the $382 million federal-state resolution, but its executed agreement is not published and no document says one payment satisfies the other. The SEC row is counted and the Attorney General row ($75.5 million) is not, which takes $75.5 million out of the Massachusetts-case total. If the agreement shows separate cash, the row comes back.
- Different payments, all counted. Twelve close groups of rows were read and kept as separate payments because the documents show different conduct, different payees or no offset: State Street's 2016 Justice Department, SEC and Labor Department parts, State Street's 2016 foreign-exchange case against its 2017 transition-management case, State Street's 2017 criminal and SEC penalties, DraftKings and FanDuel, Merck's 2011 criminal fine and civil settlement, NiSource's criminal fine and the Attorney General's fund, Boston Scientific's 2011 criminal and civil matters, Aegerion's SEC penalty and plea, MassMutual's SEC and Massachusetts Securities Division orders, Liberty Mutual's New York Attorney General and DFS orders, the two Steward hospitals of 2020, and Barnhardt's EPA and Attorney General settlements. Equal amounts alone never leave a row out.
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.
- A stated share counts at that share. The court order in the R M Packer and Tisbury Towing case gives each defendant's amount ($1,157,000 and $143,000); before, both rows carried the $1,300,000 case total and the case counted twice. Healthcare Services Group's own $990,000 in the Gate Solution Systems judgment counts the same way.
- Counted in full for one company. Where every payer named is part of the one company (a hospital and its physician organization, a parent and its listed subsidiaries), the document's whole total counts once, for that company.
- Counted for no company. Where the document gives one total for a company and individuals such as owners, or for several companies, and no split, the total stays in gross and counts for no company, including the one federal EPA penalty of $100,000 shared by five respondents that includes Suffolk Construction. Individuals are not entered as rows, so a share cannot be given to them either.
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:
- Payments to Stantec Consulting Services appear under the Eurovia Atlantic Coast group, because Stantec is a co-defendant in that case.
- EasCare is grouped with Brewster Ambulance Service, HRI Clinics with Universal Health Services, and Southcoast Emergency Medical Services with STAT Ambulance.
- The case names Centrus Premier Home Care "doing business as" Maxim Healthcare Services. Maxim is a national company, so lobbying and disclosed ties filed under Maxim's name may concern the parent rather than the Massachusetts entity.
- Some aliases are a bare brand or a common name. "Merck" as an employer may include staff of the unrelated German company Merck KGaA, and "Mercy Medical Center" is a name several unrelated hospitals use.
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.
| Stream | From | To | Note |
|---|---|---|---|
| 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:
- Ledger audit. A separate script recomputed every company's penalties, payments, donations, lobbying and disclosed ties from the raw table rows, with its own arithmetic, and matched each listed record back to a row. It found no difference for any company.
- Federal donations against an independent tally. FEC receipts for Sen. Ed Markey's committees were compared, election cycle by cycle, with the owner's separate Markey dashboard data. Cycles 2012 through 2026 agree within 4 percent, and all but 2014 within 1 percent. The 2010 cycle reads 18 percent lower here because this ledger starts in July 2009 and the FEC cycle starts in January 2009. The 2014 gap traces to rows the other tally holds that are absent from the FEC bulk files. Two loader faults found this way were fixed: a joint-fundraising committee had not been loaded, and refunds had been read as gifts.
- State donations against an independent tally. OCPF receipts for Sen. Barry Finegold were compared year by year with the figures from the owner's Finegold repo. Over the whole window this ledger is 2.8 percent higher. The candidate's own gifts, which the other tally leaves out, explain 2014; organization contributions explain 2010 and 2018; for 2026 this ledger's file runs to October and the other tally's date was not recorded.
- Lobbying 2010 to 2015 against the client's own page. For State Street and Liberty Mutual in 2012 and 2014, the firms and amounts on each company's own client page match the firm-page rows exactly ($86,400 and $140,400 for State Street; $162,500 and $210,000 for Liberty Mutual).
- Penalties against Violation Tracker. General Electric and Biogen match record for record. State Street's gross total is $20.5 million above Violation Tracker's records in the same window; three rows explain it. The 2010 Attorney General row is $320 million (about $310 million for investors plus a $10 million penalty) where Violation Tracker lists $300 million; the 2017 OFCCP row is the full $5 million fund where Violation Tracker lists $4.49 million; and the 2024 OFAC row is not rounded.
Known limits
- The window starts at fiscal 2010 because the state's online spending records start there. Older penalties, such as the 2008 Big Dig settlements, fall outside it.
- Donor matching depends on the employer each donor reports. Donors who leave it blank or write "self-employed" are missed.
- Corporate parents change. The ledger does not split a company's records at a sale or merger, so a row can hold records from before and after one.
- Totals are nominal dollars, not adjusted for inflation.
- Penalty amounts are the cash the release or order says the defendant pays, under the rule above. Some are restitution, investor payments or funds set aside for back pay rather than fines; the note on each record says which.
- The Explorer and the expanded rows find a donation's or a lobbying payment's records by name, because the record files carry no committee or firm number. Where two committees or firms share a name, the list says the records may be mixed.
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.