Industry guide · Custom Software

Water Utility Software: Fixing the Gaps Between Meters, Mains and Compliance

The short answer

Build when the off-the-shelf stack is actively costing you money and exposure. For a water utility running 10,000+ service connections across multiple pressure zones, a focused first release that unifies meter data, work orders and compliance reporting typically runs $60,000 to $130,000 and ships in 12 to 16 weeks. A full platform with SCADA integration, hydraulic model tie-ins, mobile field apps and automated regulatory submissions runs $150,000 to $400,000 phased over 6 to 12 months. If you are under 3,000 connections and your compliance reporting is one person for two days a month, stay on Cityworks or a hosted billing package. If your operations manager is rebuilding the same spreadsheet every month because no vendor will let two systems talk, you are already paying for the build. You are just paying it in labor and getting nothing durable.

Why water utility software makes or breaks a utility operator

A water utility is four businesses stapled together. You are a manufacturer (treatment), a logistics network (distribution), a billing company (meters and revenue), and a regulated entity that files paperwork under penalty of law. Most utilities run each of those on a different system that does not know the other three exist. Sensus or Badger AMI feeds meter reads into one vendor cloud. Billing lives in Tyler Munis or Springbrook or Central Square. Work orders live in Cityworks or Lucity, or on paper if you are honest about it. GIS lives in ArcGIS. Lab results arrive as PDFs from a contract lab and get keyed into a spreadsheet that someone named "DBP Q3 FINAL v4.xlsx".

The connective tissue is a person. Usually the distribution superintendent or a long-tenured office manager who knows that meter route 14 has three accounts flagged wrong in billing because the GIS service point IDs were renumbered in 2019 and nobody backfilled it. That knowledge is not in a system. It is in a head, and that head retires.

Watch one main replacement travel through the stack. A crew replaces a 6-inch main on Elm Street. The foreman closes the work order in Cityworks. The as-built sketch goes to the GIS tech, who updates the pipe segment three weeks later when he has time. The valve exercised during the shutdown never gets logged because the valve app is a separate module nobody bought. Two customers on that block get zero-consumption reads for the next cycle because the meters were pulled and reset, and billing does not know a construction event happened, so it auto-estimates. Six weeks later, the meter tech gets a service call for a $900 catch-up bill, and the customer is standing on the counter at city hall. That entire chain is one missing data link: the work order does not know about the meter, and the meter does not know about the pipe. Nobody sold you the link. Nobody will.

Problem 1: AMI data is a firehose that nobody actually reads

You paid for AMI. Sensus FlexNet or Badger BEACON or Itron is delivering hourly interval reads on 12,000 endpoints. That is roughly 105 million reads a year sitting in a vendor portal that gives you a leak-alert flag and a consumption graph. What you actually get out of it: a monthly file to billing, and a leak alert list that your CSR ignores because it fires on 400 accounts a month and 380 are irrigation.

The AMI vendor's analytics are built to sell you the AMI. They alert on continuous flow, not on your reality. They cannot tell you that account 4471 has a continuous-flow signature consistent with a running toilet (small, 24/7, stable) versus account 8823 with a signature consistent with a service line break (large, started at 2am Tuesday, still climbing). They cannot correlate a pressure drop in zone 3 with an unbilled consumption jump on three adjacent accounts, because they do not have your zone map or your SCADA pressure data. And they will not, because that is not their product.

What a custom build does: it pulls the interval read stream via the vendor API into your own store, joins it to the GIS service point, the pressure zone, the DMA, the meter make/model/install date, and the account's own 24-month history. Then you classify. Continuous flow with a stable low rate and no seasonal correlation gets tagged as a fixture leak and drops into a customer notification queue. A step change with a matching zone pressure dip escalates to the on-call distribution supervisor with a map pin. A reverse-flow read on a commercial account with an RPZ device on file becomes a cross-connection ticket with the backflow test record attached. The AI that matters here is unglamorous: an anomaly model trained on your own 24 months of interval data learns each account's normal, so a school with zero summer usage does not fire an alert every June and a laundromat's 3am cycle does not read as a break. We have seen this take an unusable 400-alert month down to 30 to 40 actionable alerts, which is a number a CSR will actually work.

The revenue side is the part that pays for it. Apparent losses from stopped and slow meters are invisible in every off-the-shelf report because the report shows what the meter said, and the meter said very little. Join install date and cumulative volume to consumption trend and you get a ranked meter-change-out list by dollars of lost revenue, not by age. That list is the business case.

Problem 2: Work orders that do not know what an asset is

