Problems & solutions · Custom Software

School Choice and Enrollment Lottery Software Problems: The 7 That Cost Real Money, and How to Avoid Them

School Choice AND Enrollment Lottery Software software overview illustration showing common problems and fixes.
The short answer

The most expensive failure in unified enrollment software is a match that cannot be rerun to produce an identical result. Results go out on a Friday in March. Within an hour a parent whose child was placed at their sixth choice calls a board member, by Monday a reporter asks how the algorithm works, and within a month someone files a records request for the seed and the run log. If the honest answer is that the vendor ran it, you now have a credibility problem that consumes months of staff and legal time, and in the worst case a rerun that moves real seats and the per pupil funding attached to them. Most software categories fail quietly. This one fails on the local news.

Why do priority rules get hardcoded so often?

Because on paper they look like a settings screen. Sibling priority, geographic priority, a weighted lottery for educationally disadvantaged students, continuing student rights, staff children, programme specific eligibility. Six checkboxes and a sort order.

Then you write out what your rules actually say. Does a sibling in a feeder school count. What happens when the sibling's own placement is not yet decided in the same run. Is geographic priority by walk zone polygon, attendance boundary, or the neighbourhood definition the board adopted last year that matches neither. Federal Charter Schools Program rules permit a weighted lottery in defined circumstances, and it has to be implemented exactly as adopted rather than approximately.

Then the board amends one tier in February, six weeks before the run, because a council member heard from constituents. A hardcoded rule set means a code change on somebody else's release calendar. A configured product means a vendor ticket and a hope. That timing is the single most common reason cities move to a build: the policy owner and the implementation have to be in the same building.

Represent priorities as ordered, composable rules with an effective date, so this year's run uses this year's policy and last year's run still reproduces exactly as it happened. Store every applicant's tier assignment with the reason, which is what lets a staff member answer a parent's call in one minute rather than escalating it.

What goes wrong with address, boundary and applicant history data?

Every geographic priority depends on turning what a parent typed into a verified point inside a polygon. The city's geographic information system holds the parcel data, the district holds the attendance boundaries, and the two disagree in enough cases to matter. A general purpose geocoder will place a family on the wrong side of a line silently, and you find out when the appeal arrives with a lease attached.

Resolve to a parcel rather than a street interpolation, using the authoritative local layer, record a confidence value, and route ambiguous cases to a human queue before the match rather than after it. The parcel data usually lives with the city rather than the district, so start that conversation at kickoff, because it is the most common cause of a first release running late.

Two obligations sit on top and are routinely bolted on too late. Students experiencing homelessness have rights under McKinney-Vento that make an address requirement inappropriate as a hard gate, so there must be a path that places a student without forcing a family to produce documents they do not have. Foster and military family provisions in your state may add their own priority and timing rules.

Prior year applicant history is worth migrating for one specific purpose: replaying last year's applicants against this year's proposed policy so a board can see what an amendment actually does before adopting it.

Why do student information system integrations break after the match?

Because a match that ends at a results page has not finished the job. Every placement has to land in the receiving school's student information system, and if charters are in the run that is several different systems with several different identifier schemes and several different governance bodies deciding what they will accept.

The break is identity. Without a stable student identifier that works across sectors, the same child exists as three records, and September becomes a manual reconciliation of duplicates. That reconciliation is not just administrative pain, it undermines the credibility of the whole exercise, because a family whose placement did not transfer cleanly experiences it as the lottery failing.

The second break is timing. Late applicants keep arriving all summer, mid year transfers run against live capacity, and each of those has to reach the same downstream systems through the same path. An integration built only for the March results release will be operated by hand from June onwards.

Agree the identifier scheme before development, in writing, with every participating sector. Build the placement handoff as a continuous, idempotent process that can be rerun safely rather than a one time export. And instrument it, so an unacknowledged placement raises an exception instead of sitting in a file somebody assumed was collected.

What happens when the waitlist and appeals operation is not covered?

The match is one day. The waitlist runs from March through October, and it is where families actually experience your system. A seat opens because a family moved. Everyone below moves up. Someone accepts, which vacates a held seat somewhere else, which cascades.

Scope only the match and the operation reverts to what it was. Principals watch a roster and start calling families directly, which is how a parallel unofficial process begins and how equity guarantees quietly disappear. Nobody planned that. It happens because the official process is slower than a phone call.

