There is no useful single price for a custom web application. Two products that sound similar in a one-paragraph description — "a portal for our customers" — can have very different budgets depending on what they actually need to do, who uses them, and what happens when something goes wrong. A feature list is a starting point for a conversation, not an estimate.
Why a feature list alone is not enough to estimate a web application
"Login, dashboard, payments" describes almost nothing about effort. Login could mean a simple form or a multi-role permission system with account recovery, audit logging, and single sign-on. Payments could mean a one-time checkout or a subscription engine with trials, proration, and dunning logic. The words are the same; the work behind them is not. A reliable estimate starts from behavior and rules, not feature names.
Product scope: users, roles, workflows, states, and permissions
The number of distinct user roles, the workflows each one needs to complete, and the states a record can move through (draft, pending, approved, expired, and so on) all drive real development effort. A product with one user type and a handful of screens is a different project from one with customers, staff, and administrators who each see different data and can take different actions.
Design maturity and the cost of unresolved user journeys
Development can start once the key user journeys are understood, even if every screen is not pixel-perfect. What is expensive is starting development before edge cases and secondary flows are resolved — empty states, error states, permission boundaries — because those decisions get made ad hoc, in code, under deadline pressure, instead of deliberately during design.
Back-end complexity, data models, APIs, and third-party integrations
How data is structured, how many external systems the product talks to, and how much logic lives outside of simple CRUD operations all shape back-end cost. A product that owns its own data model end to end is usually more predictable to estimate than one that depends on several external integrations, each with its own quirks, rate limits, and failure modes.
Payments, subscriptions, membership logic, and operational edge cases
Payment and subscription logic is disproportionately expensive relative to how simple it looks in a wireframe. Failed payments, retries, refunds, upgrades, downgrades, and access tied to billing state all need explicit rules, and each rule is a piece of logic that has to be built, tested, and maintained — not a checkbox.
Data migration and compatibility with existing systems
If the product replaces or extends something that already exists, migrating historical data safely is often underestimated. Data is rarely as clean as it looks in a spreadsheet, and reconciling it with a new schema, without breaking access to existing accounts or history, is real, often unpredictable work.
QA depth, supported browsers, and release risk
The amount of testing a product needs depends on how much a failure would cost — a marketing site tolerates more risk than a product handling payments or sensitive data. Supported browsers, device coverage, and how thoroughly critical journeys are validated before release all factor into the realistic cost of getting to a safe launch.
Infrastructure, monitoring, security responsibilities, and deployment
A product is not finished when the application code works. Environments, deployment pipelines, monitoring, and basic security responsibilities all need to be set up once, and reliably, rather than improvised at the point of launch. This is real, budgetable work, not overhead that happens automatically.
What ongoing support adds to total cost of ownership
The initial build is one part of the total cost. A realistic budget also accounts for ongoing maintenance, monitoring, dependency updates, and future feature work — not because something will necessarily go wrong, but because a live product with real users always generates some ongoing technical work.
Fixed scope versus evolving scope: when each model is realistic
A fixed-scope model works when requirements are genuinely well understood upfront. An evolving-scope model, delivered in milestones, is more honest when a product's requirements are still being discovered through use. Neither model fixes an unclear brief — it just determines who absorbs the cost of that ambiguity, and when.
A description of user roles and what each one needs to accomplish
Known third-party systems, APIs, or platforms the product must connect to
Whether payments, subscriptions, or membership logic are involved
Whether existing data needs to migrate into the new product
Any compliance, security, or accessibility requirements you already know about
Whether ongoing support and maintenance should be scoped from the start