Industry Guide

Pest Control Quote Form: Capture Service Requests That Convert

February 2026 · 11 min read

Someone sees a roach in their kitchen. They grab their phone and Google "pest control near me." They click five websites, fill out the form on two of them, and hire whoever calls back first. That's how fast this business moves. If your form is slow or confusing, you lose.

A good pest control form does three things: identifies the problem, qualifies the lead, and sets expectations on pricing. By the time someone submits, you know what pest, how bad, and what it'll roughly cost. Your callback is "Hi, I see you've got ants in your kitchen, we can treat that tomorrow for around $200" - not "So what seems to be the problem?"

We'll build a form that handles everything from routine ant problems to emergency bed bug infestations, with conditional questions for specific pests and real-time estimates that set pricing expectations.

What's the Problem?

Start with pest identification. This determines everything: treatment method, pricing, urgency, and follow-up questions.

const pestSection = form.addSubform('pest', {
    title: 'What\'s the Problem?'
});

pestSection.addRow(row => {
    row.addChips('pestTypes', {
        label: 'What pests are you dealing with?',
        options: [
            { id: 'ants', name: 'Ants' },
            { id: 'roaches', name: 'Cockroaches' },
            { id: 'spiders', name: 'Spiders' },
            { id: 'mice', name: 'Mice' },
            { id: 'rats', name: 'Rats' },
            { id: 'termites', name: 'Termites' },
            { id: 'bed-bugs', name: 'Bed Bugs' },
            { id: 'wasps', name: 'Wasps/Hornets' },
            { id: 'mosquitoes', name: 'Mosquitoes' },
            { id: 'fleas', name: 'Fleas/Ticks' },
            { id: 'wildlife', name: 'Wildlife (raccoons, squirrels)' },
            { id: 'other', name: 'Other/Not Sure' }
        ],
        isRequired: true
    });
});

pestSection.addRow(row => {
    row.addTextbox('otherPest', {
        label: 'Please describe',
        isVisible: () => (pestTypes.value() ?? []).includes('other'),
        placeholder: 'What are you seeing?'
    });
});

Chips work well here because multiple pests aren't uncommon. Someone might have ants AND spiders. Knowing both helps you quote accurately and offer comprehensive treatment.

Severity and Details

pestSection.addRow(row => {
    row.addRadioButton('severity', {
        label: 'How severe is the problem?',
        options: [
            { id: 'occasional', name: 'Occasional sighting' },
            { id: 'regular', name: 'Seeing them regularly' },
            { id: 'infestation', name: 'Full infestation' },
            { id: 'unsure', name: 'Not sure' }
        ],
        orientation: 'vertical'
    });
});

pestSection.addRow(row => {
    row.addDropdown('duration', {
        label: 'How long have you noticed the problem?',
        options: [
            { id: 'just-now', name: 'Just noticed today' },
            { id: 'days', name: 'A few days' },
            { id: 'weeks', name: '1-2 weeks' },
            { id: 'month', name: 'About a month' },
            { id: 'months', name: 'Several months' },
            { id: 'ongoing', name: 'Ongoing/recurring issue' }
        ]
    });
});

pestSection.addRow(row => {
    row.addTextbox('whereSpotted', {
        label: 'Where are you seeing them?',
        placeholder: 'e.g., kitchen, basement, bedroom, attic, yard...'
    });
});

Severity affects urgency and pricing. "Occasional sighting" is routine. "Full infestation" might need multiple treatments and emergency scheduling. Knowing how long they've had the problem tells you if it's likely to be entrenched.

Location matters for treatment. Kitchen pests need different approaches than attic wildlife. Basement moisture issues often correlate with certain pest types.

Pro tip

"Not sure" is a valid answer for pest identification. Some people genuinely don't know what they're seeing. That's fine - it just means your tech needs to identify the pest during inspection.

Property Information

Property details affect both pricing and treatment approach. A 4,000 square foot home costs more to treat than a studio apartment.

const propertySection = form.addSubform('property', {
    title: 'Property Information'
});

