Event Management System - Complete Business Plan & Technical Details
System Architecture Overview
Database Schema & Relationships
Feature Modules & Controllers
View Structure
Business Logic & Workflows
Business Model & Revenue Streams
Implementation Roadmap
API Endpoints Reference
System Architecture Overview
┌─────────────────────────────────────────────────────────────────┐
│ ORGANIZATION (Multi-tenant) │
├─────────────────────────────────────────────────────────────────┤
│ Users → Teams → OrgMembers → Roles/Permissions │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ EVENTS │ │ TICKETING │ │ PAYMENTS │
│ - Categories │ │ - TicketTypes │ │ - Invoices │
│ - Tags │ │ - Inventory │ │ - Refunds │
│ - Sessions │ │ - Orders │ │ - Discounts │
│ - Media │ │ - Waitlist │ │ - Currencies │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
└─────────────────────┼─────────────────────┘
▼
┌───────────────┐
│ REGISTRATION │
└───────────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ CHECKIN │ │ SURVEYS │ │ ANALYTICS │
│ - Devices │ │ - Questions │ │ - KPIs │
│ - Attendance │ │ - Responses │ │ - Reports │
└───────────────┘ └───────────────┘ └───────────────┘
User (root entity)
├── Organization (multi-tenant structure)
│ ├── OrgMembers
│ └── Teams
├── OrganizerProfile
├── Event (main entity)
│ ├── Sessions
│ ├── TicketTypes
│ ├── Speakers
│ ├── Sponsors
│ └── Media
├── Registration
│ ├── OrderItems
│ └── Tickets
├── Payment
│ ├── Invoice
│ └── Refunds
└── Roles & Permissions
Database Schema & Relationships
Key Relationship Patterns
Pattern
Description
Example
Many-to-Many with Pivot
Junction tables with extra data
Users ↔ Organizations (via org_members with role)
One-to-Many
Parent to children
Event → Sessions, Event → Tickets
Polymorphic-like
Multiple entities relating to one
Speakers, Sponsors, Media → Events
A. User Management & Authentication (7 Models)
Model
Purpose
Key Fields
User
Primary authentication
email, phone, locale, is_active
OrganizerProfile
Extended organizer info
display_name, bio, verified
Role
RBAC system
name, description
Permission
Fine-grained access
name, resource, action
UserRole
User-role junction
user_id, role_id, assigned_at
Team
Organizational grouping
name, organization_id
TeamMember
Team membership
team_id, user_id, assigned_role
B. Organization Management (3 Models)
Model
Purpose
Key Fields
Organization
Multi-tenant container
name, slug, settings
OrgMember
Organization membership
org_id, user_id, member_role
AuditLog
Activity tracking
action, ip_address, timestamp
C. Event Management (10 Models)
Model
Purpose
Key Fields
Event
Core event entity
title, description, start_date, end_date, capacity, status
EventCategory
Event classification
name, slug, parent_id
EventTag
Flexible tagging
name, slug
EventTagLink
Tag junction
event_id, tag_id
EventMedia
Event media files
event_id, file_path, role
Session
Event sessions/tracks
title, start_time, end_time, room
SessionMaterial
Session resources
session_id, file_path, type
Venue
Physical venues
name, address, city, capacity
VenueFacility
Venue amenities
venue_id, facility_name
EventVenueBooking
Venue reservations
event_id, venue_id, booked_from, booked_to
D. Ticketing System (6 Models)
Model
Purpose
Key Fields
TicketType
Ticket tiers
event_id, name, price, capacity, refundable
Ticket
Individual tickets
ticket_type_id, ticket_code, qr_code
TicketInventory
Stock tracking
ticket_type_id, remaining_count
OrderItem
Purchase line items
registration_id, ticket_type_id, quantity, unit_price
DiscountCode
Promotional codes
code, percent_off, valid_from, valid_to, max_uses
CouponRedemption
Discount applications
discount_code_id, registration_id
E. Speaker & Sponsor Management (6 Models)
Model
Purpose
Key Fields
Speaker
Speaker profiles
name, bio, email, company, photo
EventSpeaker
Speaker-event assignment
event_id, speaker_id, role
SessionSpeaker
Speaker-session mapping
session_id, speaker_id
Sponsor
Sponsor profiles
name, logo, contact_email
EventSponsor
Sponsor-event assignment
event_id, sponsor_id, level, amount
F. Registration & Attendee (4 Models)
Model
Purpose
Key Fields
Registration
Event registration
user_id, event_id, status, booking_reference
Waitlist
Waiting list
event_id, user_id, priority, notified
Seat
Venue seating
venue_id, section, row, seat_number, status
Location
Geographic reference
name, latitude, longitude
G. Payment & Financial (5 Models)
Model
Purpose
Key Fields
Payment
Payment records
registration_id, amount, currency, provider, status
Invoice
Billing documents
payment_id, invoice_number, total, billing_address
Refund
Refund management
payment_id, amount, reason, status
Currency
Multi-currency
code, name, symbol, exchange_rate
H. Attendee Services (4 Models)
Model
Purpose
Key Fields
Accommodation
Hotel options
event_id, name, nightly_price
Transportation
Transport arrangements
event_id, type, provider
MealPlan
Meal options
event_id, type, price
Reminder
Event reminders
event_id, user_id, remind_at, message
I. Check-in & Attendance (3 Models)
Model
Purpose
Key Fields
Checkin
Check-in records
registration_id, checkin_time, method, scanned_by
CheckinDevice
Scanning devices
device_name, location, status
AttendanceStat
Attendance metrics
event_id, total_registered, total_attended, rate
J. Communication (5 Models)
Model
Purpose
Key Fields
Message
User messaging
sender_id, receiver_id, event_id, content, is_read
Notification
System notifications
user_id, title, body, is_read, sent_at
SystemMessage
Broadcast messages
title, content, target_audience
Reminder
Scheduled reminders
remind_at, message
EmailTemplate
Email templates
name, subject, body, variables
K. Feedback & Support (5 Models)
Model
Purpose
Key Fields
Feedback
Post-event feedback
event_id, user_id, rating, comments
Survey
Survey management
event_id, title, is_active
SurveyQuestion
Survey questions
survey_id, question, type, required
SurveyResponse
User responses
survey_question_id, user_id, answer
SupportTicket
Support requests
user_id, subject, status
SupportResponse
Support replies
ticket_id, responder_id, message
L. Analytics & Reporting (4 Models)
Model
Purpose
Key Fields
AnalyticsEvent
Event tracking
event_type, payload (JSON)
AnalyticsReport
Aggregated reports
report_type, data, generated_at
EventKpi
KPI measurements
event_id, kpi_id, value
Kpi
KPI definitions
name, calculation_method
M. Supporting Entities (4 Models)
Model
Purpose
Key Fields
FileStorage
File management
file_path, file_type, size
ApiIntegration
Third-party APIs
provider, api_key, settings
Language
i18n support
code, name, is_default
Media
Media assets
file_path, file_type, uploaded_by
Feature Modules & Controllers
Module 1: Authentication & User Management
Controller
Actions
Description
AuthController
login, register, logout, forgotPassword, resetPassword, verifyEmail
User authentication
UserController
profile, update, changePassword, delete, uploadAvatar
User profile management
RoleController
index, store, update, destroy, assignPermissions
Role management
PermissionController
index, store, update, destroy
Permission management
TeamController
index, store, update, destroy, addMember, removeMember
Team management
// Auth Routes
Route::post ('/auth/register ' , [AuthController::class, 'register ' ]);
Route::post ('/auth/login ' , [AuthController::class, 'login ' ]);
Route::post ('/auth/logout ' , [AuthController::class, 'logout ' ]);
Route::post ('/auth/forgot-password ' , [AuthController::class, 'forgotPassword ' ]);
Route::post ('/auth/reset-password ' , [AuthController::class, 'resetPassword ' ]);
Route::post ('/auth/verify-email/{token} ' , [AuthController::class, 'verifyEmail ' ]);
// User Routes (authenticated)
Route::get ('/user/profile ' , [UserController::class, 'profile ' ]);
Route::put ('/user/profile ' , [UserController::class, 'update ' ]);
Route::put ('/user/password ' , [UserController::class, 'changePassword ' ]);
Route::post ('/user/avatar ' , [UserController::class, 'uploadAvatar ' ]);
// Admin Routes
Route::apiResource ('/admin/roles ' , RoleController::class);
Route::post ('/admin/roles/{role}/permissions ' , [RoleController::class, 'assignPermissions ' ]);
Route::apiResource ('/admin/permissions ' , PermissionController::class);
Route::apiResource ('/admin/teams ' , TeamController::class);
Route::post ('/admin/teams/{team}/members ' , [TeamController::class, 'addMember ' ]);
Route::delete ('/admin/teams/{team}/members/{user} ' , [TeamController::class, 'removeMember ' ]);
Module 2: Organization Management
Controller
Actions
Description
OrganizationController
index, store, show, update, destroy, members, settings
Organization CRUD
OrgMemberController
index, invite, updateRole, remove
Member management
OrganizerProfileController
show, store, update, verify
Organizer profiles
AuditLogController
index, show, export
Audit trail viewing
Route::apiResource ('/organizations ' , OrganizationController::class);
Route::get ('/organizations/{org}/members ' , [OrganizationController::class, 'members ' ]);
Route::put ('/organizations/{org}/settings ' , [OrganizationController::class, 'settings ' ]);
Route::post ('/organizations/{org}/members/invite ' , [OrgMemberController::class, 'invite ' ]);
Route::put ('/organizations/{org}/members/{member}/role ' , [OrgMemberController::class, 'updateRole ' ]);
Route::delete ('/organizations/{org}/members/{member} ' , [OrgMemberController::class, 'remove ' ]);
Route::get ('/organizer-profile ' , [OrganizerProfileController::class, 'show ' ]);
Route::post ('/organizer-profile ' , [OrganizerProfileController::class, 'store ' ]);
Route::put ('/organizer-profile ' , [OrganizerProfileController::class, 'update ' ]);
Route::get ('/admin/audit-logs ' , [AuditLogController::class, 'index ' ]);
Route::get ('/admin/audit-logs/{log} ' , [AuditLogController::class, 'show ' ]);
Route::get ('/admin/audit-logs/export ' , [AuditLogController::class, 'export ' ]);
Module 3: Event Management (Core)
Controller
Actions
Description
EventController
index, store, show, update, destroy, publish, cancel, duplicate
Event CRUD
EventCategoryController
index, store, update, destroy
Category management
EventTagController
index, store, update, destroy, attach, detach
Tag management
EventMediaController
index, store, update, destroy, reorder
Media management
SessionController
index, store, show, update, destroy, assignSpeaker
Session management
SessionMaterialController
index, store, destroy
Session materials
// Public Event Routes
Route::get ('/events ' , [EventController::class, 'index ' ]);
Route::get ('/events/{event} ' , [EventController::class, 'show ' ]);
Route::get ('/events/{event}/sessions ' , [SessionController::class, 'index ' ]);
// Organizer Event Routes
Route::post ('/organizer/events ' , [EventController::class, 'store ' ]);
Route::put ('/organizer/events/{event} ' , [EventController::class, 'update ' ]);
Route::delete ('/organizer/events/{event} ' , [EventController::class, 'destroy ' ]);
Route::post ('/organizer/events/{event}/publish ' , [EventController::class, 'publish ' ]);
Route::post ('/organizer/events/{event}/cancel ' , [EventController::class, 'cancel ' ]);
Route::post ('/organizer/events/{event}/duplicate ' , [EventController::class, 'duplicate ' ]);
// Event Media
Route::get ('/organizer/events/{event}/media ' , [EventMediaController::class, 'index ' ]);
Route::post ('/organizer/events/{event}/media ' , [EventMediaController::class, 'store ' ]);
Route::put ('/organizer/events/{event}/media/reorder ' , [EventMediaController::class, 'reorder ' ]);
Route::delete ('/organizer/events/{event}/media/{media} ' , [EventMediaController::class, 'destroy ' ]);
// Sessions
Route::apiResource ('/organizer/events/{event}/sessions ' , SessionController::class);
Route::post ('/organizer/sessions/{session}/speakers/{speaker} ' , [SessionController::class, 'assignSpeaker ' ]);
Route::post ('/organizer/sessions/{session}/materials ' , [SessionMaterialController::class, 'store ' ]);
// Categories & Tags
Route::apiResource ('/admin/event-categories ' , EventCategoryController::class);
Route::apiResource ('/admin/event-tags ' , EventTagController::class);
Route::post ('/organizer/events/{event}/tags/{tag} ' , [EventTagController::class, 'attach ' ]);
Route::delete ('/organizer/events/{event}/tags/{tag} ' , [EventTagController::class, 'detach ' ]);
┌─────────┐ publish() ┌───────────┐ event starts ┌─────────┐ event ends ┌───────────┐
│ DRAFT │ ─────────────────►│ PUBLISHED │ ──────────────────►│ ONGOING │ ────────────────►│ CONCLUDED │
└─────────┘ └───────────┘ └─────────┘ └───────────┘
│
│ cancel()
▼
┌───────────┐
│ CANCELLED │
└───────────┘
Module 4: Venue & Location
Controller
Actions
Description
VenueController
index, store, show, update, destroy, availability
Venue CRUD
VenueFacilityController
index, store, destroy
Facility management
SeatController
index, store, update, destroy, bulkCreate
Seating management
EventVenueBookingController
store, update, destroy, checkAvailability
Booking management
LocationController
index, store, update, destroy
Location management
Route::apiResource ('/venues ' , VenueController::class);
Route::get ('/venues/{venue}/availability ' , [VenueController::class, 'availability ' ]);
Route::get ('/venues/{venue}/facilities ' , [VenueFacilityController::class, 'index ' ]);
Route::post ('/venues/{venue}/facilities ' , [VenueFacilityController::class, 'store ' ]);
Route::delete ('/venues/{venue}/facilities/{facility} ' , [VenueFacilityController::class, 'destroy ' ]);
Route::get ('/venues/{venue}/seats ' , [SeatController::class, 'index ' ]);
Route::post ('/venues/{venue}/seats ' , [SeatController::class, 'store ' ]);
Route::post ('/venues/{venue}/seats/bulk ' , [SeatController::class, 'bulkCreate ' ]);
Route::put ('/venues/{venue}/seats/{seat} ' , [SeatController::class, 'update ' ]);
Route::post ('/organizer/events/{event}/venue-booking ' , [EventVenueBookingController::class, 'store ' ]);
Route::get ('/venues/{venue}/check-availability ' , [EventVenueBookingController::class, 'checkAvailability ' ]);
Route::apiResource ('/locations ' , LocationController::class);
Module 5: Ticketing System
Controller
Actions
Description
TicketTypeController
index, store, show, update, destroy
Ticket type CRUD
TicketController
index, show, generate, validate, transfer, download
Ticket management
TicketInventoryController
show, reserve, release
Inventory management
DiscountCodeController
index, store, show, update, destroy, validate
Discount codes
CouponRedemptionController
store, index
Coupon tracking
// Ticket Types (Organizer)
Route::apiResource ('/organizer/events/{event}/ticket-types ' , TicketTypeController::class);
// Tickets
Route::get ('/attendee/tickets ' , [TicketController::class, 'index ' ]);
Route::get ('/attendee/tickets/{ticket} ' , [TicketController::class, 'show ' ]);
Route::get ('/attendee/tickets/{ticket}/download ' , [TicketController::class, 'download ' ]);
Route::post ('/attendee/tickets/{ticket}/transfer ' , [TicketController::class, 'transfer ' ]);
// Ticket Validation (Check-in staff)
Route::post ('/staff/tickets/validate ' , [TicketController::class, 'validate ' ]);
// Inventory
Route::get ('/organizer/ticket-types/{ticketType}/inventory ' , [TicketInventoryController::class, 'show ' ]);
// Discount Codes
Route::apiResource ('/organizer/events/{event}/discount-codes ' , DiscountCodeController::class);
Route::post ('/discount-codes/validate ' , [DiscountCodeController::class, 'validate ' ]);
TicketType Created
│
▼
TicketInventory Created (initial count = capacity)
│
▼
Registration + Payment Complete
│
▼
Ticket Generated (unique ticket_code + QR)
│
▼
TicketInventory.remaining_count decremented
Module 6: Registration & Checkout
Controller
Actions
Description
RegistrationController
index, store, show, update, cancel
Registration CRUD
OrderItemController
store, update, destroy
Cart management
WaitlistController
join, leave, position, notify
Waitlist management
CheckoutController
initiate, complete, abandon
Checkout flow
// Registration
Route::get ('/attendee/registrations ' , [RegistrationController::class, 'index ' ]);
Route::post ('/events/{event}/register ' , [RegistrationController::class, 'store ' ]);
Route::get ('/registrations/{registration} ' , [RegistrationController::class, 'show ' ]);
Route::post ('/registrations/{registration}/cancel ' , [RegistrationController::class, 'cancel ' ]);
// Order Items (Cart)
Route::post ('/registrations/{registration}/items ' , [OrderItemController::class, 'store ' ]);
Route::put ('/registrations/{registration}/items/{item} ' , [OrderItemController::class, 'update ' ]);
Route::delete ('/registrations/{registration}/items/{item} ' , [OrderItemController::class, 'destroy ' ]);
// Waitlist
Route::post ('/events/{event}/waitlist ' , [WaitlistController::class, 'join ' ]);
Route::delete ('/events/{event}/waitlist ' , [WaitlistController::class, 'leave ' ]);
Route::get ('/events/{event}/waitlist/position ' , [WaitlistController::class, 'position ' ]);
// Checkout
Route::post ('/registrations/{registration}/checkout ' , [CheckoutController::class, 'initiate ' ]);
Route::post ('/registrations/{registration}/checkout/complete ' , [CheckoutController::class, 'complete ' ]);
┌──────────────────────────────────────────────────────────────────────────┐
│ REGISTRATION FLOW │
└──────────────────────────────────────────────────────────────────────────┘
1. User selects event
│
▼
2. Check capacity ───────────────────┐
│ │
│ (available) │ (full)
▼ ▼
3. Create Registration Join Waitlist
(status: pending) │
│ │
▼ │ (spot opens)
4. Add OrderItems ◄──────────────────┘
(ticket types, qty)
│
▼
5. Add Services (optional)
- Accommodation
- Transportation
- Meal Plan
│
▼
6. Apply Discount Code
(CouponRedemption created)
│
▼
7. Enter Billing Info
│
▼
8. Process Payment
(Payment record created)
│
▼
9. Generate Invoice
│
▼
10. Generate Tickets
(unique codes + QR)
│
▼
11. Send Confirmation Email
│
▼
12. Registration Complete
(status: confirmed)
Module 7: Payment & Financial
Controller
Actions
Description
PaymentController
store, show, webhook, status
Payment processing
InvoiceController
index, show, download, email
Invoice management
RefundController
index, store, show, approve, process
Refund handling
CurrencyController
index, convert
Currency operations
// Payments
Route::post ('/payments ' , [PaymentController::class, 'store ' ]);
Route::get ('/payments/{payment} ' , [PaymentController::class, 'show ' ]);
Route::get ('/payments/{payment}/status ' , [PaymentController::class, 'status ' ]);
Route::post ('/webhooks/stripe ' , [PaymentController::class, 'stripeWebhook ' ]);
Route::post ('/webhooks/paypal ' , [PaymentController::class, 'paypalWebhook ' ]);
// Invoices
Route::get ('/attendee/invoices ' , [InvoiceController::class, 'index ' ]);
Route::get ('/invoices/{invoice} ' , [InvoiceController::class, 'show ' ]);
Route::get ('/invoices/{invoice}/download ' , [InvoiceController::class, 'download ' ]);
Route::post ('/invoices/{invoice}/email ' , [InvoiceController::class, 'email ' ]);
// Refunds
Route::get ('/attendee/refunds ' , [RefundController::class, 'index ' ]);
Route::post ('/registrations/{registration}/refund ' , [RefundController::class, 'store ' ]);
Route::get ('/organizer/refunds ' , [RefundController::class, 'index ' ]);
Route::post ('/organizer/refunds/{refund}/approve ' , [RefundController::class, 'approve ' ]);
Route::post ('/organizer/refunds/{refund}/process ' , [RefundController::class, 'process ' ]);
// Currency
Route::get ('/currencies ' , [CurrencyController::class, 'index ' ]);
Route::get ('/currencies/convert ' , [CurrencyController::class, 'convert ' ]);
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ PENDING │────►│ PROCESSING │────►│ COMPLETED │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ │ (refund requested)
▼ ▼
┌─────────────┐ ┌─────────────┐
│ FAILED │ │ REFUNDED │
└─────────────┘ └─────────────┘
Module 8: Speakers & Sponsors
Controller
Actions
Description
SpeakerController
index, store, show, update, destroy
Speaker CRUD
EventSpeakerController
index, store, update, destroy
Event-speaker assignment
SessionSpeakerController
store, destroy
Session-speaker assignment
SponsorController
index, store, show, update, destroy
Sponsor CRUD
EventSponsorController
index, store, update, destroy
Event-sponsor assignment
// Speakers
Route::apiResource ('/speakers ' , SpeakerController::class);
Route::get ('/events/{event}/speakers ' , [EventSpeakerController::class, 'index ' ]);
Route::post ('/organizer/events/{event}/speakers ' , [EventSpeakerController::class, 'store ' ]);
Route::put ('/organizer/events/{event}/speakers/{speaker} ' , [EventSpeakerController::class, 'update ' ]);
Route::delete ('/organizer/events/{event}/speakers/{speaker} ' , [EventSpeakerController::class, 'destroy ' ]);
// Session Speakers
Route::post ('/organizer/sessions/{session}/speakers/{speaker} ' , [SessionSpeakerController::class, 'store ' ]);
Route::delete ('/organizer/sessions/{session}/speakers/{speaker} ' , [SessionSpeakerController::class, 'destroy ' ]);
// Sponsors
Route::apiResource ('/sponsors ' , SponsorController::class);
Route::get ('/events/{event}/sponsors ' , [EventSponsorController::class, 'index ' ]);
Route::post ('/organizer/events/{event}/sponsors ' , [EventSponsorController::class, 'store ' ]);
Route::put ('/organizer/events/{event}/sponsors/{sponsor} ' , [EventSponsorController::class, 'update ' ]);
Route::delete ('/organizer/events/{event}/sponsors/{sponsor} ' , [EventSponsorController::class, 'destroy ' ]);
Role
Description
keynote
Main keynote speaker
speaker
Regular session speaker
panelist
Panel discussion participant
moderator
Panel/session moderator
workshop_leader
Workshop facilitator
Sponsor Levels
Level
Typical Benefits
platinum
Logo on main stage, premium booth, speaking slot
gold
Large booth, logo on materials, session sponsorship
silver
Standard booth, logo on website
bronze
Logo on website, attendee bag insert
partner
In-kind sponsors, media partners
Module 9: Event Operations (Day-of)
Controller
Actions
Description
CheckinController
scan, manual, undo, stats
Check-in operations
CheckinDeviceController
index, store, update, destroy, activate
Device management
AttendanceController
realtime, export, summary
Attendance tracking
// Check-in Operations
Route::post ('/staff/checkin/scan ' , [CheckinController::class, 'scan ' ]);
Route::post ('/staff/checkin/manual ' , [CheckinController::class, 'manual ' ]);
Route::post ('/staff/checkin/{checkin}/undo ' , [CheckinController::class, 'undo ' ]);
Route::get ('/staff/events/{event}/checkin-stats ' , [CheckinController::class, 'stats ' ]);
// Check-in Devices
Route::apiResource ('/organizer/events/{event}/checkin-devices ' , CheckinDeviceController::class);
Route::post ('/organizer/checkin-devices/{device}/activate ' , [CheckinDeviceController::class, 'activate ' ]);
Route::post ('/organizer/checkin-devices/{device}/deactivate ' , [CheckinDeviceController::class, 'deactivate ' ]);
// Attendance
Route::get ('/organizer/events/{event}/attendance/realtime ' , [AttendanceController::class, 'realtime ' ]);
Route::get ('/organizer/events/{event}/attendance/export ' , [AttendanceController::class, 'export ' ]);
Route::get ('/organizer/events/{event}/attendance/summary ' , [AttendanceController::class, 'summary ' ]);
Method
Description
qr_scan
QR code scanned by device
manual
Manual lookup by staff
nfc
NFC badge tap
facial
Facial recognition
Controller
Actions
Description
NotificationController
index, send, markRead, markAllRead, preferences
Notifications
MessageController
index, store, show, markRead
Direct messaging
ReminderController
index, store, update, destroy
Reminders
EmailTemplateController
index, store, show, update, destroy, preview
Email templates
SystemMessageController
index, store, destroy
System announcements
// Notifications
Route::get ('/notifications ' , [NotificationController::class, 'index ' ]);
Route::post ('/notifications/{notification}/read ' , [NotificationController::class, 'markRead ' ]);
Route::post ('/notifications/read-all ' , [NotificationController::class, 'markAllRead ' ]);
Route::put ('/notifications/preferences ' , [NotificationController::class, 'preferences ' ]);
// Messages
Route::get ('/messages ' , [MessageController::class, 'index ' ]);
Route::post ('/messages ' , [MessageController::class, 'store ' ]);
Route::get ('/messages/{message} ' , [MessageController::class, 'show ' ]);
Route::post ('/messages/{message}/read ' , [MessageController::class, 'markRead ' ]);
// Reminders
Route::apiResource ('/organizer/events/{event}/reminders ' , ReminderController::class);
// Email Templates
Route::apiResource ('/organizer/email-templates ' , EmailTemplateController::class);
Route::get ('/organizer/email-templates/{template}/preview ' , [EmailTemplateController::class, 'preview ' ]);
// System Messages (Admin)
Route::apiResource ('/admin/system-messages ' , SystemMessageController::class);
Trigger
Template
Timing
Registration confirmed
registration_confirmation
Immediate
Payment received
payment_receipt
Immediate
Ticket generated
ticket_delivery
Immediate
Event reminder
event_reminder
24h, 1h before
Post-event
feedback_request
24h after event
Waitlist spot available
waitlist_notification
When spot opens
Module 11: Feedback & Support
Controller
Actions
Description
FeedbackController
index, store, show, aggregated
Feedback management
SurveyController
index, store, show, update, destroy, distribute, results
Survey management
SurveyQuestionController
store, update, destroy, reorder
Question management
SurveyResponseController
store, index
Response collection
SupportTicketController
index, store, show, update, close
Support tickets
SupportResponseController
store
Ticket responses
// Feedback
Route::post ('/events/{event}/feedback ' , [FeedbackController::class, 'store ' ]);
Route::get ('/organizer/events/{event}/feedback ' , [FeedbackController::class, 'index ' ]);
Route::get ('/organizer/events/{event}/feedback/aggregated ' , [FeedbackController::class, 'aggregated ' ]);
// Surveys
Route::apiResource ('/organizer/events/{event}/surveys ' , SurveyController::class);
Route::post ('/organizer/surveys/{survey}/distribute ' , [SurveyController::class, 'distribute ' ]);
Route::get ('/organizer/surveys/{survey}/results ' , [SurveyController::class, 'results ' ]);
// Survey Questions
Route::post ('/organizer/surveys/{survey}/questions ' , [SurveyQuestionController::class, 'store ' ]);
Route::put ('/organizer/surveys/{survey}/questions/{question} ' , [SurveyQuestionController::class, 'update ' ]);
Route::delete ('/organizer/surveys/{survey}/questions/{question} ' , [SurveyQuestionController::class, 'destroy ' ]);
Route::post ('/organizer/surveys/{survey}/questions/reorder ' , [SurveyQuestionController::class, 'reorder ' ]);
// Survey Responses (Attendee)
Route::get ('/surveys/{survey} ' , [SurveyController::class, 'show ' ]);
Route::post ('/surveys/{survey}/responses ' , [SurveyResponseController::class, 'store ' ]);
// Support
Route::get ('/support/tickets ' , [SupportTicketController::class, 'index ' ]);
Route::post ('/support/tickets ' , [SupportTicketController::class, 'store ' ]);
Route::get ('/support/tickets/{ticket} ' , [SupportTicketController::class, 'show ' ]);
Route::post ('/support/tickets/{ticket}/close ' , [SupportTicketController::class, 'close ' ]);
Route::post ('/support/tickets/{ticket}/responses ' , [SupportResponseController::class, 'store ' ]);
Type
Description
text
Free text response
textarea
Long text response
radio
Single choice
checkbox
Multiple choice
rating
1-5 star rating
scale
1-10 scale
date
Date picker
Module 12: Analytics & Reporting
Controller
Actions
Description
AnalyticsController
dashboard, eventMetrics, revenueReport, attendeeReport
Analytics
EventKpiController
index, track, compare
KPI tracking
AnalyticsReportController
index, generate, schedule, download
Report generation
AnalyticsEventController
track, query
Event tracking
// Analytics Dashboard
Route::get ('/organizer/analytics/dashboard ' , [AnalyticsController::class, 'dashboard ' ]);
Route::get ('/organizer/events/{event}/analytics ' , [AnalyticsController::class, 'eventMetrics ' ]);
Route::get ('/organizer/analytics/revenue ' , [AnalyticsController::class, 'revenueReport ' ]);
Route::get ('/organizer/analytics/attendees ' , [AnalyticsController::class, 'attendeeReport ' ]);
// KPIs
Route::get ('/organizer/events/{event}/kpis ' , [EventKpiController::class, 'index ' ]);
Route::post ('/organizer/events/{event}/kpis/track ' , [EventKpiController::class, 'track ' ]);
Route::get ('/organizer/kpis/compare ' , [EventKpiController::class, 'compare ' ]);
// Reports
Route::get ('/organizer/reports ' , [AnalyticsReportController::class, 'index ' ]);
Route::post ('/organizer/reports/generate ' , [AnalyticsReportController::class, 'generate ' ]);
Route::post ('/organizer/reports/schedule ' , [AnalyticsReportController::class, 'schedule ' ]);
Route::get ('/organizer/reports/{report}/download ' , [AnalyticsReportController::class, 'download ' ]);
// Event Tracking (Internal)
Route::post ('/analytics/track ' , [AnalyticsEventController::class, 'track ' ]);
Metric
Calculation
Model
Registration Rate
registrations / views
AnalyticsEvent
Attendance Rate
checked_in / registered
AttendanceStat
Revenue per Event
sum(payments)
Payment
Avg Ticket Price
revenue / tickets_sold
OrderItem
Refund Rate
refunds / payments
Refund
Session Popularity
checkins per session
Checkin
Speaker Rating
avg(feedback.rating)
Feedback
NPS Score
promoters - detractors
SurveyResponse
resources/views/
├── layouts/
│ ├── app.blade.php # Main layout
│ ├── auth.blade.php # Auth pages layout
│ ├── organizer.blade.php # Organizer dashboard layout
│ ├── admin.blade.php # Admin panel layout
│ └── public.blade.php # Public pages layout
│
├── auth/
│ ├── login.blade.php
│ ├── register.blade.php
│ ├── forgot-password.blade.php
│ ├── reset-password.blade.php
│ └── verify-email.blade.php
│
├── public/ # Public-facing pages
│ ├── home.blade.php # Landing page
│ ├── events/
│ │ ├── index.blade.php # Event listing/search
│ │ ├── show.blade.php # Event detail page
│ │ ├── register.blade.php # Registration form
│ │ └── checkout.blade.php # Checkout page
│ ├── speakers/
│ │ ├── index.blade.php # Speaker directory
│ │ └── show.blade.php # Speaker profile
│ ├── sponsors/
│ │ └── index.blade.php # Sponsor showcase
│ └── surveys/
│ └── show.blade.php # Public survey form
│
├── attendee/ # Attendee dashboard
│ ├── dashboard.blade.php # Overview
│ ├── registrations/
│ │ ├── index.blade.php # My registrations
│ │ └── show.blade.php # Registration detail
│ ├── tickets/
│ │ ├── index.blade.php # My tickets
│ │ └── show.blade.php # Ticket detail + QR
│ ├── invoices/
│ │ └── index.blade.php # My invoices
│ ├── messages/
│ │ └── index.blade.php # Inbox
│ └── profile/
│ └── edit.blade.php # Profile settings
│
├── organizer/ # Organizer dashboard
│ ├── dashboard.blade.php # Overview + stats
│ ├── events/
│ │ ├── index.blade.php # My events
│ │ ├── create.blade.php # Create event wizard
│ │ ├── edit.blade.php # Edit event
│ │ ├── show.blade.php # Event management hub
│ │ └── sessions/
│ │ ├── index.blade.php # Session list
│ │ └── create.blade.php # Create session
│ ├── tickets/
│ │ ├── index.blade.php # Ticket types
│ │ └── create.blade.php # Create ticket type
│ ├── speakers/
│ │ ├── index.blade.php # Speaker list
│ │ └── create.blade.php # Add speaker
│ ├── sponsors/
│ │ ├── index.blade.php # Sponsor list
│ │ └── create.blade.php # Add sponsor
│ ├── registrations/
│ │ └── index.blade.php # All registrations
│ ├── checkin/
│ │ ├── index.blade.php # Check-in dashboard
│ │ └── scan.blade.php # QR scanner
│ ├── analytics/
│ │ ├── index.blade.php # Analytics dashboard
│ │ └── reports.blade.php # Reports
│ ├── surveys/
│ │ ├── index.blade.php # Survey list
│ │ ├── create.blade.php # Create survey
│ │ └── results.blade.php # Survey results
│ └── settings/
│ └── index.blade.php # Event settings
│
├── admin/ # Admin panel
│ ├── dashboard.blade.php # System overview
│ ├── users/
│ │ ├── index.blade.php # User management
│ │ └── show.blade.php # User detail
│ ├── organizations/
│ │ └── index.blade.php # Organization list
│ ├── roles/
│ │ ├── index.blade.php # Role management
│ │ └── permissions.blade.php # Permission assignment
│ ├── audit-logs/
│ │ └── index.blade.php # Audit log viewer
│ ├── support/
│ │ ├── index.blade.php # Support tickets
│ │ └── show.blade.php # Ticket detail
│ └── system/
│ └── settings.blade.php # System settings
│
├── components/ # Reusable Blade components
│ ├── event-card.blade.php # Event card for listings
│ ├── ticket-selector.blade.php # Ticket selection widget
│ ├── seating-chart.blade.php # Interactive seating
│ ├── checkout-form.blade.php # Payment form
│ ├── qr-scanner.blade.php # QR code scanner
│ ├── rating-stars.blade.php # Star rating input
│ ├── survey-question.blade.php # Survey question renderer
│ ├── notification-bell.blade.php # Notification dropdown
│ └── stat-card.blade.php # Statistics card
│
├── emails/ # Email templates
│ ├── registration-confirmed.blade.php
│ ├── payment-receipt.blade.php
│ ├── ticket-delivery.blade.php
│ ├── event-reminder.blade.php
│ ├── feedback-request.blade.php
│ ├── waitlist-notification.blade.php
│ └── password-reset.blade.php
│
└── partials/ # Shared partials
├── header.blade.php
├── footer.blade.php
├── sidebar.blade.php
├── flash-messages.blade.php
└── pagination.blade.php
Business Logic & Workflows
1. Event Creation Workflow
┌─────────────────────────────────────────────────────────────────┐
│ EVENT CREATION WIZARD │
└─────────────────────────────────────────────────────────────────┘
Step 1: Basic Info
├── Title, Description
├── Category, Tags
├── Start/End Date & Time
└── Event Type (in-person, virtual, hybrid)
│
▼
Step 2: Venue Selection
├── Select existing venue OR
├── Create new venue
├── Book venue (EventVenueBooking)
└── Set capacity
│
▼
Step 3: Ticket Setup
├── Create ticket types
│ ├── Name, Price, Capacity
│ ├── Early bird dates
│ └── Refund policy
└── Initialize inventory
│
▼
Step 4: Schedule/Sessions
├── Create sessions/tracks
├── Set times and rooms
└── Assign speakers
│
▼
Step 5: Speakers & Sponsors
├── Add/invite speakers
├── Set speaker roles
├── Add sponsors with tiers
└── Set sponsorship amounts
│
▼
Step 6: Media & Branding
├── Upload cover image
├── Add gallery images
└── Upload documents
│
▼
Step 7: Settings
├── Registration settings
├── Email templates
├── Reminder schedule
└── Survey configuration
│
▼
Step 8: Review & Publish
├── Preview event page
├── Review all settings
└── Publish (change status to 'published')
2. Attendee Registration Workflow
┌─────────────────────────────────────────────────────────────────┐
│ ATTENDEE JOURNEY │
└─────────────────────────────────────────────────────────────────┘
Discovery
├── Browse events (filter by category, location, date)
├── Search events
└── View event detail page
│
▼
Pre-Registration
├── Check availability (capacity, dates)
├── View ticket types & pricing
└── Check discount codes
│
▼
Registration (if capacity available)
├── Create Registration (status: pending)
├── Select ticket type(s) → OrderItem(s)
├── Select quantity
└── Choose add-ons (accommodation, meals, transport)
│
├── If sold out → Join Waitlist (with priority)
│
▼
Apply Discounts
├── Enter discount code
├── Validate code (dates, max uses)
└── Create CouponRedemption
│
▼
Checkout
├── Review order summary
├── Enter billing information
├── Select payment method
└── Process payment
│
▼
Post-Purchase
├── Payment → status: completed
├── Invoice generated
├── Ticket(s) generated with QR codes
├── Confirmation email sent
└── Registration → status: confirmed
│
▼
Pre-Event
├── Receive reminder emails (24h, 1h)
├── Download tickets
├── View event schedule
└── Message organizers if needed
│
▼
Event Day
├── Check-in (QR scan or manual)
├── Attend sessions
├── Network with other attendees
└── Participate in activities
│
▼
Post-Event
├── Receive feedback request
├── Submit feedback (rating, comments)
├── Complete survey
└── Receive certificates (if applicable)
3. Payment Processing Workflow
┌─────────────────────────────────────────────────────────────────┐
│ PAYMENT FLOW │
└─────────────────────────────────────────────────────────────────┘
Initiate Payment
├── Calculate total (items + services - discounts)
├── Convert currency if needed
├── Create Payment record (status: pending)
└── Redirect to payment provider
│
▼
Payment Provider (Stripe/PayPal)
├── User enters card details
├── 3D Secure if required
└── Provider processes payment
│
├── Success ─────────────────────┐
│ │
├── Failure ──► Retry or Cancel │
│ │
▼ ▼
Webhook Received Payment Confirmed
├── Validate signature ├── Update Payment (status: completed)
├── Update Payment status ├── Generate Invoice
└── Trigger post-payment ├── Generate Tickets
actions ├── Update Inventory
├── Send confirmation email
└── Update Registration (status: confirmed)
Refund Flow
├── User requests refund
├── Check refund policy (refundable ticket type?)
├── Create Refund record (status: pending)
├── Organizer reviews & approves
├── Process refund via provider
├── Update Refund (status: processed)
├── Update Payment (status: refunded/partial)
└── Return inventory (if applicable)
┌─────────────────────────────────────────────────────────────────┐
│ CHECK-IN FLOW │
└─────────────────────────────────────────────────────────────────┘
Setup (Before Event)
├── Register CheckinDevice(s)
├── Assign devices to locations
├── Activate devices
└── Test scanning
Check-in Operations
├── Staff opens scanner interface
├── Scan QR code OR manual lookup
│ │
│ ├── QR Scan
│ │ ├── Decode ticket_code
│ │ ├── Validate ticket
│ │ └── Check not already checked in
│ │
│ └── Manual Lookup
│ ├── Search by name, email, or booking ref
│ ├── Verify identity
│ └── Select correct ticket
│
├── Validation Results
│ ├── ✓ Valid → Create Checkin record
│ ├── ✗ Already checked in → Show warning
│ ├── ✗ Wrong event → Reject
│ └── ✗ Invalid ticket → Reject
│
└── Post Check-in
├── Update AttendanceStat (realtime)
├── Trigger welcome notification
└── Print badge (if configured)
Real-time Dashboard
├── Total registered vs checked in
├── Check-ins per hour chart
├── Session attendance
└── Device activity log
5. Survey & Feedback Workflow
┌─────────────────────────────────────────────────────────────────┐
│ FEEDBACK COLLECTION │
└─────────────────────────────────────────────────────────────────┘
Survey Creation (Organizer)
├── Create Survey (link to event)
├── Add SurveyQuestions
│ ├── Question text
│ ├── Question type (text, radio, rating, etc.)
│ ├── Options (for choice questions)
│ └── Required flag
├── Set question order
└── Activate survey
Distribution
├── Set distribution trigger (post-event)
├── Email sent to attendees
└── Link included in thank-you page
Collection
├── Attendee opens survey
├── Answers questions
├── Submit → SurveyResponse records created
└── Thank you confirmation
Analysis (Organizer)
├── View response count
├── Aggregate results
│ ├── Rating averages
│ ├── Choice distributions
│ └── Text response themes
├── Export to CSV/PDF
└── Compare across events
Business Model & Revenue Streams
Stream
Description
Implementation
Ticket Sales
Commission on each ticket sold
Payment.amount * platform_fee_percent
Platform Subscription
Monthly fee for organizers
Organization tier system
Premium Features
Advanced analytics, white-label, etc.
Feature flags per organization
Payment Processing
Small fee on transactions
Payment provider markup
Secondary Revenue Streams
Stream
Description
Implementation
Sponsorship Management
Fee for managing sponsors
EventSponsor tracking
Add-on Services
Commission on accommodations, etc.
Service bookings through platform
API Access
Charge for API integrations
ApiIntegration usage tracking
Advertising
Promoted events, featured listings
Event promotion system
Tier
Monthly Fee
Commission
Features
Free
$0
5% + $0.50/ticket
Basic event creation, 100 attendees max
Starter
$29
3% + $0.30/ticket
Unlimited attendees, basic analytics
Professional
$99
2% + $0.20/ticket
Advanced analytics, custom branding
Enterprise
Custom
1% negotiated
White-label, API access, dedicated support
Report
Data Source
Purpose
Revenue by Event
Payment, OrderItem
Track event performance
Revenue by Ticket Type
OrderItem, TicketType
Optimize pricing
Refund Analysis
Refund, Payment
Monitor refund rates
Sponsor Revenue
EventSponsor
Track sponsorship income
Platform Commission
Payment
Calculate platform earnings
Phase 1: Foundation (Core Infrastructure)
Duration: Foundation phase
Working authentication flow
User dashboard
Organization management
Role-based access control
Phase 2: Event Management
Duration: Core features phase
Event creation workflow
Public event pages
Session scheduling
Venue booking
Phase 3: Ticketing & Registration
Duration: Ticketing phase
Complete ticketing system
Registration checkout
Discount codes
Waitlist management
Phase 4: Payment Integration
Duration: Payment phase
Working payment flow
Invoice generation
Refund processing
Financial reporting
Phase 5: Speakers & Sponsors
Duration: Content phase
Speaker directory
Speaker profiles
Sponsor showcase
Sponsorship management
Duration: Communication phase
Notification center
Messaging system
Automated email triggers
Reminder system
Phase 7: Event Operations
Duration: Operations phase
Check-in system
Real-time attendance
Device management
Attendance reports
Phase 8: Feedback & Surveys
Duration: Feedback phase
Feedback system
Survey builder
Results dashboard
Support system
Phase 9: Analytics & Reporting
Duration: Analytics phase
Analytics dashboard
KPI tracking
Report generation
Data export
Phase 10: Polish & Launch
Duration: Launch phase
Production-ready application
Documentation
Deployment guide
Method
Endpoint
Description
POST
/api/auth/register
Register new user
POST
/api/auth/login
User login
POST
/api/auth/logout
User logout
POST
/api/auth/forgot-password
Request password reset
POST
/api/auth/reset-password
Reset password
GET
/api/auth/user
Get current user
Method
Endpoint
Description
GET
/api/users
List users (admin)
GET
/api/users/{id}
Get user details
PUT
/api/users/{id}
Update user
DELETE
/api/users/{id}
Delete user
PUT
/api/user/profile
Update own profile
PUT
/api/user/password
Change password
Method
Endpoint
Description
GET
/api/organizations
List organizations
POST
/api/organizations
Create organization
GET
/api/organizations/{id}
Get organization
PUT
/api/organizations/{id}
Update organization
DELETE
/api/organizations/{id}
Delete organization
GET
/api/organizations/{id}/members
List members
POST
/api/organizations/{id}/members
Add member
DELETE
/api/organizations/{id}/members/{userId}
Remove member
Method
Endpoint
Description
GET
/api/events
List public events
POST
/api/events
Create event
GET
/api/events/{id}
Get event details
PUT
/api/events/{id}
Update event
DELETE
/api/events/{id}
Delete event
POST
/api/events/{id}/publish
Publish event
POST
/api/events/{id}/cancel
Cancel event
POST
/api/events/{id}/duplicate
Duplicate event
Method
Endpoint
Description
GET
/api/events/{eventId}/sessions
List sessions
POST
/api/events/{eventId}/sessions
Create session
GET
/api/sessions/{id}
Get session
PUT
/api/sessions/{id}
Update session
DELETE
/api/sessions/{id}
Delete session
POST
/api/sessions/{id}/speakers/{speakerId}
Assign speaker
Method
Endpoint
Description
GET
/api/events/{eventId}/ticket-types
List ticket types
POST
/api/events/{eventId}/ticket-types
Create ticket type
GET
/api/ticket-types/{id}
Get ticket type
PUT
/api/ticket-types/{id}
Update ticket type
DELETE
/api/ticket-types/{id}
Delete ticket type
Method
Endpoint
Description
GET
/api/registrations
List user's registrations
POST
/api/events/{eventId}/register
Create registration
GET
/api/registrations/{id}
Get registration
POST
/api/registrations/{id}/cancel
Cancel registration
POST
/api/registrations/{id}/items
Add order item
DELETE
/api/registrations/{id}/items/{itemId}
Remove item
Method
Endpoint
Description
POST
/api/payments
Create payment
GET
/api/payments/{id}
Get payment
GET
/api/payments/{id}/status
Check payment status
POST
/api/webhooks/stripe
Stripe webhook
POST
/api/webhooks/paypal
PayPal webhook
Method
Endpoint
Description
POST
/api/checkin/scan
Scan QR code
POST
/api/checkin/manual
Manual check-in
GET
/api/events/{eventId}/checkin/stats
Get check-in stats
GET
/api/events/{eventId}/attendance
Get attendance data
Method
Endpoint
Description
GET
/api/events/{eventId}/surveys
List surveys
POST
/api/events/{eventId}/surveys
Create survey
GET
/api/surveys/{id}
Get survey
PUT
/api/surveys/{id}
Update survey
POST
/api/surveys/{id}/questions
Add question
POST
/api/surveys/{id}/responses
Submit response
GET
/api/surveys/{id}/results
Get results
Method
Endpoint
Description
GET
/api/analytics/dashboard
Get dashboard data
GET
/api/events/{eventId}/analytics
Get event analytics
GET
/api/analytics/revenue
Revenue report
POST
/api/analytics/track
Track event
# Application
APP_NAME = " Event Management System"
APP_ENV = production
APP_KEY =
APP_DEBUG = false
APP_URL = https://yourdomain.com
# Database
DB_CONNECTION = mysql
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_DATABASE = event_management
DB_USERNAME = root
DB_PASSWORD =
# Mail
MAIL_MAILER = smtp
MAIL_HOST = smtp.mailtrap.io
MAIL_PORT = 2525
MAIL_USERNAME =
MAIL_PASSWORD =
MAIL_ENCRYPTION = tls
MAIL_FROM_ADDRESS = noreply@yourdomain.com
MAIL_FROM_NAME = " ${ APP_NAME } "
# Payment Providers
STRIPE_KEY =
STRIPE_SECRET =
STRIPE_WEBHOOK_SECRET =
PAYPAL_CLIENT_ID =
PAYPAL_SECRET =
PAYPAL_MODE = sandbox
# File Storage
FILESYSTEM_DISK = s3
AWS_ACCESS_KEY_ID =
AWS_SECRET_ACCESS_KEY =
AWS_DEFAULT_REGION = us-east-1
AWS_BUCKET =
# Queue
QUEUE_CONNECTION = redis
REDIS_HOST = 127.0.0.1
REDIS_PASSWORD = null
REDIS_PORT = 6379
# Cache
CACHE_DRIVER = redis
SESSION_DRIVER = redis
Authentication
Use Laravel Sanctum for API tokens
Implement rate limiting on auth endpoints
Require email verification
Authorization
Implement RBAC with granular permissions
Use policies for resource-level access
Validate organization membership
Data Protection
Encrypt sensitive data at rest
Use HTTPS everywhere
Sanitize all user inputs
Implement CSRF protection
Payment Security
Never store card details
Use payment provider tokens
Validate webhook signatures
Log all financial transactions
Audit Trail
Log all admin actions
Track user activity
Maintain IP address records
Implement data retention policies