---
title: An account universe from federal data | Josh Weidenfeller
description: "Case study: EPA and FMCSA filings joined by a Python pipeline written with Claude into a ranked market, with tank estimates at about 20% median error."
image: https://www.joshweidenfeller.com/hubfs/site-art/v3/og/og-account-universe-v2.png
---

[Skip to content](https://www.joshweidenfeller.com/work/account-universe#main)

[Josh Weidenfeller](https://www.joshweidenfeller.com/)

Menu

- [Work](https://www.joshweidenfeller.com/work)
- [The System](https://www.joshweidenfeller.com/system)
- [Creative](https://www.joshweidenfeller.com/creative)
- [Blog](https://www.joshweidenfeller.com/insights)
- [About](https://www.joshweidenfeller.com/about)
- [Contact](https://www.joshweidenfeller.com/contact)
- [Résumé (PDF)](https://www.joshweidenfeller.com/hubfs/resume/Josh-Weidenfeller-Resume.pdf)

[Start a conversation](https://www.joshweidenfeller.com/contact)

[All work](https://www.joshweidenfeller.com/work)

Strategy · Systems

# An account universe built from federal data

A ranked, tiered market built from public EPA and FMCSA filings, with a tank-count model that reports its own error.

- EPA and FMCSA data
- Python pipeline written with Claude
- ZoomInfo
- HubSpot
- Salesforce

## Summary

Challenge

What predicts need in this market is physical: tanks, trucks and locations. Standard prospecting filters describe industry and headcount well and equipment poorly.

What I built

EPA and FMCSA filings joined by fuzzy entity matching in a Python pipeline written with Claude, a tank-count model, and a fit score that set A–D account tiers.

Result

Tiers anyone could trace to public filings, and tank estimates for about 1,800 companies at roughly 20% median error.

Role

Designed the approach; built the pipeline, written with Claude, and the tank-count model

With

Used by sales and the BDRs through scoring, routing and target lists

Status

Ran in production at Anova. The tank figures are estimates for prioritizing, not counts

Part of [the lead-to-opportunity system](https://www.joshweidenfeller.com/work/lead-to-opportunity-system). It supplies the fit half of [the scoring model](https://www.joshweidenfeller.com/work/lead-scoring-model).

On this page

- [Situation](https://www.joshweidenfeller.com/work/account-universe#situation)
- [Decision](https://www.joshweidenfeller.com/work/account-universe#decision)
- [What I built](https://www.joshweidenfeller.com/work/account-universe#built)
- [Diagram](https://www.joshweidenfeller.com/work/account-universe#diagram)
- [Limits](https://www.joshweidenfeller.com/work/account-universe#limits)
- [Result](https://www.joshweidenfeller.com/work/account-universe#result)
- [Stack](https://www.joshweidenfeller.com/work/account-universe#stack)

The situation

## The signal that mattered was physical.

In industrial markets, what predicts whether a distributor needs remote monitoring is physical: how many tanks it runs, what it hauls and how many locations it serves. Standard prospecting filters describe industry, size and headcount well; equipment, much less so.

In a sale reviewed as pipeline, a target list has to be defensible: where each account came from and why it ranks where it does. A list built on industry codes alone answers neither question.

The decision

## Build the market from public data, and state the error.

The physical signals already existed, in federal datasets built for regulators rather than marketers. I decided to join them into a marketer-ready account list, estimate the equipment each company ran, and report the model's error alongside the estimate so nobody mistook a model for a count.

It was applied marketing work, not a data-engineering platform: a script, a model and a ranked list, built to answer one question well.

What I built

## From two filings to a ranked market.

Each step narrows the field or adds a signal. The output is a tier on every account record.

- ### Two federal sources
  
  EPA Risk Management Program facility data, from the Data Liberation Project's FOIA release, shows who stores which regulated chemicals, in what quantity, at which facility. The FMCSA Motor Carrier Census shows who runs trucks, and with what endorsements.
- ### A Python pipeline, written with Claude
  
  Fuzzy entity-name matching joined facilities to carriers. Chemical and NAICS filters narrowed the field, a classifier separated distributors from end users, and a fit score ranked what was left. The output was a CSV ready for ZoomInfo GTM Studio.
- ### A tank-count model
  
  From the FMCSA census I built a model estimating installed tanks for about 1,800 companies, at roughly 20% median error. Larger, less diversified operators estimated most accurately. The estimates ranked the market; they were never presented as counts.
- ### Tiers the whole team could see
  
  The universe fed ZoomInfo for contact enrichment, HubSpot for scoring and Salesforce for routing, so account fit became a field on every record rather than a spreadsheet on one laptop.

  [How the tiers were scored](https://www.joshweidenfeller.com/work/lead-scoring-model)
- ### An offer built on the data
  
  The data became the offer: a free fleet assessment that opened with "we already mapped your fleet," pre-filled with our own estimate before the first conversation.

  [How the offer was delivered](https://www.joshweidenfeller.com/work/coverage-to-capacity)
- ### Where it went to work
  
  Segmentation, account prioritization, messaging by segment, and BDR target lists. The same tiers set how much coverage each account received.

The pipeline

## Two federal datasets, one ranked market.

EPA RMPWho stores what, whereFMCSA censusWho runs trucksMatchFuzzy namesClassifyDistributor?EstimateTanks, ~20% errorABCDRanked universeInto ZoomInfo, HubSpotand Salesforce

EPA RMPWho stores whatFMCSA censusWho runs trucksMatchFuzzy namesClassifyDistributor or end userEstimateTanks, ~20% errorABCDRanked universeInto ZoomInfo, HubSpot, Salesforce

Illustrative The two filings are joined because neither shows the whole picture: EPA data shows storage and FMCSA data shows the fleet. The model sizes each company, the error travels with the estimate, and the tier lands on the CRM record where the team works.

The first use

## Chemical distributors, found by joining two filings.

The first segment the universe served was chemicals. The goal was distributors running vendor-managed inventory: companies that store regulated chemicals at their own facilities and deliver them on their own trucks. EPA filings show the storage and FMCSA records show the fleet; joining the two shows both.

The join produced facilities, chemicals, quantities and carriers at the account level, which is what the campaign, the scoring and the BDR lists were built on.

The limits

## What the model could not tell us.

A 20% median error is precise enough to rank accounts and set tiers, and not precise enough to treat as a count. The model ordered the market; it did not replace the first conversation.

It was also least reliable for smaller, more diversified operators, which is worth knowing before a tier assignment is treated as settled.

How it ran

## Fit became a field, not a guess.

The universe became the fit half of the scoring model and the tier logic behind the coverage plan. When a lead arrived from a company in the universe, it arrived with a grade the sales team could trace back to public filings.

That traceability mattered in pipeline reviews. A tier assignment could be questioned and checked against the source data.

## Result

Sales effort followed account value instead of the most recent form fill.

The tiering held up in pipeline reviews because it came from data anyone could audit, and outreach could open with something specific to the prospect's own fleet.

Takeaways

## What carries over.

- Public data is an advantage when the signal that matters is physical.
- Report the error with the estimate. It is what makes a model usable in a sales conversation.
- Put the output where the team already works: the CRM record, not a separate file.

The stack

## What it ran on.

### Data sources

- EPA Risk Management Program data
- FMCSA Motor Carrier Census

### Build

- Python pipeline written with Claude
- Fuzzy entity matching
- Fit scoring

### Activation

- ZoomInfo GTM Studio
- HubSpot
- Salesforce

Next case study

The same research problem in health-system sales, handled by an agent with a rep on every message.

## Case studies

- ### [Systems An agentic copilot for inside sales A Copilot Studio agent that researched health systems and drafted outreach, with a rep reviewing every message. Copilot StudioSalesforce Read the next case study](https://www.joshweidenfeller.com/work/ai-sales-copilot)

[All work](https://www.joshweidenfeller.com/work)

Open to senior and manager-level roles

## Need the demand engine built, or someone to run it?

Demand generation, marketing operations and RevOps roles in complex B2B, remote or hybrid from Omaha. I also take on a small number of scoped builds.

[Start a conversation](https://www.joshweidenfeller.com/contact) [Download résumé](https://www.joshweidenfeller.com/hubfs/resume/Josh-Weidenfeller-Resume.pdf)

Josh Weidenfeller

Complex B2B Demand Generation — Strategy · Systems · Design

Omaha, NE · Remote or hybrid

- [josh@joshweidenfeller.com](mailto:josh@joshweidenfeller.com)
- [LinkedIn](https://www.linkedin.com/in/joshweidenfeller)
- [Résumé (PDF)](https://www.joshweidenfeller.com/hubfs/resume/Josh-Weidenfeller-Resume.pdf)
- [Capabilities](https://www.joshweidenfeller.com/capabilities)
- [Privacy](https://www.joshweidenfeller.com/privacy)

```json
{
  "@context" : "https://schema.org",
  "@type" : "BreadcrumbList",
  "itemListElement" : [ {
    "@type" : "ListItem",
    "item" : "https://www.joshweidenfeller.com/",
    "name" : "Home",
    "position" : 1
  }, {
    "@type" : "ListItem",
    "item" : "https://www.joshweidenfeller.com/work",
    "name" : "Work",
    "position" : 2
  }, {
    "@type" : "ListItem",
    "item" : "https://www.joshweidenfeller.com/work/account-universe",
    "name" : "An account universe from federal data",
    "position" : 3
  } ]
}
```