SIGNALS Documentation
API Reference

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 mail
system.test_email System mail

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 CatalogueItemGroupSeeder having 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 DemoDataSeeder multiple times will create duplicate warehouses and accounts. Use signals:clear-demo before 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:

  • CountrySeederupdateOrCreate on code
  • ListsSeederupdateOrCreate on list design and value name
  • CurrencySeederupdateOrCreate on code
  • TaxTypeSeederupdateOrCreate on name
  • TaxRateSeederupdateOrCreate on name
  • RevenueGroupSeederupdateOrCreate on name
  • CostGroupSeederupdateOrCreate on name
  • CatalogueItemGroupSeederupdateOrCreate on name
  • PermissionSeederPermission::findOrCreate()
  • RoleSeederRole::findOrCreate() and syncPermissions()
  • EmailTemplateSeederupdateOrCreate on key
  • NotificationTypeSeedersyncToDatabase() via registry
  • ViewSeederupdateOrCreate on name + entity type
  • RateSpecificationPresetSeederupdateOrCreate on preset_slug
  • CatalogueItemSeeder — not idempotent; creates duplicates if re-run
  • ActivitySeeder — not idempotent; creates duplicates if re-run
  • DemoDataSeeder — not idempotent; use signals:clear-demo before re-seeding