Skip to content
Websites & online business

What an app development contract has to settle before anyone writes code

Most app development disputes are not about code quality. They are about whether a milestone was accepted, whether the client owns what was delivered, and who controls the accounts the app is published from. All three are settled in advance by clauses that take an afternoon to get right and are almost never read until they are needed. This is what each one has to do.

9 min readPublished How we write these

The short version

  • Ownership transfers by written assignment, triggered on payment in full. A work-for-hire clause on its own does not cover custom software.
  • The acceptance clause decides when payment falls due. The date clients miss is the deemed-acceptance deadline: say nothing during the test window and the milestone is accepted.
  • The developer can only assign what the developer wrote. Third-party components and open source arrive under their own licences, so the contract needs an inventory, not a warranty of ownership.
  • Open the App Store and Play Console accounts in the client's name at the start. Moving a published app between developer accounts afterwards is a process, not a setting.

Ownership: the clause that has to survive the developer disappearing

The default position in most common-law systems is that an independent contractor owns the copyright in what they create, and paying the invoice does not change it. For software the American work-made-for-hire route is not available either: the statutory categories do not include standalone software, so a work-for-hire clause on a custom build achieves nothing by itself. Who owns the work sets out why in detail; the drafting consequence here is simple.

  • A present-tense assignment. "Developer hereby assigns" transfers on signature. "Developer agrees to assign" is a promise to do something later, which is worth much less if the relationship ends badly.
  • Triggered on payment in full, not on creation or delivery. This is the developer's security and it costs a paying client nothing.
  • A fallback licence — perpetual, irrevocable, worldwide, royalty-free — for anything that cannot be assigned, plus a waiver of moral rights where the governing law permits one.
  • A background IP carve-out. The developer's pre-existing libraries, frameworks, internal tooling and boilerplate stay theirs, with a licence to the client covering whatever is embedded in the deliverable. Without this the clause reads as transferring the developer's entire toolkit, which is why developers resist broad assignments.
  • Further assurances. An obligation to sign whatever additional documents are needed to record the transfer, years later, with registries or an acquirer's counsel.

Then a delivery obligation, kept separate from the IP clause because it is a different thing: the complete source, build configuration, dependency manifests, infrastructure definitions, design source files, and enough documentation for a competent third party to build and deploy it. Copyright ownership does not oblige anyone to hand over a repository. That is a scope term.

Acceptance: the clause that decides when you pay

Acceptance testing converts a delivery into a payable milestone. The mechanism is standard: the developer delivers, the client tests against agreed criteria for a defined window, and either accepts or issues a defect report classified by severity. Failure gives the developer a cure period and a re-test. The details of that loop are where the money is.

The acceptance clock on one milestone

  1. Day 0

    Milestone delivered

    The test window starts on delivery, not on your team being free

  2. Day 10

    Defect report due

    Severity-classified against the written criteria

  3. Day 11

    Deemed accepted

    Silence counts as acceptance: invoice due, warranty clock starts

  4. Day 25

    Re-test after cure

    A second failure should give a refund or an exit, not a third cycle

Days are illustrative — the periods come from your contract. The point is that every one of them runs from delivery, and the third is the one that costs clients money.

Deemed acceptance is normal and defensible — without it, a client can withhold sign-off indefinitely and never pay. But it means the testing window is a real obligation on the client, and a ten-day window agreed in a kick-off meeting will collide with a holiday, a release freeze or the one person who understands the domain being unavailable. Negotiate the length against your actual capacity, and make the window start on delivery of something testable rather than on notification.

  • Write the criteria before the build, not at delivery. Criteria agreed retrospectively are criteria argued about retrospectively.
  • Define severity levels concretely — what makes a defect critical, major or minor — because only critical and major defects should block acceptance, and the boundary is otherwise a matter of opinion.
  • Say that minor defects do not block acceptance but go on a snag list with a fix deadline. Otherwise trivial issues are used to hold up payment, or waived entirely and never fixed.
  • Cap the cure cycles. After a second failure the client should have a real remedy: terminate the milestone, recover payments made for it, and keep the work in progress.
  • State what acceptance does not waive. Accepting a milestone should not waive the warranty, latent defects, or the security obligations.