Cityworks and Lucity are real CMMS products and they are fine at the CMMS job. The break is what happens at the edges. A hydrant flow test is a work order in Cityworks, a hydrant record in ArcGIS, a flow number that fire needs, and an input to your hydraulic model in WaterCAD or InfoWater. Four homes, one event. So the flow test result gets typed in Cityworks as a note in a comment field, and it dies there. Your modeler asks for last year's flow tests and the answer is "let me export the work orders and read them."

Same with valves. You are supposed to exercise every valve on a cycle. The valve turn count, the direction, whether it seated, whether it broke, and which valves are now known-bad and therefore excluded from your next shutdown plan. That last one is operational gold and it lives in a foreman's memory. When a main breaks at midnight and the crew closes the valve grid from the map, the map does not say valve 3117 has been broken since 2021. So they close it, it does not seat, and 200 more customers lose water than needed. That is a boil-water advisory footprint decided by a data gap.

What a custom build does: the asset is the spine, not the work order. Every pipe, valve, hydrant, meter, pump and tank gets a record with a condition state that changes based on events. A failed valve-exercise attempt writes a condition flag directly to the valve, which propagates to the shutdown planner so the next isolation trace routes around it. The break history writes to the pipe segment, and a segment with three breaks in five years floats to the top of your CIP renewal list with the actual repair cost summed from the work orders, not from a guess. Where AI helps: a break-likelihood score per segment trained on your material, install year, soil, pressure, and break history is genuinely better than the age-based ranking your engineer is using now, and it is honest about uncertainty. It is not clairvoyance. It reads more of your own history than any engineer has time to.

Problem 3: Compliance reporting is a manual archaeology project every quarter

This is the one that keeps a utility director awake. Your monthly operating report, your DBP sampling, your Lead and Copper service line inventory, your CCR, your bacteriological results. The lab emails a PDF. Somebody opens it, reads a number, types it into a spreadsheet, and the spreadsheet feeds the state portal submission. One typo is a violation. One missed sampling window is a violation. One sample site that no longer exists because the house was demolished is a violation when you cannot collect there.

No off-the-shelf tool fixes this because your state's requirements are your state's. The vendors build to the federal floor and leave the state layer to you. And the LCRR service line inventory in particular exposed how bad the data situation is: utilities were asked to state the material of every service line on both sides of the meter, and the honest answer was in a filing cabinet of 1950s tap cards.

What a custom build does, concretely. Lab result PDFs get parsed on arrival, and document extraction is legitimately good at this now: contract lab reports are semi-structured, they vary by lab, and a model reads the analyte, the result, the units, the method, the collection date and the sample site ID reliably enough that a human only reviews exceptions instead of keying everything. The extracted result lands against the sample site record, which knows its own sampling schedule, so a missed window fires an alert 10 days before it is a violation rather than after. Running averages for DBP compliance calculate continuously instead of at quarter end, so you see a location trending toward the MCL in month two and can flush the dead-end main, rather than finding out in month four that you already exceeded. Service line inventory becomes a real record with a material, a basis of evidence, and a photo from the field, so when a crew potholes at 14 Maple they update the line from "unknown" to "copper, verified, photo attached" from a phone in the trench, and the state submission generates from the data instead of from an intern.

Problem 4: The customer-facing side is a phone that rings

High bill complaints, service start and stop, leak questions, payment arrangements, dig-safe locates. Your CSR handles all of it by phone between 8 and 4:30. After 4:30 the answering service takes a message and the on-call guy calls back.

The billing vendors sell a customer portal. It shows a balance and a pay button. It does not show the customer the hourly interval data that proves their leak started on the 14th at 3am, which is the single thing that ends a high-bill argument in two minutes instead of twenty, because the portal is billing's and the interval data is AMI's, and the two vendors have no reason to talk.

What a custom build does: one portal fed by both. The customer sees their own hourly curve with the leak window shaded. The CSR sees the same screen the customer sees, so the call is a shared document instead of a debate. Service start and stop is a form that creates the work order, schedules the meter read, and confirms the date, with no phone call. Where AI helps after hours: a scoped assistant that answers from your actual account data (balance, last read, leak status, next bill date) and books a service appointment against the real crew calendar handles the routine calls at 9pm. It escalates anything about no water, discolored water, or a possible main break straight to the on-call number, because that judgment call should never be automated away. We scope those escalation rules first, before anything else, and put them in writing.

What this costs and how long it takes

