The most dangerous sentence in a freelance software project is usually not, “We need to rebuild everything.”
It is, “Could we also add one small thing?”
One small thing sounds harmless. It sounds like a button, a field, a filter, a notification, or a slightly different screen. It sounds like the kind of request a helpful person should absorb without making a production out of it.
That is how a project quietly becomes a different project.
I learned this while working on my first major freelance app project. I was the only person responsible for the work, which meant every new request landed on the same small system: my time, the app's existing behavior, the backend, the QA pass, the next demo, and the client's expectations.
The lesson was not that clients are bad when they ask for more. Most scope creep is not a villain entering through a trapdoor. It is a reasonable person noticing a better idea after seeing the first version.
The lesson was that a new feature request is a decision, not a task.
Every new feature spends one of three resources: time, scope, or money. If you do not name the trade, the project spends the resource silently. Usually, it spends your time first.
The helpful-person trap
Freelancers often want to be easy to work with. I understand that instinct. You want the client to feel that you are flexible, collaborative, and invested in the product.
So a client asks for a change, and you say, “Sure, I can add that.”
The sentence feels generous because it only describes the coding action. It does not describe the consequences.
The new button may require a new state. The new state may require a data-model change. The data-model change may touch existing screens. Those screens need testing. The test may reveal a permissions problem. The permissions fix may change the demo. The demo may expose another expectation.
By the time the feature is visible, “one small thing” has become a chain of decisions.
AI coding tools make this trap more dangerous because they can produce the first version of a change so quickly. The speed is real, but it can hide the surface area. A generated screen is not the same thing as a completed feature. The feature still has to fit the product, the data, the permissions, the existing user journey, and the promised timeline.
That is why I now try to pause before accepting the implementation itself.
The first response to a new request should not be “I will code it.” It should be “Let us understand what changes if we include it.”
If you want a practical place to learn this kind of project-control habit, I made AI App Builder Starter Prompts, a free pack for turning a rough app idea into a scoped first build with AI:
https://marcusykim.gumroad.com/l/ai-app-builder-starter-prompts
The three-way trade
When a new request arrives, put it through a simple three-way trade:
- Keep the original date, and remove or delay something else.
- Keep the original scope, and move the date.
- Keep the original date and scope, and add budget or people.
There is no secret fourth option where the project receives more work without paying for it somewhere. Sometimes the cost is hidden because the freelancer absorbs it. Sometimes the cost appears later as rushed QA, a missed milestone, a tired developer, or a client who no longer trusts the schedule.
Naming the trade makes the conversation less personal. You are not rejecting the idea. You are showing the project its actual accounting.
For a small freelance app, the conversation can be as plain as:
That feature makes sense. It touches the event flow and the data behind it, so I see three safe options: add it and move the next milestone, add it and remove another item from this milestone, or treat it as a new piece of work after the current milestone. Which trade do you want to make?
This is not bureaucracy. It is a way to stop a project from making an accidental promise.
What to inspect before you say yes
Before I accept a new feature, I want an impact scan. It does not need to be a forty-page technical investigation. It needs to expose the places where “small” can become expensive.
I look at six areas:
1. User outcome
What is the user trying to accomplish now?
If the request does not create a clearer user outcome, it may be decoration, a preference, or a future idea rather than a current requirement.
Ask:
- Who uses this?
- What can they do after the change that they cannot do now?
- Is that outcome part of the current promise?
2. Existing workflow
Which current path changes?
A new control placed on a screen may alter the order of actions, empty states, loading states, error states, or navigation. A request can be small in code and large in behavior.
Ask:
- Does this create a new step?
- Does it change what “done” looks like?
- What happens when the user cancels, retries, or has no data?
3. Data and ownership
Does the feature need new information to be stored, shared, or associated with a person?
This is where many beginner projects discover that a screen is only the visible part of the request. If the data does not persist, belong to the right user, or survive the next session, the feature is not finished.
Ask:
- What data is created or changed?
- Who owns it?
- Who can see or edit it?
- Does the existing schema support it?
4. Integrations and permissions
Does the feature involve notifications, location, payments, email, an outside API, or a new account boundary?
Each integration adds a contract and a failure path. The happy-path demo is the cheapest part.
Ask:
- What external service or permission is required?
- What happens when the user denies access?
- What happens when the provider is unavailable?
5. Proof
How will we know the feature works?
I want the proof named before the feature is treated as complete. That might be a user completing a workflow, data surviving a restart, two accounts seeing the correct boundaries, or a failed request producing a useful recovery state.
Ask:
- What will I demonstrate?
- What will I test with bad input or missing data?
- What existing behavior could this accidentally break?
6. Schedule and trade
What does the request displace?
This is the area people skip because it feels commercial. But schedule is part of the product promise. If the new request takes two days, those two days have to come from somewhere.
Ask:
- Does the milestone move?
- Does another feature move out?
- Does this become a separately priced change?
A better change-request note
For a new request, I would write a short note with these fields:
Requested change:
User outcome:
Existing workflow affected:
Data, permissions, or integrations affected:
New QA proof:
Estimated effort and risk:
Trade chosen: date, scope, or money:
Next decision:
The point is not to create paperwork for its own sake. The point is to make the invisible parts visible while the request is still easy to discuss.
This note also gives an AI coding tool something better than “add this feature.” You can ask the tool to inspect the repository against the change-request note, list the affected files and contracts, identify unknowns, and wait for approval before editing.
The prompt I would use is roughly:
Before changing code, analyze this requested feature against the current project.
Return:
1. The user outcome.
2. Existing workflows and data affected.
3. New permissions or integrations required.
4. Failure and empty states.
5. QA proof needed.
6. The smallest implementation that meets the outcome.
7. What the feature may displace in the current milestone.
Do not edit files until I approve the impact scan and the schedule trade.
That last sentence matters. If the AI starts coding while the request is still being negotiated, the project can become emotionally committed to a solution before anyone has agreed on the cost.
The free starter prompts are useful for this pause because they turn a vague request into a sequence of questions: what is the outcome, what belongs in version one, what does the tool need to know, and how will you verify the result? You can find that free pack here:
https://marcusykim.gumroad.com/l/ai-app-builder-starter-prompts
Scope control is part of client service
There is a fear that talking about scope makes you seem difficult. In my experience, the opposite is often true when the conversation is calm and specific.
Clients usually do not need a freelancer to say yes to every idea. They need someone to help them understand what the idea means. A useful freelancer can say:
- “Yes, here is what it would take.”
- “Not in this milestone, but here is where it fits.”
- “We can add it if we remove this other item.”
- “I do not know yet; I need to inspect the data and workflow first.”
That is not resistance. It is professional translation.
The same principle applies when you are building your own app. You are both the client and the freelancer, which means you can give yourself unlimited requests and then blame the project for taking forever.
Do not do that.
Keep a change log. When a new idea appears, record it, classify it as now, next, or later, and write down what it would cost. You are not killing creativity. You are giving creativity a place to wait without hijacking the current build.
What I would do differently now
On my first major freelance project, I learned that technical effort and project agreement are separate problems.
I can ask Codex to help implement a change. That does not mean the change belongs in the current milestone. I can make a screen look convincing. That does not mean the user workflow, data, permissions, and QA are finished. I can be excited about a feature. That does not mean the original deadline should remain unchanged.
The better sequence is:
- Translate the request into a user outcome.
- Scan the workflow, data, permissions, integrations, and QA impact.
- Name the smallest useful version.
- Choose the trade: time, scope, or money.
- Update the milestone or change log.
- Then ask AI to implement the approved slice.
The order protects both sides of the relationship. The client gets an honest decision. The freelancer gets a project that can still be finished. The AI gets a bounded job instead of a moving target.
I made a free AI App Builder Starter Prompts pack for beginners who want help turning app ideas and build requests into clearer conversations with AI:
https://marcusykim.gumroad.com/l/ai-app-builder-starter-prompts
If the starter prompts are useful and you want the deeper field manual, AI App Builder From Zero walks through idea, scope, stack, prompting, QA, deployment, and launch:
https://marcusykim.gumroad.com/l/ai-app-builder-from-zero
My rule now is simple: a new feature can be a good idea and still be the wrong thing to build next.
Before you say yes, make the project name the trade.
You can also find me here:
Medium: https://medium.com/@marcusykim
DEV.to: https://dev.to/marcusykim
Website: https://marcusykim.com/blog/
X: https://x.com/marcusykim
LinkedIn: https://www.linkedin.com/in/marcusykim/
Top comments (0)