Accounting & Tax Client Intake Form: Qualify Leads Before Consultations
Tax season brings a flood of inquiries. Everyone needs their taxes done, but not everyone is your ideal client. Some have shoebox full of receipts and expect it to cost $100. Some have IRS problems they forgot to mention. Some want monthly bookkeeping but can't afford your rates. A good intake form helps you figure this out before the consultation.
The right questions upfront save hours of unpaid discovery. By the time someone submits, you know if they're an individual or business, what services they need, how complex their situation is, and whether they're a good fit. You walk into consultations prepared, and you can quote accurately because you understand the scope.
We'll build an intake form that handles individuals and businesses, tax prep and ongoing bookkeeping, routine filings and IRS problems. Conditional logic shows relevant questions based on their answers - a W-2 employee doesn't need business entity questions.
Individual or Business
This is the fork in the road. Everything else depends on it.
const clientSection = form.addSubform('client', {
title: 'Tell Us About Yourself'
});
clientSection.addRow(row => {
row.addRadioButton('clientType', {
label: 'Are you an individual or a business?',
options: [
{ id: 'individual', name: 'Individual' },
{ id: 'business', name: 'Business' }
],
orientation: 'horizontal',
isRequired: true
});
});
// Business details
clientSection.addRow(row => {
row.addTextbox('businessName', {
label: 'Business Name',
isVisible: () => clientType.value() === 'business',
isRequired: () => clientType.value() === 'business'
});
row.addDropdown('entityType', {
label: 'Entity Type',
options: [
{ id: 'sole-prop', name: 'Sole Proprietorship' },
{ id: 'llc', name: 'LLC' },
{ id: 'llc-scorp', name: 'LLC (S-Corp election)' },
{ id: 's-corp', name: 'S Corporation' },
{ id: 'c-corp', name: 'C Corporation' },
{ id: 'partnership', name: 'Partnership' },
{ id: 'nonprofit', name: 'Nonprofit' },
{ id: 'unsure', name: 'Not sure' }
],
isVisible: () => clientType.value() === 'business'
});
});
clientSection.addRow(row => {
row.addDropdown('industry', {
label: 'Industry',
options: [
{ id: 'retail', name: 'Retail/E-commerce' },
{ id: 'professional', name: 'Professional Services' },
{ id: 'construction', name: 'Construction/Trades' },
{ id: 'restaurant', name: 'Restaurant/Food Service' },
{ id: 'healthcare', name: 'Healthcare' },
{ id: 'real-estate', name: 'Real Estate' },
{ id: 'tech', name: 'Technology' },
{ id: 'creative', name: 'Creative/Media' },
{ id: 'manufacturing', name: 'Manufacturing' },
{ id: 'other', name: 'Other' }
],
isVisible: () => clientType.value() === 'business'
});
});Business clients see entity type, industry, and business name fields. Individuals don't. This keeps the form focused and avoids confusion.
Entity type matters for service scoping. A sole proprietor filing a Schedule C is simpler than an S-Corp with payroll. Someone who's "not sure" about their entity type is either very new (opportunity to help them structure correctly) or has a mess (opportunity to clean it up).
Pro tip
Industry helps you assess complexity and identify specializations. Construction has different tax considerations than e-commerce. If you specialize in certain industries, this helps you prioritize leads in your wheelhouse.
Services Needed
Multi-select lets clients indicate everything they need. Many want tax prep AND bookkeeping. Some just need their messy books cleaned up before year-end.
const servicesSection = form.addSubform('services', {
title: 'Services Needed'
});
servicesSection.addRow(row => {
row.addChips('services', {
label: 'What services are you looking for?',
options: [
{ id: 'tax-prep', name: 'Tax Preparation' },
{ id: 'tax-planning', name: 'Tax Planning' },
{ id: 'bookkeeping', name: 'Bookkeeping' },
{ id: 'payroll', name: 'Payroll' },
{ id: 'financial-statements', name: 'Financial Statements' },
{ id: 'audit', name: 'Audit/Review' },
{ id: 'advisory', name: 'Business Advisory' },
{ id: 'entity-setup', name: 'Entity Setup/Restructuring' },
{ id: 'irs-issue', name: 'IRS Issue Resolution' },
{ id: 'other', name: 'Other' }
],
isRequired: true
});
});
servicesSection.addRow(row => {
row.addTextbox('otherServices', {
label: 'Please describe',
isVisible: () => (services.value() ?? []).includes('other')
});
});IRS issue resolution is a flag for complexity. These clients need more extensive intake - what kind of issue, how many years, have they received notices. That's worth a separate section.
Tax Details
For clients needing tax prep or planning, get the details that affect scope and pricing.
const taxSection = form.addSubform('tax', {
title: 'Tax Information',
isVisible: () => {
const s = services.value() ?? [];
return s.includes('tax-prep') || s.includes('tax-planning');
}
});
// Individual tax questions
taxSection.addRow(row => {
row.addDropdown('filingStatus', {
label: 'Filing Status',
options: [
{ id: 'single', name: 'Single' },
{ id: 'married-joint', name: 'Married Filing Jointly' },
{ id: 'married-separate', name: 'Married Filing Separately' },
{ id: 'head', name: 'Head of Household' },
{ id: 'widow', name: 'Qualifying Widow(er)' }
],
isVisible: () => clientType.value() === 'individual'
});
row.addInteger('dependents', {
label: 'Number of Dependents',
min: 0,
max: 20,
defaultValue: 0,
isVisible: () => clientType.value() === 'individual'
});
});
taxSection.addRow(row => {
row.addChips('incomeTypes', {
label: 'Types of Income',
options: [
{ id: 'w2', name: 'W-2 Employment' },
{ id: '1099', name: '1099/Self-Employment' },
{ id: 'investments', name: 'Investments' },
{ id: 'rental', name: 'Rental Property' },
{ id: 'retirement', name: 'Retirement Distributions' },
{ id: 'business', name: 'Business Income' },
{ id: 'crypto', name: 'Cryptocurrency' },
{ id: 'foreign', name: 'Foreign Income' }
],
isVisible: () => clientType.value() === 'individual'
});
});
taxSection.addRow(row => {
row.addRadioButton('previouslyFiled', {
label: 'Did you file taxes last year?',
options: [
{ id: 'yes-self', name: 'Yes, did it myself' },
{ id: 'yes-pro', name: 'Yes, used a professional' },
{ id: 'yes-software', name: 'Yes, used software (TurboTax, etc.)' },
{ id: 'no', name: 'No' },
{ id: 'extension', name: 'Filed an extension' }
],
orientation: 'vertical'
});
});Filing status and dependents are basic but essential for individuals. Income types tell you what forms you'll be dealing with - W-2 only is simple, but add 1099s, rental property, and crypto and complexity jumps significantly.
Knowing how they filed before helps set expectations. Someone coming from TurboTax might have sticker shock at professional fees. Someone leaving another CPA probably has reasons - worth exploring.
Business Details
Business clients need more detail. Revenue, employees, and current systems all affect service scope.
const businessSection = form.addSubform('business', {
title: 'Business Details',
isVisible: () => clientType.value() === 'business'
});
businessSection.addRow(row => {
row.addDropdown('businessAge', {
label: 'How long in business?',
options: [
{ id: 'startup', name: 'Not started yet' },
{ id: 'under-1', name: 'Less than 1 year' },
{ id: '1-3', name: '1-3 years' },
{ id: '3-5', name: '3-5 years' },
{ id: '5-10', name: '5-10 years' },
{ id: '10+', name: '10+ years' }
]
});
row.addDropdown('employees', {
label: 'Number of Employees',
options: [
{ id: '0', name: 'Just me' },
{ id: '1-5', name: '1-5' },
{ id: '6-10', name: '6-10' },
{ id: '11-25', name: '11-25' },
{ id: '26-50', name: '26-50' },
{ id: '50+', name: '50+' }
]
});
});
businessSection.addRow(row => {
row.addDropdown('annualRevenue', {
label: 'Annual Revenue (approximate)',
options: [
{ id: 'under-50k', name: 'Under $50,000' },
{ id: '50-100k', name: '$50,000 - $100,000' },
{ id: '100-250k', name: '$100,000 - $250,000' },
{ id: '250-500k', name: '$250,000 - $500,000' },
{ id: '500k-1m', name: '$500,000 - $1 million' },
{ id: '1-5m', name: '$1 - $5 million' },
{ id: '5m+', name: '$5 million+' }
]
});
});
businessSection.addRow(row => {
row.addDropdown('currentAccounting', {
label: 'Current Accounting System',
options: [
{ id: 'none', name: 'None/Spreadsheets' },
{ id: 'quickbooks', name: 'QuickBooks Online' },
{ id: 'quickbooks-desktop', name: 'QuickBooks Desktop' },
{ id: 'xero', name: 'Xero' },
{ id: 'freshbooks', name: 'FreshBooks' },
{ id: 'wave', name: 'Wave' },
{ id: 'other', name: 'Other' }
]
});
});Revenue range helps you price appropriately and identify if they're in your target market. A $50k side business has different needs than a $5M company.
Current accounting system matters for bookkeeping. If they're on QuickBooks Online and you're a QBO firm, great. If they're on spreadsheets, there's migration work. If they're on desktop software you don't support, that's a conversation.
See more client intake examples in our gallery.
Bookkeeping Specifics
Bookkeeping clients need different questions than tax-only clients. Understanding their current state affects pricing dramatically.
const bookkeepingSection = form.addSubform('bookkeeping', {
title: 'Bookkeeping Details',
isVisible: () => (services.value() ?? []).includes('bookkeeping')
});
bookkeepingSection.addRow(row => {
row.addRadioButton('bookkeepingStatus', {
label: 'Current bookkeeping status',
options: [
{ id: 'current', name: 'Books are up to date' },
{ id: 'behind', name: 'A few months behind' },
{ id: 'very-behind', name: 'Significantly behind (6+ months)' },
{ id: 'none', name: 'No bookkeeping in place' }
],
orientation: 'vertical'
});
});
bookkeepingSection.addRow(row => {
row.addDropdown('monthlyTransactions', {
label: 'Monthly Transaction Volume',
options: [
{ id: 'under-50', name: 'Under 50' },
{ id: '50-100', name: '50-100' },
{ id: '100-250', name: '100-250' },
{ id: '250-500', name: '250-500' },
{ id: '500+', name: '500+' }
]
});
row.addDropdown('bankAccounts', {
label: 'Number of Bank/Credit Card Accounts',
options: [
{ id: '1-2', name: '1-2' },
{ id: '3-5', name: '3-5' },
{ id: '6-10', name: '6-10' },
{ id: '10+', name: '10+' }
]
});
});A business with current books that just needs ongoing maintenance is different from one that's 18 months behind and needs catch-up. Catch-up work is often quoted separately - you need to know the scope upfront.
Transaction volume and account count are the primary drivers of monthly bookkeeping fees. Getting this upfront lets you quote accurately.
IRS Issues
IRS problem clients need special handling. These are often urgent, high-value engagements, but they're also complex and require different expertise.
const irsSection = form.addSubform('irs', {
title: 'IRS Issue Details',
isVisible: () => (services.value() ?? []).includes('irs-issue')
});
irsSection.addRow(row => {
row.addChips('irsIssues', {
label: 'What type of issue?',
options: [
{ id: 'audit', name: 'Audit Notice' },
{ id: 'unfiled', name: 'Unfiled Returns' },
{ id: 'back-taxes', name: 'Owe Back Taxes' },
{ id: 'levy', name: 'Wage Levy/Bank Levy' },
{ id: 'lien', name: 'Tax Lien' },
{ id: 'penalty', name: 'Penalty Abatement' },
{ id: 'amended', name: 'Need Amended Return' },
{ id: 'other', name: 'Other' }
]
});
});
irsSection.addRow(row => {
row.addDropdown('yearsInvolved', {
label: 'Tax Years Involved',
options: [
{ id: '1', name: '1 year' },
{ id: '2-3', name: '2-3 years' },
{ id: '4-5', name: '4-5 years' },
{ id: '6+', name: '6+ years' }
]
});
row.addRadioButton('hasNotice', {
label: 'Have you received an IRS notice?',
options: [
{ id: 'yes', name: 'Yes' },
{ id: 'no', name: 'No' }
],
orientation: 'horizontal'
});
});
irsSection.addRow(row => {
row.addTextbox('irsDetails', {
label: 'Brief description of the issue',
multiline: true,
rows: 3,
placeholder: 'What happened? What has the IRS communicated?'
});
});The type of issue determines what you're dealing with. An audit notice is time-sensitive. Unfiled returns from five years ago are serious but less urgent. Back taxes might need an installment agreement or offer in compromise.
Having the IRS notice in hand (or at least knowing one exists) tells you deadlines and specifics that affect how you respond.
Timeline and Preferences
Urgency affects prioritization and sometimes pricing. Meeting preferences help you schedule efficiently.
const timelineSection = form.addSubform('timeline', {
title: 'Timeline & Preferences'
});
timelineSection.addRow(row => {
row.addDropdown('urgency', {
label: 'When do you need to get started?',
options: [
{ id: 'asap', name: 'As soon as possible' },
{ id: 'this-month', name: 'This month' },
{ id: 'next-month', name: 'Next month' },
{ id: 'tax-season', name: 'Before tax season' },
{ id: 'exploring', name: 'Just exploring options' }
]
});
});
// Show deadline for tax prep
timelineSection.addRow(row => {
row.addRadioButton('taxDeadline', {
label: 'Do you have an upcoming filing deadline?',
options: [
{ id: 'april', name: 'April 15 deadline' },
{ id: 'extension', name: 'October 15 (extension)' },
{ id: 'quarterly', name: 'Quarterly estimated taxes' },
{ id: 'none', name: 'No immediate deadline' }
],
orientation: 'vertical',
isVisible: () => (services.value() ?? []).includes('tax-prep')
});
});
timelineSection.addRow(row => {
row.addRadioButton('meetingPreference', {
label: 'Meeting Preference',
options: [
{ id: 'in-person', name: 'In-person' },
{ id: 'virtual', name: 'Virtual/Video call' },
{ id: 'phone', name: 'Phone' },
{ id: 'any', name: 'No preference' }
],
orientation: 'horizontal'
});
});Tax season deadlines are obvious urgency drivers. But "as soon as possible" for bookkeeping might mean they have a loan application pending that needs financial statements.
Virtual meetings opened up geographic possibilities. Many clients prefer video calls over driving to an office. Knowing preferences helps you serve them better.
Contact Information
Standard contact fields, plus some useful context.
const contactSection = form.addSubform('contact', {
title: 'Contact Information'
});
contactSection.addRow(row => {
row.addTextbox('name', {
label: 'Your Name',
isRequired: true
});
row.addTextbox('title', {
label: 'Title/Role',
isVisible: () => clientType.value() === 'business',
placeholder: 'e.g., Owner, CFO, Office Manager'
});
});
contactSection.addRow(row => {
row.addEmail('email', {
label: 'Email',
isRequired: true
});
row.addPhone('phone', {
label: 'Phone',
isRequired: true
});
});
contactSection.addRow(row => {
row.addDropdown('preferredContact', {
label: 'Preferred Contact Method',
options: [
{ id: 'email', name: 'Email' },
{ id: 'phone', name: 'Phone' },
{ id: 'text', name: 'Text' }
],
defaultValue: 'email'
});
row.addDropdown('howFound', {
label: 'How did you hear about us?',
options: [
{ id: 'google', name: 'Google Search' },
{ id: 'referral', name: 'Referral' },
{ id: 'linkedin', name: 'LinkedIn' },
{ id: 'other', name: 'Other' }
]
});
});For business clients, knowing the contact's role helps. The owner makes decisions differently than an office manager gathering quotes.
const additionalSection = form.addSubform('additional', {
title: 'Additional Information'
});
additionalSection.addRow(row => {
row.addTextbox('currentCPA', {
label: 'Current CPA/Accountant (if any)',
placeholder: 'Name or firm'
});
});
additionalSection.addRow(row => {
row.addTextbox('additionalNotes', {
label: 'Anything else we should know?',
multiline: true,
rows: 3,
placeholder: 'Specific concerns, questions, or special circumstances...'
});
});Current CPA is useful context. If they're switching from another firm, understanding why helps you position your services. If they've been doing it themselves, you know they need more guidance.
Seasonal Considerations
Accounting practices have extreme seasonality. Your intake form should adapt:
Tax season (January-April): Prioritize individual tax prep. Deadline questions become more urgent. Consider adding a "Do you have all your documents?" checklist.
Extension season (August-October): Similar to tax season but for complex returns. These are often higher-value clients.
Year-end (November-December): Tax planning peaks. Business clients need year-end projections. Ask about bonus depreciation, retirement contributions, estimated taxes.
Off-season: Focus on bookkeeping, advisory, business setup. These are relationship-building opportunities that lead to tax work later.
Red Flags to Watch For
Intake forms can reveal potential problems:
Multiple years unfiled: Serious situation that needs careful handling and often specialized expertise.
"Previous CPA messed up": Sometimes true, sometimes the client is difficult. Proceed carefully.
Last-minute deadline: If it's April 10 and they just realized they need a CPA, they might not have documents ready.
Unrealistic expectations: "$50k business, need bookkeeping, budget is $50/month" isn't viable.
After Submission
Confirmation email with next steps. Include what documents to gather if they're a tax client. Mention your pricing structure broadly so there are no surprises.
Route leads by complexity and service type. IRS issues might go to a specialist partner. Simple W-2 returns can go to junior staff. Business clients with complex needs go to senior CPAs.
During tax season, response time expectations matter. "We'll review your information and respond within 24 hours" is reasonable. Don't promise faster than you can deliver.
Common Questions
Should I include pricing information in the intake form?
Include ranges or 'starting at' prices if possible. 'Individual tax returns starting at $300' sets expectations. Detailed pricing needs a consultation, but ballpark figures help filter clients whose budget doesn't match your rates.
How do I handle clients who need services I don't offer?
Be clear about your services upfront. If you don't do IRS representation, don't include it as an option. Consider referral partnerships for services outside your scope - you can still capture the lead and hand off appropriately.
What about document collection in the intake form?
Keep intake separate from document collection. Intake qualifies the lead and scopes the engagement. Document collection happens after they're a client. Mixing them makes the intake form too heavy and reduces completion rates.
Should I ask about budget?
It can feel awkward but it's useful. Frame it as 'What budget have you allocated for accounting services?' This surfaces mismatches early. If someone has a $100/month budget for full-service bookkeeping, better to know before the consultation.