Healthcare template

Register new patients with contact, insurance and consent details

Import a Laravel patient intake form for Filament, collect contact, insurance, and consent details, then handle each submission in Laravel.

Open this template in the demo builder 15 fields, 9 required. Free demo account, no card.

Updated

This Laravel patient intake form gives new patients one place to provide contact, insurance, and consent details before a first visit. Import it into FilaForms, review the rendered field table, and connect each submission to the clinic workflow your Laravel application already runs.

After submission, the response appears in the dashboard for staff review. Your application can also route the patient's email, treatment consent, and signature to an intake queue, appointment workflow, or protected review record. The template provides the collection point, while your application keeps control of the next step.

Patients should not have to repeat the same information across every intake step. Experian Health's 2024 State of Patient Access report found that 85% of patients dislike repetitive paperwork during intake. Use the form as the earliest shared record of the details staff need before the visit.

FilaForms is a Laravel form builder for Filament for teams that want to manage forms in the application they run. Staff can adjust the imported form visually, while developers can keep routing and review rules in Laravel code. The settings block controls the form's behaviour without turning the page into a second definition of the template.

Fields in this template (15 fields, 9 required)

Field types used: Text, Date, Email, Phone Number, Textarea, Select, File Upload, Toggle, Signature. Every field is editable in the builder after import.

Patient Details

Field Type Required Validation
Full Name full_name Text Yes required
Date of Birth date_of_birth Date Yes required
Email Address email Email Yes required | email
Phone Number phone Phone Number Yes required
Home Address address Textarea Yes required
Preferred Pronouns pronouns Text No none
Preferred Language language Select, 7 options No none

Emergency and Insurance

Field Type Required Validation
Emergency Contact Name emergency_name Text Yes required
Emergency Contact Phone emergency_phone Phone Number Yes required
Insurance Provider insurer Text No none
Policy Number policy_number Text No none
Insurance Card insurance_card File Upload No none

Consent

Field Type Required Validation
I consent to treatment treatment_consent Toggle Yes required
I consent to my records being shared with my GP records_consent Toggle No none
Signature signature Signature Yes required

What happens after someone submits

The field table above separates patient identity, insurance details, and consent because each supports a different decision. Intake staff need reliable contact details when confirming an appointment. Billing staff may need insurance context later. Clinical staff need a clear record of consent before they act on a submitted request.

Treat the submitted response as an intake record, not an approved patient record. A patient can enter inaccurate information, omit important context, or submit before staff confirm eligibility and appointment details. Keep the original submission available to reviewers, then create verified records through the workflow that owns them.

Decide who receives a new intake first. A smaller clinic may send every submission to a shared review queue. A larger clinic may route by location, appointment type, or service line. Keep the rule in the application process that staff can maintain and explain.

The listener below reads email, treatment_consent, and signature from the submitted data. It logs a structured handoff with the form and submission identifiers. Replace logging with the existing workflow that creates a review task or notifies the responsible staff member.

Save this listener as app/Listeners/RoutePatientIntakeSubmission.php. Laravel 12 discovers listeners in app/Listeners automatically.

<?php

namespace App\Listeners;

use FilaForms\Core\Events\FormSubmitted;
use Illuminate\Support\Facades\Log;

final class RoutePatientIntakeSubmission
{
    public function handle(FormSubmitted $event): void
    {
        $data = $event->submission->data;

        Log::info('Patient intake submission received', [
            'form_id' => $event->form->getKey(),
            'submission_id' => $event->submission->getKey(),
            'email' => $data['email'] ?? null,
            'treatment_consent' => $data['treatment_consent'] ?? null,
            'signature' => $data['signature'] ?? null,
        ]);
    }
}

Avoid copying the full submission into broad email notifications or chat messages. Send staff to the protected record when they need the complete intake. That choice reduces duplicate copies and lets access rules stay with the system that stores the response.

Use the submission identifier when a later workflow creates a patient, appointment, or internal review task. The identifier links the outcome back to what the patient originally provided. It also gives staff a path to investigate a dispute or correction without relying on a paraphrased note.

Adapting this template for a specialist clinic

A specialist clinic that receives patients from other doctors' offices can add a referring_physician field. Ask for it when the referring practice affects scheduling, document requests, or the appointment handoff. Keep the question focused on the information your staff will use.

Do not make a referral field substitute for referral review. A patient may not know the clinician's full name, and a referring office may need to provide separate records. Use the form to capture the starting context, then let staff apply the clinic's established referral process.

Specialist clinics can also adjust wording around consent to match the treatment they offer. Review the language with the people responsible for clinical and legal decisions. Make any resulting workflow explicit, including who checks the response and when an appointment can proceed.

The signature field is not a legally binding e-signature, and using this form is not a HIPAA compliance claim by itself. Do not represent the captured signature as either. Your clinic must assess its own legal, privacy, security, retention, access, and audit requirements.

