Industry Guide

Real Estate Lead Capture Form: Convert Website Visitors into Clients

February 2026 · 12 min read

Most real estate websites have a contact form that asks for name, email, and "message." Then agents spend hours chasing leads who aren't serious, can't qualify for a mortgage, or are just browsing Zillow for fun. There's a better way.

The right lead form does the qualifying for you. Before you pick up the phone, you already know if someone is pre-approved, what their budget is, and how soon they want to move. The tire-kickers filter themselves out because they don't want to answer serious questions. The real buyers and sellers stick around.

We'll build a form that handles all sides of real estate: buyers, sellers, renters, and investors. Each path collects different information, but they all end with qualified leads you can actually close.

Start with Intent

The first question should be obvious: what does this person want? Buy, sell, rent, or invest. This single choice determines everything that follows.

const leadSection = form.addSubform('lead', {
    title: 'Tell Us About Your Search'
});

leadSection.addRow(row => {
    row.addRadioButton('leadType', {
        label: 'I want to...',
        options: [
            { id: 'buy', name: 'Buy a Property' },
            { id: 'sell', name: 'Sell My Property' },
            { id: 'rent', name: 'Rent a Property' },
            { id: 'invest', name: 'Invest in Real Estate' }
        ],
        orientation: 'horizontal',
        isRequired: true
    });
});

Horizontal radio buttons work well here because there are only four options. The visual weight is equal - you're not pushing people toward buying when they want to sell.

Qualifying Buyers

A buyer lead is only as good as their ability to actually buy. The two things you need to know immediately: what they're looking for, and whether they can afford it.

Property Preferences

const buyerSection = form.addSubform('buyer', {
    title: 'Buyer Details',
    isVisible: () => leadType.value() === 'buy'
});

buyerSection.addRow(row => {
    row.addDropdown('propertyType', {
        label: 'Property Type',
        options: [
            { id: 'single-family', name: 'Single Family Home' },
            { id: 'condo', name: 'Condo/Apartment' },
            { id: 'townhouse', name: 'Townhouse' },
            { id: 'multi-family', name: 'Multi-Family' },
            { id: 'land', name: 'Land/Lot' }
        ],
        isRequired: () => leadType.value() === 'buy'
    });
    row.addDropdown('bedrooms', {
        label: 'Bedrooms',
        options: [
            { id: '1', name: '1+' },
            { id: '2', name: '2+' },
            { id: '3', name: '3+' },
            { id: '4', name: '4+' },
            { id: '5', name: '5+' }
        ]
    });
});

buyerSection.addRow(row => {
    row.addSlider('budget', {
        label: 'Maximum Budget',
        min: 100000,
        max: 2000000,
        step: 50000,
        defaultValue: 500000,
        displayFormat: (val) => '$' + val.toLocaleString()
    });
});

The slider for budget is more honest than a text field. People will type "$500,000" but they mean "somewhere around half a million, maybe more if it's perfect." A slider with defined steps sets clear expectations.

Pre-Approval Status

This is where the real qualification happens. A pre-approved buyer is worth ten times a "just looking" inquiry.

