spatie/laravel-livewire-wizard
Build multi-step Livewire wizards where each step is its own component, with easy navigation control and full access to regular Livewire features.
Architecture fit. spatie/laravel-livewire-wizard is a headless, thin orchestration layer over Livewire components. A WizardComponent declares an ordered array of StepComponent classes; each step is a normal Livewire component with its own state, validation, and rendering. This fits any Laravel application already standardized on Livewire 3, and it deliberately avoids owning UI, routing, or persistence. For a TPM, that means the package solves step sequencing and cross-step state access, while leaving the product surface (navigation, progress indicators, review screens, accessibility, analytics) as first-class delivery work.
Integration feasibility. Low-to-moderate. Installation is Composer-only, there are no migrations, service providers, or config surfaces to operate, and the public API is small (steps(), navigation helpers, state access including forStepClass, testability helpers such as testStep). The main effort is not package wiring but designing the wizard UX and deciding where step state lives. Multi-wizard-per-page and synthesizable state objects are supported in current releases, which covers most checkout/onboarding patterns.
Technical risk. Moderate, concentrated in product-level concerns rather than the package itself:
steps() or navigation logic, which can become bespoke code if flows are complex.Key questions.
Stack fit. Strong for Laravel + Livewire 3 shops building customer-facing multi-step flows: checkout, onboarding, KYC, insurance quotes, multi-part applications, and internal data-entry workflows. Weak for API-only services, non-Livewire front ends (Inertia/Vue/React), and Filament-heavy admin panels where the built-in wizard is closer to turnkey.
Migration path. Adopt incrementally rather than rewriting flows wholesale. Start with a single new or low-traffic wizard, keep existing controllers and Blade views intact, and mount the wizard as a Livewire component inside an existing route. If an existing multi-step flow is server-rendered with session state, the migration is mostly a state-relocation exercise: move per-step fields into StepComponent properties, move validation into per-step rules, and preserve the final submission endpoint so downstream integrations do not change.
Compatibility. Confirm the exact Livewire 3 minor and Laravel version against the package's released support range; pin the package version in composer.json and treat Livewire major upgrades as joint upgrade tickets. Validate that any custom Livewire features used elsewhere (volatile properties, wire:model variants, lifecycle hooks) behave identically inside StepComponent. If the application uses synthesizable objects or DTOs in step state, verify support on the installed package version.
Sequencing.
testStep, Livewire test helpers).Maintenance. Low package-level maintenance: MIT license, no infrastructure, no database footprint, and a small API surface. The real maintenance burden is the code you write around it — step components, navigation UI, state persistence, and validation rules. Treat those as product code with tests and owners, not as package configuration. Pin versions and schedule quarterly compatibility checks against Laravel and Livewire releases.
Support. No commercial SLA. Support is community-driven via GitHub issues and Spatie's documentation; Spatie's broader reputation and release discipline are the main mitigants. For business-critical flows (payments, regulated onboarding), plan internal ownership and a fork-or-replace contingency rather than relying on upstream response times.
Scaling. Runtime scaling mirrors Livewire: each step interaction is an HTTP request with a serialized component payload. Wizard payloads grow with the number and size of step properties, so keep step state lean, avoid large file payloads in component state, and move heavy artifacts to storage with references. Horizontal scaling is straightforward for stateless app servers, but any draft-persistence store (session or database) becomes part of the scaling and failover design. Cross-step state access is in-process and cheap; database writes should be confined to explicit finalization or save points.
Failure modes.
Ramp-up. Low for teams already fluent in Livewire (roughly days to first wizard); moderate for Laravel teams new to Livewire (one to two weeks to cover component lifecycle, state hydration, and testing patterns). Front-end/design effort for navigation, progress, and accessibility is the larger estimate and should be staffed accordingly. Recommend a single internal owner for the wizard pattern and a short internal guide covering step conventions, state persistence, validation, and testing, so subsequent wizards do not diverge.
How can I help you explore Laravel packages today?