How to Add Public-Facing Forms to Your Filament App | FilaForms                                   [ ![Filaforms Logo](https://filaforms.app/logo.svg)FilaForms

 ](https://filaforms.app)   [ Features ](https://filaforms.app#features) [ Documentation ](https://docs.filaforms.app) [ Blog ](https://filaforms.app/blog) [ Pricing ](https://filaforms.app#pricing)   [ Try Demo ](https://filaforms.app/login) [ Get Started ](https://filaforms.app#pricing)

  [ Features ](https://filaforms.app#features) [ Documentation ](https://docs.filaforms.app) [ Blog ](https://filaforms.app/blog) [ Pricing ](https://filaforms.app#pricing) [ Try Demo ](https://filaforms.app/login) [ Get Started ](https://filaforms.app#pricing)

   ![FilaForms](https://filaforms.app/logo.svg) FilaForms

 TutorialsHow to Add Public-Facing Forms to Your Filament App
===================================================

 filaforms.app/blog

  [    Back to blog ](https://filaforms.app/blog) [ Tutorials ](https://filaforms.app/blog/category/tutorials)

How to Add Public-Facing Forms to Your Filament App
===================================================

 Manuk Minasyan ·  March 16, 2026  · 7 min read

 Filament is great for admin panels. But the moment you need a form that unauthenticated users can fill out, you're on your own. There's no built-in way to expose a Filament form to the public internet without writing custom routes, controllers, and Livewire components from scratch. FilaForms solves this. It gives you a drag-and-drop form builder inside your Filament panel and generates public URLs that anyone can access. In this tutorial, I'll walk through the full setup: installation, creating your first form, making it public, and embedding it anywhere in your Laravel app. ## What You'll Need Before Starting Make sure your project meets these requirements: - PHP 8.3 or higher - Laravel 11+ or 12+ - Filament 5.x If you're running an older Filament version, you'll need to upgrade first. The \[FilaForms documentation\](https://docs.filaforms.app/) covers version compatibility in more detail. ## Installing FilaForms Pull in the package via Composer: `bash composer require filaforms/core ` Publish the config file and run migrations: `bash php artisan vendor:publish --tag="filaforms-config" php artisan migrate ` Then register the plugin in your Filament panel provider. Open your panel's `PanelProvider` class and add it to the `plugins` array: `php use FilaForms\\Core\\FilaFormsPlugin; public function panel(Panel $panel): Panel { return $panel -&gt;plugins(\[ FilaFormsPlugin::make(), \]); } ` After this, you'll see a new "Forms" section in your Filament sidebar. That's your form builder. ## Creating Your First Form Navigate to the Forms section in your admin panel. Click "Create Form" and give it a name, something descriptive like "Contact Form" or "Beta Signup." The builder uses drag-and-drop with 25+ field types. You can add text inputs, selects, textareas, checkboxes, file uploads, and more. Conditional logic lets you show or hide fields based on previous answers, and multi-step forms let you break longer forms into pages. For a simple contact form, you'd add: - A text input for "Name" (required) - An email input for "Email" (required) - A textarea for "Message" (required) - A select for "Subject" with options like "General Inquiry", "Bug Report", "Feature Request" Build the form visually, set your field validations, and save it. ## Making a Form Public Here's where it gets interesting. By default, your forms only exist inside the admin panel. To make one accessible to the public, you need two things: 1. The form's `is\_public` flag set to `true` 2. The form's `active` flag set to `true` Toggle both of these in the form editor. Once enabled, your form gets a public URL at `/filaforms/{ulid}`, where the ULID is a unique identifier generated automatically. The URL looks something like: `https://yourapp.com/filaforms/01HQ3K5V8R2N4M6P7T9W0X1Y2Z` The `PUBLIC\_FORMS` feature flag controls whether public form routes are registered at all. It's enabled by default, so you shouldn't need to change anything unless you've explicitly disabled it. ### Route Configuration The default routing config lives in `config/filaforms.php`: `php 'routes' =&gt; \[ 'enabled' =&gt; true, 'prefix' =&gt; 'filaforms', 'middleware' =&gt; \['web'\], 'domain' =&gt; null, \], ` You can change the prefix if you want cleaner URLs. Set `'prefix' =&gt; 'forms'` and your public URL becomes `/forms/{ulid}` instead. The `domain` option lets you serve forms from a subdomain like `forms.yourapp.com` if that fits your setup. The middleware array defaults to `web`, which gives you session handling and CSRF protection. Add any custom middleware here if you need rate limiting or additional checks. ### Controlling Form Availability Beyond the basic public/active flags, FilaForms gives you fine-grained control over when and how a form accepts submissions: - \*\*starts\_at / ends\_at\*\* — Set a date range. The form only accepts submissions within this window. Useful for event registrations or limited-time surveys. - \*\*maxSubmissions\*\* — Cap the total number of submissions. Once the limit hits, the form closes automatically. - \*\*onePerPerson\*\* — Restrict to one submission per person. Prevents duplicate entries without you writing any deduplication logic. These options are all configurable from the form editor. No code needed. ## Embedding Forms in Your Laravel Views The public URL works well for standalone forms. But what if you want to embed a form directly into one of your existing pages? FilaForms ships a Livewire component for exactly this. ### Embedding an Existing Form If you've already built a form in the admin panel, pass the form model to the component: `php ` In your controller or Livewire component, load the form however you'd normally load an Eloquent model: `php use FilaForms\\Core\\Models\\Form; public function show(string $ulid) { $form = Form::where('ulid', $ulid) -&gt;where('is\_public', true) -&gt;where('active', true) -&gt;firstOrFail(); return view('forms.show', compact('form')); } ` This gives you full control over the surrounding page layout. Wrap the form in your marketing site's header and footer. Add context above it. Put it inside a card component. The form itself renders with all the logic you configured in the builder, including validation, conditional fields, and multi-step navigation. ### Standalone Mode with JSON Schema There's a second approach if you want to define forms in code rather than through the admin builder. FilaForms supports standalone rendering from a JSON schema: `php ` This is useful when you're generating forms dynamically, maybe from an API response or a configuration file. The schema defines the fields, validation rules, and layout without needing a database record. ## What Happens After Submission Every public form needs to do something when a user submits it. FilaForms handles this with two options: \*\*Success message\*\* — Show a confirmation message on the same page. The default is a simple "Thank you" message, but you can customize the text per form. \*\*Redirect URL\*\* — Send the user to a different page after submission. Point them to a thank-you page, a dashboard, or back to your homepage. Both options are set per form in the admin builder. Submissions are stored in your database and visible in the Filament admin panel, so you never lose data regardless of the post-submit behavior. ## Spam Protection Public forms attract spam. FilaForms includes honeypot protection enabled by default. A hidden field gets added to every public form. Bots that fill in the hidden field get their submissions rejected silently. Real users never see it. This is a zero-config solution. You don't need to set up reCAPTCHA or any external service. The honeypot approach handles the majority of automated spam without adding friction for legitimate users. If you're dealing with more sophisticated spam, you can add additional middleware to the form routes in the config file, or layer on your own validation in a custom submission handler. ## A Complete Example: Event Registration Form Let me tie everything together with a real scenario. Say you're building an event registration form for a Laravel meetup. 1. Install FilaForms (covered above) 2. Create a new form called "Laravel Meetup Registration" 3. Add fields: Name (text), Email (email), Company (text, optional), Dietary Restrictions (select: None, Vegetarian, Vegan, Gluten-Free) 4. Set `is\_public` and `active` to true 5. Set `maxSubmissions` to 100 (limited seating) 6. Set `starts\_at` to two weeks before the event, `ends\_at` to the day before 7. Set the post-submit redirect to your event details page Now embed it on your event page: ```blade @extends('layouts.marketing') @section('content')

[\#](#register-for-laravel-meetup-yerevan "Permalink")Register for Laravel Meetup Yerevan
=========================================================================================

@endsection ``` The form handles everything: validation, submission storage, the 100-person cap, the date window, and spam protection. You wrote zero form logic. ## Where to Go from Here You've got public-facing forms running in your Filament app. The \[FilaForms documentation\](https://docs.filaforms.app/) covers more advanced features like conditional logic rules, multi-step form configuration, and customizing form themes. If you want to skip building forms by hand and get a full form builder inside your Filament panel, \[give FilaForms a try\](https://filaforms.app).

 Related posts
-------------

 [  Tutorials   Apr 16, 2026

 Conditional Logic in Laravel Forms: When Fields Should Show (and Hide)
------------------------------------------------------------------------

You've built a form with ten fields, and half of them only matter sometimes. A "Company Name" field that nobody filling out a personal inquiry should ever see. A "Budget Range" dropdown that makes no sense until someone picks "Enterprise" from the plan selector. You know the drill.

 ](https://filaforms.app/blog/conditional-logic-in-laravel-forms-when-fields-should-show-and-hide) [  Tutorials   Apr 9, 2026

 Multi-Step Forms in Filament: A Complete Guide
------------------------------------------------

Long forms kill completion rates. You already know this. If you've ever put 15 fields on a single page and wondered why nobody finishes it, the answer is o

 ](https://filaforms.app/blog/multi-step-forms-in-filament-a-complete-guide) [  Tutorials   Apr 2, 2026

 Form Submission Tracking and Analytics in Laravel — Without Third-Party Tools
-------------------------------------------------------------------------------

You built a form. You embedded it on your site. People are submitting it. But how many people saw the form and didn't submit? How many started filling it o

 ](https://filaforms.app/blog/form-submission-tracking-and-analytics-in-laravel-without-third-party-tools)

    ![FilaForms Logo](/logo.svg) FilaForms

 Laravel form infrastructure for Filament. Stop rebuilding forms on every project.

 ### Product

 [ Features ](https://filaforms.app#features) [ Documentation ](https://docs.filaforms.app) [ Blog ](https://filaforms.app/blog) [ Pricing ](https://filaforms.app#pricing) [ Contact ](mailto:hello@filaforms.app)

 ### Legal

 [ Terms of Service ](https://filaforms.app/terms-of-service) [ Privacy Policy ](https://filaforms.app/privacy-policy)

  © 2025-2026 FilaForms. All rights reserved.

 [    ](mailto:hello@filaforms.app) [    ](https://x.com/MinasyanManuk)
