For most projects I work on a fixed scope with an estimated range, based on an hourly rate and the complexity of the work.
In practice that usually looks like:
- A clear statement of work – pages, features, integrations
- An estimated range of hours and a likely cost
- Progress billing at agreed milestones (for example: 30% / 40% / 30%)
For smaller pieces of work, audits, or one-off fixes, I may simply bill on time spent, with a minimum block so nobody’s counting five-minute increments.