buyerSection.addRow(row => {
    row.addRadioButton('preApproval', {
        label: 'Are you pre-approved for a mortgage?',
        options: [
            { id: 'yes', name: 'Yes, I have pre-approval' },
            { id: 'no', name: 'No, not yet' },
            { id: 'cash', name: 'I'm paying cash' }
        ],
        orientation: 'vertical'
    });
});

buyerSection.addRow(row => {
    row.addTextbox('lender', {
        label: 'Lender Name',
        placeholder: 'Who provided your pre-approval?',
        isVisible: () => preApproval.value() === 'yes'
    });
    row.addMoney('approvedAmount', {
        label: 'Approved Amount',
        currency: '$',
        isVisible: () => preApproval.value() === 'yes'
    });
});

Notice the conditional fields for lender details. If someone says they're pre-approved, you want to know where. This also catches the people who think "pre-qualified" means "pre-approved" - when they can't name a lender, you know to follow up about getting real approval first.

Pro tip

Cash buyers get special treatment. They can close faster, skip financing contingencies, and often win bidding wars. Your form should flag these leads for priority follow-up.

Location Preferences

Neighborhood preferences matter as much as budget. Someone who wants walkable downtown living won't be happy in the suburbs, no matter how nice the house.

const locationSection = form.addSubform('location', {
    title: 'Location Preferences',
    isVisible: () => leadType.value() === 'buy' || leadType.value() === 'rent'
});

locationSection.addRow(row => {
    row.addChips('neighborhoods', {
        label: 'Preferred Neighborhoods',
        options: [
            { id: 'downtown', name: 'Downtown' },
            { id: 'suburbs', name: 'Suburbs' },
            { id: 'waterfront', name: 'Waterfront' },
            { id: 'school-district', name: 'Good School District' },
            { id: 'quiet', name: 'Quiet Area' },
            { id: 'walkable', name: 'Walkable' }
        ],
        maxSelections: 3
    });
});

locationSection.addRow(row => {
    row.addTextbox('specificAreas', {
        label: 'Specific Areas or Zip Codes',
        placeholder: 'e.g., 90210, Beverly Hills, Westside',
        multiline: true
    });
});

Chips work well for this because preferences aren't mutually exclusive. Someone might want "good schools" and "quiet area" - those aren't competing requirements. Limiting to 3 selections keeps leads focused.

Qualifying Sellers

Seller leads have different priorities. You need to know what they're selling, what condition it's in, and how urgently they need to sell.

const sellerSection = form.addSubform('seller', {
    title: 'Property Details',
    isVisible: () => leadType.value() === 'sell'
});

sellerSection.addRow(row => {
    row.addAddress('propertyAddress', {
        label: 'Property Address',
        placeholder: 'Enter your property address',
        isRequired: () => leadType.value() === 'sell'
    });
});

sellerSection.addRow(row => {
    row.addDropdown('propertyCondition', {
        label: 'Property Condition',
        options: [
            { id: 'excellent', name: 'Excellent - Move-in Ready' },
            { id: 'good', name: 'Good - Minor Updates Needed' },
            { id: 'fair', name: 'Fair - Needs Renovation' },
            { id: 'poor', name: 'Poor - Major Repairs Needed' }
        ]
    });
    row.addDropdown('timeline', {
        label: 'Selling Timeline',
        options: [
            { id: 'asap', name: 'As soon as possible' },
            { id: '1-3', name: '1-3 months' },
            { id: '3-6', name: '3-6 months' },
            { id: '6+', name: '6+ months' },
            { id: 'exploring', name: 'Just exploring options' }
        ]
    });
});

Property condition is a sensitive question. Most sellers overestimate their home's condition, but the dropdown options are diplomatic. "Minor updates needed" sounds better than "dated kitchen" - but you get the same information.

Timeline tells you everything about urgency. "As soon as possible" might mean job relocation, divorce, or financial pressure - all high-motivation sellers. "Just exploring options" means they'll list in six months if prices go up.

Investor Leads

Real estate investors think differently than homebuyers. They care about ROI, not "the perfect kitchen." Your form should speak their language.

const investorSection = form.addSubform('investor', {
    title: 'Investment Goals',
    isVisible: () => leadType.value() === 'invest'
});

investorSection.addRow(row => {
    row.addChips('investmentType', {
        label: 'Investment Strategy',
        options: [
            { id: 'rental', name: 'Rental Income' },
            { id: 'flip', name: 'Fix & Flip' },
            { id: 'commercial', name: 'Commercial' },
            { id: 'vacation', name: 'Vacation Rental' },
            { id: 'development', name: 'Development' }
        ]
    });
});

investorSection.addRow(row => {
    row.addSlider('investmentBudget', {
        label: 'Investment Budget',
        min: 100000,
        max: 5000000,
        step: 100000,
        defaultValue: 500000,
        displayFormat: (val) => '$' + val.toLocaleString()
    });
});

investorSection.addRow(row => {
    row.addDropdown('experience', {
        label: 'Investment Experience',
        options: [
            { id: 'first', name: 'First-time investor' },
            { id: '1-3', name: '1-3 properties' },
            { id: '4-10', name: '4-10 properties' },
            { id: '10+', name: '10+ properties' }
        ]
    });
    row.addDropdown('financingMethod', {
        label: 'Financing Method',
        options: [
            { id: 'cash', name: 'All Cash' },
            { id: 'conventional', name: 'Conventional Loan' },
            { id: 'hard-money', name: 'Hard Money' },
            { id: 'private', name: 'Private Lending' }
        ]
    });
});

Investment experience matters. A first-time investor needs hand-holding and will ask a hundred questions. Someone with ten properties knows exactly what they want and will close fast if you find it.

Financing method is equally telling. Hard money borrowers are serious and ready to move - they're paying high interest rates to act fast. "All cash" investors are your best clients if you can find what they need.

Automatic Lead Scoring

Not all leads are equal. A pre-approved buyer looking to close in 30 days deserves a callback in minutes. Someone "just browsing" can wait.

// Lead scoring based on timeline and pre-approval
const leadScore = () => {
    let score = 0;

    // Timeline urgency
    const timeline = sellingTimeline.value() ?? buyingTimeline.value();
    if (timeline === 'asap' || timeline === 'immediate') score += 40;
    else if (timeline === '1-3') score += 30;
    else if (timeline === '3-6') score += 20;
    else score += 10;

    // Pre-approval status (buyers)
    if (leadType.value() === 'buy') {
        if (preApproval.value() === 'cash') score += 50;
        else if (preApproval.value() === 'yes') score += 40;
        else score += 10;
    }

    // Budget level
    if ((budget.value() ?? 0) > 1000000) score += 20;
    else if ((budget.value() ?? 0) > 500000) score += 15;

    return score;
};

// Display lead priority for internal use
form.addRow(row => {
    row.addTextPanel('leadPriority', {
        computedValue: () => {
            const score = leadScore();
            if (score >= 80) return '🔥 Hot Lead';
            if (score >= 50) return '✨ Warm Lead';
            return '📋 New Lead';
        },
        isVisible: false // Hidden from user, included in submission
    });
});

This scoring is hidden from users but included in your submission data. Route hot leads to your best agents. Send warm leads to your drip campaign. Put new leads in your newsletter until they're ready to act.

Pro tip

Lead scores aren't permanent. Someone who was "just exploring" six months ago might be ready to buy now. Your CRM should track score changes over time as leads engage with your content.

Contact Information

Save contact details for last. By now, serious leads are invested in the form. They've told you what they want, what they can afford, and when they need it. Asking for their phone number feels natural, not invasive.

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

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

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

contactSection.addRow(row => {
    row.addDropdown('contactPreference', {
        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('bestTime', {
        label: 'Best Time to Contact',
        options: [
            { id: 'morning', name: 'Morning (9am-12pm)' },
            { id: 'afternoon', name: 'Afternoon (12pm-5pm)' },
            { id: 'evening', name: 'Evening (5pm-8pm)' }
        ]
    });
});

Contact preference matters more than most agents realize. If someone wants texts, don't call them. If they say "evenings only," respect that. First impressions count.

See more lead capture examples in our gallery.

The Conversion Psychology

Long forms convert better than short forms for real estate. Counterintuitive, but true. Here's why:

Short forms get more submissions but worse leads. "Name + email + message" captures everyone including tire-kickers, data harvesters, and people who clicked by accident. You waste hours following up with nothing.

Detailed forms filter for intent. Someone willing to answer questions about their budget, timeline, and financing is serious about working with you. They've already invested time - they want a response.

The key is progressive disclosure. Don't show 20 fields at once. Show the intent question first. Then reveal relevant sections based on the answer. Each step feels small, and by the end they've given you everything.

What Happens After Submit

The form experience doesn't end at submission. What users see next affects whether they actually answer when you call.

Show a confirmation that references their specific request. "Thanks for your interest in buying a 3+ bedroom home in Beverly Hills. We'll call you within 2 hours." This proves their form went somewhere and sets expectations.

Send an immediate email with the same information plus your contact details. They might want to call you first. Make it easy.

For sellers, offer an instant home valuation tool as the next step. Keep them engaged while you prepare for the call.

Common Mistakes

A few things that kill real estate lead forms:

Asking for budget as a text field. You'll get "$500k" and "around half a million maybe more" and "depends on the property" and other useless answers. Use a slider or dropdown with defined ranges.

Not asking about financing. A lead without pre-approval or cash isn't ready to buy. You're better off knowing this upfront than discovering it after three showings.

Treating all leads the same. Your form should capture enough data to prioritize. Hot leads need immediate follow-up. Cold leads need nurturing.

Forgetting mobile users. Half your traffic is on phones. If your form is painful to fill on mobile, you're losing leads. Use dropdowns and chips instead of text fields where possible.

Common Questions

How long should my real estate lead form be?

8-15 fields is ideal. Fewer and you don't qualify leads properly. More and you lose people. Use conditional logic to show only relevant fields - buyers don't need to answer seller questions.

Should I require phone number?

Yes, if you want quality leads. Email-only leads are 10x harder to reach. If someone won't give their phone number, they're probably not ready to work with an agent. Optional email-only submission gets you newsletter subscribers, not clients.

How fast should I follow up on leads?

Hot leads (pre-approved, immediate timeline): under 5 minutes. Studies show lead conversion drops 80% if you wait longer than 30 minutes. Warm leads: same day. Cold leads: within 24 hours with an email drip sequence.

What about open house leads?

Create a simpler version for on-site use. Tablet-friendly, 5-6 fields max. Name, phone, email, buying timeline, pre-approval status. You can qualify further in person while they're standing in front of you.

Ready to Build Your Real Estate Lead Form?

Start capturing qualified leads with forms that filter for serious buyers and sellers.