Inspiration

In high school, I took on a lot of freelance gigs, mostly event photography and logo design for new startups. Almost all of the communication happened over WhatsApp chats and emails, and it felt unprofessional and disorganised. Progress, feedback and payments were scattered across messages, and there was no clear way to track any of it. I wished there was an app that was simple enough for young freelancers to actually use, one that kept agreements, deliverables and payments in one place. Milestone Pay is that app, and I hope it solves the same problem for many other freelancers.

What it does

Milestone Pay turns the chat where you agreed the job into an agreement, then handles payment one milestone at a time through PayPal. The freelancer pastes the chat, or up to 10 screenshots, and AI drafts the scope, price, deadline and milestones. It also points out what was never agreed, like a revision limit. Once both sides approve, the client funds a milestone and Milestone Pay holds the money. The freelancer uploads the work, the client approves it, and the money goes to the freelancer's PayPal. If the client later asks for something outside the agreement, it becomes a new priced milestone.

How we built it

We built it with Claude Code as our coding assistant. We described each piece, reviewed what it wrote and had it test the result in a real browser. Inside the app, Gemini 3.1 Flash-Lite does the AI work. It reads the chat into an agreement, transcribes screenshots, checks change requests against the agreed scope and runs a small agent that decides the next payment step. PayPal moves all the money. People sign in with Log in with PayPal. The client pays through the PayPal button, the server authorizes the order to hold the funds, captures it on approval and sends it on with Payouts. Everything runs on the PayPal sandbox.

Challenges we ran into

  1. Letting AI near money. Our sample chat has a message telling the AI to ignore the contract and release the funds. We put the rules in code: a payment only moves if the client's approval is saved in the database, and the agent never sees chat text.
  2. Holds expire. A PayPal hold lapses after 29 days, whatever the milestone's due date is. We tried charging the client up front instead, didn't like it, and went back to holds with a warning before they end.
  3. Paying twice by accident. Double clicks and retries are risky with money, so every PayPal write carries an idempotency key.

Accomplishments that we're proud of

Finding out that integrating PayPal is straightforward. Login, the hold, the capture and the payout all came from one set of APIs. Keeping both the freelancer and the client in mind as they start a new working relationship. Using AI where it helps, and building something we would have wanted for our own first gigs.

What we learned

The difference between authorizing a payment and capturing it. That gap is what makes a hold possible. AI is good at drafting and bad at being trusted. It writes the agreement and suggests the next step, but a person approves anything that matters. Finally, wording matters when money is involved. "Held", "charged" and "paid" each have to be exactly true on every screen.

What's next for Milestone Pay

Checking regional regulations on how to handle money between two parties as an intermediary, before going beyond the sandbox. Making the first few minutes friendlier for a new client. Testing it with family and friends on real small jobs.

Share this project:

Updates

Submission history