Construction Bid Request Form: Get Detailed Project Inquiries
Every contractor knows the pain: a potential client calls, says they want to "build something," and you spend an hour on the phone extracting basic details. Then they ghost you. Or worse - you drive out to a site visit and realize their "budget" is half what the project actually costs.
A good bid request form filters this out before you waste time. By the time someone submits, you know what they're building, what they can spend, when they need it done, and whether they're serious. The unqualified leads drop off because they don't want to answer real questions. The good ones stick around.
We'll build a form that handles new construction, renovations, additions, and commercial work. Each project type collects different details, but they all end with enough information to decide if you want the job.
Start with Project Type
The first question tells you everything about scope. A kitchen remodel and a ground-up new build are completely different conversations.
const projectSection = form.addSubform('project', {
title: 'Project Overview'
});
projectSection.addRow(row => {
row.addDropdown('projectType', {
label: 'Project Type',
options: [
{ id: 'new-construction', name: 'New Construction' },
{ id: 'addition', name: 'Home Addition' },
{ id: 'renovation', name: 'Major Renovation' },
{ id: 'remodel', name: 'Kitchen/Bath Remodel' },
{ id: 'commercial', name: 'Commercial Build-Out' },
{ id: 'tenant', name: 'Tenant Improvement' }
],
isRequired: true
});
});
projectSection.addRow(row => {
row.addDropdown('propertyType', {
label: 'Property Type',
options: [
{ id: 'residential', name: 'Residential' },
{ id: 'commercial', name: 'Commercial' },
{ id: 'industrial', name: 'Industrial' },
{ id: 'mixed-use', name: 'Mixed-Use' }
]
});
row.addDropdown('projectStatus', {
label: 'Project Status',
options: [
{ id: 'planning', name: 'Just Planning' },
{ id: 'permits', name: 'Have Permits' },
{ id: 'drawings', name: 'Have Drawings' },
{ id: 'ready', name: 'Ready to Start' }
]
});
});Project status is equally important. "Just planning" means they're shopping ideas. "Have permits and drawings" means they're ready to break ground. You'll prioritize these leads differently.
New Construction Details
For new builds, you need structural basics: size, stories, foundation type. These drive cost more than anything else.
const newBuildSection = form.addSubform('newBuild', {
title: 'New Construction Details',
isVisible: () => projectType.value() === 'new-construction'
});
newBuildSection.addRow(row => {
row.addInteger('squareFootage', {
label: 'Approximate Square Footage',
min: 500,
max: 50000,
suffix: 'sq ft'
});
row.addInteger('stories', {
label: 'Number of Stories',
min: 1,
max: 5,
defaultValue: 1
});
});
newBuildSection.addRow(row => {
row.addDropdown('foundation', {
label: 'Foundation Type',
options: [
{ id: 'slab', name: 'Concrete Slab' },
{ id: 'crawl', name: 'Crawl Space' },
{ id: 'basement', name: 'Full Basement' },
{ id: 'pier', name: 'Pier & Beam' },
{ id: 'unsure', name: 'Not Sure Yet' }
]
});
row.addDropdown('framing', {
label: 'Framing Type',
options: [
{ id: 'wood', name: 'Wood Frame' },
{ id: 'steel', name: 'Steel Frame' },
{ id: 'icf', name: 'ICF (Insulated Concrete)' },
{ id: 'sip', name: 'SIPs (Structural Insulated)' },
{ id: 'unsure', name: 'Not Sure Yet' }
]
});
});Foundation and framing choices affect cost by 20-30%. A full basement costs three times what a slab does. ICF or SIP construction is more expensive upfront but saves on energy long-term. You need to know these preferences before you can estimate.
Pro tip
Include "Not Sure Yet" as an option for technical questions. Some clients genuinely don't know the difference between a crawl space and a basement. That's okay - it tells you they'll need more guidance.
Renovation and Remodel Scope
Renovations are trickier to scope than new builds. The same square footage can cost $50k or $500k depending on what's involved.
const renovationSection = form.addSubform('renovation', {
title: 'Renovation Scope',
isVisible: () => projectType.value() === 'renovation' ||
projectType.value() === 'remodel'
});
renovationSection.addRow(row => {
row.addChips('areas', {
label: 'Areas to Renovate',
options: [
{ id: 'kitchen', name: 'Kitchen' },
{ id: 'bathroom', name: 'Bathroom(s)' },
{ id: 'basement', name: 'Basement' },
{ id: 'attic', name: 'Attic' },
{ id: 'living', name: 'Living Areas' },
{ id: 'exterior', name: 'Exterior' },
{ id: 'whole-house', name: 'Whole House' }
]
});
});
renovationSection.addRow(row => {
row.addCheckbox('structuralChanges', {
label: 'Will this involve structural changes?',
helpText: 'Moving walls, adding doors/windows, changing floor plan'
});
row.addCheckbox('plumbingElectrical', {
label: 'Significant plumbing or electrical work?'
});
});The structural changes question is crucial. Non-structural work is relatively straightforward - demo, build, finish. The moment you're moving walls or adding windows, you're into engineering, permits, and potential surprises inside the walls.
"Significant plumbing or electrical" is another red flag for complexity. Re-running a main sewer line or upgrading an electrical panel changes the project entirely.
Trades and Scope of Work
Let clients tell you exactly what trades they need. This helps you understand if it's a project you can handle in-house or if you'll be coordinating subs.
const scopeSection = form.addSubform('scope', {
title: 'Scope of Work'
});
scopeSection.addRow(row => {
row.addChips('trades', {
label: 'Trades Needed',
options: [
{ id: 'demo', name: 'Demolition' },
{ id: 'framing', name: 'Framing' },
{ id: 'electrical', name: 'Electrical' },
{ id: 'plumbing', name: 'Plumbing' },
{ id: 'hvac', name: 'HVAC' },
{ id: 'drywall', name: 'Drywall' },
{ id: 'painting', name: 'Painting' },
{ id: 'flooring', name: 'Flooring' },
{ id: 'roofing', name: 'Roofing' },
{ id: 'windows', name: 'Windows/Doors' },
{ id: 'cabinets', name: 'Cabinets' },
{ id: 'tile', name: 'Tile Work' }
]
});
});
scopeSection.addRow(row => {
row.addTextbox('scopeDescription', {
label: 'Project Description',
multiline: true,
rows: 4,
placeholder: 'Describe your project goals, any specific requirements...'
});
});The multi-select chips work better than checkboxes here - they're more visual and clients can quickly scan what applies. The free-text description fills in context that dropdowns can't capture.
Budget and Timeline
This is where you separate serious inquiries from wishful thinking. Most people underestimate construction costs by 50% or more.
const budgetSection = form.addSubform('budget', {
title: 'Budget & Timeline'
});
// Budget ranges by project type
const getBudgetOptions = () => {
const type = projectType.value();
if (type === 'new-construction') {
return [
{ id: '200-500k', name: '$200,000 - $500,000' },
{ id: '500k-1m', name: '$500,000 - $1,000,000' },
{ id: '1-2m', name: '$1,000,000 - $2,000,000' },
{ id: '2m+', name: '$2,000,000+' }
];
}
if (type === 'addition') {
return [
{ id: '50-100k', name: '$50,000 - $100,000' },
{ id: '100-200k', name: '$100,000 - $200,000' },
{ id: '200-400k', name: '$200,000 - $400,000' },
{ id: '400k+', name: '$400,000+' }
];
}
// Default for renovations/remodels
return [
{ id: '25-50k', name: '$25,000 - $50,000' },
{ id: '50-100k', name: '$50,000 - $100,000' },
{ id: '100-200k', name: '$100,000 - $200,000' },
{ id: '200k+', name: '$200,000+' }
];
};
budgetSection.addRow(row => {
row.addDropdown('budgetRange', {
label: 'Budget Range',
options: getBudgetOptions
});
row.addDropdown('budgetFlexibility', {
label: 'Budget Flexibility',
options: [
{ id: 'firm', name: 'Firm - can\'t exceed' },
{ id: 'some', name: 'Some flexibility (10-15%)' },
{ id: 'flexible', name: 'Flexible for the right design' }
]
});
});
budgetSection.addRow(row => {
row.addDropdown('startDate', {
label: 'Desired Start Date',
options: [
{ id: 'asap', name: 'As soon as possible' },
{ id: '1-month', name: 'Within 1 month' },
{ id: '1-3-months', name: '1-3 months' },
{ id: '3-6-months', name: '3-6 months' },
{ id: '6-12-months', name: '6-12 months' },
{ id: 'planning', name: 'Still in planning phase' }
]
});
row.addDropdown('completion', {
label: 'Deadline Requirements',
options: [
{ id: 'flexible', name: 'Flexible' },
{ id: 'preferred', name: 'Preferred date but flexible' },
{ id: 'firm', name: 'Firm deadline (event, lease, etc.)' }
]
});
});Notice how budget ranges adjust by project type. A $50k budget is reasonable for a bathroom remodel but laughable for new construction. Dynamic options set realistic expectations.
Budget flexibility matters. A client who says "can't exceed" and picks a low range might not be worth pursuing - you'll spend the whole project fighting over costs. "Flexible for the right design" suggests someone who understands quality costs money.
Pro tip
Timeline questions help with scheduling. If someone needs to start ASAP and you're booked for six months, better to know upfront than waste everyone's time.
Property Information
Site conditions affect everything from material delivery to permitting complexity.
const propertySection = form.addSubform('property', {
title: 'Property Information'
});
propertySection.addRow(row => {
row.addAddress('siteAddress', {
label: 'Project Site Address',
isRequired: true
});
});
propertySection.addRow(row => {
row.addDropdown('ownership', {
label: 'Property Ownership',
options: [
{ id: 'own', name: 'I own this property' },
{ id: 'buying', name: 'Under contract to buy' },
{ id: 'lease', name: 'Leased/rented' }
]
});
row.addDropdown('access', {
label: 'Site Access',
options: [
{ id: 'easy', name: 'Easy access' },
{ id: 'limited', name: 'Limited parking/access' },
{ id: 'hoa', name: 'HOA restrictions' },
{ id: 'historic', name: 'Historic district' }
]
});
});HOA restrictions and historic districts are major factors. An HOA might require specific materials, colors, or even architectural review. Historic districts can add months to permitting. Flag these early.
Project Documents
If they have plans, you want to see them. A client with architect-stamped drawings is much further along than someone with a napkin sketch.
const documentsSection = form.addSubform('documents', {
title: 'Project Documents'
});
documentsSection.addRow(row => {
row.addChips('existingDocs', {
label: 'What do you have?',
options: [
{ id: 'plans', name: 'Architectural Plans' },
{ id: 'permits', name: 'Permits' },
{ id: 'survey', name: 'Site Survey' },
{ id: 'engineering', name: 'Engineering Reports' },
{ id: 'soil', name: 'Soil Tests' },
{ id: 'nothing', name: 'Nothing Yet' }
]
});
});
documentsSection.addRow(row => {
row.addFileUpload('files', {
label: 'Upload Plans or Photos',
accept: '.pdf,.jpg,.jpeg,.png,.dwg',
multiple: true,
maxFiles: 10,
maxSize: 25 * 1024 * 1024, // 25MB per file
helpText: 'PDF, images, or CAD files. Up to 10 files.'
});
});File upload is optional but valuable. Photos of existing conditions help you spot issues before the site visit. CAD files or PDFs of plans let you start estimating immediately.
Showing a Preliminary Estimate
Here's where your form becomes a calculator. Based on square footage and project type, you can show a rough range. This sets expectations before you've spent any time on the project.
// Rough estimate based on project scope
const estimateSection = form.addSubform('estimate', {
title: 'Preliminary Estimate'
});
const calculateEstimate = () => {
const type = projectType.value();
const sqft = squareFootage.value() ?? 0;
// Cost per square foot by project type
const rates: Record<string, [number, number]> = {
'new-construction': [200, 400],
'addition': [250, 450],
'renovation': [100, 250],
'remodel': [150, 350],
'commercial': [175, 375],
'tenant': [75, 200]
};
const [low, high] = rates[type] ?? [150, 300];
return {
low: sqft * low,
high: sqft * high
};
};
estimateSection.addRow(row => {
row.addTextPanel('estimateRange', {
computedValue: () => {
const sqft = squareFootage.value();
if (!sqft || sqft < 100) {
return 'Enter square footage above for a rough estimate.';
}
const { low, high } = calculateEstimate();
return `Rough estimate: $${low.toLocaleString()} - $${high.toLocaleString()}\n\nThis is a preliminary range based on typical projects. Actual costs depend on finishes, site conditions, and specific requirements.`;
},
variant: 'info'
});
});The estimate updates in real-time as they fill in details. Someone who balks at "$300k - $600k" for a 2,000 square foot new build probably isn't a good fit. Someone who sees the range and continues knows what they're getting into.
See more quote calculator examples in our gallery.
Contact Information
By now, anyone still filling out the form is serious. They've told you what they want to build, what they can spend, and when they need it. Asking for contact information feels natural.
const contactSection = form.addSubform('contact', {
title: 'Your Information'
});
contactSection.addRow(row => {
row.addTextbox('name', {
label: 'Your Name',
isRequired: true
});
row.addTextbox('company', {
label: 'Company (if applicable)'
});
});
contactSection.addRow(row => {
row.addPhone('phone', {
label: 'Phone',
isRequired: true
});
row.addEmail('email', {
label: 'Email',
isRequired: true
});
});
contactSection.addRow(row => {
row.addDropdown('role', {
label: 'Your Role',
options: [
{ id: 'owner', name: 'Property Owner' },
{ id: 'developer', name: 'Developer' },
{ id: 'architect', name: 'Architect/Designer' },
{ id: 'pm', name: 'Project Manager' },
{ id: 'other', name: 'Other' }
]
});
row.addDropdown('howFound', {
label: 'How did you find us?',
options: [
{ id: 'google', name: 'Google Search' },
{ id: 'referral', name: 'Referral' },
{ id: 'social', name: 'Social Media' },
{ id: 'past', name: 'Past Client' },
{ id: 'other', name: 'Other' }
]
});
});Knowing their role helps with communication. Property owners make decisions differently than developers or architects. A developer wants ROI numbers. An architect wants to know you'll execute their vision. Tailor your follow-up.
Why Long Forms Work for Contractors
Short forms get you more leads. Long forms get you better leads. For construction, "better" wins every time.
Consider the math: a detailed 15-field form might convert at 2% instead of 5%. But those 2% are serious inquiries with real projects and realistic budgets. The extra 3% from a short form would have wasted your time anyway.
Every question in the form serves a purpose: qualifying the project, setting expectations, or giving you information to estimate accurately. If someone won't spend 10 minutes on a form, they're not ready to spend $500k on a building.
After the Submission
What happens next matters as much as the form itself.
Send an immediate confirmation that references their project specifics: "Thanks for your interest in a 2,500 sq ft new construction project in [neighborhood]. We'll review your submission and reach out within 24 hours."
For projects with uploaded documents, mention that you're reviewing their plans. This signals that their time filling out the form was worthwhile.
Route leads by project type and budget. Big commercial projects might go straight to a principal. Smaller residential work goes to a project manager. Keep response times tight - contractors are judged on responsiveness.
Common Mistakes
Asking for an exact budget number. People don't know what construction costs. Give them ranges and let them pick. "I don't know" is a valid answer - it means they need education, not dismissal.
Too many required fields. Make project type, size, and contact info required. Everything else should be optional. Some clients won't know their foundation preference - that's fine.
No conditional logic. Showing renovation questions to someone building from scratch wastes their time and makes you look unprofessional.
No file upload. Clients with plans want to send them. Make it easy. If they have to email files separately, you're creating friction.
Common Questions
Should I show pricing estimates in the form?
Rough ranges are helpful - they filter out clients with unrealistic budgets before you've invested time. But make it clear these are preliminary estimates that can vary significantly based on finishes, site conditions, and specific requirements.
How do I handle tire-kickers who just want free estimates?
The form itself filters many out - people fishing for free pricing don't want to answer detailed questions. For the rest, make it clear that accurate estimates require a paid site visit or consultation. Serious clients understand.
What about subcontractors using this form?
Create a simpler version for trade-specific leads. An electrician doesn't need foundation type questions. Customize the form for your specific trade with relevant scope questions.
Should I require project documents?
No - make uploads optional. Many clients at the inquiry stage don't have formal drawings yet. Requiring documents would filter out legitimate early-stage projects. But definitely offer the option for those who have them.