Filament Approvals 1.0.0: multi-step approval workflows for any record
Stop hand-rolling status columns and if-statements: Filament Approvals adds multi-step, permission-gated approval chains with a full audit trail and a visual flow diagram to any Eloquent model.
By PtPlugins team
Every Filament app eventually grows a record that someone has to sign off on — an expense, a campaign, a document, a price change. And almost every team builds the same thing by hand: a status column, a couple of buttons wrapped in if ($user->can(...)), and a silent prayer that nobody approves their own request or skips the finance step. Then the requirements arrive: "Legal only needs to see it above €10k", "send it back to the author, but don't make them start over", "who approved this in March?" — and the hand-rolled version quietly becomes a project of its own.
Filament Approvals 1.0.0 is that project, done once, properly. Define the chain in plain PHP, drop the ready-made UI onto your resource, and every record gets a permission-gated, fully audited approval workflow — with a flow diagram your users can actually read:

The whole integration is one method and three drop-ins
Make any Eloquent model approvable:
class Expense extends Model implements HasApprovalWorkflow
{
use HasApprovals;
public function approvalWorkflow(): ApprovalWorkflow
{
return ApprovalWorkflow::make()
->step('manager', 'Manager', gate: 'approve-as-manager')
->step('finance', 'Finance', gate: 'approve-as-finance')
->step('director', 'Director', gate: 'approve-as-director',
condition: fn (Expense $e): bool => $e->amount > 10_000);
}
}
Then hand your resource the UI: ApprovalStatusColumn::make() for the badge, ...ApprovalActions::all() for Send / Approve / Return / Cancel (each one only visible to the user allowed to act on the record's current step), ApprovalsRelationManager for the history, and ApprovalFlowEntry::make() for the diagram above. No schema changes on your table — the whole history lives in one polymorphic approvals table shared by every approvable model.

What's in 1.0.0
- Audit-first state machine — submit / approve / return / cancel each append an immutable history row; the current status is derived from history, never stored. Status and audit trail cannot drift apart, and "who approved this in March?" is a table you already have.
- Conditional steps — a step whose condition fails for a record is transparently skipped (and shown as skipped on the diagram). Small expenses never see the Director.
- Return & resume — a returned record goes back to its author with a required comment; re-submitting resumes at the step that returned it, or restarts the whole chain if you prefer (
restartAfterReturn()). - Pluggable authorization — the bundled gate checks step abilities through Laravel's
can(); bind your ownApprovalGateto integrate Filament Shield, spatie/permission or record-level rules like "authors can't approve their own submissions". - The flow diagram — a self-contained node graph (scoped CSS + inline SVG, immune to your Tailwind purge) coloured by real progress: done, awaiting, upcoming, returned, skipped, cancelled. Also available headless via
WorkflowDiagram::for($record)for custom views. - Single codebase across Filament 3, 4 and 5.
Here is the less happy path, which is where approval tools usually fall apart: a record returned by Sales on a team with no Team Lead. The diagram shows the skipped step and the returning one, and the audit trail below it keeps the reviewer's comment:

Try it
Click through the full workflow — submit, approve, return, cancel, all five states — in the live demo, no signup needed. Filament Approvals is a Pro plugin distributed through our private Composer registry — see the plugin catalogue for availability and pricing.
Released July 18, 2026.
Try PtPlugins
Premium Filament plugins, built for production.
Pivot tables, model merging, deduplication, and more — with live demos you can try right now.