Seeders
What data gets seeded by default and how to run individual seeders.
Signals ships with database seeders that populate your application with reference data, permissions, roles, and optional demo content. Running php artisan db:seed executes all default seeders in the correct dependency order.
What Runs by Default
The DatabaseSeeder calls these seeders in order:
| # | Seeder | Purpose |
|---|---|---|
| 1 | CountrySeeder |
ISO country data |
| 2 | ListsSeeder |
System-managed lists of values |
| 3 | CurrencySeeder |
ISO 4217 currency definitions |
| 4 | TaxTypeSeeder |
Default company and catalogue item tax types |
| 5 | TaxRateSeeder |
Default tax rates (Standard 20%, Reduced 5%, Zero 0%) |
| 6 | RevenueGroupSeeder |
Revenue groups (Dry Hire, Wet Hire, Sales, Services) |
| 7 | CostGroupSeeder |
Cost groups (Equipment Sub-Hire, Crew Sub-Hire, Transport, Consumables, Equipment Purchase) |
| 8 | CatalogueItemGroupSeeder |
Default catalogue item groups (Audio, Lighting, Video, Staging, etc.) |
| 9 | PermissionSeeder |
All system permissions for role-based access control |
| 10 | RoleSeeder |
System roles with permission assignments |
| 11 | EmailTemplateSeeder |
System email templates (invitation, password reset, test) |
| 12 | NotificationTypeSeeder |
Notification type definitions with channel defaults |
| 13 | ViewSeeder |
System-managed live filters for accounts, catalogue items, stock, and activities |
| 14 | RateSpecificationPresetSeeder |
Industry-standard rate specification presets |
| 15 | CatalogueItemSeeder |
Sample catalogue items across rental, sale, and service types |
| 16 | ActivitySeeder |
Sample activities linked to seeded accounts and users |
It also creates a test user (test@example.com) for development.
CountrySeeder
Loads all ISO country records from database/data/countries.json. Each country has a code, name, and associated metadata. Uses updateOrCreate keyed on code — safe to re-run.
ListsSeeder
Creates the system-managed lists of values used throughout the platform:
| List | Values |
|---|---|
| Address Type | Billing, Shipping, Primary, Registered |
| Email Type | Work, Personal, Billing, Support |
| Phone Type | Work, Mobile, Home, Fax |
| Link Type | Website, LinkedIn, Facebook, Instagram, X (Twitter), YouTube |
| Relationship Type | Employee, Director, Contractor, Agent |
| Lawful Basis Type | Legitimate interest (prospect/customer/supplier), Consent, Contract, Legal obligation, Vital interests, Public task, Not applicable |
| Location Type | Internal, External |
| Rating | None, 1–5 Stars |
| Invoice Term | Due on Receipt, Net 7/14/30/45/60/90, End of Month |
| Locale | 17 locale codes (en-GB, en-US, fr-FR, de-DE, and others) |
| File Category | Contract, Invoice, Quote, Purchase Order, Certificate, and 8 others |
All values are marked is_system = true and use updateOrCreate — safe to re-run.
CurrencySeeder
Creates 30 ISO 4217 currency definitions. GBP, USD, and EUR are enabled by default; the remaining 27 are disabled and can be enabled in settings.
TaxTypeSeeder
Creates the default tax typeification records:
- Company Tax type: Standard (default)
- CatalogueItem Tax Types: Standard (default), Exempt
Uses updateOrCreate — safe to re-run.
TaxRateSeeder
Creates three default tax rates suitable for UK VAT:
| Name | Rate |
|---|---|
| Standard | 20% |
| Reduced | 5% |
| Zero | 0% |
Uses updateOrCreate — safe to re-run.
RevenueGroupSeeder
Creates four revenue groups used for categorising rental line items:
- Dry Hire
- Wet Hire
- Sales
- Services
Uses updateOrCreate — safe to re-run.
CostGroupSeeder
Creates five cost groups used for categorising rental costs:
- Equipment Sub-Hire
- Crew Sub-Hire
- Transport
- Consumables
- Equipment Purchase
Uses updateOrCreate — safe to re-run.
CatalogueItemGroupSeeder
Creates 10 default catalogue item groups with sort order:
Audio, Lighting – Generic, Lighting – Moving Heads, Video, Staging, Power, Rigging, Furniture, Transport, Consumables.
Uses updateOrCreate — safe to re-run.
PermissionSeeder
Creates all permissions used by the role-based access control system. Permissions follow the resource.action naming convention and are grouped by domain:
| Group | Permissions |
|---|---|
| Settings | settings.view, settings.manage |
| Users | users.view, users.invite, users.edit, users.deactivate, users.activate, users.reset-password |
| Roles | roles.view, roles.manage |
| Accounts | accounts.view, accounts.create, accounts.edit, accounts.delete |
| Rentals | rentals.view, rentals.create, rentals.edit, rentals.delete |
| Invoices | invoices.view, invoices.create, invoices.edit, invoices.delete |
| Catalogue items | catalogue-items.view, catalogue-items.create, catalogue-items.edit, catalogue-items.delete |
| Stock | assets.view, assets.adjust, assets.transfer |
| Reports | reports.view, reports.export |
| System | action-log.view, custom-fields.manage, static-data.manage, webhooks.manage |
Uses Permission::findOrCreate() — safe to re-run.
RoleSeeder
Creates the four system roles and assigns their default permission sets. Owner access is handled separately via the is_owner flag on users — not as a Spatie role.
| Role | Access Level |
|---|---|
| Admin | All permissions |
| Manager | All resource permissions (no settings, users, or roles management) |
| Operator | Core operational permissions — rentals, invoicing, stock, and read-only catalogue items/accounts |
| Viewer | Read-only access to all resources |
All roles are marked is_system = true and cannot be deleted through the UI. The RoleSeeder calls PermissionSeeder internally, ensuring permissions exist.
EmailTemplateSeeder
Creates three system email templates:
| Key | Name | Purpose |
|---|---|---|
user_invited |
User Invitation | Sent when a new user is invited |
password_reset |
Password Reset | Sent when a user requests a password reset |
test_email |
Test Email | Sent when testing email configuration from admin settings |
Templates support merge fields (e.g. {{ user.name }}, {{ company.name }}). Uses updateOrCreate — safe to re-run.
NotificationTypeSeeder
Registers notification type definitions via the NotificationRegistry and syncs them to the notification_types table:
| Key | Category | Default Channels |
|---|---|---|
user.invited |
Users | database, mail |
user.deactivated |
Users | database |
user.reactivated |
Users | database |
password.reset |
System | |
system.test_email |
System |
ViewSeeder
Creates system-managed live filters for each entity type. These views appear in the API and UI view selectors and cannot be deleted by users.
| Entity | Views Created |
|---|---|
| Accounts | All Accounts (default), Companies Only, Contacts Only, Active Venues, Inactive Accounts |
| Catalogue items | All Catalogue items (default), Rental CatalogueItems, Sale CatalogueItems, Active CatalogueItems, Inactive Catalogue items |
| Assets | All Assets (default), Barcoded Stock, Loose Stock |
| Activities | All Activities (default), Scheduled Activities, Completed Activities |
| Catalogue item groups | All Catalogue item groups (default) |
Uses updateOrCreate keyed on name + entity type — safe to re-run.
RateSpecificationPresetSeeder
Creates the 11 industry-standard rate specification presets from RatePresets::all(). Presets are identified by a preset_slug and use updateOrCreate — safe to re-run. See the Rate specifications page for details on each preset.
CatalogueItemSeeder
Creates 14 sample catalogue items across rental, sale, and service types to demonstrate the catalogue:
| Group | Catalogue items |
|---|---|
| Audio | Shure SM58, JBL EON615, Yamaha TF1 Mixing Console |
| Lighting – Moving Heads | Robe Esprite, Martin MAC Aura XB |
| Lighting – Generic | Chauvet COLORado Panel Q40, ETC Source Four 750W |
| Video | Barco UDX-4K32, Samsung 55" LED Display |
| Staging | Stage Deck 8x4, Stage Leg 1m |
| Power | Power Distribution 63A 3-Phase |
| Consumables | Gaffer Tape 50m Black (sale item) |
| (none) | Lighting Technician (service item) |
Note: This seeder is not idempotent — re-running it will create duplicate catalogue-items. It depends on
CatalogueItemGroupSeederhaving run first.
ActivitySeeder
Creates 6 sample activities (task, call, meeting, email, note, completed) linked to the first user and the first available accounts. Depends on UserFactory having created the test user.
Note: This seeder is not idempotent — re-running it will create duplicate activities.
WarehouseSeeder
Creates a default warehouse called "Main Warehouse" if no warehouses exist. This seeder is not included in the default DatabaseSeeder — run it separately if needed.
Note: The setup wizard (
php artisan signals:setup) handles warehouse creation interactively, so this seeder is primarily useful for automated deployments.
DemoDataSeeder
Creates large volumes of realistic demo data for development and evaluation:
- 3 demo warehouses (London Warehouse, Manchester Depot, Edinburgh Office)
- 2,000 companies, 500 venues, and 3,000 contacts — each with a primary email and phone
- Relationships between contacts, companies, and venues
All demo accounts are tagged with demo-data so they can be identified and cleared later.
This seeder is not included in the default DatabaseSeeder. Use the Artisan commands below or the admin panel.
# Seed demo data
php artisan signals:seed-demo
# Remove demo data (deletes all records tagged 'demo-data')
php artisan signals:clear-demo
Note: Running
DemoDataSeedermultiple times will create duplicate warehouses and accounts. Usesignals:clear-demobefore re-seeding.
Running Seeders
# Run all default seeders
php artisan db:seed
# Run a specific seeder
php artisan db:seed --class=PermissionSeeder
php artisan db:seed --class=ViewSeeder
# Run in production (requires --force flag)
php artisan db:seed --force
php artisan db:seed --class=PermissionSeeder --force
You can also run seeders from the admin panel under Settings > System > Database Seeders, which shows the current status of each seeder and lets you run them individually.
Idempotency
Most seeders use updateOrCreate or findOrCreate and are safe to run multiple times:
- CountrySeeder —
updateOrCreateoncode - ListsSeeder —
updateOrCreateon list design and value name - CurrencySeeder —
updateOrCreateoncode - TaxTypeSeeder —
updateOrCreateonname - TaxRateSeeder —
updateOrCreateonname - RevenueGroupSeeder —
updateOrCreateonname - CostGroupSeeder —
updateOrCreateonname - CatalogueItemGroupSeeder —
updateOrCreateonname - PermissionSeeder —
Permission::findOrCreate() - RoleSeeder —
Role::findOrCreate()andsyncPermissions() - EmailTemplateSeeder —
updateOrCreateonkey - NotificationTypeSeeder —
syncToDatabase()via registry - ViewSeeder —
updateOrCreateon name + entity type - RateSpecificationPresetSeeder —
updateOrCreateonpreset_slug - CatalogueItemSeeder — not idempotent; creates duplicates if re-run
- ActivitySeeder — not idempotent; creates duplicates if re-run
- DemoDataSeeder — not idempotent; use
signals:clear-demobefore re-seeding