Keeping intake and patient records distinct

An intake submission records information at a particular moment. A patient record may need corrections, verification, retention rules, and permissions that differ from the submission. Keeping these records distinct prevents an unreviewed answer from becoming a confirmed clinical fact by accident.

Define the point where staff move information from intake to a patient record. That may happen after insurance verification, referral review, or an appointment confirmation. Record who made the decision in the workflow that owns the patient record, rather than inferring approval from form completion.

When a patient asks to correct an answer, preserve enough context to understand the change. The original submission and the later verified record can serve different purposes. Your application should make that relationship clear to staff who review the intake later.

Review the FilaForms features for Laravel and Filament when the workflow needs conditional questions, multi-step forms, notifications, or submission reporting. Keep the intake form focused on the information your clinic can review and use before the first visit.

Use this template in your own application

With FilaForms installed, one call creates the form with every field, rule, and setting listed above. Then edit it in the builder.

use FilaForms\Core\Support\FormTemplates;

$form = FormTemplates::createFormFromTemplate('patient-intake');
Template schema (JSON)
{
    "name": "Patient Intake Form",
    "description": "Register new patients with contact, insurance and consent",
    "icon": "heroicon-o-clipboard-document",
    "category": "Healthcare",
    "popularity": "Very High",
    "sections": [
        {
            "name": "Patient Details",
            "fields": [
                {
                    "label": "Full Name",
                    "type": "text",
                    "code": "full_name",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Date of Birth",
                    "type": "date",
                    "code": "date_of_birth",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Email Address",
                    "type": "email",
                    "code": "email",
                    "required": true,
                    "validation": [
                        {
                            "name": "email",
                            "parameters": []
                        }
                    ],
                    "width": "50"
                },
                {
                    "label": "Phone Number",
                    "type": "phone",
                    "code": "phone",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Home Address",
                    "type": "textarea",
                    "code": "address",
                    "required": true,
                    "width": "100"
                },
                {
                    "label": "Preferred Pronouns",
                    "type": "text",
                    "code": "pronouns",
                    "required": false,
                    "width": "50"
                },
                {
                    "label": "Preferred Language",
                    "type": "select",
                    "code": "language",
                    "required": false,
                    "options": [
                        {
                            "value": "English"
                        },
                        {
                            "value": "Spanish"
                        },
                        {
                            "value": "French"
                        },
                        {
                            "value": "German"
                        },
                        {
                            "value": "Arabic"
                        },
                        {
                            "value": "Mandarin"
                        },
                        {
                            "value": "Other"
                        }
                    ],
                    "width": "50"
                }
            ]
        },
        {
            "name": "Emergency and Insurance",
            "fields": [
                {
                    "label": "Emergency Contact Name",
                    "type": "text",
                    "code": "emergency_name",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Emergency Contact Phone",
                    "type": "phone",
                    "code": "emergency_phone",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Insurance Provider",
                    "type": "text",
                    "code": "insurer",
                    "required": false,
                    "width": "50"
                },
                {
                    "label": "Policy Number",
                    "type": "text",
                    "code": "policy_number",
                    "required": false,
                    "width": "50"
                },
                {
                    "label": "Insurance Card",
                    "type": "file-upload",
                    "code": "insurance_card",
                    "required": false,
                    "width": "50"
                }
            ]
        },
        {
            "name": "Consent",
            "fields": [
                {
                    "label": "Privacy Notice",
                    "type": "section-divider",
                    "code": "privacy_divider",
                    "required": false,
                    "placeholder": "Privacy Notice",
                    "width": "100"
                },
                {
                    "label": "I consent to treatment",
                    "type": "toggle",
                    "code": "treatment_consent",
                    "required": true,
                    "description": "Your records are held under the practice privacy policy",
                    "width": "50"
                },
                {
                    "label": "I consent to my records being shared with my GP",
                    "type": "toggle",
                    "code": "records_consent",
                    "required": false,
                    "width": "50"
                },
                {
                    "label": "Signature",
                    "type": "signature",
                    "code": "signature",
                    "required": true,
                    "width": "100"
                }
            ]
        }
    ]
}

Frequently asked questions

What happens after a patient submits this form?
The submission appears in the dashboard, where a Laravel listener can route the patient's email, treatment consent, and signature to a review workflow.
Can I adapt this form for a specialist clinic?
Yes. Add a `referring_physician` field when other doctors' offices send patients to your specialist clinic.
How do I handle a submitted patient intake form in Laravel?
Listen for `FilaForms\\Core\\Events\\FormSubmitted` and read `email`, `treatment_consent`, and `signature` from the submission data.
Does the signature make this form legally binding or HIPAA compliant?
No. The signature field is not a legally binding e-signature, and using this form is not a HIPAA compliance claim by itself.

More templates