propertySection.addRow(row => {
    row.addDropdown('propertyType', {
        label: 'Property Type',
        options: [
            { id: 'house', name: 'Single Family Home' },
            { id: 'townhouse', name: 'Townhouse' },
            { id: 'apartment', name: 'Apartment/Condo' },
            { id: 'mobile', name: 'Mobile Home' },
            { id: 'commercial', name: 'Commercial Building' },
            { id: 'restaurant', name: 'Restaurant/Food Service' },
            { id: 'warehouse', name: 'Warehouse/Industrial' }
        ],
        isRequired: true
    });
});

propertySection.addRow(row => {
    row.addDropdown('sqft', {
        label: 'Approximate Size',
        options: [
            { id: 'under-1000', name: 'Under 1,000 sq ft' },
            { id: '1000-2000', name: '1,000 - 2,000 sq ft' },
            { id: '2000-3000', name: '2,000 - 3,000 sq ft' },
            { id: '3000-4000', name: '3,000 - 4,000 sq ft' },
            { id: '4000+', name: '4,000+ sq ft' }
        ]
    });
    row.addDropdown('stories', {
        label: 'Number of Stories',
        options: [
            { id: '1', name: '1 story' },
            { id: '2', name: '2 stories' },
            { id: '3+', name: '3+ stories' }
        ]
    });
});

propertySection.addRow(row => {
    row.addAddress('address', {
        label: 'Service Address',
        isRequired: true
    });
});

Commercial properties often need different licensing, treatment schedules, and documentation. Restaurants have health code requirements. Knowing property type upfront routes leads appropriately.

Service Type

Some people want a one-time fix. Others want ongoing protection. Knowing which helps you price and pitch appropriately.

const serviceSection = form.addSubform('service', {
    title: 'Service Needed'
});

serviceSection.addRow(row => {
    row.addRadioButton('serviceType', {
        label: 'What type of service do you need?',
        options: [
            { id: 'one-time', name: 'One-time treatment' },
            { id: 'ongoing', name: 'Ongoing protection plan' },
            { id: 'inspection', name: 'Inspection only' },
            { id: 'not-sure', name: 'Not sure - need recommendation' }
        ],
        orientation: 'vertical'
    });
});

// Show plan options for ongoing service
serviceSection.addRow(row => {
    row.addDropdown('planFrequency', {
        label: 'Preferred Service Frequency',
        options: [
            { id: 'monthly', name: 'Monthly' },
            { id: 'bimonthly', name: 'Every 2 months' },
            { id: 'quarterly', name: 'Quarterly' },
            { id: 'recommend', name: 'Let me recommend' }
        ],
        isVisible: () => serviceType.value() === 'ongoing'
    });
});

Ongoing plans are your bread and butter - recurring revenue with predictable scheduling. If someone indicates interest, that's a higher-value lead worth prioritizing.

Pest-Specific Questions

Some pests need additional detail. Termites and bed bugs are complex enough to warrant their own sections.

Termite Details

// Termite-specific questions
const termiteSection = form.addSubform('termite', {
    title: 'Termite Details',
    isVisible: () => (pestTypes.value() ?? []).includes('termites')
});

termiteSection.addRow(row => {
    row.addChips('termiteSigns', {
        label: 'What signs have you noticed?',
        options: [
            { id: 'swarmers', name: 'Flying termites/swarmers' },
            { id: 'wings', name: 'Discarded wings' },
            { id: 'tubes', name: 'Mud tubes on walls' },
            { id: 'damage', name: 'Wood damage' },
            { id: 'droppings', name: 'Termite droppings (frass)' },
            { id: 'hollow', name: 'Hollow-sounding wood' }
        ]
    });
});

termiteSection.addRow(row => {
    row.addRadioButton('previousTreatment', {
        label: 'Has the property been treated for termites before?',
        options: [
            { id: 'yes', name: 'Yes' },
            { id: 'no', name: 'No' },
            { id: 'unsure', name: 'Not sure' }
        ],
        orientation: 'horizontal'
    });
});

termiteSection.addRow(row => {
    row.addRadioButton('needInspection', {
        label: 'Do you need an official termite inspection letter?',
        helpText: 'Often required for real estate transactions',
        options: [
            { id: 'yes', name: 'Yes' },
            { id: 'no', name: 'No' },
            { id: 'maybe', name: 'Maybe - tell me more' }
        ],
        orientation: 'horizontal'
    });
});

Termite inspections for real estate transactions are a different service than treatment. Asking upfront ensures you send the right tech with the right paperwork.