App development agreement

The full text free to read and copy — scope and milestones, acceptance and cure, change control, present-tense IP assignment with a background-IP carve-out, warranty period and handover obligations.

Open

Source code escrow, and when it earns its fee

Escrow is a three-party arrangement: the supplier deposits source and build materials with an independent agent, and the agent releases them to the customer on defined trigger events. The conventional triggers are the supplier's insolvency, discontinuation of the product, and failure to meet maintenance and support obligations after a cure period.

It is worth understanding what it is for. Escrow does not apply to custom development where the client already owns the code and holds the repository — there is nothing to escrow. It applies where you depend on software you do not own and cannot maintain: a licensed platform, an embedded component, an on-premise product from a small vendor, a white-label application. Those are the cases where the supplier failing leaves you with a running binary and no ability to change it.

What separates useful escrow from expensive theatre

  • A deposit schedule tied to releases, not a single deposit at signature. Escrowed code that is three years behind the version you run is not a continuity plan.
  • Verification by the agent: that the deposit is readable, that it compiles, and that it includes build tooling and documentation. Discovering it does not build is a discovery you want to make now.
  • A deposit that includes the things the code alone will not give you: build scripts, environment configuration, dependency versions, infrastructure definitions, deployment runbooks and any keys or certificates required.
  • Release triggers that are objective and do not require the supplier's cooperation to establish.
  • Licence rights on release that permit use, modification and maintenance — not a right merely to view the code, which is the limitation that makes an escrow worthless.
  • A release mechanism that does not depend on the supplier not objecting, with a defined dispute route and a short deadline.

The accounts and keys nobody puts in the contract

This is the most common practical failure in app projects, and it has nothing to do with intellectual property. Ownership and control are two separate axes, and a contract that settles only the first leaves you in the square nobody plans for.

Owning the code and being able to ship it are different questions

Store, signing and cloud accounts

Copyright in the build

No written assignment

Assigned on payment

In the developer's name

A binary and a hope

You have a running app, no right to the source, and no way into the account it ships from.

Owned, and unshippable

You own the code and cannot push an update, because the certificate is not yours.

In your name

Shippable, not sellable

Fine until diligence, a resale, or a disagreement about who may fork it.

Actually yours

Present-tense assignment, plus keys, certificates and billing enrolled to your entity.

The top-right square is where most disputes start: a client with a clean assignment, an app signed with a certificate held by a contractor who has moved on.

Apple's own guidance points the same way: an app should be published under the developer account of the business that owns it, because the store relationship is with the owner of the content. An agency publishing a client's app from its own account creates a mismatch that surfaces during app review, during a transfer, and during any dispute.

Name these in the agreement, in the client's name, from day one

  • Apple Developer Program and App Store Connect, enrolled to the client entity, with the developer added as a team member.
  • Google Play Console, on the client's account, likewise.
  • Code signing certificates, provisioning profiles, upload keys and the Play app signing key — including where the private material is stored and who can recover it.
  • Push notification keys and any service credentials the app needs to function.
  • Domain registrations, DNS, TLS certificates and the email records the app depends on.
  • Cloud and backend accounts including billing ownership, the CI system, artefact registries, analytics and crash reporting.
  • Third-party API keys, and which of them are in the developer's name and will stop working on handover.

The contract should list them, say who holds each during the project, and require transfer of all of them at handover or on termination for any reason. Then test the list before final payment: log in to each account using client credentials. An access list that has never been exercised is the same kind of fiction as an untested backup.

Fee model, change control and the scope you did not price

