Choosing a partner

What should be in a software development contract?

We are a software firm writing about what you should demand from a software firm, including us. Eight clauses decide whether a project protects you or quietly leaves you exposed, and code ownership is the one people discover too late.

The eight clauses that matter
  • IP and code ownership. Written assignment of the code to you on payment. Without this clause, the default in most places favours the contractor, not you.
  • Scope and deliverables. What is being built, listed specifically, plus what is explicitly excluded from this version.
  • Acceptance criteria. How both sides will agree a deliverable is finished, decided before the build rather than argued after it.
  • Payment model and milestones. Fixed price, time and materials, or a hybrid, tied to milestones you can verify.
  • Change control. How new requests get priced and approved in writing, so scope changes do not become disputes.
  • Handover. Source code, documentation, credentials, and repository access named as deliverables, not favours.
  • Confidentiality and data. Who may access your business data, and what happens to it afterwards.
  • Exit and termination. How either side ends the engagement, and what you receive if it ends early.

Most people hiring a developer for the first time worry about the price and the deadline. Those matter, but they are rarely what causes the painful surprises. The surprises come from the questions nobody asked: who owns this code, what counts as finished, and what happens if this relationship ends badly. This is a plain-language guide to the clauses that answer those questions. It is not legal advice, and a contract of any real value should be reviewed by a lawyer in your jurisdiction. It is the checklist we would want a client to bring to us.

Who owns the code when you hire a software development company?

This is the single most misunderstood point in the whole arrangement, so it goes first. Many buyers assume that paying for software means owning it. In most jurisdictions that assumption is wrong by default: an employee's work typically belongs to the employer, but an external contractor generally retains copyright in what they create unless the contract explicitly transfers it. Paying an invoice does not by itself move the copyright.

What you want is an explicit written assignment of the intellectual property to you, effective on payment. Relying on the phrase "work made for hire" alone is risky, because in some jurisdictions that concept is narrow and may not cover commissioned software at all. An unambiguous assignment clause is the safer construction.

Two honest caveats any competent firm will raise. First, nobody can assign you exclusive ownership of third-party open-source libraries inside your application; your rights there come from their licences, and you are entitled to a list of what has been used. Second, many firms reuse internal tooling across clients and will license that to you rather than assign it. That is reasonable, but it should be written down, with a perpetual licence broad enough that you can keep operating and modifying your system without asking permission.

Paying for software does not automatically mean owning it. Without an explicit assignment clause, the default in most places favours the contractor.

The practical test: ask directly whether you will hold the source code, the documentation, the repository, and the deployment credentials at the end. For us the answer is that you own everything we build, and handover is part of the job rather than an upsell, which is set out plainly in how we work. Any firm that hesitates on that question has told you something important.

What is the difference between fixed price and time and materials?

The payment model decides who carries the risk of the unknown. Neither is dishonest; they suit different situations.

ModelWho carries the riskBest when
Fixed price The vendor. They absorb overruns, so the quote includes a buffer for the unknowns. Scope is genuinely settled and written down. You are buying budget certainty and paying a premium for it.
Time and materials You. You pay for hours worked, so an underestimate lands on your budget. Requirements will genuinely evolve, or technical unknowns are real. Requires a cap and regular reporting to stay safe.
Hybrid Shared, in sequence. Most real projects. Pay for a short discovery or audit phase, then fix the price of the build against what that phase produced.

The hybrid is what we recommend and what we practise, for an unglamorous reason: a fixed price quoted before anyone understands the problem is not certainty, it is a guess with a buffer on top. Diagnose first, then commit to a number. That is the entire argument for a solution design audit as a small paid first step, and it is why our fixed-scope offers state both a price and a duration up front. If you are choosing a model, also insist on a spending cap under time and materials, and on milestone payments rather than a single sum in advance.

Want a scope and a fixed price in writing before you commit to a build?

Book a discovery call

How do you define acceptance criteria and avoid scope disputes?

Almost every ugly software dispute is really an argument about the word "finished." The cure is cheap and nobody does it: write down, before the build starts, the specific conditions under which each deliverable is considered complete. Not "a working dashboard," but the specific views it shows, the data it draws on, and the check that proves it works. Acceptance criteria are not bureaucracy. They are the only thing that makes "done" a fact rather than an opinion.

Pair that with a change control clause. New ideas will arrive mid-project, and that is healthy. What matters is that each one gets written down, priced, and approved before work starts on it, rather than absorbed silently until the timeline slips and everyone is annoyed. A change process is not a way of saying no; it is what allows a project to say yes without quietly breaking the plan. Scope added mid-flight is one of the main reasons projects run late, as we set out in how long it takes to build custom software.

What should the handover include?

Handover is where a good engagement proves itself, and it belongs in the contract as a named deliverable rather than an assumed courtesy. Ask for the source code in a repository you own, written documentation covering how the system is deployed and maintained, all credentials and access to hosting and third-party accounts in your own name, and a walkthrough for whoever will operate it. That last item matters more than it sounds. A system only one external person understands has simply moved your dependency somewhere else, which is the same trap as the legacy systems we describe in modernizing legacy software.

A useful clause to add: hosting and third-party accounts should be registered to your business from the start, not the vendor's. Recovering a domain or cloud account from a former vendor is a miserable exercise.

What about confidentiality, data, and exit terms?

If the software touches customer records, the contract should say who may access that data, where it is stored, and what happens to copies when the work ends. Under India's DPDP Act, and equivalent rules elsewhere, responsibility for personal data does not transfer just because a contractor handles it, so vague wording here is a real business risk.

Exit terms are the clause everyone skips because nobody signs a contract expecting it to go wrong. Include them anyway: notice period on either side, what you have paid for and receive if the engagement ends early, and confirmation that IP already paid for is assigned and handed over regardless of why the relationship ended. A firm that is comfortable with a clean exit clause is telling you it expects to earn the next phase rather than rely on you being trapped.

What if a vendor refuses these terms?

Push back on any of the eight and watch the response, because it is diagnostic. Reasonable pushback exists: a firm may want to license reusable tooling rather than assign it, may decline unlimited liability, or may resist a fixed price before scoping. All are defensible if written down clearly. Unreasonable pushback looks like refusing to assign ownership of work you commissioned, declining to define acceptance criteria, keeping accounts in the vendor's name, or treating documentation as an extra. Those are not negotiating positions, they are dependency by design, and they belong with the other signals in how to choose a software development partner. More short answers of this kind are in our FAQ.

The short version

Get the ownership assignment in writing, define what finished means before anyone builds, agree how changes get priced, name the handover as a deliverable, and settle how the relationship ends while everyone is still cheerful. None of this is adversarial. A clear contract protects the vendor as much as the client, because most disputes come not from bad faith but from two people holding different pictures of the same agreement. The work we have done is on our case studies page, and the conversation that precedes any contract is a thirty-minute discovery call.

Question this did not answer? Send it over and you will get a straight answer, not a sales sequence. The good ones become articles.

Ravinder Dalal
Partner, Business Development, Leo Tech Labs

Leo Tech Labs is a boutique, consulting-led software firm. We scope in writing, quote against a real plan, and hand over everything we build.

← All articles

Bring us the checklist. We'll answer all eight.

Ask us these questions on a discovery call and see how the answers sound. If another firm is the better fit, we'll tell you that too.

Book a discovery call
Ravinder Dalal · Partner, Business Development · Thirty minutes, no pitch deck