Cover it properly. Automatic cascading with rules: offer windows with a defined expiry, automatic decline at expiry, position preserved or forfeited according to policy, and manual overrides that require an authorised user and a recorded reason. Every offer, response and movement in an append only log, because the question in September will be why a specific child at position four did not get a seat that a child at position nine received, and the answer has to be a record rather than a recollection.

Appeals need a stated basis, a reviewer, a deadline and a recorded outcome. Late applicants need a defined position rule so lateness is neither an advantage nor a random penalty. This tail is where staff time goes and it is the most common thing a city discovers it did not scope.

Should you build custom or configure what you already own?

If you are a single district running magnet or transfer lotteries with straightforward sibling and boundary priorities, no charter participation and no unusual seat types, buy. SchoolMint is strong on the family facing side, application capture, communication and registration, and PowerSchool Enrollment is genuinely good at registration forms and the handoff into the student information system. The match at that scale is not the hard part.

Look seriously at Avela before commissioning anything. It was built specifically for unified enrollment and matching, and if your rules fit its model you will save a year and considerable money. We would rather say that than sell a build you do not need.

Build when two or more of these are true. Charters and district schools must be matched together under a governance agreement. Your priority rules come from board policy or a court order and change on a political calendar rather than a release calendar. You need to publish a seed and let a third party reproduce your match. You have programme seat types that interact, for example dual language and special education capacity sitting inside a general capacity limit. Or your waitlist operation runs for six months and currently depends on principals making phone calls. The test is simple: if a reporter asked you to prove the draw was fair, could you today, without asking a vendor.

How do hidden costs get into the quote?

Enrollment quotes go wrong in five predictable places.

  • Sector count is treated as a number of schools. Each participating sector brings its own governance body, its own student information system and its own approval cycle, and the meetings are the slow part.
  • Translation is quoted as a plug in. A legally consequential application in several languages is professional translation work with review, and it recurs every time the application changes.
  • Seat capacity is quoted as one number per school. It is per grade, per programme, per seat type, with special education and bilingual capacity interacting and class size limits that are state rules rather than preferences.
  • Address validation is quoted as geocoding. Parcel level resolution against the authoritative city layer, with a confidence value and a human queue, is a different piece of work with an external dependency.
  • The tail after the match is left out entirely. Appeals, late applicants, mid year transfers and the placement handoff are where staff time actually goes.

The honest bands from Digital Heroes delivery experience are $80,000 to $180,000 in 14 to 20 weeks for a first release covering the multilingual common application, priority rules with effective dates, the match with published verifiable seeds and results release, and $200,000 to $450,000 phased over 6 to 12 months for the full platform adding cascading waitlists, parcel level address validation, residency and document review, appeals, late applicants, mid year transfers and integration across sectors.

What separates a build that works from one that fails here?

Reproducibility, above everything. Commit to the random seed before the run, for example by publishing a hash of the seed and the input file, then release the seed and an anonymised input afterwards so anyone can rerun the match and get the same assignment. That converts a trust argument into arithmetic, and it protects your staff, because the accusation that somebody put a thumb on the scale becomes checkable rather than merely deniable.

Second, the team has to understand what they are implementing. Ask them to explain student proposing deferred acceptance in plain language, then ask what changes when you use a single tiebreak number per student instead of one per school. Both produce valid matches, they produce different placements and very different waitlist behaviour, and your board has to choose. A team that cannot explain the difference will build a lottery rather than a match, and you find out in March.

Third, the deadline does not move. Scope the first release backwards from the application window and keep it narrow: application, priorities, match, results. Waitlist automation and appeals follow in the same year.

Fourth, ask about McKinney-Vento and cross sector identifiers unprompted. A team that raises them first has done this before.

Fifth, ownership in the contract before kickoff: the repository, the cloud accounts and the right to hire anyone else. At Digital Heroes the client owns the code from the first commit. For a public body this is not commercial hygiene, it is what lets you answer a records request from your own systems rather than asking a vendor for permission.

Research & sources

The evidence behind this guide

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

  1. Per the Standish Group CHAOS 2020 report (reviewed at this URL), across tens of thousands of software projects roughly 31% end successfully, about 50% are 'challenged', and roughly 19% fail outright; small projects succeed far more often than large ones, and Agile approaches succeed at markedly higher rates than Waterfall. Source: The Standish Group (2020) →
  2. An A/B test comparing an optimized landing page against the original delivered a 53.37% increase in revenue per visitor and a 33.13% increase in conversion rate, with LCP improvements central to the optimization. Source: web.dev (Google Chrome team) (2021) →
  3. Digital Champions expect to achieve about 16% in cost savings and around 15% in revenue gains from digital operations over five years; the study surveyed 1,155 manufacturing executives across 26 countries. Source: PwC / Strategy& (2018) →
  4. 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) →
