How to add public-facing forms to your Filament app
How to add public-facing forms to your Filament app
If you've built anything with Filament, you know this moment: your admin panel works, your resources are organized, everything's humming along. Then someone says "we need a contact form on the website."
Suddenly you're building public-facing forms outside Filament's comfort zone.
The problem with public forms in Filament
Filament was built for admin panels. It handles the backend well. But the moment you need a form that visitors fill out (contact form, survey, job application, registration), you're on your own.
The standard approach goes something like this:
- Create a Livewire component
- Import Filament's form package into it
- Build out the form schema manually in PHP
- Handle the submission logic
- Deal with validation
- Set up email notifications
- Build a way to view submissions in the admin
- Figure out styling (Filament's form styles don't just work on public pages)
- Realize you also need spam protection
- Wonder why you're spending three days on a contact form
That last step is the real one. You're rebuilding form infrastructure that already exists, every time.
Why Filament's built-in forms don't solve this
Filament's form builder package can technically run in a standalone Livewire component. The docs explain how. But there's a big gap between "technically possible" and "ready for production."
Here's what you still have to build yourself:
Submission storage. Where do responses go? You need a database table, a model, migrations.
Submission management. How do you view, filter, search, and export responses? You need a Filament resource for that.
Notifications. Admin gets an email when someone submits. Submitter gets a confirmation. You need to wire up mailables, queue them, handle failures.
Analytics. How many people viewed the form vs. started filling it out vs. actually submitted? You have no idea unless you build tracking.
Spam protection. Bots will find your form within hours. Honeypot fields, rate limiting, CSRF. Someone has to implement all of that.
Each of these takes a day. Maybe two. For every project.
What FilaForms does instead
FilaForms is a Filament plugin that handles all of the above. Install it, register it in your panel, and you get:
A visual form builder. Drag and drop, 25+ field types, conditional logic, multi-step forms. You build the form in your Filament admin panel, and it generates a public URL that visitors can access.
Submission management. Every response shows up in your admin panel. Filter, search, view details, bulk export to CSV. It's a Filament resource, so it works like the rest of your admin.
Built-in analytics. Form views, form starts, submissions, completion rate, average completion time. No third-party tracking needed. All data stays on your server, anonymized with SHA-256 fingerprinting.
Notifications out of the box. Admin email alerts, auto-responder emails to submitters, in-app Filament notifications. Toggle them on or off per form.
Spam protection. Honeypot fields, CSRF protection, XSS prevention, input sanitization. Enabled by default.
The installation takes about two minutes:
composer require filaforms/corephp artisan filaforms:install
Register the plugin in your panel provider:
use FilaForms\Core\FilaFormsPlugin;public function panel(Panel $panel): Panel{ return $panel ->plugins([ FilaFormsPlugin::make(), ]);}
That's it. "Fila Forms" appears in your Filament sidebar. Click it, create a form, publish it, share the URL.
A real example: contact form
Say your Laravel app needs a contact form at yoursite.com/forms/contact.
Without FilaForms, you'd create a Livewire component, write the form schema, create a ContactSubmission model, write a migration, build the validation rules, create a mailable for notifications, set up a Filament resource to view submissions, and add some basic spam protection. Conservatively, that's half a day.
With FilaForms, you open the form builder in your admin panel, drag in a text field for "Name", an email field for "Email", a textarea for "Message", toggle on admin notifications, and click publish. Five minutes, maybe.
The difference matters more by the second project. By the tenth, you've saved weeks. You stop rebuilding the same plumbing.
What about styling?
One of the biggest headaches with Filament forms on public pages is CSS. Filament's styles are scoped to the admin panel. Getting them to render correctly on a public page, with your own Tailwind config and your own theme, turns into a fight.
If you've browsed the Filament GitHub discussions, you've seen threads like "Forms on public facing pages styling issues" and "Public facing Filament 4 form with Tailwind 4." These come up constantly.
FilaForms handles its own rendering. You add the plugin's views to your Tailwind CSS theme file:
/* resources/css/filament/admin/theme.css */@source "../../../../vendor/filaforms/core/resources/views/**/*.blade.php";@source "../../../../vendor/relaticle/custom-fields/resources/views/**/*.blade.php";
The forms render cleanly on public pages without fighting your existing styles.
When you might not need this
If you have one form in one project and you enjoy writing form code, build it yourself. Seriously. It's good practice and you'll understand the internals better.
But if you're running multiple Laravel/Filament projects, or your app needs more than a couple of forms, or you'd rather spend time on actual product features, that's when a dedicated form plugin pays for itself in the first week.
Getting started
FilaForms requires PHP 8.3+, Laravel 11+, and Filament 4.x or 5.x. It's a commercial plugin with a one-time license fee (no recurring subscription).
Full docs are at docs.filaforms.app. You can also try the demo to see the builder in action before purchasing.