DEV Community

Kornel Varga
Kornel Varga

Posted on

Stop Undercharging: A Simple Cost-to-Rate and Scope Checklist for Freelancers

A practical, ethical guide to pricing freelance work from real constraints instead of guesswork.

You can be busy and still be undercharging.

The warning signs are familiar: a full calendar with little left after expenses, a “quick favor” that becomes a second deliverable, or a project that sounds profitable until you count calls, revisions, and admin time. The fix is not to copy someone else’s rate. Make your assumptions visible, then price and scope from them.

This is a small system you can reuse for your next proposal.

1. Start with a sustainable hourly floor

Your hourly floor is the lowest rate that can support your work. It is a reality check, not necessarily the rate you show every client.

Use this worksheet:

Monthly personal costs = ____
Monthly business costs = ____
Monthly tax/safety buffer = ____
Monthly target for yourself = ____

Total monthly requirement = sum of the four lines
Realistic billable hours = ____

Hourly floor = monthly requirement ÷ billable hours

Do not use every hour you work. Proposals, bookkeeping, learning, marketing, breaks, and client communication are real work, but usually are not invoiced. If you have 160 working hours in a month, perhaps only 80–100 are realistically billable.

Example: if your monthly requirement is $4,000 and you can bill 80 hours, your floor is $50/hour. A $300 project taking ten total hours is below that floor before surprises appear. Revisit the worksheet when your costs or availability change.

2. Quote the outcome, not an imaginary perfect hour count

Clients usually care about an outcome: a reviewed landing page, a cleaned-up dashboard, a content plan, or a working automation. Use your floor privately to build a project price:

Estimated delivery hours = ____
Estimated communication/admin = ____
Contingency for uncertainty = ____

Total effort × hourly floor = baseline project price

Compare the baseline with the value and risk of the project. A clear, repeatable task may need little contingency. An unfamiliar integration with dependencies needs more. If the project falls below your floor, change the scope, timeline, or price. Do not quietly donate the difference.

A useful proposal explains what the client receives, what “done” means, and what is not included. That gives both people the same definition of the work.

3. Use a scope checklist before you say yes

Scope creep often begins with a friendly sentence: “Could you also…?” The question is not whether you can help. It is whether the request changes the agreed outcome.

Before accepting a project, write down:

  • Outcome: What should be different when the work is complete?
  • Deliverables: Which files, pages, meetings, or decisions are included?
  • Inputs: What must the client provide, and by when?
  • Revisions: How many rounds are included, and what counts as a round?
  • Communication: Which channel and response window will you use?
  • Dependencies: What approvals, access, or third-party tools could delay delivery?
  • Exclusions: What adjacent tasks are explicitly outside this project?
  • Change rule: How will new work be estimated and approved?
  • Timeline: When does the clock start, and what moves the deadline?

You do not need a complicated contract. A short “included / not included / change process” section in the proposal can prevent a long thread of assumptions.

4. Turn additions into choices, not arguments

When a client adds work, avoid defending your original quote emotionally. Make the change legible:

“That is a useful addition. It is outside the current deliverables, so I can add it for [price] and move the delivery date to [date], or we can keep the current timeline and leave it for a follow-up. Which works better?”

This keeps the relationship collaborative while protecting the boundary. If the request is genuinely tiny, you can include it as goodwill—but label that choice for yourself. Repeated “tiny” extras are data about whether your package or process needs to change.

Also distinguish clarification from expansion. Fixing an ambiguity in the original brief is different from creating a new feature. Your notes should make that distinction easy to explain.

5. Review the project after delivery

A rate system gets better when it learns from reality. Spend ten minutes after each project answering:

  1. How many hours did delivery, communication, and admin actually take?
  2. Which assumption was wrong?
  3. Where did the client experience friction?
  4. What should be added to the next scope checklist?
  5. Would I accept the same project at the same price again?

If the answer to the last question is no, do not automatically double your rate. First find the cause: unclear inputs, too many revisions, an unrealistic timeline, or a genuinely low price. Then make one deliberate adjustment for the next project.

You can also create a “minimum project” rule. If setup and communication make every engagement take at least three hours, a tiny task may need a minimum fee rather than a microscopic hourly quote. The exact number is yours; the principle is to price the whole engagement, not just visible production time.

A small next step

For your next inquiry, complete the two worksheets above. Then write five bullets under “included” and five under “not included.” You will have a more defensible starting point than a rate copied from a random internet list—and a clearer way to discuss changes without making them personal.

If you want a low-pressure place to practice outreach while you refine your pricing, the free outreach pack includes reusable messages and a GitHub version you can browse first.

For the final step of turning these calculations into a reusable rate and scope sheet, the optional Freelance Rate & Scope Calculator Kit ($14) is available. Use it if a structured template would save you time; the worksheets in this article are enough to get started.

What is one scope boundary you wish you had written down before your last project?

Top comments (0)