<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gig Shield</title>
    <description>The latest articles on DEV Community by Gig Shield (@gig_shield_267391e1750ebf).</description>
    <link>https://dev.to/gig_shield_267391e1750ebf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4141319%2F8567e241-c16a-4cd0-ba05-da3198559982.png</url>
      <title>DEV Community: Gig Shield</title>
      <link>https://dev.to/gig_shield_267391e1750ebf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gig_shield_267391e1750ebf"/>
    <language>en</language>
    <item>
      <title>How to Structure Milestone Payments for Freelance Software Projects</title>
      <dc:creator>Gig Shield</dc:creator>
      <pubDate>Thu, 24 Sep 2026 13:32:20 +0000</pubDate>
      <link>https://dev.to/gig_shield_267391e1750ebf/how-to-structure-milestone-payments-for-freelance-software-projects-14in</link>
      <guid>https://dev.to/gig_shield_267391e1750ebf/how-to-structure-milestone-payments-for-freelance-software-projects-14in</guid>
      <description>&lt;p&gt;If you've freelanced as a developer for long enough, you've probably had one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client says the feature "isn't finished" three weeks after you shipped it.&lt;/li&gt;
&lt;li&gt;The last invoice is the one that never gets paid.&lt;/li&gt;
&lt;li&gt;A "quick change" after sign-off turns into a week of unpaid work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are really about money. They're about a project structure that left "done" undefined and put all the risk on one side. Here's how to fix that.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Milestones should end in something you can run
&lt;/h2&gt;

&lt;p&gt;A milestone is only useful if both sides can check it without an argument. "Backend work" is not a milestone. "API endpoints for auth and orders, deployed to staging, with a Postman collection" is.&lt;/p&gt;

&lt;p&gt;A structure that works for most small and mid-size projects:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Deliverable&lt;/th&gt;
&lt;th&gt;Share of budget&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spec&lt;/td&gt;
&lt;td&gt;Agreed scope, user stories, technical approach&lt;/td&gt;
&lt;td&gt;10 to 15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core build&lt;/td&gt;
&lt;td&gt;Main features working on staging&lt;/td&gt;
&lt;td&gt;35 to 40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completion&lt;/td&gt;
&lt;td&gt;Remaining features, tests passing, bugs fixed&lt;/td&gt;
&lt;td&gt;30 to 35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handover&lt;/td&gt;
&lt;td&gt;Production deploy, docs, access transferred&lt;/td&gt;
&lt;td&gt;15 to 20%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep the final milestone small. It's the one most often delayed, so don't let it hold a third of the budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Write acceptance criteria like test cases
&lt;/h2&gt;

&lt;p&gt;For every milestone, agree in writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which features must work, and in which environment&lt;/li&gt;
&lt;li&gt;Which tests must pass (unit, integration, or a manual checklist)&lt;/li&gt;
&lt;li&gt;What's included: docs, migrations, environment setup&lt;/li&gt;
&lt;li&gt;How long the client has to review, and what happens if they don't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters. A fixed review window, for example 72 hours, after which the milestone is treated as approved, stops your payment from waiting on someone's holiday.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Every change request is a new milestone
&lt;/h2&gt;

&lt;p&gt;Anything outside the agreed scope gets its own price and its own acceptance criteria. It feels formal the first time. After that it saves the relationship, because nobody is doing free work and nobody gets a surprise invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Get the money committed before you write code
&lt;/h2&gt;

&lt;p&gt;Asking for full payment upfront scares good clients. Waiting until the end puts all the risk on you. The middle ground is escrow per milestone:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The client funds the milestone before work starts.&lt;/li&gt;
&lt;li&gt;A neutral party holds the funds.&lt;/li&gt;
&lt;li&gt;You deliver, the client approves, the money is released.&lt;/li&gt;
&lt;li&gt;If there's a disagreement, the evidence is checked against the written criteria.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Developers have an advantage here: our evidence is unusually good. Commit history, pull requests, staging URLs, CI results and logs make it easy to show whether a milestone was met.&lt;/p&gt;

&lt;p&gt;Disclosure: I'm the founder of &lt;a href="https://gigshield.ai" rel="noopener noreferrer"&gt;GigShield.ai&lt;/a&gt;, which does milestone escrow for freelancers and the clients they already work with. There's a longer guide on &lt;a href="https://gigshield.ai/escrow-for-software-development" rel="noopener noreferrer"&gt;escrow for software development projects&lt;/a&gt; if you want templates for milestone design. The structure in this article works with any escrow method, or even without one.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep the paper trail as you go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The signed agreement, with milestones and criteria&lt;/li&gt;
&lt;li&gt;Written approval for each milestone (a message is enough)&lt;/li&gt;
&lt;li&gt;Each change request and its price&lt;/li&gt;
&lt;li&gt;Links to the commits, releases and test runs for each delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checklist before your next project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every milestone ends in something the client can run or test&lt;/li&gt;
&lt;li&gt;Acceptance criteria are written, with a review deadline&lt;/li&gt;
&lt;li&gt;The final milestone is 20% or less of the budget&lt;/li&gt;
&lt;li&gt;Change requests are priced as new milestones&lt;/li&gt;
&lt;li&gt;The first milestone is funded before you start&lt;/li&gt;
&lt;li&gt;Both sides know how a disagreement will be resolved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get the structure right and most "payment problems" never happen.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>career</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
