Industry Guide

Freelancer Project Intake Form

February 2026 · 11 min read

"Can you give me a quote?" Then follows 47 emails trying to figure out what they actually need. Budget? "Flexible." Timeline? "ASAP." Style? "Modern, but also classic." A proper intake form gets real answers before you waste time on calls that go nowhere.

The right questions filter out tire-kickers and give you everything needed to write a proposal. Project type, scope, budget, timeline, style preferences, decision-makers. Clients who fill out detailed forms are serious. Those who won't weren't going to pay anyway.

Project Type

Start broad. What kind of project is this? The answer determines which follow-up questions to show.

// Project type determines which fields appear next
form.addRow(row => {
    row.addRadioButton('projectType', {
        label: 'What type of project is this?',
        options: [
            { id: 'website', name: 'Website Design/Development' },
            { id: 'branding', name: 'Branding & Logo' },
            { id: 'marketing', name: 'Marketing Materials' },
            { id: 'copywriting', name: 'Copywriting & Content' },
            { id: 'video', name: 'Video Production' },
            { id: 'other', name: 'Other' }
        ],
        isRequired: true
    });
});

form.addRow(row => {
    row.addTextbox('otherProjectType', {
        label: 'Please describe',
        isVisible: () => form.radioButton('projectType')?.value() === 'other',
        isRequired: () => form.radioButton('projectType')?.value() === 'other'
    });
});

Website projects need feature lists and page counts. Branding needs deliverable checklists. Each path gets relevant questions, not a generic one-size-fits-all form.

Pro tip

Keep the "Other" option but require description. Unusual projects can be the most interesting - don't force people into boxes that don't fit.

Project Description

Core questions that apply to any project. What, why, and for whom.

// Core project details
form.addRow(row => {
    row.addTextarea('projectSummary', {
        label: 'Project Summary',
        placeholder: 'Describe what you need in a few sentences...',
        rows: 3,
        isRequired: true
    });
});

form.addRow(row => {
    row.addTextarea('goals', {
        label: 'What are you trying to achieve?',
        placeholder: 'Increase sales, build credibility, launch a new product...',
        rows: 2
    });
});

form.addRow(row => {
    row.addTextarea('targetAudience', {
        label: 'Who is your target audience?',
        placeholder: 'Demographics, interests, pain points...',
        rows: 2
    });
});

Goals and target audience reveal whether they've thought this through. Vague answers like "increase engagement" need follow-up. Specific answers like "convert 20% more free trial users" tell you they know what success looks like.

Website-Specific Fields

When they select "Website," show relevant details. Features needed, size estimate, existing site to reference.

// Website-specific fields
const isWebsite = () => form.radioButton('projectType')?.value() === 'website';

form.addRow(row => {
    row.addCheckboxList('websiteFeatures', {
        label: 'Features needed',
        options: [
            { id: 'contact-form', name: 'Contact form' },
            { id: 'blog', name: 'Blog' },
            { id: 'ecommerce', name: 'E-commerce/Shop' },
            { id: 'booking', name: 'Booking/Scheduling' },
            { id: 'members', name: 'Member area/Login' },
            { id: 'cms', name: 'Content management' },
            { id: 'multilang', name: 'Multiple languages' }
        ],
        isVisible: isWebsite
    });
});

form.addRow(row => {
    row.addDropdown('pageCount', {
        label: 'Estimated number of pages',
        options: [
            { id: '1-5', name: '1-5 pages (simple site)' },
            { id: '6-15', name: '6-15 pages (standard site)' },
            { id: '16-30', name: '16-30 pages (larger site)' },
            { id: '30+', name: '30+ pages (complex site)' }
        ],
        isVisible: isWebsite
    });
});

form.addRow(row => {
    row.addTextbox('existingSite', {
        label: 'Current website URL (if any)',
        placeholder: 'https://...',
        isVisible: isWebsite
    });
});

The feature checklist surfaces complexity early. E-commerce with member login is a different project than a 5-page brochure site. Better to know now than discover scope creep mid-project.

Branding-Specific Fields

Branding projects need different questions. What deliverables, and are we starting fresh or building on existing work?

// Branding-specific fields
const isBranding = () => form.radioButton('projectType')?.value() === 'branding';

form.addRow(row => {
    row.addCheckboxList('brandingDeliverables', {
        label: 'What do you need?',
        options: [
            { id: 'logo', name: 'Logo design' },
            { id: 'colors', name: 'Color palette' },
            { id: 'typography', name: 'Typography selection' },
            { id: 'guidelines', name: 'Brand guidelines document' },
            { id: 'stationery', name: 'Business cards & stationery' },
            { id: 'social', name: 'Social media templates' }
        ],
        isVisible: isBranding
    });
});

form.addRow(row => {
    row.addRadioButton('hasExistingBrand', {
        label: 'Do you have existing branding?',
        options: [
            { id: 'none', name: 'Starting from scratch' },
            { id: 'refresh', name: 'Have branding, needs refresh' },
            { id: 'extend', name: 'Have branding, need extensions' }
        ],
        isVisible: isBranding
    });
});

