NorthQuad x 120Water · Predictive Modeling

Verification Planner.

9.2 million US homes still have a lead pipe. Every utility must find and fix theirs by November 2027. I built a self-serve tool with Claude that turns 120Water's internal lead science into something any utility can run on its own.

Nov 2027Federal EPA Compliance Deadline
9.2MUS Homes Still On Lead Pipes
$105KAvoided On One Utility's Numbers
95%Model Recall Across 2M+ Records
My Role
Sole UX Designer
Platform
Desktop Web App (PWS)
Timeline
10+ Weeks · Ongoing
Tools
Figma · Claude · HTML/CSS/JS
The Stakes

Lead pipes don't sit under every home equally.

Lead pipes cluster in older homes, and the EPA is clear on who that hits hardest: lower-income communities. That's why federal funding sets money aside for these systems specifically. Not a bonus. A requirement.

Budget doesn't change the deadline.

🚰Lead vs Copper Service Linepm-stakes-lead-copper.png
The Problem

The science existed. Nobody outside 120Water could touch it.

120Water already had a model that could score each unknown line. It just lived outside the actual product. Someone on 120Water's team had to run it by hand, one utility at a time.

Real machine learning, wrapped in a white-glove service. White-glove doesn't scale to every utility racing the same deadline.

Discovery

Four testing sessions. The same three problems, every time.

Two utility customers, two internal reviewers, one live prototype. These three confusions showed up in every single session.

01
A percentage means nothing alone
"69%, 97%, what does that tell me?" The free tier now shows likely lead, inconclusive, or likely non-lead instead.
02
Nobody trusts "accept all" right away
Every tester reviewed lead records one at a time, bulk button or not.
03
"Updated" reads as already done
Two testers assumed "updated" meant saved. Nothing commits until the final step.
Our User

Small team. Real deadline pressure.

The same person showed up every time: a non-technical utility employee, wearing several hats, no data science background, and no budget to hire one.

👷Utility Field Operatorpm-user-fieldwork.png
Primary User Archetype
The Deadline-Squeezed Operator
Goals
  • Classify every unknown line before 2027
  • Avoid digs the budget can't cover
  • Send crews to the highest-value lines first
Frustrations
  • Had to call 120Water for every model run
  • Never saw their own prediction scores
  • No self-serve way to clean their own data
In Their Words
"That is an extremely daunting task, and it's something that has been weighing heavily on us."

Utility Operator, User Testing Session

"It sucks to review 700 lines, but I'd rather take the time to review them one at a time than mess up 700 locations."

Internal Product Discussion, on why bulk actions stay off by default for high-risk data

Solution Space

Three areas. One self-serve platform.

Each area replaces a manual step. Data Quality shipped first, on purpose. Those same checks help every customer, not just PM buyers.

📊
Inventory Dashboard
Materials, data quality, and lead prediction, in one widget row.
🧹
Data Quality Review
Self-serve versions of the checks 120Water used to run by hand.
🗺️
Verification Planner
A guided path from messy data to a prioritized field plan.
The Design

Three rules governed every decision.

Never say "predictive" to a free customer. Hover to reduce complexity, never to remove information. One color means one thing, everywhere. Everything else followed from those three.

Getting Started

Locked until the data's ready.

A new utility starts here. Clean the data first, unlock the planner next.

Inventory dashboard in the locked state, prompting the utility to review data quality before the Verification Planner unlocks
Inventory Dashboard

Everything that matters, above the fold.

Materials, data quality, and lead prediction, together on one page.

120Water Inventory Dashboard, Premium tier, showing material breakdown, digs avoided, and lead prediction histogram
Free Tier

No percentage, on purpose.

Three buckets instead of a raw score. Straight from finding one.

Free tier bucket chart showing higher probability non-lead, inconclusive, and higher probability lead, no raw percentages shown
Data Quality Review

Same checks. Now self-serve.

Approve, edit, or delete, right in the drawer. No spreadsheet round-trip required.

Street Name Validation drawer listing addresses that could not be matched to a standard street name, with approve, edit, and delete actions
Where Risk Starts

Bulk actions stop at Lead.

Every other suggestion here is eligible for Accept All. A Lead classification never is.

Update Year Built Material Suggestions step, showing Non-Lead-Other rows eligible for Accept All and one Lead-classified row flagged for individual review and excluded
Geocode Validation

A map, not just a table.

Outliers and duplicate coordinates, shown exactly where they sit.

Geocode Validation split view with a map on the left and a list of locations plotting outside the service area boundary on the right
Verification Planner

Capacity first. Name it later.

One question starts the plan: how many lines can your team verify a month?

Setup a Verification Program, Step 1, asking how many lines the team can verify in a month before any other program details
Build Your Plan

From plan to field crew.

Review the list, split it across teams, send it out.

Verification Program summary screen showing selected lines and team assignment across Field Crew A and Field Crew B
Program Progress

See it running. Then steer what's next.

Review progress, then plan the next batch or change the strategy.

Active Verification Program view with completion progress, crew-by-crew breakdown, a Plan Next Batch action, an editable prioritization strategy, and a map alongside the line-by-line results table
Live Prototype

Every screen above, fully interactive.

Built conversationally, 41 versions in. Best on desktop.

predictivemodelingprototype.netlify.app
Open in new tab ↗
Process

Direction first. Code second, always.

Every session started from a real transcript. Never memory, never a guess.

✏️
Sketch
Gray-box the layout in Figma first.
💻
Prototype
Build it live and clickable, not static comps.
🎙️
Test It
Same script, every session. Patterns that repeat become findings.
Verify
118 automated assertions, 8 suites, after every change.
Where It Stands

Prototype complete. Not in front of every user yet.

v41, functionally complete across all three areas. Tested with four people, two customers, two internal. Developer handoff is next.

4
Testing sessions, two real utility customers, two internal reviewers
118
Automated test assertions, 8 suites, real headless-browser screenshots
3
Internal-only tools turned into one self-serve prototype
What I Learned

The best decision was often the one I didn't make yet.

First time running user testing here. The rule: don't build past what's confirmed.

The same three problems kept showing up, in different sessions, with different people. It's why four short tests beat one long one.

Next Project
Up next
Griffith Foods Maintenance Assistant