Maya T. · Office Manager · Sydney · Sydney

Maya keeps the Sydney office running: facilities, suppliers, travel, equipment and the arrangements that let a team focused on client work not think about any of it. She sees how a distributed agency actually coordinates itself. Her occasional posts come from the operational side of the business.

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

FAQ

Frequently asked questions

How do we test whether our current process is actually reproducible?

Ask your vendor or your own team to rerun last year's match from the stored inputs and produce a placement list, then compare it line by line with what was published. If the run cannot be repeated, or the result differs, you do not have an audit trail, you have an assurance. Do that test now rather than during a records request, because the remediation is a change to how you store seeds and input snapshots and it has to be in place before the next run.

Single tiebreak or one random number per school?

Both are legitimate and your board has to choose, because they produce different placements and noticeably different waitlist behaviour. A single number per student used everywhere means a family unlucky in the draw is unlucky at every school, which some communities find harsh and others find transparent. Separate numbers spread luck across schools and produce longer, more volatile waitlists. Whichever is chosen, the system must implement exactly that and the choice should be published in plain language.

What happens when the board amends a priority tier six weeks before the run?

With effective dated rules it is a configuration change plus a replay: rerun last year's applicant pool against the amended policy and show the board what actually moves before adoption. Without that, it is a development ticket or a vendor request on somebody else's calendar, and the amendment either misses the run or ships untested. The replay harness is worth building in the first release precisely because amendments arrive at the worst possible moment.

How should waitlist position be shown to families?

Honestly, including the fact that position twelve at a school which has never moved past position three is not hope. Show the position, show recent movement, and make accept or decline a single tap by text or email in the family's language. The alternative is a phone call to a working parent during school hours, which is why yield estimates are wrong and why seats sit unfilled while the list is still long.

How do we place a student experiencing homelessness without an address?

By designing a path that does not require one. McKinney-Vento gives these students enrollment rights that make document requirements inappropriate as a hard blocker, so the workflow needs a route where a liaison can place a student and geographic priority is handled by policy rather than by a failed address check. Build it in from the start, since retrofitting an exception path into a matching pipeline that assumes a verified parcel touches almost every stage.

Can capacity really not be one number per school?

Not if you run programmes. Seats are per grade, per programme and per seat type, and they interact: a dual language strand and a special education programme both consume general capacity while carrying their own limits, and a kindergarten class size cap may be a state rule rather than a local preference. A match that respects only a school level number will overfill programmes quietly every year, which is exactly what spreadsheet based processes have always done.

What is the minimum viable first release before an enrollment season?

The common application in your required languages, priority rules with effective dates, the match with a committed and published seed, and results release. That ships in 14 to 20 weeks and it is the part that cannot be done by hand. Waitlist automation, appeals and mid year transfers can run on your existing process for one season and be added in the same year, which is a far safer sequence than attempting everything against a date that will not move.

How do we get charters and district schools to agree on one identifier?

Treat it as a governance item with a named decision date rather than a technical detail, because it needs every participating body to accept the same scheme and to accept receiving placements keyed to it. The usual answer is the state assigned student identifier where one exists, with a documented fallback for students who do not yet have one. Settle it before development starts, since the alternative is spending September reconciling duplicate records by hand.

