Milestones and private trades
Milestone Payments for Freelancers
Milestone payments for freelancers work best as one escrow per stage. DeFiEscrow releases the whole payout at once, not a percentage along the way.
· 4 min read · DeFiEscrow
Milestone payments for freelancers are how a client and a contractor avoid the two bad defaults: pay everything up front, or deliver everything and hope the invoice clears. An escrow locks the price for a stage until both sides approve. DeFiEscrow can do that for a stage paid in ETH, USDC, or USDT. It cannot pay 30% of a single escrow now and keep the rest for later. Release credits the whole payout. If your project has stages, you want one escrow per stage.
That constraint is the design guide. Everything else is ordinary project management that the contract will not do for you.
One escrow, one release
When an escrow is Approved and someone calls release, every party who has a willReceive amount is credited that full amount. There is no percent field and no schedule of dates inside the contract. A client who deposits 9,000 USDC against three equal milestones has not created three milestones. They have created one 9,000 USDC payment that moves when everyone approves.
Split it.
- Milestone 1: 3,000 USDC, its own funding deadline, its own approval deadline, its own definition of done.
- Milestone 2: created when milestone 1 is accepted, or created at the start if you already know the terms and you are willing to have it sit funded.
- Milestone 3: same pattern.
Creating them one at a time has a practical advantage. You can correct an address or a scope change before the next stage exists. Creating all three at the start locks the later terms early, which is fine if the scope is stable and painful if it is not. You cannot edit escrow number two after it is created.
The protocol fee applies to each escrow. At 1%, a 3,000 USDC milestone carries a 30 USDC fee. On a small ETH milestone, compare that with the 0.05 ETH minimum before you choose ETH out of habit. A short fee walkthrough has the breakpoint: under 5 ETH of payout, the minimum is larger than 1%.
Who approves, and what "done" means
The client is the depositor. The freelancer is the withdrawer. If a studio manager must also accept the work, add them as an acknowledger, and understand that their approval is now mandatory. Unanimous approval is not a metaphor. A silent manager blocks release until the approval deadline refunds the client.
Write "done" in the statement of work, not in the contract's nonexistent notes field. A milestone might be "homepage implemented against the attached list, on the staging URL." The freelancer approves when they believe they delivered it. The client approves when they agree. If they do not agree, they do not approve. After the approval deadline, the client's deposit can be refunded. That is the client's protection. The freelancer's protection is that the deposit was locked before they did the work, and that a client who wants the release has to approve rather than simply walk off with the files unpaid while the tokens sit forever. They do not sit forever. The deadline ends the Funded state if approvals are incomplete.
Pick the approval deadline from the review period you actually want. Forty-eight hours after delivery is a real review window if both people can reach a wallet. Thirty days "to be nice" is thirty days the freelancer waits on a client who will not say yes or no. Nice is a shorter clock and a clear spec.
Revisions, disputes, and the next stage
A round of revisions is not a contract state. If the spec allows one revision, the approval deadline has to be long enough to do that revision, or you agree to a new escrow for the extra work. Do not approve "so the freelancer gets paid something" while expecting the contract to hold back a portion. It will not.
If the work is disputed in the ordinary sense, either party can raise a dispute while the escrow is Funded or Approved. That freezes release. It does not summon a design critique. After 30 days the deposit refunds to the client if the dispute is still open. Use that when you need a freeze. Use the approval deadline when the issue is simply "not accepted." Disputes are a blunt tool next to a well-written milestone.
Start the next milestone's escrow when you are ready to lock the next amount. Do not ask the freelancer to begin the next stage on a promise that you will "set up the escrow Monday" unless they are comfortable working unsecured. The point of the pattern is that the secured stage is the stage in progress.
Practical checks
Agree the asset. USDC and USDT keep a 3,000 dollar milestone near 3,000 dollars. ETH does not. The freelancer should confirm the withdraw address on a second channel. The client should deposit from the address named in the escrow, after approving the token spend for that amount. Both should look at the review screen where the fee is already included.
Milestone payments work when each stage is small enough to lose a dispute over, clear enough to approve, and separate enough that release means "this stage is over." The contract will enforce that separation only if you create it.