June 24, 2026
How I Run a Freelance Project, From First Call to Deploy
Scope, milestones, and what happens after launch. The process I use so clients always know what's shipping next.
Most freelance projects that go badly don't fail technically. They fail because nobody agreed on what 'done' meant, and the disagreement surfaced two weeks after it was expensive to fix. Here's the process I use to keep that from happening.
The first call is scoping, not selling
I spend the first conversation trying to find the smallest version of the project that's still worth building. Clients usually arrive with a feature list, and a good chunk of it is speculative: things they think they'll want, based on a version of the business that doesn't exist yet. Cutting those before we start is the single cheapest thing we can do together.
What I want out of that call is a clear picture of who uses this, what they do with it, and what has to be true on launch day. Everything else becomes a later phase.
Milestones the client can actually see
I break the work into milestones that produce something visible, not internal ones like 'set up the database'. A client can't evaluate a schema, but they can evaluate a working signup flow, a product page with real data, or an admin they can log into. Each milestone is something they can open in a browser and react to.
That structure catches misunderstandings early. If I built the wrong thing, I find out at the end of a milestone instead of at the end of a project.
One point of contact, in both directions
I work directly with clients, with no account manager relaying requirements through a second person. It works because it also runs the other way: I need one person on their side who can make decisions. Feedback from four people with different opinions and no tiebreaker is how a two-week milestone turns into six.
Launch is the middle, not the end
Handoff includes hosting, domains, and deployment, because the alternative is a client holding a codebase they can't run. After launch there's always a tail: a bug under real traffic, a copy change, something that only shows up once actual users arrive. I plan for that tail rather than treating it as an interruption.
None of this is complicated. It's mostly just deciding things early, in writing, with someone who has the authority to decide them.