A brand refresh is very different from creating something new. Extending existing branding (new social templates, signage) is different again. Each path has different effort and pricing.

See more intake form examples.

Budget

The question everyone dances around. Make it easy with ranges and different structures.

// Budget selection with explanation
form.addRow(row => {
    row.addRadioButton('budgetType', {
        label: 'Budget structure',
        options: [
            { id: 'fixed', name: 'Fixed project budget' },
            { id: 'hourly', name: 'Hourly rate' },
            { id: 'retainer', name: 'Monthly retainer' },
            { id: 'unsure', name: 'Not sure yet' }
        ],
        isRequired: true
    });
});

// Fixed budget range
form.addRow(row => {
    row.addDropdown('budgetRange', {
        label: 'Budget range',
        options: [
            { id: 'under-1k', name: 'Under $1,000' },
            { id: '1k-3k', name: '$1,000 - $3,000' },
            { id: '3k-5k', name: '$3,000 - $5,000' },
            { id: '5k-10k', name: '$5,000 - $10,000' },
            { id: '10k-25k', name: '$10,000 - $25,000' },
            { id: '25k+', name: '$25,000+' }
        ],
        isVisible: () => form.radioButton('budgetType')?.value() === 'fixed',
        isRequired: () => form.radioButton('budgetType')?.value() === 'fixed'
    });
});

// Monthly retainer
form.addRow(row => {
    row.addDropdown('retainerRange', {
        label: 'Monthly budget',
        options: [
            { id: 'under-500', name: 'Under $500/month' },
            { id: '500-1k', name: '$500 - $1,000/month' },
            { id: '1k-2k', name: '$1,000 - $2,000/month' },
            { id: '2k-5k', name: '$2,000 - $5,000/month' },
            { id: '5k+', name: '$5,000+/month' }
        ],
        isVisible: () => form.radioButton('budgetType')?.value() === 'retainer',
        isRequired: () => form.radioButton('budgetType')?.value() === 'retainer'
    });
});

"Not sure yet" is a valid answer - some clients genuinely don't know what things cost. But now you can educate them in the proposal rather than wasting a call on someone with a $500 budget for a $10,000 project.

Timeline

Urgency affects everything - pricing, availability, approach. Get the real timeline upfront.

// Timeline and deadlines
form.addRow(row => {
    row.addRadioButton('urgency', {
        label: 'How urgent is this project?',
        options: [
            { id: 'asap', name: 'ASAP - I needed it yesterday' },
            { id: 'soon', name: 'Soon - within 2-4 weeks' },
            { id: 'normal', name: 'Normal - 1-2 months' },
            { id: 'flexible', name: 'Flexible - no hard deadline' }
        ],
        isRequired: true
    });
});

form.addRow(row => {
    row.addDatepicker('hardDeadline', {
        label: 'Hard deadline (if any)',
        placeholder: 'Leave empty if flexible',
        minDate: new Date().toISOString().split('T')[0]
    });
});

form.addRow(row => {
    row.addTextbox('deadlineReason', {
        label: 'What\'s driving the deadline?',
        placeholder: 'Product launch, event, campaign start...',
        isVisible: () => !!form.datepicker('hardDeadline')?.value()
    });
});

Hard deadlines with real reasons (product launch, trade show) are different from arbitrary deadlines. Knowing "why" helps you understand what's actually flexible.

Style Preferences

Creative direction is subjective. Keywords and examples give you a starting point.

// Visual style preferences
form.addRow(row => {
    row.addCheckboxList('styleKeywords', {
        label: 'Which words describe your desired style?',
        options: [
            { id: 'modern', name: 'Modern' },
            { id: 'minimal', name: 'Minimal' },
            { id: 'bold', name: 'Bold' },
            { id: 'playful', name: 'Playful' },
            { id: 'elegant', name: 'Elegant' },
            { id: 'professional', name: 'Professional' },
            { id: 'friendly', name: 'Friendly' },
            { id: 'edgy', name: 'Edgy' }
        ]
    });
});

form.addRow(row => {
    row.addTextarea('references', {
        label: 'Examples you like',
        placeholder: 'Links to websites, designs, or brands you admire and why...',
        rows: 3
    });
});

form.addRow(row => {
    row.addTextarea('dislikes', {
        label: 'What to avoid',
        placeholder: 'Anything you definitely don\'t want?',
        rows: 2
    });
});

"Modern and minimal" means different things to different people. Reference links are gold - "I like how this site feels but with brighter colors" is actionable. "Make it pop" is not.

Communication Style

Working style compatibility matters. Some clients want daily updates, others want to see the final result. Mismatched expectations kill projects.

// Working style preferences
form.addRow(row => {
    row.addRadioButton('communicationStyle', {
        label: 'Preferred communication',
        options: [
            { id: 'email', name: 'Email - async is fine' },
            { id: 'slack', name: 'Slack/Chat - quick back and forth' },
            { id: 'calls', name: 'Regular video calls' },
            { id: 'mixed', name: 'Mix of all' }
        ]
    });
});

