Most freelance web developers don’t feel underpaid because of the build quote. They feel underpaid because of the eight months of post-launch DMs, “real quick” tickets, and “the contact form is acting weird” emails that never appeared in the original number. A proper web developer quote separates the project from the relationship, and charges for both.
The build is the engagement that ends. The maintenance is the engagement that continues. Treating them as one document is the single most expensive mistake freelance developers make.
The build quote: fixed scope, milestone payments
A build quote is a finite document. It describes a website or app that will exist by a specific date for a specific price. The scope is the spine.
A solid web developer quote for a build includes:
- Pages or screens covered, listed by name
- Technology stack (Next.js 16, Tailwind, headless Sanity CMS, etc.)
- Integrations (Stripe, Mailchimp, HubSpot, Calendly)
- Performance targets (Lighthouse score, Core Web Vitals)
- Responsive breakpoints
- Browser support
- Number of revision rounds per phase
- Content responsibility (who writes, who provides images)
- Out-of-scope, plainly listed
- Milestone payment schedule
- Launch date and what “launch” means
Milestone payments are typically 33% on signing, 33% on staging approval, 34% on launch. Some developers split into 4 milestones for builds over $15K.
What “out of scope” looks like in plain language
The out-of-scope list is the most valuable section of the entire web developer quote. Examples:
- Content writing or copywriting
- SEO strategy beyond on-page basics
- Email marketing setup
- Logo design or full brand identity
- Custom photography or illustration
- Translation or multilingual setup beyond a single language
- Ongoing maintenance (covered in separate quote)
- Hosting, domain registration, third-party software fees
Each of those is a real thing clients assume is included. Listing them as out-of-scope doesn’t mean you won’t do them, it means you’ll quote them separately when asked.
The maintenance quote: tiered monthly retainer
A maintenance quote is a recurring document. It exists independently of the build. Most freelance developers offer 3 tiers:
| Tier | Monthly hours | Includes | Typical price |
|---|---|---|---|
| Essentials | 2 hrs | Updates, backups, uptime monitoring, small text edits | $200/mo |
| Standard | 5 hrs | Above + minor design tweaks, plugin troubleshooting, analytics review | $475/mo |
| Priority | 10 hrs | Above + 24-hour response SLA, monthly call, small feature additions | $950/mo |
Numbers vary by market and stack. The structure is what matters: tiered, hour-capped, with clear SLA differences.
What maintenance covers (and what it absolutely doesn’t)
Covered:
- Security patches and dependency updates
- Daily or weekly backups
- Uptime monitoring with notification
- Minor copy and image swaps (under 30 min each)
- Plugin or package updates and conflict resolution
- Basic SEO health (broken links, missing alts)
Not covered:
- New pages, sections, or templates
- Redesigns or visual overhauls
- New integrations or APIs
- Major content migrations
- E-commerce product additions beyond a small number per month
- Feature requests of any size
When a client asks for something in the “not covered” list, you quote it as a mini-project. The maintenance retainer keeps running. The new work is billed on top.
The response SLA matters more than the hours
Most clients on a maintenance plan never use their hours. What they’re paying for is the confidence that you’ll pick up the phone. I have retainer clients who haven’t used 4 of the last 6 months of their hours, and they renew every year because the one time their checkout broke at 11pm I answered.
Define response time explicitly:
- Essentials: 3 business day response
- Standard: 1 business day response
- Priority: 4-hour response during business hours
If you don’t define it, the client assumes “immediately, always, including Saturday.” Then they get mad when you take 2 days. Define it, and 2 days becomes the deal you agreed to.
How to present both quotes together
The presentation matters. Don’t email two PDFs and hope for the best.
A clean web developer quote bundle looks like:
- Cover note explaining you’re sending two quotes: the build and the maintenance plan
- The build quote (signed separately)
- The maintenance tiers (signed separately, can be deferred)
- A line saying: “If you’d prefer no maintenance plan, post-launch support is billed at $X/hour with a 5-business-day response and a 1-hour minimum.”
That last line is the magic. It removes the “free support” assumption without forcing the client into a retainer they don’t want.
The hourly rate fallback is not your real rate
Notice that the ad-hoc hourly rate is usually 20% to 40% higher than the effective rate on a retainer. That’s intentional. Retainer clients get a discount for the predictability. Ad-hoc clients pay the premium for the lack of commitment.
If your retainer effective rate is $150/hour, your ad-hoc rate should be $200/hour. This isn’t greed. It’s how you fund the context switching and unscheduled interruptions that ad-hoc work creates.
Track when the client opens the maintenance quote
Even if they sign the build today, the maintenance quote often sits unsigned for weeks. The good news is that most clients re-open it the moment something breaks. A quote that tells you when the client viewed the maintenance section lets you call them at exactly the right moment, usually the day after they re-opened it for the second time.
The renewal conversation
Maintenance plans should auto-renew monthly with a 30-day cancel clause. Once a year, send a brief review email: hours used, incidents resolved, recommendations for the next year. That’s when you upsell to the next tier, propose a redesign, or add a feature project.
The web developer quote that wins isn’t the cheapest. It’s the one that turns a $14,000 build into a $14,000 build plus $5,400/year of maintenance, every year, for as long as the site exists.
Ready to send stronger proposals?
Build, send, and track proposals in one place so follow-up is easier.
Start your free trial →





