Step-by-step workflows
Panel path in the starter is /admin. Navigation group: Forms.
Create a form (admin)
- Open Forms and click Create.
- On the Settings tab, enter a Name. Slug and public path auto-fill from the name on blur if they were empty.
- Adjust Public path if you want a friendlier URL. Conflicts get a short
-f{hash}suffix. The helper text shows the prefix (default/forms/{path}). - Choose Layout: Single page, Wizard, Tabs, or Pages.
- Optional: description, default label position, success message, redirect URL after submit, notify emails.
- Leave Published off until the builder is ready. Active defaults on. Both must be on for the public URL to work.
- Save. You return to the list (create redirects to index). Open the form again to continue building.
Add sections and fields
- Open the form and use the Builder tab (the tab is kept in the query string).
- Each section is a collapsed repeater row labeled with the section title. Drag to reorder. Clone a section if the layout allows more than one.
- Single page forms cannot add or delete extra sections (max 1).
- Inside a section, Add field. Collapsed rows show
Field label · type(or the internal name). - Set label (auto-slugs the internal name if empty), type, width on the 12-column grid, required, optional label position override, label override, placeholder, hint, extra Laravel rules, and visibility pair.
- For select/radio/multi-select/tags, add options. Collapsed option rows show the option label.
- Switch to Preview for a live schematic of sections and spans. It is not the interactive public form.
Publish and share
- Turn Published on (and keep Active on). Save.
- On the list, Open appears for published+active forms (new tab). The view page has Open public form.
- Share the URL shown under the form name (e.g.
/forms/contact-us).
Unpublished forms stay in the admin but 404 for guests.
Capture data on the public form
- Open the public URL. The page uses the package layout and CSS (no Filament theme required).
- Wizard / pages: complete the step, click Next or Save and continue. Only that section is validated. Drafts restore if the visitor comes back in the same session.
- Tabs: switch sections freely; everything validates on Submit.
- Required fields show an asterisk. Errors appear under the field.
- On success, the success message displays. If a redirect URL is set, a Continue link appears (the visitor is not force-redirected).
Review submissions
- Open Submissions, or the Submissions relation on a form’s view/edit.
- Header charts: submissions over the last 14 days, and status doughnut.
- Tabs: Table / New / Reviewed / Archived.
- Filters: form (on the global list), status, submitted between dates, Field contains (internal field name + substring).
- Open a row to see labeled answers (option values mapped to labels). Mark Reviewed or Archive.
- Bulk: change status, archive, export selected, delete (audit logged).
Statuses: New (warning), Reviewed (success), Archived (gray), Spam (danger).
Export CSV / Excel / PDF
- On the submissions list, click Export (needs
export_form_submissionsonce Shield has created it). - Choose CSV, Excel (XML), or PDF.
- A notification shows the absolute path on the exports disk (default
storage/app/form-builder-exports/). Download from the server or copy the file. - Or select rows and use Export selected.
Clone, JSON export, import custom fields
Clone (admin)
List action Clone copies schema and settings, generates a new UUID/slug/path, and leaves the copy unpublished.
Export JSON (admin)
On Edit, Export JSON writes storage/app/form-builder-exports/{slug}.json using document().
CLI import/export
php artisan form-builder:export --slug=contact-us
php artisan form-builder:import storage/app/form-builder-export.json --publish
Import from Dynamic Fields (developer)
There is no Filament button in v1.0.0. In tinker, a seeder, or your own action:
$form = \Spiggle\FormBuilder\Models\Form::query()->where('slug', 'contact-us')->first();
$form->importCustomFields([1, 2, 3]); // custom_fields.id values
Fields append to the last section as a snapshot. Later edits in Custom Fields do not update the form. Submissions still go to form_builder_submissions, never custom_field_values.
Validate and store from code
$rules = app(\Spiggle\FormBuilder\Services\ValidationBuilder::class)->rules($form);
$ok = Validator::make(['data' => $payload], $rules)->passes();
app(\Spiggle\FormBuilder\Services\SubmissionManager::class)
->capture($form, $payload, request(), ['source' => 'api']);
Listen to Spiggle\FormBuilder\Events\FormSubmitted to send mail to notify_emails (addresses are stored on the form; v1 does not send mail by itself).