Installation
Requirements
| Package | Filament | Laravel | PHP |
|---|---|---|---|
1.x |
^5.0 |
^12.0 / ^13.0 |
8.3+ |
Purchasing a license
Licenses are sold at packstub.dev/plugins/filament-features. After purchase, create an access token on the Install Guide page of your Packstub dashboard.
Installing with Composer
composer config repositories.packstub-filament-features composer https://packstub.dev/composer/filament-features
composer config --auth http-basic.packstub.dev pkg_xxxxxxxxxxxxxxxx your-token-secret
composer require packstub/filament-features
php artisan packstub-features:install
The installer publishes config/packstub-features.php and the feature_overrides migration (string scope ids, so integer, UUID and Tenancy string keys all fit).
Defining features and plans
use Packstub\Features\FeaturesPlugin;
$panel->plugin(
FeaturesPlugin::make()
->features([
'api_access' => ['label' => 'API access', 'type' => 'boolean', 'default' => false, 'group' => 'Integrations', 'description' => 'Personal access tokens and webhooks.'],
'reports' => ['label' => 'Reports', 'default' => false, 'group' => 'Insights'],
'projects' => ['label' => 'Projects', 'type' => 'limit', 'default' => 3, 'unit' => 'projects', 'group' => 'Workspace'],
'storage_gb' => ['label' => 'Storage', 'type' => 'limit', 'default' => 1, 'unit' => 'GB'],
])
->plans([
'free' => ['label' => 'Free', 'features' => ['projects' => 3]],
'pro' => ['label' => 'Pro', 'price' => '$29/mo', 'features' => ['projects' => 50, 'api_access' => true, 'reports' => true]],
'enterprise' => ['label' => 'Enterprise', 'features' => ['projects' => null, 'api_access' => true, 'reports' => true, 'storage_gb' => 500]],
], default: 'free')
->planUsing(fn (?Team $team): ?string => $team?->plan)
->usage('projects', fn (?Team $team): int => $team?->projects()->count() ?? 0)
->upgradeUrl(fn (?Team $team): string => route('billing.show', $team))
->navigationGroup('Account'),
);
The same definitions can live in config/packstub-features.php instead — the plugin merges both.
The tenant model
use Packstub\Features\Concerns\HasFeatures;
class Team extends Model
{
use HasFeatures; // hasFeature(), featureValue(), featureLimit(), featureRemaining(), canUseFeature(), featureOverrides(), features()
}
Optional — every check is also available on the Features facade with an explicit scope, and without one the current Filament tenant is used.
Admin pages
On your central/admin panel:
$panel->plugin(FeaturesPlugin::make()->planPage(null)->adminPages());
Scheduling
Schedule::command('features:prune')->daily(); // drop expired overrides