{"id":792,"date":"2026-10-21T05:03:02","date_gmt":"2026-10-21T05:03:02","guid":{"rendered":"https:\/\/abrarqasim.com\/blog\/retainer-agreement-template-web-developer-clauses-that-matter\/"},"modified":"2026-10-21T05:03:02","modified_gmt":"2026-10-21T05:03:02","slug":"retainer-agreement-template-web-developer-clauses-that-matter","status":"publish","type":"post","link":"https:\/\/abrarqasim.com\/blog\/retainer-agreement-template-web-developer-clauses-that-matter\/","title":{"rendered":"Retainer Agreement Template for Web Developers: Clauses That Matter"},"content":{"rendered":"<p>Picture the lazy version of a retainer. A developer writes it on one line in an email: &ldquo;Ten hours a month, same rate, invoiced on the first.&rdquo; The client says yes within the hour, and everyone feels very professional for roughly three weeks. Then a request lands on day 29 that is really a small project, the client asks what happens to unused hours, and someone wonders whether &ldquo;ten hours&rdquo; includes the time spent reading emails.<\/p>\n<p>None of that was in the one-liner. That&rsquo;s the job a retainer agreement does, and a one-liner doesn&rsquo;t do it. Below is the template I&rsquo;d use today for a web developer retainer, the reasoning behind each clause, and the places where I think most templates online quietly fail the developer.<\/p>\n<p>I&rsquo;m not a lawyer, and this isn&rsquo;t legal advice. Treat the wording as a starting point and get a local professional to read it before you attach your name to it, especially if your client is in another country.<\/p>\n<h2 id=\"decide-what-the-client-is-buying\">Decide what the client is buying<\/h2>\n<p>A retainer can sell three different things, and the agreement should say which one you mean.<\/p>\n<p>The first is a bank of hours. The client gets a fixed number of hours each month at an agreed rate. This is the easiest to explain and the easiest to argue about, because every hour becomes a unit someone can question.<\/p>\n<p>The second is availability. The client pays for the right to reach you within a stated response time, whether or not they use it. This is closer to an insurance premium, and it suits maintenance work for a site that mostly runs by itself.<\/p>\n<p>The third is a defined outcome: for instance, &ldquo;keep the site patched, backed up and monitored, and fix anything that breaks within one business day&rdquo;. You&rsquo;re selling the result and you absorb the variance in hours.<\/p>\n<p>I lean toward the third for small sites and the first for active product work. The mistake is mixing them without saying so. If the agreement promises a one-day response time and also caps you at ten hours, you&rsquo;ve written a contract that you&rsquo;ll break in the first busy month, and the client has no idea.<\/p>\n<p>If you haven&rsquo;t already talked through scope with the client, do that before you send anything. My <a href=\"https:\/\/abrarqasim.com\/blog\/discovery-call-questions-web-client-before-quoting\" rel=\"noopener\">list of discovery call questions<\/a> is what I&rsquo;d run through first, because half of these clauses get easier to write once you know what the site actually does.<\/p>\n<h2 id=\"the-clauses-that-matter\">The clauses that matter<\/h2>\n<p>Here is the skeleton. Short on purpose.<\/p>\n<pre><code class=\"language-text\">RETAINER AGREEMENT\n\n1. Services. The Developer will provide the services listed in Schedule A\n   (maintenance, updates, monitoring, and small changes) for the Client's\n   website at [domain].\n\n2. Monthly fee. The Client will pay [amount] per month, invoiced on the\n   [first] of each month, payable within [14] days.\n\n3. Included time. The fee covers up to [N] hours per month. Time is tracked\n   in 15-minute increments and reported monthly.\n\n4. Unused time. Unused hours [expire at month end \/ roll over for one month].\n\n5. Extra work. Work beyond Schedule A or beyond [N] hours is quoted\n   separately and does not start until the Client approves the quote in writing.\n\n6. Response times. The Developer will acknowledge requests within [1]\n   business day. Emergency means the site is down or taking payments\n   incorrectly; those requests are handled first.\n\n7. Term and ending. This agreement runs month to month. Either party can end\n   it with [30] days written notice.\n\n8. Ownership. The Client owns the work product once the month's invoice is paid.\n   The Developer keeps rights to general tools and code not specific to the Client.\n\n9. Liability. The Developer's liability is limited to the fees paid in the\n   preceding [3] months.\n<\/code><\/pre>\n<p>Most of that is boilerplate. A few clauses carry all the weight, and those are the ones I&rsquo;d spend an evening on.<\/p>\n<h3 id=\"unused-hours\">Unused hours<\/h3>\n<p>Clause 4 is where the money argument happens. If hours expire, the client feels cheated in quiet months and the developer feels fine. If hours roll over without limit, you can end up owing someone 60 hours at the worst possible moment. I&rsquo;d pick expiry as the default, and offer a single month of rollover if the client pushes. Whatever you choose, write it down. An unstated rollover rule means the client will assume the generous version.<\/p>\n<h3 id=\"what-counts-as-extra\">What counts as extra<\/h3>\n<p>Clause 5 is the one the day-29 request breaks. Define &ldquo;small change&rdquo; with a number, not an adjective. Something like &ldquo;any single request that I estimate at more than three hours is a project and gets its own quote&rdquo;. Then the client doesn&rsquo;t have to argue with your opinion of what &ldquo;small&rdquo; means. They can argue with an estimate, which is a much more productive fight.<\/p>\n<p>Approval in writing matters because it protects both sides. An email reply is fine. A verbal &ldquo;yeah go ahead&rdquo; on a call is how a retainer becomes unpaid project work.<\/p>\n<h3 id=\"ending-it\">Ending it<\/h3>\n<p>Month to month with notice is boring and it&rsquo;s the right answer for most small clients. Long fixed terms scare people off, and a client who can&rsquo;t leave tends to become a client who resents you. A 30-day notice period gives you time to hand over credentials and documentation, and it gives them time to find someone else without a gap in coverage.<\/p>\n<h2 id=\"billing-it-so-it-actually-gets-paid\">Billing it so it actually gets paid<\/h2>\n<p>A retainer that depends on you remembering to send an invoice on the first of the month will fail in the month you&rsquo;re busiest, which is also the month the client most needs the cash flow to be dull and predictable.<\/p>\n<p>If your clients can pay by card, a recurring subscription takes the chasing out of it. Stripe documents the model in its <a href=\"https:\/\/docs.stripe.com\/billing\/subscriptions\/overview\" rel=\"nofollow noopener\" target=\"_blank\">subscriptions overview<\/a>: you create a price, attach the customer, and the billing happens on a schedule without you. For clients who need a proper invoice with a PO number or bank transfer details, <a href=\"https:\/\/docs.stripe.com\/invoicing\" rel=\"nofollow noopener\" target=\"_blank\">Stripe Invoicing<\/a> can generate and send those on a schedule too. Neither is the only option, and I don&rsquo;t have a stake in the choice. The point is to remove yourself from the loop.<\/p>\n<p>Two things I&rsquo;d add. First, send the hours report with the invoice, even when the client never asks for it. A short list of what you did builds trust faster than any promise about quality. Second, decide in advance what happens when a payment fails. A sensible default is a reminder at day 7, a pause on non-emergency work at day 14, and a conversation by phone before anything harsher. Write that sequence into clause 2 or a short schedule so it isn&rsquo;t a personal decision at the worst moment.<\/p>\n<h2 id=\"where-templates-online-get-it-wrong\">Where templates online get it wrong<\/h2>\n<p>Free retainer templates tend to share the same weaknesses.<\/p>\n<p>Many are written for consultants or agencies and talk about &ldquo;deliverables&rdquo; and &ldquo;milestones&rdquo; in a way that doesn&rsquo;t fit ongoing maintenance. A retainer is a service relationship, not a project with an end date.<\/p>\n<p>Many bury the response time or skip it. Clients buy retainers because they want to know that someone will pick up the phone. If the agreement doesn&rsquo;t say how fast, the client will fill in &ldquo;immediately&rdquo; in their head.<\/p>\n<p>And some give the developer almost no protection on scope. A line like &ldquo;ongoing website support&rdquo; is an invitation. Schedule A should list what is included in plain words, such as plugin and framework updates, uptime monitoring, nightly backups with a monthly restore test, and small content or layout edits. It should also list what is excluded: new features, redesigns, third-party integrations, and anything caused by changes someone else made to the server.<\/p>\n<p>The <a href=\"https:\/\/www.freelancersunion.org\/\" rel=\"nofollow noopener\" target=\"_blank\">Freelancers Union<\/a> publishes free resources on contracts and getting paid, and it&rsquo;s worth a read if you&rsquo;re newer to this. If you want my view on the broader contract, I wrote up <a href=\"https:\/\/abrarqasim.com\/blog\/freelance-contract-template-six-questions-before-i-sign\" rel=\"noopener\">six questions I ask before I sign<\/a>, and most of them apply here too.<\/p>\n<h2 id=\"what-id-do-this-week\">What I&rsquo;d do this week<\/h2>\n<p>Open the last retainer proposal you sent, or the email where you described one, and check it against the skeleton above. Find the three clauses it&rsquo;s missing. For most people that&rsquo;s unused hours, the definition of extra work, and the notice period.<\/p>\n<p>Then write Schedule A as two short lists, included and excluded, and send the updated version to your next client before they ask. If you already have clients on a retainer with no written agreement, send them the new one with a short note and offer to talk it through. Nobody has ever been upset to be asked what happens to the unused hours before the answer matters.<\/p>\n<p>If you&rsquo;d like to see how I scope and price this sort of work, my <a href=\"https:\/\/abrarqasim.com\" rel=\"noopener\">portfolio<\/a> is the place to start.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A retainer agreement template for web developers, clause by clause: unused hours, what counts as extra work, notice periods, and billing that does not rely on memory.<\/p>\n","protected":false},"author":2,"featured_media":791,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"","rank_math_description":"A retainer agreement template for web developers, clause by clause: unused hours, what counts as extra work, notice periods, and billing that does not rely on memory.","rank_math_focus_keyword":"retainer agreement template","rank_math_canonical_url":"","rank_math_robots":"","footnotes":""},"categories":[721],"tags":[725,764,773,868,39],"class_list":["post-792","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-freelance","tag-contracts","tag-freelance","tag-pricing","tag-retainer","tag-web-development"],"_links":{"self":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts\/792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/comments?post=792"}],"version-history":[{"count":0,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts\/792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/media\/791"}],"wp:attachment":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/media?parent=792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/categories?post=792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/tags?post=792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}