Custom Software Delivery · Field Guide
From a conversation to a
quotable, deliverable project.
A practical playbook for planning, designing, building, testing, documenting and pricing custom software — for brand-new applications and for enhancements to systems already in production.
Introduction & how to use this guide
This guide describes a repeatable way to take a software idea — a new product or a change to an existing one — through the full arc of planning, design, construction, testing, documentation and release, in a way that lets you quote the work accurately before you commit to it.
Purpose & audience
It is written to be used two ways at once. Internally, it is a methodology manual — a shared checklist so that any project, run by any team member, produces the same artifacts, hits the same quality bar, and can be estimated with the same discipline. Externally, it is a trust document: something you can hand a prospect (or paraphrase in a proposal) to show that their project will be run by professionals who define before they build. It applies equally to an independent developer quoting a one-person job and to a small firm coordinating several people.
Treat every phase as optional-but-deliberate. Small projects collapse several phases into a single short document; large or regulated projects keep them fully separate. What should never happen is a phase being skipped by accident.
The core principle
You cannot accurately price what you have not defined. One of the most common causes of unprofitable projects and unhappy clients is quoting from a conversation instead of from a specification. Every phase in this guide exists to convert vague intent into defined scope — and defined scope is what makes an estimate defensible.
This has a direct commercial consequence: the work of defining scope is itself billable. A fixed-price quote for an undefined project is a gamble you will usually lose. The professional move is to sell a small, paid discovery/design engagement first, and quote the build from its output (see Paid discovery).
New builds vs. enhancements to existing systems
The same phases apply to both, but the center of gravity shifts:
| Dimension | New application | Enhancement to an existing system |
|---|---|---|
| Biggest risk | Getting requirements and architecture right from a blank page | Unintended impact on features already in production |
| Heaviest phase | Requirements & high-level design | Impact analysis & regression testing |
| Key unknown to price | Scope breadth & unfamiliar domain | Condition of the existing codebase & data |
| Documentation focus | Full document set from scratch | Deltas: what changed, and updated user/release notes |
| Estimation danger | Under-scoping the feature list | Under-scoping the "touch everything it connects to" tax |
Engagement models & when to use them
How you price a project should follow how well the project is defined. Match the commercial model to the amount of uncertainty, not to what feels easiest to sell.
First: should you take it on?
Before discovery — before any number changes hands — decide whether the opportunity is worth pursuing at all. Qualification is a five-minute filter that saves weeks: it separates a real project with a sponsor and a budget from a conversation that will never close, or a job that doesn't fit what you do or can support.
Questions to answer • What business problem is driving this — and what is it worth solved? • Who feels the pain, and how often? • Is there a real decision-maker (sponsor) AND an operational expert (SME)? • Is there a budget, or at least a ceiling? • Is the timeline real, flexible, or event-driven? • Will the client pay for discovery & design? • Does it fit our skills, strategy, and capacity to support long-term? • Is the work customer-specific, reusable product value, or mixed? One-page output problem · value · decision-makers · budget & timeline · fit · risks · next step
Any figure you offer at this stage is a Rough Order of Magnitude (ROM) — a deliberately wide range to gauge interest, explicitly labelled as such. A ROM is not a quote. Naming it that way is a mark of professionalism, not weakness: it lets you be helpful about cost without being trapped by a number you gave before you understood the work.
The four common models
| Model | Best when… | Who carries the risk | Watch for |
|---|---|---|---|
| Fixed price | Scope is fully defined & stable (post-design) | You | Any scope change must trigger a change order |
| Time & materials | Scope is exploratory or fast-moving | Client | Needs trust & transparent reporting |
| Capped T&M | Client wants T&M flexibility with a ceiling | Shared | You eat overruns above the cap |
| Retainer / support | Ongoing enhancements & maintenance | Shared | Define what a "unit" of work is |
| Milestone / phased | Large builds; reduces everyone's exposure | Shared | Each milestone needs its own acceptance criteria |
Who benefits — and who should fund it
This distinction matters most when you both maintain a product and do custom work for individual clients. Some work benefits only the client in front of you; some builds reusable value you can sell again and again. Deciding up front who funds which protects your margin now and protects the product as an asset later.
| Type of work | Who typically funds it |
|---|---|
| Customer-specific configuration, reports, conversions, exceptions | The customer |
| Reusable product foundation or features you can resell | Vendor investment (or shared) |
| Mixed benefit | Cost-share / discounted customer contribution |
| Experimental or future capability | Separate pilot / R&D budget |
Beware quietly funding reusable product value out of one customer's fixed-price budget. You lose margin on that job and hand over — often without a license conversation — an asset you could have sold many times. Name reusable work as reusable, and fund it as a deliberate investment, not an accident.
Sell discovery as its own paid phase
The cleanest way to de-risk a fixed-price build is to precede it with a small, fixed-price discovery & design engagement. Its deliverable is the requirements and design documents in this guide, plus a detailed build estimate. This gives the client a real artifact they own even if they walk away, and gives you a defined thing to quote.
Before we quote the build, we run a short paid discovery phase. In it we document exactly what the software must do, how it will fit your existing systems, and what it will cost to build — as a fixed set of deliverables you own outright. It typically runs [1–2 weeks / $X]. If you decide to proceed, that work feeds straight into the build; if you don't, you keep the specification and can take it anywhere. It means the build quote you receive is based on a real plan, not a guess.
Choosing a model quickly
- Undefined idea → Paid discovery (fixed)
- Defined build → Fixed price or milestones
- Ongoing change → Retainer or capped T&M
- Emergency / unknown code → T&M until scoped
The lifecycle at a glance
Every project moves through the same sequence of phases. On a small job several may be a single afternoon; on a large one each is a formal deliverable. The order matters because each phase's output is the next phase's input.
The phase map
Documentation is shown late for numbering, but in practice it is written continuously — user docs during testing, release notes during release, technical docs during design and build.
Phase gates
A phase gate is a short, explicit checkpoint between phases: is the previous deliverable complete and signed off before the next one starts? Gates are where scope creep is caught early and where the client re-confirms they are buying what you are building. Even a one-line email — "Design approved, proceeding to build against this document, dated X" — is a valid gate and a valuable paper trail.
Skipping the gate between design and estimate is the most expensive mistake in the whole lifecycle. If you estimate before the design is settled, you are pricing a moving target — and you will own the difference.
Deployment models: what stays the same, what shifts
One question arrives the moment a prospect hears "custom software": does this still apply if it runs in a browser instead of on my PC — or the other way round? Yes. This framework is deployment-agnostic. Every phase, every document, the estimation maths and the change-control discipline apply whether the solution runs locally on a specific operating system or in a browser against a cloud server.
Same process, different weight
Web, cloud, mobile and desktop builds run the same lifecycle. What changes is not the steps but the weight inside a few of them — and, more importantly, who is responsible for running the software once it is live. That second point is the deepest difference, and it is commercial, not technical:
- Desktop / local. The customer's machine is the runtime. You ship a build; their environment runs it. Your operational responsibility largely ends at delivery.
- Web / cloud. You — or your host — run the single production instance. Uptime, internet-facing security, scaling, monitoring, backups and hosting cost move permanently into your world, for as long as the software exists.
What stays the same, what shifts
| Phase | Identical everywhere | What a web / cloud build adds or intensifies |
|---|---|---|
| Requirements | Functional behavior & business rules | Concurrency/load, browser & device matrix, responsive layout, latency & offline behavior, uptime / SLA, multi-tenancy |
| Design | Data model, module logic | Explicit client/server split, API contracts, session & state management, auth model (tokens / OAuth / SSO), caching |
| Security | Access control & audit | A far larger, internet-facing surface: injection / XSS / CSRF, transport encryption, secrets management, dependency & supply-chain risk |
| Testing | Unit → integration → system → regression → UAT | Cross-browser / device testing, load & performance testing, security / penetration testing |
| Release | Tested migration, rehearsed rollback | Dev / staging / prod environments, CI/CD, zero-downtime strategies — and one bad deploy hits every user at once, so rollback discipline matters more |
| Support & commercial | Warranty, backlog, change control | Hosting + subscription (recurring), monitoring, and you now own backups & uptime — versus desktop's license + optional maintenance |
The recurring-cost trap
The most common web/cloud mistake is quoting the project like a desktop project and forgetting you have just agreed to run it indefinitely. A local app is mostly a one-time build plus optional maintenance. A hosted app carries cost every month it exists: hosting, monitoring, backups, security patching, and your time keeping it healthy. Price the operating model, not just the build — usually as a subscription or managed-service fee — or a successful project quietly becomes an unpaid liability.
This is the same "who benefits, who funds" logic from the engagement-models section, applied over time instead of across features: someone must fund the running of the software, not only its construction.
Discovery & requirements
The goal of this phase is a written, agreed answer to one question: what must this software do, for whom, and why? Everything downstream — design, estimate, tests, docs — is traceable back to a requirement stated here.
What you produce
The headline deliverable is a Software Requirements Specification (SRS). It separates three things that are easy to blur:
- Business requirements — the outcome the client wants (reduce order-entry time, cut errors, enter a new market).
- Functional requirements — specific behaviors the system must exhibit ("the system shall validate a purchase order against the price list before saving").
- Non-functional requirements — qualities: performance, security, availability, supported platforms, data volumes, compliance. These are routinely forgotten and routinely expensive.
Equally important are the boundaries: assumptions, constraints, dependencies, and an explicit out-of-scope list. The out-of-scope list is your single best defense against scope creep — write down what you are not doing.
Template · SRS outline
1. Introduction
1.1 Purpose & business objective
1.2 Stakeholders & intended users (roles)
1.3 Definitions & glossary
2. Scope
2.1 In scope (bulleted, specific)
2.2 Out of scope (bulleted, specific)
2.3 Assumptions & constraints
2.4 Dependencies (systems, data, third parties, people)
3. Current state (for enhancements: how it works today)
4. Functional requirements
FR-1 [Actor] shall be able to [action] so that [outcome]
FR-2 … (each numbered & individually testable)
5. Non-functional requirements
5.1 Performance & expected data volumes
5.2 Security, access control & audit
5.3 Availability, backup & recovery
5.4 Platforms, browsers, devices, integrations
5.5 Compliance / regulatory
6. Data requirements (entities, sources, retention, migration)
7. Interfaces (users, other systems, files, APIs)
8. Acceptance criteria (how we agree it's "done")
9. Open questions & risks
10. Sign-off
Every functional requirement should be numbered, atomic, and testable. If you cannot write a pass/fail test for it, it is not yet a requirement — it is a wish. "Fast" is a wish; "returns search results in under 2 seconds for up to 100,000 records" is a requirement.
AI assist · requirements
AI is strong at turning messy meeting notes into a structured first draft, surfacing missing non-functional requirements, and generating clarifying questions you should ask the client before quoting. Treat the output as a checklist to interrogate, never as agreed scope.
# Prompt: draft SRS + gaps from raw notes
You are a senior business analyst. Below are raw notes from a client
call about [a new / an enhancement to an existing] application.
1. Draft a structured requirements outline (functional & non-functional).
2. List every ASSUMPTION you had to make to fill gaps.
3. List the 10 highest-value clarifying questions I must ask before
I can quote this accurately, ranked by how much each could change cost.
Notes:
"""[paste notes]"""
Worked example
Client says: "We need the order screen to handle commodity pricing — prices change daily and vary by source."
Turned into requirements:
- FR-1 — A user shall record a daily price per commodity, per source, with an effective date.
- FR-2 — When an order line references a commodity, the system shall apply the price effective on the order date.
- FR-3 — A user shall be able to view price history for any commodity/source.
- NFR-1 — Price lookups shall not add more than 200 ms to order-line save.
- Out of scope — Automated import of external market feeds (noted as a likely phase 2).
- Open question — What happens to an order priced before a same-day price correction? (Cost driver — must resolve before quoting.)
Notice how one sentence became six testable statements plus a scope boundary plus a pricing-relevant open question. That expansion is the phase's entire value.
High-level design (solution architecture)
High-level design answers "what is the shape of the solution?" — the major components, how they fit together, the technology choices, and how the new work connects to anything that already exists. It is deliberately above the code.
What an HLD covers
- Architecture — the major building blocks and how they communicate (client app, database, services, reporting, integrations).
- Technology stack — languages, frameworks, database engine, deployment target, and why each was chosen (or is fixed by an existing system).
- Data model overview — the main entities and relationships, not yet every field.
- Integration points — every external system, file exchange, or interface, each a known risk and cost.
- Cross-cutting concerns — security model, error handling, logging/audit, backup and recovery.
- Key decisions & alternatives — record what you chose and what you rejected, so the choice can be defended later.
For an enhancement, the HLD is mostly about fit: which existing modules, tables and screens are affected, and how the change respects the current architecture rather than fighting it.
Template · HLD outline
1. Overview & design goals 2. Architecture diagram & component summary 3. Technology stack & rationale 4. Data model overview (main entities & relationships) 5. Integration & interface inventory 6. Security & access model 7. Non-functional strategy (performance, availability, backup) 8. Key design decisions & rejected alternatives 9. Impact on existing system (enhancements only) 10. Risks & assumptions carried into technical design
AI assist · high-level design
Use AI to pressure-test an architecture, not to choose one blindly. Ask it to critique your proposed design, enumerate trade-offs, and generate diagram source (e.g. a text-based diagram description) you can refine. Because model advice varies, cross-checking the same design question across more than one assistant is a cheap way to catch blind spots.
# Prompt: architecture critique
Here is a proposed high-level design for [system]:
"""[paste your component list, stack & data model overview]"""
Constraints that are FIXED and non-negotiable:
- [existing database engine / language / deployment target]
Critique this design. Identify: (1) the top 3 technical risks,
(2) anything that will be expensive to change later, (3) integration
points I may have under-estimated, (4) two alternative approaches with
their trade-offs. Do not suggest changing the fixed constraints.
Technical design (detailed design)
Technical design answers "exactly how is each part built?" It is detailed enough that construction becomes largely mechanical — and, crucially, detailed enough to estimate task by task.
What detailed design contains
- Data schema — every table/entity, field, type, key, index and relationship. This is where a four-table idea becomes an exact set of columns and constraints.
- Module & procedure specs — for each unit of work: inputs, outputs, logic, and error handling.
- Interface & API contracts — exact request/response shapes, file layouts, message formats.
- UI specification — screens, fields, validations, navigation, and states.
- Security detail — who can do what, at the level of specific actions.
- Migration & data conversion — how existing data is mapped and moved (a frequent hidden cost).
Template · technical design outline
1. Traceability (map each section back to requirement IDs)
2. Data design
2.1 Schema: tables/entities, fields, types, keys, indexes
2.2 Relationships & referential integrity rules
2.3 Migration / conversion mapping (source → target)
3. Module design (one block per module)
- Purpose · Inputs · Outputs · Logic · Errors · Dependencies
4. Interface design (screens, reports, files, APIs — exact contracts)
5. Security & permissions (action-level)
6. Validation & business rules
7. Logging, audit & error-handling strategy
8. Build/task breakdown (feeds directly into the estimate)
Section 8 above — the task breakdown — is not busywork. A technical design that lists concrete build tasks converts directly into a work breakdown structure. Projects that are hard to estimate are almost always projects whose technical design was never finished.
Enhancement · impact analysis
For changes to a live system, the technical design must include an explicit impact analysis: every existing table, screen, report, and integration the change touches — directly or by side effect. Each touched item is a candidate for regression testing, and each is a line in the estimate.
A "small" change to a shared table or a widely-used routine is rarely small. The change itself may be trivial; verifying that everything else which relies on it still works is the real cost. Estimate the ripple, not just the edit.
Estimation & quoting
This is where design becomes a number you are willing to stand behind. Good estimation is not guessing well — it is decomposing the work small enough that the guesses become small, then adding structured allowances for everything that isn't raw coding.
Start with a work breakdown structure
A work breakdown structure (WBS) decomposes the project into tasks small enough to estimate confidently — a useful target is no task larger than one to two days. If a task is bigger than that, break it down further; large tasks hide large errors. The technical design's task list is your starting WBS.
Estimation techniques
| Technique | How it works | Use when |
|---|---|---|
| Analogous | Base the estimate on a similar past project | Early, ballpark, or a familiar job type |
| Bottom-up | Estimate every WBS task, then sum | You have a technical design — most accurate |
| Three-point (PERT) | Combine optimistic / likely / pessimistic | Any task with uncertainty (i.e. most) |
| Wideband Delphi | Several people estimate independently, then reconcile | High-stakes quotes; reduces individual bias |
For each task, capture three numbers: O (optimistic), M (most likely), P (pessimistic). The expected estimate is a weighted average that leans on the likely case but respects the tails:
Estimate = (O + 4M + P) ÷ 6 · Uncertainty (σ) = (P − O) ÷ 6
A wide spread between O and P is a signal to reduce risk before quoting — usually by finishing the design of that task.
Coding is only part of the effort
The most common under-estimate treats the developer-hours to write the feature as the whole cost. In reality, construction is often only 40–50% of total effort. A realistic project spreads across the full lifecycle:
| Activity | Typical share of effort* | Notes |
|---|---|---|
| Requirements & design | 15–20% | Higher for new builds & unfamiliar domains |
| Construction (coding) | 40–50% | The part people mistake for the whole |
| Testing & QA | 20–25% | Higher for enhancements (regression) |
| Documentation | 5–10% | User, release & technical docs |
| Project mgmt & client comms | 10–15% | Meetings, reporting, coordination |
| Deployment & release | 3–7% | Migration, go-live, rollback prep |
On top of the summed effort, add a contingency/risk reserve sized to the project's uncertainty — a well-defined enhancement might carry 10%, a novel build 25–40%. Contingency is not padding you hope to keep; it is the priced expectation that some tasks will hit their pessimistic case.
The work everyone forgets to price
These tasks rarely appear in a first-draft estimate and routinely blow it. Run the list against every estimate before you send it:
- · Customer meetings & clarifications
- · Data cleanup, conversion & migration
- · Error handling, validation & security
- · Regression testing & test-data creation
- · Reports & exports
- · Environment setup, deployment & rollback
- · Documentation & training
- · Beta feedback & rework
- · Post-release stabilization
Worksheet · estimation
| # | Task | Cx | O | M | P | Est (O+4M+P)/6 | σ |
|---|---|---|---|---|---|---|---|
| 1 | Data schema & migration for new tables | M | 6 | 10 | 18 | 10.7 | 2.0 |
| 2 | Pricing lookup logic & validation | M | 8 | 12 | 22 | 13.0 | 2.3 |
| 3 | Order-screen UI changes | S | 4 | 6 | 10 | 6.3 | 1.0 |
| 4 | Price-history screen & report | M | 6 | 9 | 16 | 9.7 | 1.7 |
| 5 | Regression on affected order features | M | 5 | 8 | 14 | 8.5 | 1.5 |
| Construction & test subtotal (hrs) | 48.2 | — | |||||
Then build up to the quote:
| Construction & test subtotal | 48.2 h |
| + Requirements & design (already partly done in discovery) | 10.0 h |
| + Documentation (user + release notes) | 5.0 h |
| + PM & client communication (~12%) | 7.6 h |
| + Deployment & migration run | 4.0 h |
| Base effort | 74.8 h |
| + Contingency @ 20% (defined enhancement) | 15.0 h |
| Quoted effort | ≈ 90 h |
| × Blended rate ($/h) | × $R |
| Quoted price | 90 × $R |
Rate note: your effective rate must cover non-billable time, tools, and margin — not just an hourly wage. If you want a target profit, price the outcome, then check it against effort; don't let cost-plus be your only lens.
Building the quote / statement of work
The estimate is internal; the quote or Statement of Work (SOW) is what the client signs. A defensible SOW always includes:
1. Scope of work (what's included — reference requirement IDs) 2. Deliverables (documents, software, migration, training) 3. Assumptions (what must be true for this price to hold) 4. Exclusions (explicitly NOT included — mirrors out-of-scope) 5. Timeline & milestones 6. Price & payment schedule (tied to milestones/acceptance) 7. Acceptance criteria (how each deliverable is approved) 8. Change control (how new scope is priced & approved) 9. Warranty & support (what's covered after go-live, for how long) 10. Assumptions on client responsibilities (access, data, test users, sign-off)
The exclusions and change control sections protect your margin more than the price does. A clear change-control clause turns "can you just also…" from an argument into a routine, priced add-on.
AI assist · estimation
AI is useful for generating a first-draft WBS from a design, for spotting tasks you forgot (migration, error handling, permissions, training), and for drafting SOW prose. It should never set the numbers — your calibrated experience does that. Its value is completeness of the list, not accuracy of the hours.
# Prompt: WBS completeness check
Here is my technical design and my draft task list with hour estimates:
"""[paste design + tasks]"""
Act as a skeptical delivery lead. List every task that is commonly
required but MISSING from my list (e.g. data migration, permissions,
error handling, regression, documentation, deployment, UAT support).
For each, say why it's needed. Do NOT re-estimate my hours — only find gaps.
Development
With a signed design and quote, construction should be the most predictable phase. The practices below keep it that way and keep the client confident while it happens.
Practices & cadence
- Build in slices. Deliver working, demonstrable increments rather than disappearing for weeks. Each slice is a chance for the client to confirm you are on track — and a natural milestone.
- Version control, always. Every change tracked, with meaningful commit messages tied back to a requirement or task ID. This is your audit trail and your safety net.
- Coding standards. A short, enforced standard (naming, structure, UI conventions) keeps a codebase maintainable and makes AI-generated code consistent with the rest.
- Code review. Even a solo developer benefits from a structured self-review or a second-pass tool. For AI-generated code, review is not optional — it is the step that makes the code yours.
- Progress reporting. A brief, regular status note (done / in progress / blocked / next) prevents the anxiety that drives clients to interrupt.
AI-assisted coding
AI code generation can dramatically accelerate construction, but it changes where the effort goes rather than removing it. The developer's job shifts toward precise specification, review, integration, and testing. The estimate should reflect that shift — less typing, but no less verification.
Give the model the specification, the constraints, and the standards — then treat everything it returns as a draft to be read, tested and understood, never as trusted output to be pasted.
# Prompt: generate against spec + standards
Implement the following module exactly to this specification. Do not add
features beyond the spec. Follow the coding & UI standards provided.
Target platform/language: [fixed stack].
Spec:
"""[paste module spec: inputs, outputs, logic, errors]"""
Standards:
"""[paste your naming / structure / UI conventions]"""
After the code, list: (1) assumptions you made, (2) edge cases I should
test, (3) anything in the spec that was ambiguous.
Never paste confidential client code, credentials, or regulated data into a tool whose data-handling terms you have not confirmed the client has agreed to. Confidentiality is a contractual obligation, not a preference.
Testing & quality assurance
Testing is how a requirement earns the word "done." A test plan traces each requirement to at least one test; a passing test suite is your evidence — to yourself and the client — that the software does what was agreed.
Levels of testing
| Level | Question it answers | Who runs it |
|---|---|---|
| Unit | Does each small piece work in isolation? | Developer |
| Integration | Do the pieces work together? | Developer |
| System | Does the whole system meet the requirements? | You / QA |
| Regression | Did this change break anything that worked before? | You / QA |
| User acceptance (UAT) | Does it satisfy the client, on their terms? | Client |
For enhancements, regression is the headline. The change may be small; the surface it could disturb is not. Your impact analysis is the map of what to regression-test.
Template · test procedure
Test Plan
- Scope, requirements covered, environments, test data, entry/exit criteria
Test Case (one per behavior)
ID: TC-014
Requirement: FR-2 (apply effective price on order date)
Precondition: Prices exist for commodity X on 3 dates
Steps: 1. Create order dated [D]
2. Add line for commodity X
Expected: Line price = price effective on [D]
Actual: [filled at run time]
Result: Pass / Fail
Notes/defect: [link to defect if failed]
Define, in advance, what must be true to start a test cycle (build deployed, data loaded) and to declare it passed (e.g. 100% of critical cases pass, no open severity-1 defects). Without exit criteria, "tested" is an opinion; with them, it is a fact both sides can check.
AI assist · testing
AI is excellent at generating test cases from a requirement or a function — especially the edge cases and negative paths a tired human skips. It can also draft test data. Verify that generated tests actually assert the right behavior; a test that passes for the wrong reason is worse than no test.
# Prompt: generate test cases from a requirement
Given this requirement and its logic:
"""[paste FR + relevant rules]"""
Produce a table of test cases covering: the happy path, boundary values,
invalid inputs, and at least 3 edge cases likely to be missed. For each:
ID, precondition, steps, expected result. Flag which cases are most
likely to reveal a defect.
Beta testing
Beta is the controlled exposure of the software to real users doing real work, before general release. It catches the problems that only appear with genuine data, genuine workflows, and genuine human behavior.
Template · beta plan
A beta needs a plan, not just an audience. Define who is in it, what "success" looks like, and how feedback flows back to you.
1. Objectives (what the beta must prove) 2. Participants (roles, count, environment) 3. Duration & schedule 4. Entry criteria (what must be true to start) 5. Scope of use (what testers should exercise) 6. Feedback channel (how issues are reported & triaged) 7. Severity definitions (blocker / major / minor / cosmetic) 8. Exit criteria (e.g. no open blockers, X% tasks completed) 9. Support during beta (response times, known-issues list) 10. Go / no-go decision (who decides, on what evidence)
A beta without exit criteria becomes permanent. Decide up front what result lets you move to release, or the beta will quietly absorb unbudgeted weeks.
Client-facing · beta invite
Subject: You're invited to the [feature] beta We've completed and tested the new [feature] and would like a small group of your team to use it with real work for [duration] before we roll it out to everyone. What we'd ask of you: • Use it as you normally would for [these tasks]. • Report anything odd via [channel] — even small things help. • Know that this is a controlled test: we're watching closely and can step in quickly. What you can expect from us: • [Response time] on anything blocking your work. • A short list of known items we're already aware of. • A clear decision point at the end on moving to full release. Your feedback here directly shapes the final version. Thank you.
Documentation
Documentation is a deliverable, not an afterthought — and it is a line item in the quote. Different readers need different documents; conflating them serves none of them well.
The document set
| Document | Reader | Answers |
|---|---|---|
| User guide | End users | How do I do my job with this? |
| Admin guide | Administrators | How do I configure & manage it? |
| Release notes | Everyone | What changed in this version? |
| Technical / maintenance doc | Future developers (incl. you) | How is it built & how do I safely change it? |
| API / interface doc | Integrators | How does another system talk to it? |
| Install / deployment doc | Whoever deploys | How do I stand it up correctly? |
Write user-facing docs during testing (you are exercising the features anyway) and technical docs during design and build (the knowledge is freshest then). Release notes are assembled at release from the change log.
AI assist · documentation
Documentation is one of AI's highest-value uses: drafting user guides from a feature list, turning a change log into readable release notes, generating first-pass technical docs from code, and rewriting your terse notes into clear end-user language. You still own accuracy — verify every instruction against the actual software.
# Prompt: user-guide section from a feature
Write a user-guide section for the feature below, for a non-technical
end user. Use plain language, numbered steps, and name things the way the
user sees them on screen (not by internal component names). Include a short
"what this is for" intro and a "common questions" list.
Feature spec / screenshots described:
"""[paste]"""
Release & deployment
Release is the moment of highest risk and highest visibility. A written, rehearsed release procedure turns a nerve-wracking event into a routine one — and gives you a way back if something goes wrong.
Template · release checklist
Pre-release [ ] All exit criteria met; no open blockers [ ] Release notes finalised & user docs updated [ ] Version tagged in source control [ ] Full backup of current system & data taken [ ] Rollback plan written & understood [ ] Deployment window agreed with client [ ] Data migration script tested on a copy of production Deployment [ ] Notify users of window / downtime [ ] Deploy build to production [ ] Run migration; verify record counts & spot-check data [ ] Smoke-test critical paths in production Post-release [ ] Confirm with client that key workflows work [ ] Monitor for [period]; keep rollback ready [ ] Log go-live; open the warranty/support period [ ] Short retrospective: what to improve next time
Two things sink go-lives: a data migration that was never tested against a real production copy, and the discovery — mid-incident — that there is no rollback. Test the migration on a copy, and never deploy without a written way back.
Client-facing · go-live communication
Subject: [System] update — going live [date/time] We're ready to release [feature/version]. Here's what to expect: • When: [date], starting [time]. Expected downtime: [duration]. • During the window: please [save work / log out / avoid X]. • After: you'll see [brief description of what's new]; the release notes are attached. • If anything looks wrong: contact [channel]. We'll be monitoring closely for [period] and can respond quickly. We've backed everything up and tested the update thoroughly, including a rehearsal on a copy of your live data. Thank you — we'll confirm here once it's done.
Support & maintenance
Go-live is not the end of the relationship — it is the start of the next one. Defining support and change terms up front turns "the app has a problem" from a dispute into a process.
Warranty & support tiers
- Stabilization period. The first days or weeks after go-live are their own phase, not "done." Watch errors, performance and real user behavior closely, fix production defects ahead of everything else, and confirm users are actually following the intended workflow before you consider the project closed.
- Warranty period. A defined window after go-live in which defects against the agreed spec are fixed at no charge. Be precise: a warranty covers defects (it doesn't do what was agreed), not new wishes (it should also do this).
- Support tiers. Distinguish break/fix support from enhancement work, and define response expectations by severity. A retainer or support agreement is the natural home for ongoing small changes.
- Backlog. Capture everything that surfaces — deferred ideas, "phase 2" items, minor requests — in one visible list. It becomes both a roadmap and a source of future quotes.
Change control
Every request that goes beyond the signed scope enters change control: it is written down, assessed for impact, estimated, and approved before work begins — exactly like a mini version of the whole lifecycle. This is not bureaucracy; it is what protects both the client's budget and your margin, and it keeps the original project's success from being diluted by unpriced additions.
When you hear "can you also just…", the professional response is warm and structured: "Good idea — let me scope that as a small change so you can see the cost and we don't disturb the current timeline." You have said yes to the relationship and no to unpriced scope, in one sentence.
AI across the lifecycle
AI tools can add value in nearly every phase — but the value is in speed and completeness of drafts, not in delegated judgement. Used well, AI lets a small team produce the artifact quality of a much larger one; used carelessly, it produces confident, plausible errors at scale.
Phase-by-phase map
| Phase | High-value AI uses | You must still own… |
|---|---|---|
| Requirements | Structure raw notes; surface missing NFRs; generate clarifying questions | What the client actually agreed to |
| High-level design | Critique architecture; enumerate trade-offs; draft diagrams | The chosen architecture & its risks |
| Technical design | Draft schemas & module specs; find edge cases | Correctness against requirements |
| Estimation | Draft WBS; find forgotten tasks; draft SOW prose | The hours & the price |
| Development | Generate code to spec; explain unfamiliar code; refactor | Review, testing, integration |
| Testing | Generate test cases & data; find negative paths | Whether tests assert the right thing |
| Documentation | Draft user guides & release notes; simplify language | Accuracy vs. the real software |
| Enhancement analysis | Summarise legacy code; map dependencies for impact analysis | Verifying the map is complete |
Ground rules
- Human-in-the-loop, always. Every AI output is a draft that a person reviews, tests, and takes responsibility for. Accountability cannot be delegated to a tool.
- Verify, then trust. Code must be tested; facts must be checked; documentation must be validated against the running software. Cross-checking a critical answer across more than one assistant is a cheap way to catch confident errors.
- Confidentiality is contractual. Do not put client code, data, or credentials into tools whose terms the client hasn't accepted. When in doubt, generalise the problem before asking.
- Specification in, quality out. AI amplifies the clarity of your input. A precise spec and explicit standards produce usable drafts; vague prompts produce plausible mistakes.
- Estimate the review, not just the generation. AI shifts effort from typing to specifying and verifying — it rarely removes the verification. Price accordingly.
Deliverables matrix
A single view of what each phase produces, who approves it, and the gate it feeds. Use it as a project checklist and as the backbone of a proposal's "what you receive" section.
Documents by phase
| Phase | Primary deliverable(s) | Approved by | Gate it opens |
|---|---|---|---|
| Requirements | SRS; scope & out-of-scope; open questions | Client | Begin design |
| High-level design | HLD; architecture & stack decisions | You (client informed) | Begin technical design |
| Technical design | TDD; schema; task breakdown; impact analysis | You | Produce estimate |
| Estimate & quote | WBS; estimate; SOW / quote | Client | Begin build |
| Development | Working increments; change log; code | You (client demos) | Begin formal testing |
| Testing & QA | Test plan; test results; defect log | You | Begin beta / UAT |
| Beta | Beta plan; feedback log; go/no-go | You + client | Release |
| Documentation | User, admin, release & technical docs | Client accepts user docs | Release |
| Release | Release checklist; deployment; migration; rollback plan | Client (go-live) | Support period |
| Support | Warranty terms; support agreement; backlog | Client | Next change / project |
Communicating with clients & prospects
Most project failures are communication failures wearing a technical costume. The phases above give you the substance; this section gives you the language to set expectations, protect scope, and keep trust.
Setting expectations early
- Lead with the process, not the price. A prospect who understands how you work will trust the number more. "Here is how we define and build" beats "here is a figure."
- Name the unknowns. Saying "we can't price the build accurately until we've defined it — that's what discovery is for" is more credible than a confident guess, and it usually wins the work.
- Make scope a shared object. Refer to the requirements and SOW as "our agreement," a thing you both maintain — not a document you imposed.
- Report rhythmically. Predictable short updates reduce anxiety and interruptions far more than occasional long ones.
Reusable snippets
Great question — and the honest answer is that a reliable number needs a little definition first. What I can do right now is give you a ballpark range based on similar work, and propose a short paid discovery step that pins the scope down and produces a firm, fixed quote you can decide on. That way the figure you commit to is based on a real plan rather than an optimistic guess — which protects your budget as much as it does my time.
That's a sensible addition and I'd like to include it properly. Because it goes a little beyond what we scoped, let me write it up as a small change: you'll get a quick estimate of cost and any timeline impact, and once you're happy we'll fold it in. That keeps the current work on track and makes sure nothing gets added without you seeing the cost first.
Every project we take on follows the same disciplined path: we define the requirements in writing, design the solution before we build it, quote from that design rather than a conversation, then build in reviewable increments, test against the agreed requirements, and release with a tested migration and a way back if needed. You receive documented deliverables at each stage — so you always know what you're getting, what it costs, and why.
Prospect red flags to price carefully
- · "It should be simple"
- · No one can describe the current process
- · "Just like X, but…"
- · Undocumented legacy system
- · Many stakeholders, no decision-maker
- · Hard deadline, soft requirements
- · "We'll figure out the details later"
None of these are reasons to walk away — they are reasons to insist on paid discovery and to size contingency generously. Each is a signal that the gap between what's said and what's needed is wide.
Governance, roles & risk
Someone must own each decision, and every project carries the same handful of predictable risks. Naming owners and pre-loading controls turns governance from overhead into cheap insurance.
Who owns what
| Role | Owns |
|---|---|
| Executive sponsor | The outcome, the budget, and the project's priority |
| Product / business owner | Requirement and scope decisions |
| Subject-matter expert | Operational rules and scenario validation |
| Project lead | Scope, schedule, risks, actions, communication |
| Technical lead | Architecture, implementation quality, technical risk |
| Test / UAT lead | Test preparation, evidence, and acceptance |
| Release owner | Deployment, rollback, verification, support readiness |
Control artifacts
Keep these lightweight — a shared document or a few tabs in a spreadsheet is enough for most jobs. The point is not ceremony; it is that each one exists and stays current.
- · SOW / charter
- · Milestone plan
- · Responsibility matrix
- · Risk & issue log
- · Decision log
- · Change-request log
- · Environment plan
- · Communication plan
- · Acceptance plan
Risk register
Most project risk is not exotic — it repeats. Carry a standing register so each risk has a warning sign you can watch for and a control you already know you'll apply.
| Risk | Warning sign | Control |
|---|---|---|
| Incomplete requirements | "We forgot…" / "That's not what we meant" | Paid discovery, written scenarios, sign-off |
| Optimistic estimate | Quote made before design & testing understood | WBS, three-point estimate, stated assumptions |
| Scope creep | Requests added informally, in passing | Change log + commercial approval |
| Client delay | Late answers, data, testing, or approvals | Named owners, due dates, schedule-impact notes |
| Poor data quality | Duplicates, missing keys, inconsistent values | Early data sample, conversion plan, cleanup budget |
| Integration surprise | Undocumented external system or interface | Interface spike, confirm the contract, add contingency |
| Key-person dependency | One person holds critical knowledge | Documentation, cross-review, recorded decisions |
Acceptance & sign-off
Each major deliverable ends with an explicit, recorded acceptance against its acceptance criteria — a signed page, or even a dated email that says "approved, proceeding against this." Sign-off is not a formality: it is the moment scope is frozen for that stage, and the paper trail that protects both sides if memory later diverges.
Toolkit: agendas & review
Reusable agendas keep meetings short and complete; a disciplined post-project review is how your estimates get more accurate every year.
Meeting & review agendas
□ Business objective & urgency □ Current process — live demonstration □ Users & responsibilities □ Inputs, outputs, data & documents □ Rules, calculations & exceptions □ Volume, timing, performance, security □ Reports & integrations □ Examples to collect · follow-up actions & owners
□ Confirm scope & exclusions □ Walk the future workflow □ Review components & data flow □ Review rules & error handling □ Review security & audit behavior □ Review acceptance criteria □ Confirm open decisions & owners
□ Test status & open defects reviewed □ Data conversion verified on a production copy □ Documentation & training ready □ Deployment & rollback rehearsed □ Support coverage in place □ Go / no-go decision recorded, with owner
Post-project review & the estimating library
The single highest-return habit in estimation is closing the loop. After each project, spend half an hour comparing your estimate to what actually happened, and feed what you learn into a private estimating library — your own record of what this kind of task really costs. Over a handful of projects, that library beats any generic ratio, including the ones in this guide.
• What did we estimate accurately? • What work did we miss entirely? • Which assumptions turned out false? • Where did scope change, and why? • Which AI uses actually saved time? • What should we templatize or reuse next time? • What ACTUAL effort should we add to the estimating library?
Quick-start playbook
The whole guide compressed to a single screen. When a new opportunity lands, this is the path — expand any step by jumping to its section above.
- Qualify — sponsor, budget, fit? Offer a ROM range only, never a quote.
- Sell discovery — a small paid step that produces the specification.
- Define — the SRS: requirements, boundaries, explicit out-of-scope.
- Design — high-level then technical, detailed enough to estimate and build.
- Estimate — WBS + three-point + overhead + contingency → quote / SOW.
- Agree — signed scope, price, acceptance criteria, change control.
- Build — reviewable slices, version control, standards, AI to spec.
- Test — unit → integration → system → regression → UAT, against the requirements.
- Beta — real users, real data, exit criteria, go/no-go.
- Document — user, release & technical docs.
- Release — tested migration, rehearsed rollback, go-live comms.
- Stabilize & support — warranty, backlog, post-project review.
Tech stacks: the landscape & how to choose
A "stack" is the combined set of tools a solution is built from — language, framework, database and runtime. Everything else in this guide is stack-neutral, but the stack you choose (or inherit) shapes cost, speed, hiring, longevity and risk. This section maps the main families and the trade-offs that matter when you scope and quote.
What a stack is
Most solutions layer the same way: a presentation layer (what the user sees), an application/logic layer (the rules), a data layer (where information lives) and a runtime/hosting layer (where it all executes). A stack is one concrete choice at each layer. For an enhancement, the stack is usually fixed by the existing system — you work with it. For a new build, it is a decision with long consequences, because the data layer in particular is the hardest thing to change later.
The main families
| Family | Representative tools | Best-fit work | Trade-offs to price in |
|---|---|---|---|
| Desktop / native | C#/.NET (WPF, WinForms, MAUI); template-driven 4GL / RAD tools; Delphi; C++/Qt; Java | Data-heavy internal business apps; high local performance; offline; tight OS integration | Update distribution is manual; per-machine environment variance; some mature RAD/4GL tools have smaller hiring pools — weigh maintainability & succession |
| Server-rendered web | ASP.NET Core; Java/Spring; Python/Django; Ruby on Rails; PHP/Laravel; Node/Express | Browser-delivered business apps; central deployment; broad reach; no install | You now operate a server: security surface, hosting & ongoing ops cost |
| Single-page / modern front-end | React, Angular or Vue over an API backend | Rich, app-like interfaces; interactive dashboards | Two codebases (client + API); API-contract discipline; more testing |
| Mobile | Native: Swift (iOS), Kotlin (Android). Cross-platform: Flutter, React Native, .NET MAUI | On-the-go use; camera, GPS, notifications, offline | App-store review & policies; device fragmentation; release cadence tied to stores |
| Cloud & backend services | Azure, AWS, GCP; managed databases; containers; serverless functions | Scale, elasticity, managed operations, global reach | Ongoing spend; some vendor lock-in; requires ops/DevOps skills |
| Data layer (cross-cutting) | SQL Server, PostgreSQL, MySQL, SQLite; ISAM / file-based stores; NoSQL | Every application above sits on one of these | Often the most durable, hardest-to-change decision — treat it as architecture, not a detail |
| Low-code / rapid platforms | Vendor app builders & workflow tools | Simple internal tools built fast | Trades flexibility & portability for speed; watch lock-in and ceilings |
How to choose (or justify) a stack
There is no universally "best" stack — only the best fit for this work, this team, and this time horizon. Weigh these factors, roughly in order:
- Constraint first. Enhancements inherit the existing stack. Work with it, not against it — fighting the platform is a hidden cost few estimates survive.
- Fit for the work. Data-heavy business CRUD, rich interactive UI, mobile-first, and internet-scale are genuinely different problems that favor different families.
- Team skills. The best stack you can't staff is the wrong stack. A mature tool the team already knows often beats a fashionable one they'd have to learn on the client's budget.
- Longevity & hiring pool. Who maintains this in five to ten years? Smaller ecosystems can build faster but are harder to hand over — a real factor for succession, or if the business may be sold.
- Total cost of ownership. Licenses, hosting and operations — not just build hours. A "cheaper" build on an expensive-to-run platform is not cheaper.
- Integration reality. What must it talk to, and does the stack make that easy or painful?
- Exit / hand-over. If the business or product might change hands, a mainstream stack is materially easier — and more valuable — to transfer.
Match the stack to the job and to whoever must live with it. Speed of building matters at the start; ease of maintaining, staffing and handing over matters for the entire life of the software — which is almost always longer than the project that created it.
Glossary
Plain-language definitions of the terms used in this guide. Useful as a shared vocabulary internally, and as a reference you can share with less technical clients.
| Term | Definition |
|---|---|
| Acceptance criteria | The specific, agreed conditions under which a deliverable is considered complete and approved by the client. |
| Beta testing | A controlled release to a small group of real users doing real work, before general availability, to catch issues that only appear in genuine use. |
| Change control | The process of documenting, assessing, estimating and approving any work that falls outside the agreed scope, before it is done. |
| Contingency (reserve) | An amount added to an estimate to cover the expected reality that some tasks will take longer than their most-likely case; sized to project uncertainty. |
| Discovery | An early, usually paid, phase whose purpose is to define requirements and design well enough to produce a firm build quote. |
| Estimating library | A private, growing record of how long particular kinds of task actually took on past projects, used to calibrate future estimates against reality rather than generic ratios. |
| Functional requirement (FR) | A specific behavior the system must exhibit, written so it can be individually tested. |
| High-level design (HLD) | The overall shape of the solution — components, technology, data model overview and integrations — above the level of code. |
| Impact analysis | For enhancements, the identification of every existing part of a system a change could affect, directly or as a side effect. |
| Milestone | A defined, verifiable point in a project, often tied to a deliverable, an acceptance step, and a payment. |
| Non-functional requirement (NFR) | A quality the system must have — performance, security, availability, supported platforms, compliance — rather than a specific behavior. |
| Opportunity qualification | An early filter, before discovery, that decides whether a request is worth pursuing at all — assessing sponsor, budget, timeline, fit, and whether the client will pay for discovery. |
| Phase gate | A checkpoint between phases where the previous deliverable is confirmed complete and approved before the next phase begins. |
| Regression testing | Re-testing existing functionality to confirm that a change has not broken anything that previously worked. |
| Release notes | A concise, reader-facing summary of what changed in a given version of the software. |
| Responsibility matrix (RACI) | A grid mapping each role to what they are Responsible for, Accountable for, Consulted on, or Informed about — so no decision or task is left unowned. |
| Risk register | A standing list of a project's likely risks, each paired with a warning sign to watch for and a control to apply. |
| Rollback plan | A pre-defined way to return a system to its previous working state if a release goes wrong. |
| Rough Order of Magnitude (ROM) | A deliberately wide, early cost range given to gauge interest before the work is defined — explicitly not a quote or a commitment. |
| Software Requirements Specification (SRS) | The primary requirements document, separating business, functional and non-functional requirements plus scope and boundaries. |
| Stabilization period | The initial window immediately after go-live, treated as its own phase, in which production defects are prioritized and real-world use is monitored before the project is considered closed. |
| Statement of Work (SOW) | The client-facing agreement defining scope, deliverables, timeline, price, acceptance, exclusions and change control. |
| Technical design (TDD) | The detailed design that specifies exactly how each part is built — schema, module specs, interfaces — detailed enough to estimate and construct from. |
| Three-point estimate (PERT) | An estimate combining optimistic, most-likely and pessimistic values as (O + 4M + P) ÷ 6 to account for uncertainty. |
| User acceptance testing (UAT) | Testing performed by the client to confirm the software meets their needs on their terms, typically the final gate before release. |
| Warranty period | A defined window after go-live during which defects against the agreed specification are corrected at no additional charge. |
| Work breakdown structure (WBS) | A decomposition of a project into tasks small enough to estimate confidently — typically no larger than one to two days each. |