form.addRow(row => {
    row.addRadioButton('involvement', {
        label: 'How involved do you want to be?',
        options: [
            { id: 'hands-off', name: 'Hands-off - just show me the result' },
            { id: 'checkpoints', name: 'Key checkpoints only' },
            { id: 'collaborative', name: 'Collaborative - regular feedback loops' },
            { id: 'very-involved', name: 'Very involved - daily updates' }
        ]
    });
});

form.addRow(row => {
    row.addRadioButton('decisionMaker', {
        label: 'Who makes final decisions?',
        options: [
            { id: 'me', name: 'Just me' },
            { id: 'partner', name: 'Me + business partner' },
            { id: 'team', name: 'Small team/committee' },
            { id: 'stakeholders', name: 'Multiple stakeholders' }
        ]
    });
});

Multiple stakeholders and committees slow everything down. Knowing this upfront lets you plan for longer feedback cycles and more revision rounds.

Contact Information

Finally, who are they and how did they find you?

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

contactSection.addRow(row => {
    row.addTextbox('name', {
        label: 'Name',
        isRequired: true
    });
    row.addTextbox('company', {
        label: 'Company/Business'
    });
});

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

contactSection.addRow(row => {
    row.addTextbox('website', {
        label: 'Current website',
        placeholder: 'https://...'
    });
});

contactSection.addRow(row => {
    row.addDropdown('howFound', {
        label: 'How did you find me?',
        options: [
            { id: 'referral', name: 'Referral' },
            { id: 'google', name: 'Google search' },
            { id: 'social', name: 'Social media' },
            { id: 'portfolio', name: 'Saw your portfolio' },
            { id: 'other', name: 'Other' }
        ]
    });
});

"How did you find me" helps track what's working. Referrals close faster than cold inquiries. Portfolio visitors are already sold on your style.

Complete Example

A streamlined version with the essentials.

// Complete freelancer project intake form
form.addRow(row => {
    row.addRadioButton('projectType', {
        label: 'Project type',
        options: [
            { id: 'website', name: 'Website' },
            { id: 'branding', name: 'Branding' },
            { id: 'marketing', name: 'Marketing' },
            { id: 'other', name: 'Other' }
        ],
        isRequired: true
    });
});

form.addRow(row => {
    row.addTextarea('summary', {
        label: 'Project summary',
        placeholder: 'What do you need?',
        rows: 3,
        isRequired: true
    });
});

form.addRow(row => {
    row.addDropdown('budget', {
        label: 'Budget range',
        options: [
            { id: 'under-1k', name: 'Under $1k' },
            { id: '1k-5k', name: '$1k - $5k' },
            { id: '5k-10k', name: '$5k - $10k' },
            { id: '10k+', name: '$10k+' }
        ],
        isRequired: true
    });
    row.addDropdown('timeline', {
        label: 'Timeline',
        options: [
            { id: 'asap', name: 'ASAP' },
            { id: '2-4weeks', name: '2-4 weeks' },
            { id: '1-2months', name: '1-2 months' },
            { id: 'flexible', name: 'Flexible' }
        ],
        isRequired: true
    });
});

form.addRow(row => {
    row.addTextarea('references', {
        label: 'Examples you like (optional)',
        placeholder: 'Links or descriptions...',
        rows: 2
    });
});

const contact = form.addSubform('contact', { title: 'Contact' });
contact.addRow(row => {
    row.addTextbox('name', { label: 'Name', isRequired: true });
    row.addEmail('email', { label: 'Email', isRequired: true });
});

Best Practices

Qualify, Don't Interrogate

Long forms scare off good clients. Start with essentials, make detailed questions optional or conditional. You can always ask more on the call.

Explain Why You're Asking

"Budget helps me suggest the right approach" is better than just demanding numbers. People share more when they understand the purpose.

Make It Easy to Say "I Don't Know"

Not everyone has figured out their timeline or budget. "Flexible" and "Not sure" options prevent people from abandoning the form or making up answers.

Review Submissions Before Calls

The form does its job when you can prepare a rough proposal before the discovery call. No more starting from zero every time.

Common Questions

Should I require budget information?

Make it required but include 'Not sure yet' as an option. Serious clients will share their budget. Those who won't are often either shopping on price alone or haven't thought it through - both are red flags.

How long should the form be?

5-10 questions for the core form, with conditional fields adding more when relevant. Test it yourself - if it takes more than 5 minutes to fill out thoughtfully, it's probably too long.

What if clients give vague answers?

Vague answers are data too. They tell you the client hasn't fully thought through the project. You can either follow up for clarification or use the call to help them define requirements.

Should I show pricing based on their answers?

Optional. Some freelancers show ranges ('projects like this typically run $X-$Y'). Others prefer to discuss pricing on calls. Either works - just be consistent.

Build Your Intake Form

Stop chasing details over email. Get proper briefs from day one.