Lawn Care & Landscaping Quote Calculator
Spring arrives. A homeowner looks at their overgrown lawn and searches "lawn service near me." They find three companies. One says "call for free estimate." One has a contact form. Yours asks about their lot size and shows weekly pricing immediately. Who gets the job?
Lawn care is the gateway to landscaping revenue. Weekly mowing builds relationships that turn into fertilization programs, landscaping projects, and year-round maintenance contracts. A quote form that shows transparent pricing and offers clear service tiers converts browsers into long-term customers.
This guide covers building quote forms for lawn care services: basic mowing, full lawn programs, landscaping projects, and seasonal cleanup. Each has different pricing models and upsell opportunities.
Service Type Selection
Start by understanding what they want. The form adapts based on whether it's recurring mowing, a one-time project, or a full care program.
form.addRow(row => {
row.addDropdown('serviceType', {
label: 'What do you need?',
options: [
{ id: 'mowing', name: 'Lawn Mowing (Recurring)' },
{ id: 'full-service', name: 'Full Lawn Care Program' },
{ id: 'one-time', name: 'One-Time Service' },
{ id: 'landscaping', name: 'Landscaping Project' },
{ id: 'cleanup', name: 'Seasonal Cleanup' },
{ id: 'irrigation', name: 'Irrigation / Sprinkler' }
],
isRequired: true
});
});Six categories cover most lawn and landscape work. Mowing is your foot in the door. Full-service programs are where the real money is. Landscaping projects are one-time but high-value.
Lot Size: The Key Variable
Lot size drives pricing for almost every service. Larger properties take more time, equipment, and materials.
form.addRow(row => {
row.addDropdown('lotSize', {
label: 'Lot Size',
options: [
{ id: 'small', name: 'Small (under 5,000 sq ft)' },
{ id: 'medium', name: 'Medium (5,000 - 10,000 sq ft)' },
{ id: 'large', name: 'Large (10,000 - 20,000 sq ft)' },
{ id: 'xlarge', name: 'Very Large (20,000 - 43,560 sq ft / 1 acre)' },
{ id: 'acreage', name: 'Acreage (over 1 acre)' }
],
tooltip: 'Average suburban lot is 8,000-10,000 sq ft',
isRequired: true
});
});
form.addRow(row => {
row.addInteger('acres', {
label: 'How many acres?',
min: 1,
max: 100,
defaultValue: 1,
isVisible: () => form.dropdown('lotSize')?.value() === 'acreage'
});
});Most homeowners have a rough idea of their lot size. The help text gives context - "average suburban lot is 8,000-10,000 sq ft" helps them pick the right bracket. Acreage is a separate category with different pricing.
Pro tip
Consider using Google Maps or county records to verify lot sizes before confirming quotes. Many customers underestimate their property size, leading to underpriced jobs.
Mowing Service Details
For recurring mowing, frequency and included services matter. Weekly vs. biweekly changes the monthly price significantly.
const mowingSection = form.addSubform('mowing', {
title: 'Mowing Service Options',
isVisible: () => {
const service = form.dropdown('serviceType')?.value();
return service === 'mowing' || service === 'full-service';
}
});
mowingSection.addRow(row => {
row.addRadioButton('mowingFrequency', {
label: 'How often?',
options: [
{ id: 'weekly', name: 'Weekly' },
{ id: 'biweekly', name: 'Every 2 Weeks' },
{ id: 'as-needed', name: 'As Needed / On Call' }
],
defaultValue: 'weekly'
});
});
mowingSection.addRow(row => {
row.addCheckboxList('mowingIncludes', {
label: 'Include with mowing',
options: [
{ id: 'edging', name: 'Edging (sidewalks, driveways)' },
{ id: 'trimming', name: 'String Trimming' },
{ id: 'blowing', name: 'Blow Off Hard Surfaces' }
],
defaultValue: ['edging', 'trimming', 'blowing']
});
});Default the extras to "included" - edging, trimming, and blowing should be standard. Customers who want bare-bones mowing-only can deselect them. Most won't, and you've set expectations for quality service.
Full Lawn Care Programs
Full programs bundle mowing with fertilization, weed control, and other treatments. These are your highest-value recurring customers.
const programSection = form.addSubform('program', {
title: 'Lawn Care Program',
isVisible: () => form.dropdown('serviceType')?.value() === 'full-service'
});
programSection.addRow(row => {
row.addRadioButton('programLevel', {
label: 'Program Level',
options: [
{ id: 'basic', name: 'Basic - Mowing + Fertilization (4x/year)' },
{ id: 'standard', name: 'Standard - Basic + Weed Control + Aeration' },
{ id: 'premium', name: 'Premium - Full Service + Overseeding + Disease Control' }
],
defaultValue: 'standard'
});
});
programSection.addRow(row => {
row.addTextPanel('programDetails', {
computedValue: () => {
const level = form.radioButton('programLevel')?.value();
if (level === 'basic') {
return 'Includes: Weekly mowing + 4 fertilizer applications per year';
}
if (level === 'standard') {
return 'Includes: Weekly mowing + fertilization + pre/post-emergent weed control + fall aeration';
}
return 'Includes: Everything in Standard + overseeding + grub control + fungicide treatments + priority scheduling';
}
});
});Three tiers work well: basic (mowing plus fertilization), standard (adds weed control and aeration), and premium (everything). Show what each includes so customers understand the value difference.
Landscaping Projects
Landscaping is harder to quote online - projects vary wildly. But you can qualify leads by understanding scope and budget.
const landscapeSection = form.addSubform('landscape', {
title: 'Landscaping Project Details',
isVisible: () => form.dropdown('serviceType')?.value() === 'landscaping'
});
landscapeSection.addRow(row => {
row.addCheckboxList('landscapeServices', {
label: 'What do you need?',
options: [
{ id: 'design', name: 'Landscape Design' },
{ id: 'planting', name: 'Planting (shrubs, trees, flowers)' },
{ id: 'mulch', name: 'Mulch Installation' },
{ id: 'beds', name: 'New Flower Beds' },
{ id: 'sod', name: 'Sod Installation' },
{ id: 'hardscape', name: 'Hardscape (pavers, walls, patios)' },
{ id: 'drainage', name: 'Drainage Solutions' },
{ id: 'lighting', name: 'Landscape Lighting' }
]
});
});
landscapeSection.addRow(row => {
row.addDropdown('projectBudget', {
label: 'Approximate Budget',
options: [
{ id: 'small', name: 'Under $1,000' },
{ id: 'medium', name: '$1,000 - $5,000' },
{ id: 'large', name: '$5,000 - $15,000' },
{ id: 'major', name: '$15,000 - $50,000' },
{ id: 'premium', name: 'Over $50,000' },
{ id: 'unknown', name: 'Not sure / Need guidance' }
],
defaultValue: 'unknown'
});
});Budget question helps qualify leads. "Under $1,000" might be DIY territory. "$15,000+" is a serious project. "Not sure / need guidance" signals someone who needs consultation - that's a sales opportunity.
Mowing Pricing
Show per-visit and monthly pricing for mowing. Let customers see how frequency affects their cost.
const mowingPrices: Record<string, number> = {
small: 35,
medium: 50,
large: 75,
xlarge: 110,
acreage: 150
};
form.addRow(row => {
row.addPriceDisplay('mowingPrice', {
label: 'Per Visit',
prefix: 'From',
computedValue: () => {
const service = form.dropdown('serviceType')?.value();
if (service !== 'mowing') return null;
const size = form.dropdown('lotSize')?.value();
if (!size || !mowingPrices[size]) return null;
let price = mowingPrices[size];
// Acreage pricing
if (size === 'acreage') {
const acres = form.integer('acres')?.value() || 1;
price = 150 + (acres - 1) * 75;
}
return price;
},
isVisible: () => form.dropdown('serviceType')?.value() === 'mowing'
});
});
form.addRow(row => {
row.addPriceDisplay('monthlyMowing', {
label: 'Monthly Estimate',
suffix: '/month',
computedValue: () => {
const service = form.dropdown('serviceType')?.value();
if (service !== 'mowing') return null;
const size = form.dropdown('lotSize')?.value();
const freq = form.radioButton('mowingFrequency')?.value();
if (!size || !mowingPrices[size]) return null;
let perVisit = mowingPrices[size];
if (size === 'acreage') {
const acres = form.integer('acres')?.value() || 1;
perVisit = 150 + (acres - 1) * 75;
}
const visitsPerMonth = freq === 'weekly' ? 4 : freq === 'biweekly' ? 2 : 2;
return perVisit * visitsPerMonth;
},
isVisible: () => form.dropdown('serviceType')?.value() === 'mowing'
});
});Per-visit pricing helps comparison shoppers. Monthly pricing helps budgeters. Showing both gives customers the information they need to decide. Acreage has separate pricing logic - each additional acre adds cost.
See more lawn care and service calculators.
Program Pricing
Full programs have higher monthly prices but better per-service value. Show the monthly cost clearly.
const programPrices: Record<string, Record<string, number>> = {
basic: { small: 150, medium: 200, large: 275, xlarge: 375 },
standard: { small: 225, medium: 300, large: 400, xlarge: 525 },
premium: { small: 325, medium: 425, large: 550, xlarge: 700 }
};
form.addRow(row => {
row.addPriceDisplay('programPrice', {
label: 'Monthly Program Cost',
prefix: 'From',
suffix: '/month',
variant: 'highlight',
computedValue: () => {
const service = form.dropdown('serviceType')?.value();
if (service !== 'full-service') return null;
const size = form.dropdown('lotSize')?.value();
const level = form.radioButton('programLevel')?.value() || 'standard';
if (!size || size === 'acreage' || !programPrices[level]) return null;
return programPrices[level][size];
},
isVisible: () => form.dropdown('serviceType')?.value() === 'full-service'
});
});The "highlight" variant draws attention to the price - this is the number that matters for recurring revenue. Premium pricing should be noticeably higher but clearly justified by included services.
Seasonal Cleanup Pricing
Spring and fall cleanup are seasonal services with predictable scope. Price by lot size and season.
const cleanupPrices: Record<string, { spring: number; fall: number }> = {
small: { spring: 175, fall: 200 },
medium: { spring: 250, fall: 300 },
large: { spring: 375, fall: 450 },
xlarge: { spring: 500, fall: 600 }
};
const cleanupSection = form.addSubform('cleanup', {
title: 'Cleanup Details',
isVisible: () => form.dropdown('serviceType')?.value() === 'cleanup'
});
cleanupSection.addRow(row => {
row.addRadioButton('cleanupType', {
label: 'Type of Cleanup',
options: [
{ id: 'spring', name: 'Spring Cleanup' },
{ id: 'fall', name: 'Fall Leaf Cleanup' },
{ id: 'both', name: 'Both (Seasonal Package)' }
],
defaultValue: 'fall'
});
});
form.addRow(row => {
row.addPriceDisplay('cleanupPrice', {
label: 'Estimated Price',
prefix: 'Starting at',
computedValue: () => {
const service = form.dropdown('serviceType')?.value();
if (service !== 'cleanup') return null;
const size = form.dropdown('lotSize')?.value();
const type = form.radioButton('cleanupType')?.value() || 'fall';
if (!size || size === 'acreage' || !cleanupPrices[size]) return null;
if (type === 'both') {
return cleanupPrices[size].spring + cleanupPrices[size].fall;
}
return cleanupPrices[size][type];
},
isVisible: () => form.dropdown('serviceType')?.value() === 'cleanup'
});
});Fall cleanup typically costs more than spring - leaves are a bigger job than debris clearing. Offering a "both" package with a slight discount locks in seasonal revenue.
Property Features
Property characteristics affect difficulty and price. Fenced yards, slopes, and obstacles all add time.
form.addRow(row => {
row.addCheckboxList('propertyFeatures', {
label: 'Property Features',
options: [
{ id: 'fenced', name: 'Fenced Yard' },
{ id: 'hills', name: 'Hills / Slopes' },
{ id: 'obstacles', name: 'Many Trees / Obstacles' },
{ id: 'dog', name: 'Dogs in Yard' },
{ id: 'gated', name: 'Gated Community' },
{ id: 'hoa', name: 'HOA Requirements' }
]
});
});These don't need to change the instant quote - but they help you prepare for assessment. A hilly, heavily-treed lot with dogs takes longer than a flat, open yard. You might adjust pricing after seeing the property.
Service Area and Routing
Lawn care is route-based. Efficiency comes from dense routes, not scattered one-offs. Consider your service area carefully.
See our address validation guide for implementing service area checks. You might offer lower prices in areas where you already have customers nearby.
Complete Example
Here's a working lawn care quote form covering the main service types:
export function lawnCareQuote(form: FormTs) {
form.setTitle(() => 'Lawn Care Quote');
// Service type
form.addRow(row => {
row.addDropdown('serviceType', {
label: 'What do you need?',
options: [
{ id: 'mowing', name: 'Lawn Mowing' },
{ id: 'full-service', name: 'Full Lawn Care' },
{ id: 'landscaping', name: 'Landscaping' },
{ id: 'cleanup', name: 'Seasonal Cleanup' }
],
isRequired: true
});
});
// Lot size
form.addRow(row => {
row.addDropdown('lotSize', {
label: 'Lot Size',
options: [
{ id: 'small', name: 'Small (under 5k sq ft)' },
{ id: 'medium', name: 'Medium (5-10k sq ft)' },
{ id: 'large', name: 'Large (10-20k sq ft)' },
{ id: 'xlarge', name: 'Very Large (20k+ sq ft)' }
],
isRequired: true
});
});
// Contact info
const contact = form.addSubform('contact', { title: 'Contact Information' });
contact.addRow(row => {
row.addTextbox('name', { label: 'Name', isRequired: true });
row.addTextbox('phone', { label: 'Phone', isRequired: true });
});
contact.addRow(row => {
row.addTextbox('address', { label: 'Service Address', isRequired: true });
});
form.configureSubmitButton({ label: 'Get Quote' });
}This handles the core flow: service type, lot size, and contact details. Add your specific pricing, service tiers, and property questions for a complete quote calculator.
Converting Mowing to Full Programs
The real opportunity is converting mowing customers to full programs:
- Show the savings - Program vs. a-la-carte for same services
- Offer trial - "Add fertilization for 3 months, see the difference"
- Seasonal upsell - Spring is perfect for "upgrade to full program"
- Quality difference - Show before/after of program lawns
A customer who starts at $200/month for mowing can become $400/month full program within a season. That's real growth.
Common Questions
Should I show lawn care prices online?
Yes - lawn care customers comparison shop heavily. Show per-visit and monthly pricing clearly. 'From $50/visit' or '$200/month for weekly service' attracts customers who value transparency. Hidden pricing makes you look like you're hiding something expensive.
How do I handle lots I haven't seen?
Online quotes should be 'starting at' prices. Reserve the right to adjust after seeing the property - steep hills, excessive obstacles, or access issues might add 10-20%. Most lots fall within your standard pricing; adjustments are the exception.
How do I price landscaping projects online?
Don't try to quote landscaping precisely online - scope varies too much. Instead, qualify leads: what services, rough budget, property size. Then schedule a consultation. The form's job is to capture qualified leads, not replace site visits.
Should I offer different prices for different neighborhoods?
Consider route-based pricing: areas where you already have customers can be lower (efficient routing), while distant properties cost more. This is easier to explain than neighborhood-based pricing and rewards customer density.
What about seasonal pricing changes?
Some companies charge more during peak season (spring/early summer) and less in off-peak. If you do this, be transparent. Alternatively, offer discounts for signing annual contracts during off-peak seasons - locks in customers before competition heats up.