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
Day 0
Milestone delivered
The test window starts on delivery, not on your team being free
Day 10
Defect report due
Severity-classified against the written criteria
Day 11
Deemed accepted
Silence counts as acceptance: invoice due, warranty clock starts
Day 25
Re-test after cure
A second failure should give a refund or an exit, not a third cycle
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.
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.
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.
Sources
- Software escrow clauses: release triggers, deposit cadence, verification and section 365(n)
- Source code escrow: parties, release conditions, verification and known limitations
- Publishing client apps: whose developer account to use
- Acceptance testing and change order provisions in software development agreements
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.