Bed Bug Details

// Bed bug specific questions
const bedBugSection = form.addSubform('bedBug', {
    title: 'Bed Bug Details',
    isVisible: () => (pestTypes.value() ?? []).includes('bed-bugs')
});

bedBugSection.addRow(row => {
    row.addChips('affectedAreas', {
        label: 'Which rooms are affected?',
        options: [
            { id: 'master', name: 'Master Bedroom' },
            { id: 'bedroom', name: 'Other Bedrooms' },
            { id: 'living', name: 'Living Room' },
            { id: 'multiple', name: 'Multiple Rooms' },
            { id: 'whole', name: 'Entire Home' }
        ]
    });
});

bedBugSection.addRow(row => {
    row.addRadioButton('bites', {
        label: 'Has anyone been getting bites?',
        options: [
            { id: 'yes', name: 'Yes' },
            { id: 'no', name: 'No' },
            { id: 'unsure', name: 'Not sure' }
        ],
        orientation: 'horizontal'
    });
});

bedBugSection.addRow(row => {
    row.addDropdown('howAcquired', {
        label: 'Any idea how they might have arrived?',
        options: [
            { id: 'travel', name: 'Recent travel' },
            { id: 'furniture', name: 'Used furniture' },
            { id: 'neighbors', name: 'Neighbors have them' },
            { id: 'guests', name: 'Recent guests' },
            { id: 'unknown', name: 'No idea' }
        ]
    });
});

Bed bugs are emotional. People are stressed, embarrassed, and desperate. The form should be matter-of-fact and non-judgmental. Knowing the scope (one room vs. whole home) dramatically affects pricing.

See more service quote examples in our gallery.

Urgency and Preferences

How quickly do they need service? And are there any treatment constraints?

const urgencySection = form.addSubform('urgency', {
    title: 'Timeline & Preferences'
});

urgencySection.addRow(row => {
    row.addRadioButton('urgency', {
        label: 'How soon do you need service?',
        options: [
            { id: 'emergency', name: 'Emergency - today/tomorrow' },
            { id: 'soon', name: 'Within a few days' },
            { id: 'week', name: 'This week' },
            { id: 'flexible', name: 'Flexible - just getting quotes' }
        ],
        orientation: 'vertical'
    });
});

urgencySection.addRow(row => {
    row.addCheckbox('pets', {
        label: 'Do you have pets?',
        helpText: 'Important for selecting pet-safe treatment options'
    });
    row.addCheckbox('children', {
        label: 'Young children in the home?',
        helpText: 'We use child-safe products when needed'
    });
});

urgencySection.addRow(row => {
    row.addRadioButton('preferences', {
        label: 'Treatment preferences',
        options: [
            { id: 'any', name: 'Whatever works best' },
            { id: 'eco', name: 'Prefer eco-friendly/organic options' },
            { id: 'low-odor', name: 'Prefer low-odor products' }
        ],
        orientation: 'vertical'
    });
});

Pets and children affect product selection. Many customers specifically want pet-safe or eco-friendly options. Knowing this upfront prevents the awkward conversation when your tech shows up with standard chemicals.

Emergency requests deserve fast callbacks. "Flexible - just getting quotes" can wait. Route appropriately.

Showing an Estimate

Real-time pricing estimates set expectations and qualify leads. Someone who sees "$500-1500" for bed bugs and continues is mentally prepared for that cost. Someone who expected $50 will self-select out.

// Show rough estimate based on selections
const estimateSection = form.addSubform('estimate', {
    title: 'Estimated Cost'
});

const calculateEstimate = () => {
    const pests = pestTypes.value() ?? [];
    const size = sqft.value();
    const service = serviceType.value();

    // Base prices by pest type
    const prices: Record<string, [number, number]> = {
        'ants': [150, 300],
        'roaches': [150, 350],
        'spiders': [100, 250],
        'mice': [200, 400],
        'rats': [250, 500],
        'termites': [500, 2500],
        'bed-bugs': [500, 1500],
        'wasps': [150, 350],
        'mosquitoes': [100, 300],
        'fleas': [200, 400],
        'wildlife': [300, 600]
    };

    let low = 0, high = 0;
    for (const pest of pests) {
        const [l, h] = prices[pest] ?? [100, 300];
        low += l;
        high += h;
    }

    // Size adjustment
    if (size === '3000-4000' || size === '4000+') {
        low *= 1.25;
        high *= 1.25;
    }

    return { low: Math.round(low), high: Math.round(high) };
};