Fixed price transfers estimation risk to the developer, who prices that risk into the number and defends the scope boundary hard. Time and materials transfers it to the client, who then carries the cost of every change of mind. Capped time and materials splits it, and is the model most likely to produce a workable relationship — provided the contract says what happens when the cap is reached, which is the term most often left out.

Whichever model applies, the change mechanism has to be usable. Changes take effect only through a written change order referencing the affected milestone and signed by both sides, with a lightweight route for small items — a named approver each side, an email confirmation, a value ceiling. A process too heavy for a two-hour change is a process that gets bypassed, and bypassed changes are the raw material of scope disputes. Where the build sits under a master agreement, MSA and SOW covers how the two documents interact and which one governs when they disagree.

Warranty, security and the period after launch

  • A warranty period after acceptance — 60 or 90 days is common — during which defects against specification are fixed at no charge. Distinguish it clearly from paid support, or every support ticket becomes a warranty argument.
  • Security obligations that outlive the project: dependency updates during the warranty period, a disclosure route, and notice to the client of vulnerabilities found in delivered code.
  • Store compliance. Rejections by Apple or Google for policy reasons are the developer's to fix where they relate to the implementation, and the client's where they relate to the business model. Allocating this in advance avoids the most predictable argument in mobile work.
  • Portfolio rights. Developers will want to show the work. Grant it expressly, with a confidentiality carve-out, rather than leaving it to an argument after launch.

If you are already mid-project without any of this

Do three things this week, in order. Get a signed IP assignment covering everything produced to date — retrospective assignments are awkward, but the leverage only ever moves away from you. Take a full copy of the repository, the dependency inventory and the build configuration, and confirm they build outside the developer's environment. Then transfer or create the store, signing and cloud accounts in your own name.

None of that requires renegotiating the commercial deal, and all three are ordinary requests that a competent developer will expect. A developer who resists all three has told you the most useful thing you will learn about the project, and told you it while you can still act on it.

General information, not legal advice. This guide explains how these documents and rules generally work. Law varies by jurisdiction and changes, and none of it is applied to your circumstances here. For anything consequential, consult a licensed attorney where you are.

Frequently asked

Who owns the source code by default?

The developer, unless there is a written assignment. Paying for the work buys the deliverable and an implied permission to use it for the purpose it was commissioned for, not the copyright. A work-for-hire clause does not fix this for software, because standalone software is not within the statutory categories that clause depends on.

What is deemed acceptance?

A provision saying that if the client does not deliver an acceptance notice or a defect report within the test window, the deliverable is treated as accepted and becomes payable. It exists to stop sign-off being withheld indefinitely. It also means the test window is a hard obligation on the client, so negotiate a length your team can actually meet.

Is source code escrow worth it?

It depends on whether you own the code already. For custom development where the client holds the repository, escrow adds nothing. It matters where you depend on software you do not own and could not maintain — a licensed platform, an embedded component, an on-premise product from a small supplier. There, insist on verified deposits updated at every release.

Who should own the Apple and Google developer accounts?

The business that owns the app. Store relationships are with the content owner, and publishing a client's app from an agency account creates problems at review, at transfer and in any dispute. Enrol the client entity, add the developer as a team member, and hold signing keys and certificates somewhere the client can recover them.

Can a developer use open source in my app?

Almost certainly, and almost every app does. What the contract needs is an inventory of components and their licences at each milestone, and a requirement that anything with copyleft obligations is flagged before it is used. Shipping a mobile binary is distribution, which is what triggers most open source obligations in the first place.

Do the whole thing on your phone

Draft it, check it for risk, rewrite the clauses you do not like, sign it and send it — without opening a laptop.

  • 136 templates across 12 categories
  • AI review in plain English
  • Free every month — 3 documents, 2 reviews
Download on theApp Store
Free to download · no account

iPhone, iPad, Mac & Vision Pro · iOS 15.6+ · 76.1 MB
Premium from $1.99/week