concept7/filament-invite
A Filament plugin for inviting users to your panel. Send email invitations, generate secure signed links, track pending invites, resend or revoke them, and assign roles or permissions when invitations are accepted—all from a simple Filament resource.
v2.0.2 is a compatibility patch: the only change is a widened laravel/framework (and by extension supporting dependency) constraint to allow installing on Laravel 13 (#26). There are no API, config, or migration changes versus v2.0.1, so if you are already on 2.x you can upgrade with a normal composer update concept7/filament-invite and re-run your test suite.
If you are picking the package up for the first time:
composer require concept7/filament-invitephp artisan vendor:publish --tag="filament-invite-migrations" then php artisan migrate. Check database/migrations for the invitations table before assuming the tag name — vendor tags vary between releases.php artisan vendor:publish --tag="filament-invite-config".PanelProvider::panel() chain — usually ->plugin(FilamentInvitePlugin::make()).User (or App\Models\User) model so invitees can be persisted and later accept.FilamentUser with canAccessPanel()), otherwise the invitee lands on a panel they cannot enter.First real use case: log into /admin, open the invitations resource, invite a teammate by email, and confirm they can complete registration from the signed link. That single loop exercises mail, token generation, and the accept route — if all three work, the rest of the package is configuration.
Where to look first when something is off: the published config (expiry, guard, redirect targets), the package's routes file (php artisan route:list --path=invite), and the notification class — the email is the thing most likely to be customised or swapped.
Panel-scoped registration. Register the plugin only on the panels that should expose invitations. Multi-panel apps frequently want invites on an admin panel but not on a customer-facing panel; doing this per-provider keeps the resource and routes out of the panels that don't need them.
Role/tenant assignment on accept. The most common day-to-day extension is granting something at acceptance time. Listen for the package's accept event (or override the accept controller/action) and attach a role, set tenant_id, or assign a team. This keeps the invite resource generic while your app encodes its own onboarding rules.
Invite-then-approve workflows. Because invitations are persisted rows, they double as an audit trail. Query them directly to build "pending invites" widgets, resend flows, or cleanup jobs that purge expired rows on a schedule — cheaper than re-deriving state from mail logs.
Pairing with Filament's own user management. Filament v3/v4 panels typically already have a UserResource. Keep invitations as the creation path and the user resource as the editing path; avoid duplicating "create user" forms in both places or your validation rules will drift.
Testing. Use Notification::fake() and assert the invitation notification was sent, then pull the token from the persisted invitation record rather than parsing the email body. This keeps tests stable if you swap the notification's markdown view.
CI matrix. With the Laravel 13 constraint now allowed, add 13.* to your dependency matrix. If you support both Laravel 12 and 13, pin with "laravel/framework": "^12.0|^13.0" in your root composer and let the package float — Composer will resolve the matching package version per job.
Integration tip. If you customise the accept redirect, prefer config over editing vendor-published views; published views are the first thing to fall out of sync on the next minor release.
filament/filament or another dependency caps the framework. Run composer why-not laravel/framework 13.* before filing a bug against this package.vendor:publish will silently skip the existing file. Diff the package's database/migrations directory against your database/migrations after minor upgrades.->unique() rule or an observer.MAIL_MAILER=log means invites "work" but nobody receives anything; and queued notifications need a running worker. Check failed_jobs first when an invite is reported missing.composer update and will not survive the next compatibility bump like this one.php artisan route:list --path=invite to confirm the route exists on the right panel, then verify APP_URL — signed URLs generated under the wrong host fail validation with a generic 403 that looks like a token problem.How can I help you explore Laravel packages today?