Disease Surveillance Software Problems: The 7 That Cost Health Departments Real Time, and How to Avoid Them
The most expensive failure in a surveillance build is scoping person matching as an import routine.
On this page
The most expensive failure in a surveillance build is scoping person matching as an import routine. A department funds electronic laboratory reporting intake, the vendor delivers a loader that creates a case per result, and within a fortnight epidemiologists are spending their mornings deciding by hand which of 340 results belong to the same human being. That is professional staff time, every day, permanently, and the second order cost is worse: matching errors in one direction dispatch investigators twice, and in the other direction merge two people, which is a genuine harm and very hard to unwind.
Why does person matching get scoped as an import routine?
Every requirements document in this category contains a line about receiving electronic laboratory results. It is read as a loader. Read the message stream instead and the real problem is obvious: before it is a disease question, it is an identity question.
A positive result leaves a hospital laboratory in the evening, travels through an interface engine and arrives overnight. In the morning the queue holds 340 results. Sixty are repeat tests on people already under investigation. A dozen are the same person tested at three sites with three spellings of a name and two dates of birth. Names get truncated by sending systems. A hospital reports the ordering facility where the performing laboratory belongs. A reference laboratory changes its identifier between months. Test names arrive coded in one feed and as free text in another, and a result is positive in one system, detected in another and reactive in a third for the same organism.
Underneath all of that sits one question: is this a new person, a new episode for a known person, or a duplicate of something you already hold. A loader answers it with exact match on name and date of birth, which fails on exactly the records that matter, because the people hardest to match are frequently the people hardest to reach.
The fix is a real master person index with probabilistic matching, weights tuned to your jurisdiction's demographics rather than a vendor default, an automatic merge band, a manual review band and an unmerge path that restores original records rather than approximating them. Every match decision stores the score and the rule version, so when thresholds change you can see what would have changed historically. Scope this as the core of the build, and refuse a proposal that treats it as a data step.
What goes wrong when you migrate legacy case history?
Departments assume the old case data comes across cleanly because it was structured. It was structured by a schema, not by a discipline.
What is actually in there: the same person as four case records because the legacy system had no person concept and every case created a new demographic row. Conditions recorded against a code list revised twice, so one disease appears under two live codes and a retired third. Investigation answers stored with no version reference, so you cannot tell which form a 2019 answer belongs to. Free text notes carrying the facts that mattered, including exposures never structured. Addresses geocoded once at entry and never revalidated.
The fix is to seed the master person index from legacy data as an explicit deduplication project with human review, before the new system goes live, rather than letting the first live lab feed match against a duplicated population. Migrate current and recent cases at full fidelity with their conditions remapped to a maintained code list, and older cases as structured summary plus preserved free text. Keep the legacy system read only for a defined period. Budget the deduplication review as a named work stream staffed by people who know the jurisdiction, because a developer cannot judge whether two records with the same surname and adjacent birth dates are one person.
Why do laboratory and clinical feeds break after launch?
The standard tells you the structure. It does not tell you the quality, and it does not stop a sending facility changing something on a Tuesday without telling you.
The recurring breakages are specific. A hospital upgrades its laboratory information system and the sending facility identifier changes, so results that were routing correctly now arrive unattributed. A new test goes live at a large sender coded with a local code rather than a standard one, and it silently fails your condition mapping, which means positives for a reportable condition are landing in an unmapped bucket. A message arrives malformed and gets dropped rather than quarantined, so nobody knows it existed. Electronic case reporting from clinical systems arrives with a different message shape than laboratory reporting and with different gaps, and a build that assumed one shape has to be extended.
The fix is operational as much as technical. Quarantine bad messages for human review rather than dropping them, and alarm on the quarantine depth. Monitor per sender volume against its own baseline so a sender that stops or halves is detected within a day rather than at the end of a month. Hold the coding maps as maintained reference data with an owner, and alert on any unmapped code arriving from a sender rather than defaulting it. And onboard each sender as its own small project with its own test messages, because the standard does not make two senders equivalent.
What happens when statutory notification timeframes are not covered?
Reportable conditions carry timeframes set in state rule and the tightest are measured in hours. Most systems treat this as a report you run afterwards to find out you missed, which is the wrong shape entirely.
The failure looks like this. An immediately reportable condition arrives at 18:12 into an overnight queue. Nobody is looking at the queue. It is opened at 08:40 the next morning by an epidemiologist working top to bottom, and the on call investigator who should have been paged the previous evening finds out fourteen hours late. Nothing in the system failed. The system was never asked to know.
The fix makes the clock a first class object. When a case is created the system knows the condition, the applicable timeframe and who is on call, and it pages rather than queues for immediately reportable conditions. It escalates anything sitting unassigned past a threshold. It measures time to first contact attempt rather than time to case closure, because the first attempt is usually what the rule actually governs, and a system that only records closure will report compliance you do not have.
The second half of this is field work. Interviews happen on cell phones from a car, in a shelter, in a hospital corridor, and a system that only works on a desktop inside the department network means notes get written twice and attempt timestamps become approximations. A mobile interface for interview capture, contact elicitation and attempt logging makes the quality measure real.
Should you build custom or configure what you already own?
If you are a small county receiving a modest volume of reports, your state provides a shared instance, and your reportable conditions are the standard list handled without local variation, stay on the NEDSS Base System and put the money into disease intervention staff. It exists precisely so jurisdictions do not each build this, and it carries the national notifiable disease plumbing you would otherwise implement yourself. Conduent Maven is a defensible choice for a mid sized department that wants condition modules maintained by someone else and can live inside a vendor release cycle.
The honest test is authorship. If your epidemiologists need to define a new condition, add three questions to an investigation form and change a routing rule during an event, and the current path is a support ticket in someone else's release calendar, you have outgrown buying. During a slow year that is annoying. During an emerging event it is disqualifying, because the questions you need on Thursday were not knowable on Monday.
The other buy signal to respect: if investigators simply cannot see each other's caseloads, that may be a configuration and process project. Fix the process first, because a build layered on an undisciplined process produces a faster version of the same confusion.
What separates a surveillance build that works from one that fails?
The builds that work put authorship in the department's hands. Conditions, case definitions, questionnaires and routing rules are versioned configuration with an approval step, publishable by a trained analyst in an afternoon, with earlier versions preserved so a case investigated in March still shows the March form. Classification logic for confirmed, probable and suspect is expressed as readable rules against collected data rather than buried where one contractor understands it.
They also treat relationships as a graph rather than as rows with a parent case identifier. Named contact, shared exposure venue, same household, same congregate facility and genomic relatedness returned from the state laboratory are typed edges, which turns cluster detection into a query that can score a new result at intake instead of a link somebody notices in a Tuesday meeting. Exposure venues are real entities with an address, a licensee and a history, which is what lets you see the facility appearing in three unrelated investigations across two years.
And they design for surge from the start, because surge is a requirement rather than a contingency. Narrow role based access provisioned in minutes so a temporary contact tracer can do exactly one job. Intake and matching that scale horizontally, since the lab feed collapses first. Supervised bulk operations that are auditable, because during surge somebody will need to close four thousand cases at once and will do it in the database if you have not given them a supported path.
The builds that fail try to cover every reportable condition in release one. Start with your five highest volume conditions and your three largest senders. That covers most of the message traffic and teaches the build everything it needs before the long tail arrives.
When you are ready to turn this into a specification, Digital Heroes contracts through India LLP, US LLC and UK LTD entities, so the agreement and the intellectual property assignment sit under law your own advisers already read. The document is yours whichever way you go.
The evidence behind this guide
Independent findings on why this investment pays off. Every link goes to the primary source.
- Technology 'Leaders' grow revenue at more than twice the rate of 'Laggards'; laggards surrendered 15% in foregone annual revenue in 2018 and stood to miss out on as much as 46% in revenue gains by 2023 if they did not change their enterprise technology approach. Based on a survey of more than 8,300 organizations across 20 industries and 20 countries. Source: Accenture (2019) →
- Standish's 2015 CHAOS research found roughly a third of software projects (about 36% by the Modern definition) fully succeed on time, on budget, and on scope, with top success drivers including executive support, user involvement, and clear requirements/business objectives. Source: Standish Group (CHAOS Report) (2015) →
- In the Flexera 2025 State of ITAM report, respondents reported roughly 33% of SaaS spend is wasted, underscoring how paying for off-the-shelf seats and tiers that go unused erodes the supposed cost advantage of generic SaaS. Source: Flexera (2025) →
- Workers can expect 39% of their existing skill sets to be transformed or become outdated over 2025-2030; 77% of employers plan to upskill their workforce, and 63% identify skill gaps as the biggest barrier to business transformation. Source: World Economic Forum (2025) →
Frequently asked questions
How do we tune person matching for our jurisdiction rather than a default?
Start from your own data. Take a sample of known duplicates and known distinct pairs from the legacy system, then tune the weights until the automatic merge band produces no false merges on that sample and the manual review band is small enough for staff to work daily. Naming conventions, transliteration patterns and the share of records with no reliable address vary enormously between jurisdictions, and a vendor default trained elsewhere will be wrong in a direction you cannot predict without testing it.
What should happen when two records merge that should not have?
An unmerge that restores the original records exactly as they were, including their original identifiers, their linked results and any investigation attached to each. Approximating the restoration is not acceptable, because the merged record has usually accumulated new material that has to be attributed to the correct person. Ask any prospective developer to describe this specifically, since a team that has run a master person index in production will have a clear answer and a team that has not will improvise one.
Why do results from one hospital suddenly stop arriving?
Most often because the sending facility identifier changed during a laboratory information system upgrade, so messages still arrive but no longer attribute correctly, or because a new test went live with a local code that fails your mapping silently. Neither generates an error anyone sees. Monitor per sender volume against its own baseline so a sender that stops or halves raises an alert within a day, and alarm on unmapped codes rather than letting them default into an unmapped bucket.
Can epidemiologists change an investigation questionnaire without a developer?
In a properly built system yes, and that capability is frequently the whole reason to build. Conditions, case definitions, questionnaires and routing rules should be versioned configuration with an approval step, publishable by a trained analyst in an afternoon. Crucially, cases investigated under an earlier version keep that version, so a change in June does not rewrite what was collected in March or invalidate the analysis someone already published.
How do we actually meet an immediately reportable timeframe?
Make the timeframe an object rather than a report. On case creation the system should know the condition, the applicable window and who is on call, then page rather than queue, and escalate anything unassigned past a threshold. Measure time to first contact attempt rather than time to closure, because that is usually what the rule governs and a closure based measure will show compliance you do not have. Field attempt logging on a mobile device is what makes those timestamps real rather than reconstructed.
Is the NEDSS Base System still the right answer for a mid sized department?
Often, yes. If your reportable conditions are the standard list, your volume is moderate and your state provides the instance, it carries the national reporting plumbing and you should not rebuild it. The point at which it stops fitting is authorship: when your team needs a new condition, a new question and a new routing rule live during an event, and the path runs through a change request in someone else's release calendar. Most departments are not at that point, and the ones that are already know it.
How should restricted condition data be protected during a surge?
With field and condition level access control that the system enforces and logs, designed before the surge rather than during it. Surge is precisely when a temporary worker sees a record they should not, because onboarding is fast, supervision is thin and roles get widened to unblock people. Provision narrow roles that do exactly one job, log every view rather than only every edit, and make bulk operations require supervisor authorisation so nobody reaches for direct database access under pressure.
What is the fastest way to get value from a surveillance build?
Start with your five highest volume reportable conditions and your three largest sending laboratories, and ship intake, matching and the statutory clock first. That covers the great majority of message traffic, removes the daily deduplication burden immediately, and teaches the build everything it needs to know about your data before the long tail of low volume conditions arrives. Departments that try to cover every condition in release one usually spend the budget on the conditions that generate the fewest cases.
Should I ask for a fixed price or pay the agency hourly?
Fixed price for the first version, hourly or retainer for what comes after launch. A fixed-scope, fixed-price V1 puts the estimation risk on the agency, which is exactly where you want it while trust is unproven; hourly billing on an unscoped greenfield build is a blank check. After launch, flip it, because maintenance and small features arrive unpredictably and fixed-pricing every ticket wastes everyone's time.
Couldn't I just build my app in Bubble or another no-code tool instead of hiring an agency?
For validating an idea with real users, yes, and we tell clients that honestly. The walls come later: Bubble apps cannot be exported as code to run anywhere else, performance drops on complex data operations, and usage-based pricing climbs as you grow. A meaningful share of Digital Heroes custom builds are rebuilds of no-code MVPs that proved the business worked, which is the system operating as intended: validate cheap, then build the version that scales.
Can I build my product on a no-code tool like Bubble instead of hiring developers?
For testing whether anyone wants the product, yes, and Bubble's paid plans start at $29 a month, which is the cheapest validation you will ever buy. The ceiling arrives with complex data relationships, heavy integrations, performance at a few thousand users, and the fact that you cannot export a Bubble app to servers you control. A path many Digital Heroes clients take: prove demand on no-code, then rebuild custom once revenue justifies it, treating the no-code version as a paid prototype rather than a foundation.
How many people should be working on my software project?
Three to five for a typical focused build: a project lead, one or two engineers, a designer, and part-time QA, which is the standard shape across 2,000+ Digital Heroes projects. Larger platforms justify 6 to 10, but a ten-person team on a small first version usually signals bill padding rather than horsepower. What predicts success is whether a senior engineer is writing your code daily, not the headcount on the proposal.
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.
How do I make sure custom software is secure and compliant with rules like HIPAA?
Start with the baseline every business system should have: encryption in transit and at rest, role-based access control, and audit logs. If HIPAA applies, the hosting provider must sign a Business Associate Agreement, which AWS, Azure, and Google Cloud all offer, and access controls have to be designed in from day one, not bolted on. SOC 2 certifies a company's operating practices, not a codebase, so ask vendors what they have shipped in your regulated domain rather than which logos are on their website.
Can custom software connect to the tools we already use, like QuickBooks, Stripe, and Google Workspace?
Yes, and connecting your existing tools is one of the main reasons to build custom: mainstream platforms like QuickBooks, Stripe, Shopify, and Google Workspace all publish documented APIs. Budget 1 to 3 weeks of work per integration depending on API quality and how much data flows in both directions. Ask any vendor whether they have integrated with your specific tools before, because quirks like QuickBooks' OAuth token handling and API rate limits get learned on someone's project, and it should not be yours.
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.
Is custom software more secure than off-the-shelf SaaS?
Neither is secure by default; security tracks the practices of whoever builds and operates the system, not the model. SaaS gives you the vendor's certifications and patching but puts your data in a shared multi-tenant platform on their terms, while custom gives you full control over data residency, access rules, and compliance requirements like HIPAA, with the responsibility sitting with you and your agency. Before hiring anyone for a system holding sensitive data, ask for their security checklist: encryption at rest and in transit, an OWASP Top 10 review, role-based access, and a penetration test before launch.
Who can build a custom software system?
Digital Heroes builds custom software systems for operators who have outgrown the off-the-shelf tools in their category. The work is delivered remotely: our engineers work from Delhi and Lucknow, leadership is in New York, and some team members live in London and Sydney and work remotely from there. You can chat with the team directly, and every form gets an email reply within 24 hours.
Related guides
Published · Last updated .