Veterinary Clinic Intake Form: Capture Pet Patient Details Before the Visit
A pet owner calls your clinic. The front desk scrambles to ask about the pet's breed, age, weight, vaccination history, and reason for visiting - all while the waiting room fills up. The vet walks into the exam room blind, asking the same questions the receptionist just asked. The visit takes twice as long as it should, and the owner leaves feeling like nobody was prepared.
A good intake form fixes this. It collects everything before the pet walks through the door: species, age, existing conditions, reason for the visit, and which services the owner expects. The vet reviews the chart ahead of time. The tech has the right supplies ready. The visit starts with "I see Max is here for his annual vaccines and you're concerned about a lump on his side" instead of "So what brings you in today?"
The key to a veterinary intake form is conditional logic. A wellness exam needs vaccine selection and preventative care options. A surgery visit needs procedure type and pre-op add-ons. An emergency needs triage severity and after-hours flags. One form handles all of it by showing only what's relevant to each visit type.
Pet Information
Pet details drive everything downstream. A giant breed dog costs more to sedate than a cat. A geriatric pet needs senior bloodwork. An exotic animal might require a specialist vet entirely. Start here because every section that follows depends on what kind of animal is coming in.
const petSection = form.addSubform('pet', {
title: 'Pet Information'
});
petSection.addRow(row => {
row.addDropdown('petType', {
label: 'Type of Pet',
options: [
{ id: 'dog', name: 'Dog' },
{ id: 'cat', name: 'Cat' },
{ id: 'rabbit', name: 'Rabbit' },
{ id: 'bird', name: 'Bird' },
{ id: 'reptile', name: 'Reptile' },
{ id: 'small-mammal', name: 'Small Mammal (hamster, guinea pig)' },
{ id: 'exotic', name: 'Exotic Pet' }
],
isRequired: true
});
row.addDropdown('petSize', {
label: 'Pet Size',
options: [
{ id: 'small', name: 'Small (under 20 lbs)' },
{ id: 'medium', name: 'Medium (20-50 lbs)' },
{ id: 'large', name: 'Large (50-90 lbs)' },
{ id: 'giant', name: 'Giant (90+ lbs)' }
],
isVisible: () => ['dog', 'cat'].includes(petType.value() ?? '')
});
});
petSection.addRow(row => {
row.addDropdown('petAge', {
label: 'Pet Age',
options: [
{ id: 'puppy-kitten', name: 'Puppy/Kitten (under 1 year)' },
{ id: 'young', name: 'Young Adult (1-3 years)' },
{ id: 'adult', name: 'Adult (3-7 years)' },
{ id: 'senior', name: 'Senior (7-10 years)' },
{ id: 'geriatric', name: 'Geriatric (10+ years)' }
]
});
row.addCheckbox('existingConditions', {
label: 'Has Existing Health Conditions',
tooltip: 'Chronic conditions may require additional testing'
});
});The size dropdown only appears for dogs and cats. Rabbits, birds, and reptiles don't use the same weight classifications, and showing irrelevant fields confuses pet owners. The "existing conditions" checkbox is a simple flag that tells the vet to pull historical records and allocate extra time. One checkbox saves five minutes of digging through charts during the visit.
Pro tip
Exotic pets often need specialist vets with specific training and equipment. If your clinic doesn't handle exotics, use conditional logic to show a message redirecting those owners to a partner clinic. Better to route them correctly than book an appointment you can't serve.
Visit Type
Visit type is the branching point for the entire form. Each option unlocks a different set of follow-up questions, services, and pricing. Get this wrong and you're asking surgery patients about vaccine packages.
const visitSection = form.addSubform('visit', {
title: 'Visit Type'
});
visitSection.addRow(row => {
row.addRadioButton('visitType', {
label: 'Reason for Visit',
options: [
{ id: 'wellness', name: 'Wellness Exam' },
{ id: 'sick', name: 'Sick Visit' },
{ id: 'emergency', name: 'Emergency' },
{ id: 'surgery', name: 'Surgery' },
{ id: 'dental', name: 'Dental Care' },
{ id: 'specialist', name: 'Specialist Visit' }
],
orientation: 'vertical',
isRequired: true
});
});Six options cover the vast majority of veterinary visits. Wellness exams are the bread and butter - routine checkups with predictable services and pricing. Sick visits need diagnostic flexibility. Emergencies need speed and severity assessment. Surgery needs procedure selection and pre-op prep. Each path through the form feels purpose-built because it is.
Wellness Services
Wellness exams are where most clinics make their predictable revenue. Annual checkups, vaccinations, heartworm tests, and preventative medications. The form should make it easy for owners to see what's available and opt in to services they might not have considered.
const wellnessSection = form.addSubform('wellness', {
title: 'Wellness Services',
isVisible: () => visitType.value() === 'wellness'
});
wellnessSection.addRow(row => {
row.addCheckbox('examFee', {
label: 'Physical Examination',
defaultValue: true
});
row.addCheckbox('vaccinations', {
label: 'Vaccinations',
defaultValue: true
});
});
wellnessSection.addRow(row => {
row.addDropdown('vaccinePackage', {
label: 'Vaccination Package',
options: [
{ id: 'core', name: 'Core Vaccines Only' },
{ id: 'recommended', name: 'Core + Recommended' },
{ id: 'full', name: 'Full Protection Package' }
],
defaultValue: 'recommended',
isVisible: () => vaccinations.value() === true
});
row.addCheckbox('heartwormTest', {
label: 'Heartworm Test',
defaultValue: true,
isVisible: () => ['dog', 'cat'].includes(petType.value() ?? '')
});
});
wellnessSection.addRow(row => {
row.addCheckbox('fecalExam', { label: 'Fecal Examination' });
row.addCheckbox('bloodwork', { label: 'Wellness Blood Panel' });
});
wellnessSection.addRow(row => {
row.addCheckbox('microchip', { label: 'Microchip Implant' });
row.addCheckbox('preventatives', {
label: 'Flea/Tick/Heartworm Prevention (3 months)'
});
});The vaccine package dropdown only appears when the owner checks "Vaccinations." No point showing core vs. full protection if they don't want vaccines at all. Same logic for the heartworm test - it only shows for dogs and cats because rabbits and birds don't get heartworm. Each conditional keeps the form focused on what actually applies to this particular pet and this particular visit.
Preventative medications are an upsell opportunity that benefits both the clinic and the pet. Most owners don't think to ask about flea and tick prevention during a vaccine visit. Putting it on the form as a checkbox plants the seed. A three-month supply is easier to say yes to than a year's worth.
Surgery Details
Surgery visits need specific information upfront so the clinic can prepare properly. The procedure type determines staffing, equipment, and time allocation. Pre-op add-ons like bloodwork and IV fluids affect both cost and safety.
const surgerySection = form.addSubform('surgery', {
title: 'Surgery Details',
isVisible: () => visitType.value() === 'surgery'
});
surgerySection.addRow(row => {
row.addDropdown('surgeryType', {
label: 'Procedure',
options: [
{ id: 'spay', name: 'Spay (Female)' },
{ id: 'neuter', name: 'Neuter (Male)' },
{ id: 'mass-removal', name: 'Mass/Tumor Removal' },
{ id: 'dental-extraction', name: 'Dental Extraction' },
{ id: 'foreign-body', name: 'Foreign Body Removal' },
{ id: 'acl', name: 'ACL/Cruciate Repair' },
{ id: 'fracture', name: 'Fracture Repair' },
{ id: 'bladder-stones', name: 'Bladder Stone Removal' }
],
isRequired: true
});
});
surgerySection.addRow(row => {
row.addCheckbox('preSurgeryBloodwork', {
label: 'Pre-Surgery Blood Panel',
defaultValue: true,
tooltip: 'Recommended for anesthesia safety'
});
row.addCheckbox('ivFluids', {
label: 'IV Fluids During Surgery',
defaultValue: true
});
});
surgerySection.addRow(row => {
row.addCheckbox('painMeds', {
label: 'Pain Medication (take-home)',
defaultValue: true
});
row.addCheckbox('eCollar', {
label: 'E-Collar/Cone',
defaultValue: true
});
});Pre-surgery bloodwork defaults to checked because it's a safety recommendation, not an upsell. IV fluids and pain medication are the same - they default to on because any responsible clinic would recommend them. The e-collar prevents pets from tearing at incision sites. Defaulting these to true means the owner has to actively opt out, which naturally leads to a conversation about why they're important rather than the clinic having to sell each item individually.
Learn how conditional visibility keeps forms focused.
Emergency Visits
Emergencies are different from every other visit type. The owner is stressed, the pet may be in pain, and speed matters more than thoroughness. The form should collect just enough information to triage effectively without slowing anyone down.
const emergencySection = form.addSubform('emergency', {
title: 'Emergency Details',
isVisible: () => visitType.value() === 'emergency'
});
emergencySection.addRow(row => {
row.addDropdown('emergencyType', {
label: 'Emergency Type',
options: [
{ id: 'trauma', name: 'Trauma/Injury' },
{ id: 'toxin', name: 'Toxin Ingestion' },
{ id: 'gi', name: 'GI Emergency (vomiting, bloat)' },
{ id: 'respiratory', name: 'Respiratory Distress' },
{ id: 'seizure', name: 'Seizures' },
{ id: 'urinary', name: 'Urinary Blockage' },
{ id: 'other', name: 'Other Emergency' }
],
isRequired: true
});
});
emergencySection.addRow(row => {
row.addDropdown('emergencySeverity', {
label: 'Severity Level',
options: [
{ id: 'minor', name: 'Minor (stable, non-critical)' },
{ id: 'moderate', name: 'Moderate (needs prompt treatment)' },
{ id: 'serious', name: 'Serious (hospitalization likely)' },
{ id: 'critical', name: 'Critical (ICU/surgery needed)' }
]
});
row.addCheckbox('afterHours', {
label: 'After-Hours/Weekend Visit',
tooltip: 'Emergency fees are typically 30-50% higher outside business hours'
});
});Severity level helps the clinic prioritize. A stable, non-critical pet can wait if there's a critical case ahead of them. The after-hours checkbox is important for pricing transparency - emergency fees outside business hours are typically 30-50% higher, and owners need to know that before they arrive. Surprising someone with a $200 surcharge when their pet is already on the table destroys trust.
Emergency type helps the vet prepare before the pet arrives. Toxin ingestion needs activated charcoal on hand. A GI emergency might need X-ray or ultrasound equipment ready. Respiratory distress means oxygen support standing by. The difference between "pet is on the way" and "pet with suspected bloat is on the way" is the difference between scrambling and being ready.
Cost Estimates
Veterinary pricing is one of the most common sources of friction between clinics and pet owners. Owners feel blindsided by costs they didn't expect. Clinics feel defensive explaining prices during an emotional moment. A cost estimate in the intake form solves both problems. The owner sees a range before they walk in. The conversation shifts from "why does this cost so much" to "I see the estimate was $300-500, where do we land?"
const calculatePricing = () => {
const visit = visitType.value();
const size = petSize.value() || 'medium';
const sizeMultiplier: Record<string, number> = {
'small': 0.8, 'medium': 1.0, 'large': 1.3, 'giant': 1.6
};
const mult = sizeMultiplier[size] ?? 1.0;
let low = 0, high = 0;
if (visit === 'wellness') {
if (examFee.value()) { low += 50; high += 100; }
if (vaccinations.value()) {
const pkg = vaccinePackage.value() || 'recommended';
const costs = { 'core': [40, 80], 'recommended': [80, 150], 'full': [150, 250] };
const [l, h] = costs[pkg] ?? [80, 150];
low += l; high += h;
}
if (heartwormTest.value()) { low += 35; high += 60; }
if (bloodwork.value()) { low += 100; high += 200; }
if (microchip.value()) { low += 45; high += 75; }
if (preventatives.value()) { low += 50 * mult; high += 100 * mult; }
}
if (visit === 'surgery') {
const surgeryCosts = {
'spay': [200, 500], 'neuter': [150, 400],
'mass-removal': [300, 1500], 'acl': [2500, 5000],
'fracture': [1500, 4000], 'foreign-body': [1500, 4000]
};
const [sl, sh] = surgeryCosts[surgeryType.value()] ?? [500, 2500];
low += sl * mult; high += sh * mult;
if (preSurgeryBloodwork.value()) { low += 80; high += 150; }
if (ivFluids.value()) { low += 40; high += 80; }
}
if (visit === 'emergency') {
const severityCosts = {
'minor': [200, 500], 'moderate': [500, 1500],
'serious': [1500, 4000], 'critical': [3000, 10000]
};
const [el, eh] = severityCosts[emergencySeverity.value()] ?? [500, 1500];
low += el + 100; high += eh + 200;
if (afterHours.value()) { low *= 1.3; high *= 1.5; }
}
return { low: Math.round(low), high: Math.round(high) };
};
resultsSection.addRow(row => {
row.addPriceDisplay('lowEstimate', {
label: 'Low Estimate',
computedValue: () => calculatePricing().low,
variant: 'default',
prefix: 'From'
});
row.addPriceDisplay('highEstimate', {
label: 'High Estimate',
computedValue: () => calculatePricing().high,
variant: 'default',
prefix: 'Up to'
});
});Ranges protect the clinic while setting expectations. A spay for a small dog costs less than a spay for a giant breed because everything scales - anesthesia, surgical time, and recovery monitoring. The size multiplier handles this automatically. Emergency pricing factors in severity and after-hours surcharges. The owner sees a realistic window, not a single number that might be wrong.
Using PriceDisplay with "From" and "Up to" prefixes makes the range feel deliberate rather than vague. It communicates that the clinic has thought about pricing carefully and is being transparent about the variables involved.
Owner Contact Information
Collect contact details last. By this point the owner has invested time selecting services and seeing cost estimates. They're more likely to complete the form than if you'd asked for their name and email first.
const contactSection = form.addSubform('contact', {
title: 'Owner Information'
});
contactSection.addRow(row => {
row.addTextbox('ownerName', {
label: 'Your Name',
isRequired: true
});
row.addTextbox('petName', {
label: 'Pet\'s Name',
isRequired: true
});
});
contactSection.addRow(row => {
row.addEmail('email', {
label: 'Email Address',
isRequired: true
});
row.addTextbox('phone', {
label: 'Phone Number',
placeholder: '(555) 123-4567',
isRequired: true
});
});Asking for the pet's name alongside the owner's name serves a practical purpose beyond the database. When the clinic calls to confirm the appointment, "Hi Sarah, we're looking forward to seeing Bella on Thursday" is warmer than "Hi, confirming your appointment." Pet owners respond to their pet's name being used. It signals that the clinic sees their animal as a patient, not a transaction.
Common Mistakes
Making the form too clinical. Pet owners aren't veterinary professionals. "Ovariohysterectomy" means nothing to most people - "Spay (Female)" does. Use plain language for every option, every label, every tooltip. If the owner has to Google a term on your form, you've lost them. Save the medical terminology for the chart.
Not handling emergencies differently. An emergency intake form should be fast and focused. Three fields maximum: what happened, how bad is it, when are you arriving. Don't ask emergency patients about vaccine packages or microchip implants. Conditional logic means emergency visits see only emergency questions. Everything else disappears.
Forgetting exotic pets. Roughly 10% of pet owners have birds, reptiles, or other exotics. If your form only has "dog" and "cat" as options, you're telling those owners you don't take their pets seriously. Include exotic options even if you refer them out - at least you're capturing the lead and directing them somewhere helpful instead of losing them entirely.
No cost transparency. Veterinary costs are the number one reason pet owners delay care. They don't know what a wellness visit costs, so they put it off. They don't know surgery pricing, so they agonize over the decision. Showing cost estimates in the intake form removes the fear of the unknown. Even a rough range like "$200-400 for a spay" is infinitely better than "we'll discuss pricing at the visit."
Common Questions
Should I show cost estimates or wait until the visit?
Show them in the form. Pet owners consistently rank cost transparency as their top concern when choosing a vet. A range estimate during intake builds trust and reduces sticker shock. It also pre-qualifies clients - someone who sees the range and still books is mentally prepared for that cost. You can always adjust the final number after examination.
How do I handle multiple pets?
Add a repeater section or let owners submit the form once per pet. Most clinics prefer one form per pet because each animal has its own medical record, visit type, and service selection. If a family brings in two dogs and a cat, three separate submissions give you three clean records. A short note field like 'scheduling together with another pet' handles the coordination side.
Should emergency visits use a different form?
No, use the same form with conditional logic. When the owner selects 'Emergency' as the visit type, the form strips down to only the essential questions - emergency type, severity, and contact info. This keeps everything in one system while giving emergency patients a fast, focused experience. Separate forms create maintenance headaches and confuse owners who aren't sure which one to use.
What about vaccination records upload?
A file upload field for vaccination records is useful but should be optional. Many owners don't have digital copies readily available, and requiring them creates a barrier to form completion. Let owners upload if they have records handy, but include a note that records can be transferred from their previous vet by phone. The intake form captures intent - the records transfer happens between clinics afterward.