Across 2,000+ projects at Digital Heroes, our honest bands for this category: a focused first release runs $60,000 to $130,000 and ships in 12 to 16 weeks. For a water utility that first release is usually AMI ingestion plus the asset spine plus one high-value workflow, typically leak triage or compliance sampling, because those show a number to the board fastest. A full platform with SCADA historian integration, field mobile with offline support, hydraulic model exchange, the customer portal and automated state submissions runs $150,000 to $400,000 phased over 6 to 12 months.

What drives price up specifically here. SCADA integration is the big one: if your historian is a Wonderware or Ignition instance sitting behind an air gap on the OT network, the integration is a security architecture conversation before it is a code conversation, and that conversation adds 3 to 5 weeks and a real dollar amount. Second, GIS data quality: if your service points and your billing accounts do not share a reliable key, somebody is doing a reconciliation project, and on a 12,000-connection system that is 4 to 6 weeks of matching and field verification before the good part starts. Budget for it rather than discovering it in week 9. Third, the number of state-specific report formats you need generated. Each one is a discrete build. Fourth, the age of your billing system: a modern Tyler Munis instance has an API. A 2008 AS/400 billing system has a nightly flat file and a prayer, and everything you build has to live with that latency.

What does not drive price: the number of connections, mostly. The work is the same at 8,000 as at 40,000. Which is why the math gets better the bigger you are.

Build versus buy: where the line actually is

Buy, genuinely, if you are under roughly 3,000 connections with one pressure zone, your compliance load is a monthly operating report and quarterly bacts, and your crew is four people. Cityworks or a hosted package plus your AMI vendor's portal is the right answer, and anyone telling you to build is selling you something. The overhead of owning software will eat the benefit.

Build when you hit these signals, and they are concrete. One: someone on your staff maintains a spreadsheet that joins data from two vendor systems, and that spreadsheet is load-bearing for a decision or a filing. That spreadsheet is a system you already built, badly, with no backup and no owner. Two: you have asked two vendors for an integration and both quoted you a data export. Three: your non-revenue water is above 15% and you cannot say with confidence how much is real loss versus apparent loss, because the answer requires joining AMI data to production meters to the DMA map and no single tool holds all three. Four: you are running multiple systems, whether that is a regional authority with several treatment plants or a utility that acquired a neighboring district, and every acquisition means another billing system and another set of workarounds. That is the case where custom wins hardest, because the off-the-shelf products are priced and designed per-system and you are trying to operate as one.

The position we take: the middle is where the pain is. Small utilities should buy. Very large utilities have already built. The 8,000 to 60,000 connection utility is being served by products designed for someone else, and is quietly paying for the gap in staff hours, apparent losses, and regulatory exposure.

How to choose a developer for water utility software

First, ask what data model they would propose for a service line, before you sign anything. If the answer does not immediately distinguish the utility-side material from the customer-side material, and does not include a basis-of-evidence field, they have not read the LCRR and they will learn on your money. The service line is the sharpest domain test in this category because it is where regulation, GIS and the physical world disagree.

Second, ask specifically what they have integrated. Not "we do integrations." Name the system: have they pulled from a Sensus FlexNet API, a Badger BEACON export, a Tyler Munis instance, an ArcGIS feature service, an Ignition historian via OPC. If they have not touched utility systems, they will discover that AMI vendor APIs are rate-limited and rewrite the ingestion layer in month four. Ask who has actually stood in a pump station.

Third, ask what happens when SCADA is involved. The right answer includes the words read-only and a one-way data diode or equivalent, and a refusal to put any control path through the application. A developer who is casual about the OT network boundary is a developer who has never been near one. That conversation should make them slower and more careful, not faster.

Fourth, get code ownership and a data exit in the contract, in writing, at signing. You own the repository, you own the database, and there is a documented export. You are a public entity with a 40-year asset horizon and a vendor that folds should cost you a migration, not your operating history.

Research & sources

The evidence behind this guide

Independent findings on why this investment pays off. Every link goes to the primary source.

  1. Only 22% of firms are 'future ready' having significantly transformed digitally; these companies show average revenue growth 17.3 percentage points and net margins 14.0 percentage points above their industry average. Source: MIT Center for Information Systems Research (MIT Sloan) (2022) →
  2. The median annual wage for U.S. software developers was $133,080 in May 2024, and employment is projected to grow 15% from 2024 to 2034 - a core input to any in-house build-vs-buy TCO model. Source: U.S. Bureau of Labor Statistics (2024) →
  3. SHRM's 2025 benchmarking data puts the average cost-per-hire at $5,475 for nonexecutive roles and $35,879 for executive roles - executive hires are on average nearly 7x more expensive than nonexecutive hires. Source: SHRM (Society for Human Resource Management) (2025) →
  4. Acquiring a new customer is five to 25 times more expensive than retaining an existing one, and research by Frederick Reichheld of Bain & Company found that increasing customer retention rates by 5% increases profits by 25% to 95% - underscoring the ROI of support that keeps customers. Source: Harvard Business Review / Bain & Company (2014) →