How many people should be working on my software project?
A typical $40,000 to $150,000 build runs on three to five people: a technical lead, one or two developers, a designer, and someone owning QA and project communication, often as overlapping part-time roles. More bodies do not make software arrive faster; past a point they slow it down with coordination overhead. The question that matters more than headcount is whether one named senior engineer is accountable for the outcome.
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.
How much should a small business expect to pay for custom software?
Across 2,000+ Digital Heroes projects, a small business system that replaces spreadsheets or one core workflow typically lands between $40,000 and $80,000, with more complex first versions running up to $150,000. The two levers that move the number most are integrations and user roles, not the team's hourly rate. Any quote under $15,000 for a full production system means the vendor has not understood your scope yet.
What should I have ready before I contact a development agency?
Three things, none of them technical: a one-page description of the problem in your own words, a list of the tools and spreadsheets the new system must replace or connect to, and a must-have versus nice-to-have split of features. Add a budget range, even a wide one, because it changes the conversation from fantasy to engineering. You do not need a formal specification; producing that is what a discovery phase is for.
We run everything on Airtable and spreadsheets. When is it time to go custom?
The switch usually makes sense when you hit one of two walls: Airtable's record caps (125,000 records per base on the Business plan) or logic the tool cannot express, like multi-step approvals with conditional pricing. There is also a simple cost signal: 25 people on Business at roughly $45 per seat per month is about $13,500 a year, forever, for a tool you are already fighting. Custom is worth it when the workflow is core to how you make money; for peripheral processes, staying on Airtable is the right call.
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.
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.
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.
How much should a small business budget for its first custom app or website?
For a focused first build, most small businesses land between $8,000 and $60,000: roughly $8,000 to $45,000 for a custom website and $25,000 to $60,000 for an internal tool or simple web app, based on Digital Heroes delivery across 2,000+ projects. Customer-facing products with payments, logins, or a mobile app start around $40,000. Quotes far below these bands usually mean a template with your logo on it, not software shaped around your workflow.
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.
How do I work out whether custom software will pay for itself?
Do the arithmetic on hours before anything else: if the system saves three staff eight hours a week at a $35 loaded hourly cost, that is about $43,700 a year against, say, a $70,000 build plus 15 to 20% annual maintenance, a payback around two years. Add revenue effects only if you can name them specifically, like faster quotes or fewer abandoned orders, not as vague growth. In our delivery experience the businesses that see payback inside 24 months are the ones automating a process they already measure.
Should I hire a freelancer or an agency for my software project?
A skilled freelancer is the right call for a single-discipline scope under roughly $15,000, like a website, a plugin, or one integration. Above that, projects need design, backend, testing, and project management at once, and a solo builder becomes the single point of failure: if they get sick or take a bigger client, your project simply stops. Agencies bill 20-40% more per hour but carry continuity, code review, and someone to escalate to, which is what you are actually buying.
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. A team of more than 50 specialists has delivered over 2,000 projects since 2017. Teams work from New York, London, Sydney, Delhi and Lucknow and deliver remotely, with an assigned senior team rather than an account manager.

Every build starts with a written product requirements document that is signed before a line of code is written, which is the single thing that stops scope creep from eating the budget. Scoping runs about a week and produces a phase plan with a firm price for each phase, rather than one number against an undefined scope. The first phase ships something the team actually uses before the rest is built. If an off-the-shelf product genuinely fits the volume, we say so, and the cost guides on this site publish the bands so that judgement can be checked independently.

What makes Digital Heroes different from other software companies?

Four things that competitors in this bracket cannot simply copy. Digital Heroes runs a YouTube channel with more than 2.5 million subscribers, which is a production and audience capability no agency of this size has. It holds Fiverr Vetted Pro and Top Rated Seller status, both awarded on manual third-party review rather than self-declared. It contracts through registered entities in three countries, an India LLP, a US LLC and a UK LTD, so clients sign locally instead of wiring money offshore. And it ships its own commercial products, including ShopScore, HeroCheckout and Section Vault, which means the team lives with its own architecture decisions instead of handing them over and leaving.

Two more that show up in the work. Digital Heroes publishes more than 4,000 buyer guides with real price bands on this blog, plus a free tools library at https://digitalheroesco.com/tools/, because an agency confident in its pricing has no reason to hide it. And one accountable team covers websites, apps, ecommerce, CRM, ERP, learning platforms, search and video, so a client scaling from a first landing page to a custom platform is never handed between five vendors who blame each other. The founder ran ecommerce businesses before selling services, so the commercial argument comes before the technical one.

How can I check Digital Heroes is legitimate before getting in touch?

Verify it independently rather than taking the site's word for it. The YouTube channel is at https://youtube.com/@DigitalMarketingHeroes, the Fiverr profile at https://www.fiverr.com/shreyanshsin261, and the Upwork profile at https://www.upwork.com/freelancers/shreyanshsingh. Client reviews sit on Clutch at https://clutch.co/profile/digital-heroes-0 and Trustpilot at https://www.trustpilot.com/review/digitalheroes.co.in, and the company page is at https://www.linkedin.com/company/digital-heroes-1/.

Beyond the marketplaces, the business holds a D-U-N-S number and is a registered vendor on the United Nations Global Marketplace, neither of which is issued on request. Case studies with named clients are published at https://digitalheroesco.com/case-studies/. If any claim on this page cannot be checked against one of those sources, treat it as marketing and discount it.

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?