Industry Guide

Pool Cleaning & Maintenance Quote Form

January 2026 · 11 min read

Summer is coming. A homeowner's pool is turning green. They search "pool cleaning near me" and find three companies. One says "call for estimate." One has a generic contact form. Yours asks about their pool size, shows monthly pricing, and offers green pool recovery. Who gets the job?

Pool service is recurring revenue - the holy grail of service businesses. One customer can mean years of weekly visits. A quote form that captures pool details, shows transparent pricing, and offers multiple service levels converts visitors into long-term customers.

This guide covers building quote forms for pool services: recurring maintenance, one-time cleaning, seasonal opening/closing, and equipment repair. Each has different pricing models and information needs.

Service Type Selection

Start by understanding what they need. The rest of the form - and the pricing - adapts based on this choice.

form.addRow(row => {
  row.addDropdown('serviceType', {
    label: 'What do you need?',
    options: [
      { id: 'recurring', name: 'Weekly Maintenance Service' },
      { id: 'one-time', name: 'One-Time Cleaning' },
      { id: 'opening', name: 'Pool Opening (Spring)' },
      { id: 'closing', name: 'Pool Closing (Winterization)' },
      { id: 'repair', name: 'Equipment Repair' },
      { id: 'green-clean', name: 'Green Pool Recovery' }
    ],
    isRequired: true
  });
});

Six categories cover most pool service work. Recurring maintenance is your bread and butter. Green pool recovery is a common one-time need that often converts to recurring service once the pool is clean.

Pool Type and Surface

In-ground vs. above-ground, and surface type, affect both service approach and pricing. Vinyl liners need different care than plaster.

form.addRow(row => {
  row.addRadioButton('poolType', {
    label: 'Pool Type',
    options: [
      { id: 'inground', name: 'In-Ground Pool' },
      { id: 'above-ground', name: 'Above-Ground Pool' }
    ],
    defaultValue: 'inground',
    isRequired: true
  });
});

form.addRow(row => {
  row.addRadioButton('poolSurface', {
    label: 'Pool Surface',
    options: [
      { id: 'plaster', name: 'Plaster / Concrete' },
      { id: 'vinyl', name: 'Vinyl Liner' },
      { id: 'fiberglass', name: 'Fiberglass' },
      { id: 'tile', name: 'Tile' },
      { id: 'unknown', name: 'Not sure' }
    ],
    defaultValue: 'unknown',
    isVisible: () => form.radioButton('poolType')?.value() === 'inground'
  });
});

Above-ground pools are typically smaller and simpler. In-ground pools vary more in size and complexity. Surface type matters for chemical balance and cleaning approach - fiberglass has different needs than plaster.

Pro tip

Most homeowners with above-ground pools know their pool type. But many in-ground pool owners don't know if they have plaster vs. pebble finish. "Not sure" should always be an option.

Pool Size

Size is the primary pricing factor. Larger pools need more chemicals, more time, and more work.

form.addRow(row => {
  row.addDropdown('poolSize', {
    label: 'Pool Size (gallons)',
    options: [
      { id: 'small', name: 'Small (up to 15,000 gal)' },
      { id: 'medium', name: 'Medium (15,000 - 25,000 gal)' },
      { id: 'large', name: 'Large (25,000 - 40,000 gal)' },
      { id: 'xlarge', name: 'Extra Large (40,000+ gal)' },
      { id: 'unknown', name: 'Not sure' }
    ],
    defaultValue: 'unknown',
    tooltip: 'Typical residential pool is 15,000-20,000 gallons',
    isRequired: true
  });
});

Most homeowners don't know their pool's gallon capacity. The help text gives context - "typical residential pool is 15,000-20,000 gallons." Ranges are easier to answer than exact numbers.

Pool Features

Features add complexity and time. An attached spa, water features, or automatic covers all affect service scope and pricing.

form.addRow(row => {
  row.addCheckboxList('features', {
    label: 'Pool Features (select all that apply)',
    options: [
      { id: 'spa', name: 'Attached Spa / Hot Tub' },
      { id: 'waterfall', name: 'Waterfall / Water Feature' },
      { id: 'slide', name: 'Pool Slide' },
      { id: 'diving-board', name: 'Diving Board' },
      { id: 'solar-cover', name: 'Solar Cover' },
      { id: 'auto-cover', name: 'Automatic Cover' },
      { id: 'heater', name: 'Pool Heater' },
      { id: 'salt', name: 'Salt System' },
      { id: 'screen', name: 'Screen Enclosure' }
    ]
  });
});

Attached spas essentially double the water treatment. Salt systems need cell inspection. Screen enclosures reduce debris but add access time. Each feature tells you more about the service requirements.

Recurring Service Options

For weekly maintenance, offer clear service tiers. Each level should have distinct value that justifies the price difference.

