Journal — May 23, 2026 · 6 min read
Contracts and Scope Creep
The specific contract clauses I now refuse to work without as a freelance developer, each one paired with the exact disaster it prevents, plus the project that taught me why.
A contract isn't a legal document you hope never to use. It's a conversation you have once, in writing, so you don't have to have it eleven times over WhatsApp while a deadline burns.
Every clause below exists because something went wrong, either to me or to someone whose war story I took seriously.
The "not included" list
Prevents: everything else on this page.
A scope that says what you're building is table stakes. A scope that says what you are not building is the single most valuable paragraph in the document.
For a typical app build mine reads roughly: does not include content writing, SEO work, third-party account setup, native iOS or Android code beyond the cross-platform build, design of new screens beyond the agreed set, data migration from existing systems, or ongoing hosting management.
Clients rarely object. What they do instead is more useful: they read it, spot the thing they assumed was in there, and say so on day one instead of day fifty. That paragraph converts a future argument into a present conversation, which is the whole job.
A change-request process with a price attached
Prevents: the slow grind of "while you're in there."
Every contract of mine says new work is quoted before it starts. Not "may be quoted." Is.
The value is that it hands you a sentence that ends scope creep without any conflict:
Happy to do that. It adds about six hours and $400, and pushes delivery to the 18th. Want me to send it as a change order?
Read it again. You said yes. You were pleasant. You were fast. And the request either becomes billable work or quietly evaporates, which tells you exactly how much the client wanted it. Nobody has ever got angry at that sentence. Before I had it, I used to just absorb the work and resent it.
Deposit, net terms, and a late fee
Prevents: financing your client's business with your savings.
50% up front on small projects, 40/30/30 across milestones on longer ones. Net-14 for new clients, net-30 for established ones. A late fee around 2% per month, stated plainly.
The late fee isn't really about collecting the fee. It's about the invoice sitting on someone's desk with a consequence attached. I've never charged one. I've also never waited past 30 days since adding it.
IP transfers on final payment, not on delivery
Prevents: a client shipping your code and then negotiating.
A one-line change with enormous leverage. Copyright passes to the client when the final invoice clears, not when you hand over the build. Until then they have a licence to review, not to launch.
It sounds aggressive. In practice it's invisible, because clients who pay on time never encounter it.
Termination and a kill fee
Prevents: four weeks of work vanishing because a funding round didn't close.
Either side can end the engagement with written notice. If the client ends it, all work completed to that point is billable and the deposit is non-refundable. If I end it, I hand over everything built so far in a usable state.
Startups die, priorities rotate, a founder changes their mind in March. None of that is malice. It's the reason your contract needs an exit that doesn't involve you eating the loss.
Revision limits
Prevents: round nine of a logo you didn't design.
Two rounds per deliverable, with a definition of what a "round" is: one consolidated set of feedback, not eleven separate messages across a weekend. Further rounds are billable hourly.
The consolidation matters more than the number. Fragmented feedback is what destroys a schedule.
Who owns accounts and credentials
Prevents: being the accidental hostage-taker, or the accidental hostage.
The client owns their AWS account, their Vercel project, their Stripe, their domain, their app store listings. I get access, not ownership, and it's written down.
I've seen the other version, where a freelancer's personal account holds a client's production infrastructure. It looks like leverage until you want a holiday.
A support window with an end date
Prevents: the unpaid maintenance contract nobody signed.
Thirty days of bug fixes after launch. A bug means agreed functionality not working as specified. A new feature isn't a bug, however small.
After day 31, support is hourly or moves to a retainer. Say this at kickoff, not at day 31, or you'll look like you're inventing a fee.
Liability capped at fees paid
Prevents: a $6,000 project generating a $600,000 problem.
Liability limited to what the client paid you, excluding indirect and consequential losses. You are not insuring their revenue. Sensible clients accept this because it's what every agency contract says.
The part that isn't legal
Here's what took me longest to understand: scope creep is almost never malice.
It's an unclear boundary meeting a freelancer who wants to be liked. The client asks for a small thing because they genuinely don't know it isn't small. You say yes because yes feels like good service. Then you say yes eleven more times, and now you're behind and quietly angry at someone who has no idea anything is wrong.
The "quick favour" is the specific shape it takes. A tiny tweak that's obviously fifteen minutes. It is fifteen minutes. Then it's a second one, a bug from the first, and a call about the second. On one engagement I stopped counting at about fifteen unpaid hours of favours, spread thin enough that no single one ever looked like a problem.
A contract doesn't make you less nice. It lets you be nice on purpose instead of by default.
The one I got wrong
An early project, someone I knew, a rebuild of a small business site plus "an admin panel."
No written scope. A WhatsApp thread and a good feeling. I'd quoted a fixed price based on a model of the work that existed only in my head.
"An admin panel" turned out to mean role-based permissions, an audit log, CSV export, and a bulk editor, because that's what the client had always pictured and never needed to say out loud. I built all of it, because at no point could I point at a document and say this wasn't in there. The project ran about 60% over the hours I'd priced.
The client wasn't a bad person. They got what they'd imagined and paid what we'd agreed. The failure was mine, and it was made of nothing but the paragraph I didn't write.
Write the paragraph. Twenty minutes, and the highest-earning twenty minutes in this business.