Rohan Malhotra · Enterprise Software Consultant

Rohan advises mid-market and enterprise teams on ERP, CRM and custom software, and has led delivery on dozens of business-software builds.

Writes for Digital Heroes, shipping business software for 2,000+ brands across 55+ countries since 2017.

FAQ

Frequently asked questions

How much does custom water utility software cost for a utility with 15,000 service connections?
A focused first release covering AMI ingestion, an asset register and one core workflow like leak triage or compliance sampling runs $60,000 to $130,000 and ships in 12 to 16 weeks, based on Digital Heroes delivery experience. A full platform adding SCADA integration, field mobile, a customer portal and automated state reporting runs $150,000 to $400,000 phased over 6 to 12 months. Connection count barely moves the number, the integration count does. A 15,000-connection utility and a 40,000-connection utility with the same vendor stack cost roughly the same to build for.
Is custom software better than Cityworks for a water utility?
Cityworks is a capable CMMS and it is the right answer if work order management is the whole problem. Custom wins when the problem spans systems Cityworks does not own, meaning the join between meter data, GIS, billing and compliance. Most utilities that build keep Cityworks for what it is good at and build the layer that connects it to everything else, rather than replacing it outright. Replacing a working CMMS is usually the expensive mistake.
Can custom software integrate with our Sensus or Badger AMI system?
Yes, both expose APIs and scheduled exports that a custom system reads directly, and this is standard work rather than a research project. The realistic constraint is rate limits and read latency, so the ingestion layer needs to be designed around pulling interval data on a schedule and storing it in your own database rather than querying the vendor live. Once the reads are in your own store you can join them to GIS, pressure zones and billing accounts, which is the thing the vendor portal will never do.
How long does it take to build a water utility management system?
A first release ships in 12 to 16 weeks if your data is in reasonable shape. The variable that stretches timelines in this category is GIS-to-billing key reconciliation: if your service point IDs and account numbers do not match reliably, add 4 to 6 weeks of matching and field verification before development on the real features starts. SCADA integration adds another 3 to 5 weeks, mostly for the OT network security review, not the code.
Do we own the code if we hire a developer to build our utility software?
You should, and you should get it in the contract at signing rather than negotiating later. Ask for the repository, the database, a documented data export, and infrastructure that runs in your own cloud account. As a public entity with 40-year assets you cannot have your operational history locked in a vendor you do not control. Any developer who resists this term is telling you something important about their business model.
Can custom software handle our LCRR service line inventory and state reporting?
Yes, and this is one of the strongest cases for building in this category because state requirements vary and no off-the-shelf vendor builds to your specific state portal. A custom build stores each service line with material on both the utility and customer side plus a basis-of-evidence field, lets crews update it from a phone with a photo when they pothole, and generates the submission from the data. Lab result PDFs can be parsed automatically on arrival so results land against the sample site record without manual keying.
Will custom software help reduce our non-revenue water?
It helps most on the apparent loss side, which is usually the faster money. Joining interval reads to meter install date and cumulative volume produces a change-out list ranked by lost revenue rather than by meter age, and that ranking is typically very different from the age-based list. On real losses, an anomaly model trained on your own history plus a join to zone pressure data turns an unusable AMI alert list into a small set of alerts a CSR will actually work. Neither happens inside the AMI vendor's portal because it does not have your zone map.
What happens to our data if we migrate from our existing billing system later?
This is exactly why the asset and account records should live in your own database rather than in the billing vendor's. If the custom layer holds the service point, the asset history and the compliance record, then swapping billing systems becomes a change to one integration instead of a full data migration. Utilities that build this layer first find their next billing procurement gets significantly easier and cheaper because they are no longer hostage to the incumbent's export.
Is it safe to connect custom software to our SCADA system?
Only read-only, and only with a proper boundary between the IT and OT networks. The correct architecture pulls historian data out through a one-way path with no control capability in the application, ever, and any developer who is relaxed about this has not worked on an OT network. Expect the security review to add 3 to 5 weeks to the timeline, and treat that as a feature of a serious engagement rather than a delay.
What does a $50,000 custom software budget actually buy?
One core workflow done properly: 10 to 15 screens, two or three user roles, a couple of integrations, an admin panel, and automated tests, delivered in roughly 12 to 14 weeks. What it does not buy is that workflow plus a mobile app plus AI features plus five more integrations. The discipline of picking the one workflow that matters is what separates $50,000 projects that ship from $50,000 projects that stall at 70% complete.
Will an app built for 10 users survive growing to 500?
Yes, if it is built on standard cloud infrastructure with a sound data model, because moving from 10 to 500 users is a hosting configuration change, not a rebuild. The scaling decisions that actually hurt are made early and invisibly: how the database is structured, how accounts and permissions are modeled, and whether background work is queued properly. Ask your agency how the system would handle ten times the load; the right answer is boring and specific, and a promise to cross that bridge later means you will pay for the bridge twice.
If an agency builds my software, who actually owns the code?
You should own everything, assigned in writing: the contract transfers full IP to you on final payment, the code lives in your GitHub organization, and hosting runs in cloud accounts you control. The red flag is a proposal that mentions the agency's proprietary platform or framework, which usually means you are renting, not buying. Digital Heroes structures every build this way precisely so a client can fire us and lose nothing but the relationship.
What happens if I stop paying for maintenance after launch?
Nothing breaks on day one, which is what makes it dangerous. Within 6 to 18 months, unpatched dependencies accumulate known vulnerabilities, an integrated API like Stripe ships a breaking change, and the first fix requires a developer to relearn a stale codebase at full price. Budget 15 to 20% of the build cost per year for upkeep; it is the difference between a $500 patch and a $15,000 emergency.
How many SaaS seats do we need before building custom becomes cheaper?
The crossover usually shows up between 20 and 50 seats on premium tiers. Salesforce Enterprise lists at $165 per user per month, so 40 users cost about $79,000 a year in subscriptions, which is real money against a custom system you would own outright. Run the comparison over three years: if subscription spend beats the build cost plus 15-20% annual maintenance, custom wins on price before you even count workflow fit.
Can we migrate years of data out of our current system into new custom software?
Almost always yes, through CSV exports or the vendor's API, and migration should be scoped as its own workstream with field mapping, a dry run, and a planned cutover window rather than an afterthought. The real time sink is rarely moving the data; it is cleaning it, since years of duplicates, free-text fields, and inconsistent formats surface all at once. Pull a full export from your current vendor before committing to anything new, because some SaaS plans restrict exports on lower tiers.
What are the biggest mistakes first-time software buyers make?
Choosing the lowest bid, paying more than 30-40% upfront instead of on milestones, skipping a written specification, and having no maintenance plan for after launch. The most expensive of the four in Digital Heroes rescue projects is the missing spec: without written acceptance criteria, done becomes an argument instead of a checklist, and every disagreement resolves in the vendor's favor. Fix those four and you have avoided most of the ways these projects fail.
What happens to my software if the agency shuts down or we stop working together?
Nothing dramatic, if the engagement was set up correctly: the code sits in your repository, hosting runs on your cloud account, and a handover document explains how to deploy and operate the system. Any competent replacement team can then take over in days rather than months. If the agency controls the repo, the servers, or the domain, fix that now, because renegotiating access during a dispute is the most expensive place to discover the problem.
Does the tech stack matter, and which one should I ask for?
It matters less than agencies imply, provided it is boring. A mainstream stack, something like React or Next.js on the front end, Node.js or Python behind it, and PostgreSQL for data, means thousands of developers can maintain your system if you ever change vendors. Apply one test: ask how hard it would be to hire a replacement developer for the proposed stack, and walk away from anything built on an agency's in-house framework.
Is a solo freelancer enough for my project, or do I really need an agency?
A solo freelancer is a fine choice for a well-defined build under roughly $15,000 to $20,000 with a limited lifespan: an internal calculator, a scripted integration, a prototype. Above $50,000, or for any system your business will depend on for years, you are buying continuity as much as code: enforced code review, cover when someone is ill, and support that outlasts one person's career plans. Price the risk of a single point of failure, not just the hourly rate.
Keep reading
let's build

Build something worth launching.

A plan, a team, a timeline, within 24 hours. No decks, no discovery calls. Tell us what you're building and we'll come back with a real scope and a real number.

message us directly · we reply within one business day

mission briefing

Monthly dispatch

Playbooks, real build costs, and what we're shipping. One email a month. No fluff.

visit us

New York HQ

1140 Broadway, Suite 704 · New York, NY 10001

Get directions
Online now

Hey there 👋 How can we help you today?