const recurringSection = form.addSubform('recurringOptions', {
  title: 'Service Options',
  isVisible: () => form.dropdown('serviceType')?.value() === 'recurring'
});

recurringSection.addRow(row => {
  row.addRadioButton('serviceLevel', {
    label: 'Service Level',
    options: [
      { id: 'basic', name: 'Basic - Chemical balance & skim' },
      { id: 'standard', name: 'Standard - Basic + vacuum & brush' },
      { id: 'premium', name: 'Premium - Full service + filter clean' }
    ],
    defaultValue: 'standard'
  });
});

recurringSection.addRow(row => {
  row.addRadioButton('frequency', {
    label: 'Frequency',
    options: [
      { id: 'weekly', name: 'Weekly' },
      { id: 'biweekly', name: 'Every 2 Weeks' },
      { id: 'monthly', name: 'Monthly (chemical check only)' }
    ],
    defaultValue: 'weekly'
  });
});

Three tiers work well: basic (essentials only), standard (most popular), and premium (everything). Biweekly is common for light-use pools or budget-conscious customers. Monthly is really just chemical monitoring.

Recurring Service Pricing

Show monthly pricing based on service level, pool size, and frequency. Transparent pricing converts better than "call for quote."

const servicePrices: Record<string, Record<string, number>> = {
  basic: { small: 80, medium: 95, large: 110, xlarge: 130 },
  standard: { small: 110, medium: 130, large: 150, xlarge: 175 },
  premium: { small: 150, medium: 175, large: 200, xlarge: 240 }
};

const frequencyMultiplier: Record<string, number> = {
  weekly: 1,
  biweekly: 0.6,
  monthly: 0.35
};

form.addRow(row => {
  row.addPriceDisplay('monthlyPrice', {
    label: 'Monthly Estimate',
    prefix: 'From',
    suffix: '/month',
    computedValue: () => {
      const service = form.dropdown('serviceType')?.value();
      if (service !== 'recurring') return null;

      const level = form.radioButton('serviceLevel')?.value() || 'standard';
      const size = form.dropdown('poolSize')?.value() || 'medium';
      const freq = form.radioButton('frequency')?.value() || 'weekly';

      if (!servicePrices[level] || !servicePrices[level][size]) return null;

      const basePrice = servicePrices[level][size];
      const multiplier = frequencyMultiplier[freq] || 1;
      const visitsPerMonth = freq === 'weekly' ? 4 : freq === 'biweekly' ? 2 : 1;

      return Math.round(basePrice * visitsPerMonth * multiplier);
    },
    isVisible: () => form.dropdown('serviceType')?.value() === 'recurring'
  });
});

The calculation shows a monthly estimate based on all factors. Weekly service at standard level for a medium pool might be $520/month. Biweekly basic for a small pool might be $192/month. Let customers see how their choices affect price.

See more service calculators with recurring pricing.

One-Time Service Pricing

One-time cleaning, pool opening, and closing have fixed-ish prices based on pool size.

const oneTimePrices: Record<string, Record<string, number>> = {
  'one-time': { small: 150, medium: 175, large: 200, xlarge: 250 },
  'opening': { small: 200, medium: 250, large: 300, xlarge: 375 },
  'closing': { small: 225, medium: 275, large: 325, xlarge: 400 },
  'green-clean': { small: 350, medium: 450, large: 550, xlarge: 700 }
};

form.addRow(row => {
  row.addPriceDisplay('oneTimePrice', {
    label: 'Estimated Price',
    prefix: 'Starting at',
    computedValue: () => {
      const service = form.dropdown('serviceType')?.value();
      const size = form.dropdown('poolSize')?.value() || 'medium';

      if (!service || !oneTimePrices[service]) return null;
      return oneTimePrices[service][size];
    },
    isVisible: () => {
      const service = form.dropdown('serviceType')?.value();
      return service && oneTimePrices[service];
    }
  });
});

Pool opening and closing are seasonal services with predictable scope. Green pool recovery costs more because it requires more chemicals and multiple visits. "Starting at" language leaves room for complications.

Green Pool Recovery

Green pools need special handling. The severity affects both price and timeline significantly.

const greenSection = form.addSubform('greenPool', {
  title: 'Pool Condition',
  isVisible: () => form.dropdown('serviceType')?.value() === 'green-clean'
});

greenSection.addRow(row => {
  row.addRadioButton('greenLevel', {
    label: 'How green is the pool?',
    options: [
      { id: 'light', name: 'Light green - can still see bottom' },
      { id: 'medium', name: 'Medium green - murky, can\'t see bottom' },
      { id: 'dark', name: 'Dark green / black - swamp-like' }
    ],
    defaultValue: 'medium'
  });
});