estimateSection.addRow(row => {
    row.addTextPanel('estimate', {
        computedValue: () => {
            const pests = pestTypes.value() ?? [];
            if (pests.length === 0) return 'Select pest type above for estimate.';

            const { low, high } = calculateEstimate();
            const service = serviceType.value();

            let text = `Estimated range: $${low} - $${high}`;
            if (service === 'ongoing') {
                text += '\n\nOngoing plans typically save 20-30% vs. one-time treatments.';
            }
            text += '\n\nFinal price depends on inspection findings.';
            return text;
        },
        variant: 'info'
    });
});

The disclaimer about final price depending on inspection protects you. Estimates are ranges, not commitments. But giving a range builds trust and reduces sticker shock on the callback.

Contact Information

Get their contact info last, after they've told you everything about their pest problem.

const contactSection = form.addSubform('contact', {
    title: 'Your Information'
});

contactSection.addRow(row => {
    row.addTextbox('name', {
        label: 'Your Name',
        isRequired: true
    });
    row.addPhone('phone', {
        label: 'Phone Number',
        isRequired: true
    });
});

contactSection.addRow(row => {
    row.addEmail('email', {
        label: 'Email',
        isRequired: true
    });
});

contactSection.addRow(row => {
    row.addDropdown('preferredContact', {
        label: 'Best Way to Reach You',
        options: [
            { id: 'call', name: 'Phone Call' },
            { id: 'text', name: 'Text Message' },
            { id: 'email', name: 'Email' }
        ],
        defaultValue: 'call'
    });
    row.addDropdown('preferredTime', {
        label: 'Best Time to Call',
        options: [
            { id: 'morning', name: 'Morning' },
            { id: 'afternoon', name: 'Afternoon' },
            { id: 'evening', name: 'Evening' },
            { id: 'anytime', name: 'Anytime' }
        ]
    });
});

Contact preferences matter. Someone who wants a text won't answer a phone call. Someone who says "call anytime" is probably desperate and should be prioritized.

Response Time Wins

In pest control, speed kills (the competition, not the pests). The company that responds first usually wins the job. Your form should:

Send instant notifications. The moment someone submits, your phone should buzz. Email is too slow.

Include all details. The notification should have pest type, severity, address, and phone number. You should be able to call back without logging into anything.

Route by urgency. Emergency requests need immediate callback. "Just getting quotes" can go to the queue.

Consider auto-response. Immediate text: "Thanks for contacting [Company]. We received your request about [pest type] and will call within 15 minutes." This buys you time and confirms receipt.

Common Mistakes

Too many required fields. Someone with roaches doesn't want to fill out 30 fields. Get pest type, address, and phone number. Everything else is nice-to-have.

No mobile optimization. Most pest control searches happen on phones. If your form requires pinching and zooming, you lose.

Hidden pricing. People hate surprises. A rough estimate range builds trust. "We can't quote without inspection" feels like a trap.

Slow response. If you can't call back within 30 minutes during business hours, you're losing to competitors who can. Staff accordingly.

Common Questions

Should I show exact prices or ranges?

Ranges are safer. '$150-300 for ant treatment' accounts for variables like property size and severity. Exact prices can backfire when the tech arrives and finds more work than expected. Ranges set expectations while leaving room for accurate on-site quotes.

How do I handle commercial vs residential leads?

Route them differently. Commercial accounts have different pricing, contracts, and compliance requirements. Use conditional logic to show relevant questions for each. Commercial often needs business name, contact person, and whether they need pest control logs for health inspections.

Should I ask for photos?

Optional photo upload can help but shouldn't be required. Someone frantically Googling at 11pm might not want to photograph bugs. But if they do upload, a photo of termite damage or mouse droppings helps your tech prepare.

What about after-hours requests?

Set expectations. If you don't offer 24/7 service, say so clearly. 'We'll respond first thing tomorrow morning' is better than silence. For true emergencies (like wasp nest near a kid's bedroom), consider an answering service that can dispatch.

Ready to Build Your Pest Control Quote Form?

Start converting website visitors into booked service calls.