Installation
Requirements
| Package | Filament | Laravel | PHP |
|---|---|---|---|
1.x |
^5.0 |
^12.0 / ^13.0 |
8.3+ |
Optional: spatie/laravel-permission (teams feature) and bezhansalleh/filament-shield for Shield-managed roles; packstub/filament-tenancy for database-per-tenant apps.
Purchasing a license
Licenses are sold at packstub.dev/plugins/filament-teams. After purchase, create an access token on the Install Guide page of your Packstub dashboard — it shows the commands below with your token filled in.
Installing with Composer
composer config repositories.packstub-filament-teams composer https://packstub.dev/composer/filament-teams
composer config --auth http-basic.packstub.dev pkg_xxxxxxxxxxxxxxxx your-token-secret
composer require packstub/filament-teams
php artisan packstub-teams:install
The installer publishes config/packstub-teams.php and two migrations: create_team_user_table (the membership pivot) and create_team_invitations_table. Already have a pivot — for example Filament Tenancy's tenant_user? Delete the first migration and point the config at yours (Filament Tenancy →).
Models
use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasTenants;
use Packstub\Teams\Concerns\HasTeamMemberships;
class User extends Authenticatable implements FilamentUser, HasTenants
{
use HasTeamMemberships; // joinedTeams(), teamRole(), hasTeamRole(), hasTeamPermission(), ownsTeam(), getTenants(), canAccessTenant()
}
use Packstub\Teams\Concerns\HasTeamMembers;
class Team extends Model
{
use HasTeamMembers; // members(), owners(), invitations(), roleOf(), seatsUsed(), hasAvailableSeats()
}
Both traits are conveniences: every lookup also exists on the Teams service (Teams::membersOf(), teamsOf(), isMember(), roleOf(), …) for models you don't control.
Panel
use Packstub\Teams\Filament\Pages\Auth\Register;
use Packstub\Teams\TeamsPlugin;
$panel
->tenant(Team::class, slugAttribute: 'slug')
->tenantRegistration(RegisterTeam::class)
->registration(Register::class) // prefills the invited e-mail
->plugin(TeamsPlugin::make()->navigationGroup('Team'));
When a team is created, make its creator the owner:
use Packstub\Teams\Facades\Teams;
$team = Team::create($data);
Teams::addMember($team, auth()->user(), Teams::ownerRole());
That's it — the Members and Invitations pages appear in the tenant navigation, the tenant menu gets a Members entry, and /{panel}/invitations/{token} handles every invitation link.
Scheduling
Add the prune command to your scheduler to keep the invitations table small:
Schedule::command('teams:prune-invitations')->daily();