When upgrading venturedrake/laravel-crm, you must re-run the permission seeder before deploying the new code. This ensures that any new permission rows added in recent releases exist in your database. If these rows are missing, even Owner and Admin roles will receive 403 Forbidden errors because their Permission::all() grant was captured at the time they were originally seeded.
Commonly missing permission families include:
crm monitors (Uptime / SSL monitoring)crm features (Feature voting & feedback portal)crm email-campaigns (Email marketing)crm sms-campaigns (SMS marketing)crm chat (Live chat)crm activities (Activity timeline)
Step 1: Update permissions and roles
Run one of the following commands to create missing permission rows and re-grant them to stock roles. This is safe to re-run; it uses firstOrCreate and is additive.
# Option A: Run the update command (recommended)
php artisan laravelcrm:update
# Option B: Run only the seeder without migrating
php artisan db:seed --class="VentureDrake\LaravelCrm\Database\Seeders\LaravelCrmTablesSeeder" --force
Step 2: For Multi-tenant installs ONLY
If laravel-crm.teams is set to true, run this command after Step 1 to copy global roles and grants down to each team:
php artisan laravelcrm:permissions
Note: php artisan laravelcrm:permissions is not a substitute for Step 1. If you run it on a single-tenant install, it will exit without making changes.
Verification
You can verify permissions exist using Tinker:
// Check if monitoring permissions exist (expect 4)
Spatie\Permission\Models\Permission::where('name', 'like', '%crm monitors%')->count();
// Check if Owner has all permissions
Spatie\Permission\Models\Role::where('name', 'Owner')->first()->permissions->count();
php artisan laravelcrm:update