greenSection.addRow(row => {
  row.addTextPanel('greenNote', {
    computedValue: () => {
      const level = form.radioButton('greenLevel')?.value();
      if (level === 'dark') {
        return 'Severe algae may require multiple treatments over 1-2 weeks. Final price depends on chemical needs.';
      }
      return 'Most green pools can be recovered within 3-5 days.';
    }
  });
});

A light green pool might clear in 2-3 days. A black swamp needs a week or more of treatment. Setting expectations upfront - both for time and cost - prevents unhappy customers who expected a one-day fix.

Equipment Repair

Equipment repair is harder to quote - you need to diagnose first. But knowing which equipment helps you prepare.

const equipmentSection = form.addSubform('equipment', {
  title: 'Equipment Information',
  isVisible: () => form.dropdown('serviceType')?.value() === 'repair'
});

equipmentSection.addRow(row => {
  row.addCheckboxList('equipmentIssue', {
    label: 'What needs attention?',
    options: [
      { id: 'pump', name: 'Pump not working / loud' },
      { id: 'filter', name: 'Filter issue' },
      { id: 'heater', name: 'Heater not heating' },
      { id: 'salt-cell', name: 'Salt cell / chlorinator' },
      { id: 'cleaner', name: 'Automatic cleaner' },
      { id: 'lights', name: 'Pool lights' },
      { id: 'leak', name: 'Suspected leak' },
      { id: 'other', name: 'Other equipment' }
    ]
  });
});

equipmentSection.addRow(row => {
  row.addTextarea('equipmentDescription', {
    label: 'Describe the problem',
    placeholder: 'When did it start? Any error codes?',
    rows: 3
  });
});

Pump issues are different from heater issues. "Suspected leak" is a major red flag that might need leak detection specialists. The description field captures context that helps with diagnosis.

Seasonal Considerations

Pool service is highly seasonal in many markets:

  • Spring - Pool openings surge. Book early messaging helps.
  • Summer - Peak maintenance season. Green pool emergencies.
  • Fall - Closing season. Winterization specials.
  • Winter - Off-season in cold climates. Year-round in warm ones.

Consider showing different messaging or promotions based on the current season. "Book your pool opening now" converts better in February than May.

Complete Example

Here's a working pool service quote form covering the main service types:

export function poolServiceQuote(form: FormTs) {
  form.setTitle(() => 'Pool Service Request');

  // Service type
  form.addRow(row => {
    row.addDropdown('serviceType', {
      label: 'What do you need?',
      options: [
        { id: 'recurring', name: 'Weekly Maintenance' },
        { id: 'one-time', name: 'One-Time Cleaning' },
        { id: 'opening', name: 'Pool Opening' },
        { id: 'closing', name: 'Pool Closing' },
        { id: 'repair', name: 'Equipment Repair' }
      ],
      isRequired: true
    });
  });

  // Pool size
  form.addRow(row => {
    row.addDropdown('poolSize', {
      label: 'Pool Size',
      options: [
        { id: 'small', name: 'Small (under 15k gal)' },
        { id: 'medium', name: 'Medium (15-25k gal)' },
        { id: 'large', name: 'Large (25k+ gal)' }
      ],
      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, pool size, and contact details. Add your specific pricing, service tiers, and you have a working quote calculator.

Converting to Recurring

The real goal is recurring service contracts. Your form can help:

  • Show monthly savings - Compare per-visit one-time vs. weekly contract
  • Highlight benefits - "Guaranteed clean pool all season"
  • Offer trial - "First month at one-time rates"
  • Follow up - After any one-time service, offer recurring

A green pool cleanup that becomes a weekly maintenance contract is worth thousands over the lifetime of the relationship.

Common Questions

Should I show pool service prices online?

Yes - pool owners are comparison shopping and want to know what service costs. Show monthly rates for recurring service and starting prices for one-time work. Transparent pricing builds trust and attracts customers who value professionalism over cheapest-bid hunting.

How do I handle pools I haven't seen?

Use 'starting at' or 'estimated' language and reserve the right to adjust after the first visit. Most pools fall within your standard pricing, but some have issues (heavy debris, poor equipment) that need adjustment. Set expectations that the quote may change after assessment.

Should I charge for chemicals separately?

Either works - all-inclusive is simpler for customers, separate chemical charges reflect actual costs. If separate, estimate monthly chemical cost in your pricing. 'Service: $400/month + chemicals (typically $50-100)' is clearer than finding out later.

What fields should be required?

Require: service type, pool size, contact info. Optional: pool type, features, specific issues. You need enough to give a ballpark quote and make contact. Details can be gathered at the first visit or in follow-up. Don't let perfect information prevent a lead.

How do I handle service area for pool routes?

Pool service is route-based - efficiency matters. Consider showing different pricing for different zones, or asking for zip code early to confirm you service the area. A pool 30 minutes from your route costs more than one on the way.

Ready to Build Your Pool Service Quote Form?

Start capturing recurring revenue with size-based pricing.