TECHNICAL OVERVIEW

How UtilityGuard works.

From a PDF uploaded by your team to a ready-to-send dispute letter — here is the complete technical picture of every step in the audit pipeline.

PIPELINE STAGES
01 · Document ingestion
02 · AI extraction
03 · Tariff lookup
04 · Audit checks (5 types)
05 · Letter generation
ONGOING · Rate monitoring
STEP 01
Document ingestion
Bills are uploaded as PDF files from your dashboard. Each file is stored securely on AWS S3 with a server-side encrypted presigned URL — your raw bill data never passes through our application servers unencrypted.
Any utility, any format
PDFs from all 30 covered utilities are accepted. The same pipeline handles digital-native PDFs from modern utilities and scanned paper bills from older providers.
Secure storage
Files are stored in a private S3 bucket with server-side AES-256 encryption. Presigned URLs with a 1-hour expiry are used for upload and download.
Async processing
Uploads trigger a BullMQ job on a background worker process. The UI stays responsive while parsing and auditing happen asynchronously.
Status tracking
Each bill tracks a parseStatus field: pending → parsing → parsed → audited (or failed). You can see real-time progress from the dashboard.
STEP 02
AI extraction
The PDF is sent to Claude (claude-sonnet-4-6) as a base64-encoded document. Claude reads the full bill using vision and structured extraction, returning every charge as a typed JSON object with a confidence score per field.
CONFIDENCE THRESHOLD
0.70
Fields below 70% confidence are logged but still processed — no manual review gate.
EXTRACTED FIELDS PER BILL
// ParsedBill structure
{ accountNumber, billingPeriodStart, billingPeriodEnd,
  totalBilled, usageKwh, meterReadPrev, meterReadCurrent,
  lineItems: [ { chargeType, description, quantity,
               unit, rate, amount, confidenceScore } ]
} 
30 parsers
One parser class per covered utility. Each uses the shared AI extraction base — utility-specific logic is added when needed.
Auto-proceeds
No human confirmation step. Low-confidence extractions are logged; the audit runs regardless. Speed over perfection.
STEP 03
Tariff database
Every US utility files official tariff schedules with their state Public Utilities Commission. These contain the exact rates, tiers, and surcharges that are legally permitted to appear on your bill.
Tariff data is sourced and entered by our operations team from official state regulatory filings. Data is flagged for refresh every 90 days.
DATABASE STRUCTURE
Utility
30 covered utilities with state, territory, website, and official tariff URL.
TariffSchedule
Named rate schedules (e.g. GS-1, TOU-D) with effective date, customer type, and rate class.
TariffRate
Individual line items within a schedule: charge type, tier min/max, unit, and rate per unit.
30
Utilities
90d
Refresh cycle
~5min
Admin entry per schedule
STEP 04
Audit engine
Five independent check types run against every parsed bill. Each produces an AuditResult record with status, expected vs. billed amount, and discrepancy in dollars.
Rate Verification
Surcharge Verification
Anomaly Detection
Duplicate Detection
Tariff Classification
Rate Verification
Line-item rate verification
Every charge on every bill is matched against the official tariff rate for that utility, rate class, and charge type. We calculate what you should have paid, compare it to what you were billed, and flag discrepancies above $5 or 3%.
Cross-references TariffRate records filed with state regulators. Handles tiered pricing structures automatically.
Surcharge Verification
Surcharge & tax verification
Surcharges and taxes are verified against the utility's filed tariff. Any surcharge not present in the official schedule is flagged as unverified — a common source of phantom fees.
Matches by charge type against TariffRate records for the specific utility and schedule.
Anomaly Detection
Usage anomaly detection
Your trailing 12-month usage average is computed per location. Bills with usage more than 30% above or 50% below that average are flagged for review — often indicating meter errors or vacant periods being billed at peak rates.
Spike threshold: 30% above trailing average. Drop threshold: 50% below.
Duplicate Detection
Duplicate billing detection
Overlapping billing periods and identical total amounts for the same location and billing period are cross-checked. Duplicate bills — a surprisingly common occurrence after utility system migrations — are caught immediately.
Checks billing period overlap and exact amount matches within the same location.
Tariff Classification
Rate class optimization
Your current rate class is compared against all other commercial schedules available from your utility. If we find a schedule that would cost less for your usage pattern, we generate a rate change recommendation with estimated monthly savings.
Generates RateRecommendation if projected savings exceed $20/month.
STEP 05
Dispute letters
When flagged audit results are grouped into a dispute, UtilityGuard generates a professional PDF letter — ready to send directly to your utility's billing department.
Company letterhead with your name and account number
Itemized table of each disputed charge with expected vs. billed amounts
Reference to the specific tariff schedule and rate applied
Total dollar amount disputed
Signature block and submission instructions
ONGOING
Rate monitoring
Every month, the audit engine runs a tariff classification check against all available commercial schedules for your utility. If a better rate class exists for your usage pattern, you get a rate recommendation with projected monthly savings.
Weekly email reports
Summary of bills audited, overcharges found, and cumulative savings identified — delivered every Monday.
90-day tariff refresh
Tariff schedules are flagged for re-verification every 90 days to catch rate changes filed with state regulators.
Inactivity alerts
If no bill is uploaded from a location in 45 days, we send a reminder to keep your audit coverage complete.
READY TO START
Stop reading. Start saving.
No account required. Pay and get your login link instantly.
Get Started →