Events Registration Management
A full-featured events registration system for Larapen. Create and manage events with ticket types, custom registration fields, attendee tracking, payment processing, and user-submitted events.
Event Management
Create events with full details: venue, dates, online/in-person, capacity limits, featured images, and gallery.
Ticket Types
Multiple ticket tiers per event with individual pricing, quantities, sale windows, and per-registration limits.
Registration & Check-in
Online registration with confirmation workflow, attendee check-in tracking, and CSV export of registrations.
Custom Fields
Collect additional attendee data with 10 field types. Create global fields or event-specific ones.
Payment Integration
Supports Stripe, PayPal, Paddle, and MoMo via the core PaymentService for paid event registrations.
User-Submitted Events
Allow registered users to create and manage their own events, with admin approval before publishing.
Use Cases
Conferences & Summits
Organize multi-day conferences with multiple ticket types (Early Bird, General Admission, VIP). Use custom fields to collect dietary preferences, T-shirt sizes, or company information. Track check-ins at the door and export attendee lists.
Workshops & Training Sessions
Run limited-capacity workshops with waitlist support. Set registration windows to control sign-up timing. Collect prerequisite information via custom fields.
Webinars & Online Events
Create online events with meeting URLs (Zoom, Google Meet, etc.). Track registrations for free or paid webinars. Send automatic confirmation emails with join links.
Community Meetups
Enable the “User Events” feature to let community members create and manage their own events. Events go through admin review before publishing.
Requirements
- Larapen CMS v1.0.0 or later
- PHP 8.3+
- MySQL 8.0+
- A payment gateway add-on (e.g. Stripe, PayPal) for paid events (optional)
Installation
Step 1: Place the Add-on
Copy or symlink the events folder into your Larapen "extensions/addons" directory:
Step 2: Activate the Add-on
Go to Admin → Add-ons → Installed Add-ons and activate Events Registration Management.
Step 3: Run Migrations
This creates 5 tables: events_events, events_registrations,
events_ticket_types, events_custom_fields, and events_custom_field_values.
It also uses the unified categories table with categorizable_type = 'event'.
Step 4: Set Permissions
The add-on registers 17 permissions (see Permissions). Assign them to admin roles via Admin → Users → Roles & Permissions.
Step 5: Configure
Navigate to Admin → Events → Settings to configure feature toggles, notification preferences, and registration behavior. See Configuration.
Step 6: Build Theme Assets
If the events add-on includes theme-specific SCSS or JS files, rebuild the Vite manifest:
Configuration
All settings are managed via Admin → Events → Settings and stored in the
settings table with the event_ prefix. Default values are defined in
config/events.php.
General Settings
| Setting | Description | Default |
|---|---|---|
per_page |
Number of events shown per page on the front-end listing. | 12 |
admin_per_page |
Number of items per page in admin tables. | 15 |
max_images |
Maximum number of gallery images per event. | 5 |
max_tickets_per_registration |
Maximum ticket quantity a registrant can select per registration. | 10 |
Feature Toggles
| Setting | Description | Default |
|---|---|---|
registration_confirmation |
Require admin confirmation for new registrations (registrations start as “pending” instead of “confirmed”). | false |
allow_guest_registration |
Allow non-authenticated visitors to register for events. | false |
require_phone |
Make the phone number field required on the registration form. | false |
enable_waitlist |
Enable waitlist functionality when events reach capacity. | false |
allow_user_events |
Allow registered users to create and submit their own events. | false |
confirmation_email |
Send a confirmation email to registrants upon successful registration. | true |
Notification Toggles
| Setting | Description | Default |
|---|---|---|
notify_admin_on_new_event |
Notify admins when a new event is created (by users). | true |
notify_organizer_on_publish |
Notify the event organizer when their event is published. | true |
notify_registrants_on_cancellation |
Notify all registrants when an event is cancelled. | true |
notify_registrant_on_registration |
Send confirmation to a registrant upon successful registration. | true |
notify_admin_on_new_registration |
Notify admins when a new registration is submitted. | true |
notify_registrant_on_confirmation |
Notify a registrant when their registration is confirmed by admin. | true |
notify_registrant_on_cancellation |
Notify a registrant when their registration is cancelled. | true |
notify_organizer_on_new_registration |
Notify the event organizer when a new registration is received. | true |
Admin: Events
The Events page (Events → All Events) manages all events on the platform.
Events List
A sortable, paginated table showing:
- Title: event name with link to edit
- Category: assigned event category
- Start / End Date
- Status: colored badge (Draft, Published, Cancelled, Completed, Archived)
- Registrations count
- Featured: star indicator
- View count
Filters: status dropdown, category dropdown, and text search. Per-event actions: Edit, Publish, Cancel, Delete.
Create & Edit
The event form is organized into sections:
Basic Information
- Title (translatable): required
- Slug (translatable): auto-generated from title
- Category: select from event categories
- Description (translatable): short description / excerpt
- Content (translatable): full event content with WYSIWYG editor
Date & Time
- Start Date (datetime): required
- End Date (datetime): optional
- Timezone: event timezone
- Registration Start (datetime): when registration opens
- Registration End (datetime): when registration closes
Location
- Is Online: toggle for virtual events
- Online URL / Online Platform: shown when “Is Online” is enabled
- Venue Name, Address, City, Region, Country
- Latitude / Longitude: for map display
Capacity & Pricing
- Max Attendees: null for unlimited
- Is Free: toggle
- Ticket Types: inline management (add/edit/remove ticket tiers)
Organizer & Contact
- Organizer Name, Organizer Description
- Contact Email, Contact Phone
SEO & Publishing
- Meta Title (translatable), Meta Description (translatable)
- Status: Draft, Published, Cancelled, Completed, Archived
- Is Featured: toggle
- Published At: schedule publication date
- Position: sort order
Media
- Featured Image: primary event image
- Gallery: up to 5 additional images (configurable via
max_images)
Publish & Cancel
Quick-action buttons on the events list allow changing event status without opening the edit form:
- Publish: sets status to
published, setspublished_at, and sends a notification to the organizer (if enabled). - Cancel: sets status to
cancelledand notifies all confirmed registrants (if enabled).
Admin: Categories
Event categories use the unified categories table with categorizable_type = 'event'.
They support hierarchical nesting (parent/child) via the parent_id column.
Categories List
A hierarchical tree view of all event categories with drag-and-drop reordering. Shows: name (translatable), slug, events count, active status.
Category Form
- Name (translatable): required
- Slug (translatable): auto-generated
- Description (translatable)
- Meta Title / Meta Description (translatable)
- Parent Category: optional
- Position: sort order
- Is Active: toggle
Admin: Registrations
The Registrations page (Events → Registrations) provides a centralized view of all event registrations.
Registrations List
A paginated table showing:
- Registration Number: unique identifier (format:
EVT-YYYY-#####) - Event Name
- Attendee Name & Email
- Ticket Type & Quantity
- Status: colored badge (Pending, Confirmed, Cancelled, Attended, No Show)
- Payment Status (if applicable)
- Amount Paid
- Registration Date
Filters: event dropdown, status dropdown, and text search.
Detail & Actions
The registration detail page (Registrations → {registration}) shows:
- Registration info card: registration number, event name, attendee details (name, email, phone, company, job title), ticket type, quantity, dates
- Status management: current status badge with action buttons:
| Action | Transition | Effect |
|---|---|---|
| Confirm | Pending → Confirmed | Sends confirmation notification to registrant |
| Cancel | Any → Cancelled | Sends cancellation notification to registrant |
| Check In | Confirmed → Attended | Records checked_in_at timestamp |
| Delete | — | Permanently removes the registration record |
- Payment details: amount, currency, payment method, reference, paid date
- Custom field values: all custom field responses submitted by the attendee
- IP address & linked user account (if authenticated)
Export
Click Export CSV to download registrations as a CSV file. The export can be filtered by event and status before downloading. The CSV includes all registration fields, ticket information, payment data, and custom field values.
Admin: Custom Fields
Custom fields allow you to collect additional information from registrants beyond the standard fields (name, email, phone). Fields can be global (appear on all events) or event-specific (appear only on a particular event).
Custom Fields List
Shows all custom fields with: name, type, scope (Global or specific event name), required status, position, and active toggle. Filterable by event.
Custom Field Form
- Name (translatable): field label shown to registrants
- Slug: auto-generated unique identifier
- Placeholder (translatable): optional placeholder text
- Help Text (translatable): optional help text shown below the field
- Type: see Field Types
- Options: comma-separated values for Select, Radio, and Checkbox types
- Event: select a specific event or leave empty for a global field
- Is Required: toggle
- Position: sort order
- Is Active: toggle
Field Types
| Type | HTML Input | Supports Options |
|---|---|---|
text | Text input | No |
textarea | Textarea | No |
number | Number input | No |
select | Dropdown select | Yes |
checkbox | Checkbox(es) | Yes |
radio | Radio buttons | Yes |
date | Date picker | No |
url | URL input | No |
email | Email input | No |
file | File upload | No |
Admin: Settings
The settings page (Events → Settings) is organized into three sections:
General
- Events Per Page: front-end listing pagination
- Admin Per Page: admin table pagination
- Max Images: gallery image limit per event
- Max Tickets Per Registration: quantity cap
Features
- Registration Confirmation: toggle manual approval workflow
- Allow Guest Registration: allow unauthenticated registrations
- Require Phone: make phone field mandatory
- Enable Waitlist: waitlist when capacity is reached
- Allow User Events: let users create events
- Confirmation Email: send email upon registration
Notifications
Eight toggle switches controlling when email notifications are sent. See Notifications for the full list.
Front-end: Events Listing
The public events page displays all published, active events with filtering and pagination.
Routes
| Method | URL | Route Name | Description |
|---|---|---|---|
| GET | /{locale}/events |
front.events.index.localized |
Events listing page |
| GET | /{locale}/events/category/{slug} |
front.events.category.localized |
Events filtered by category |
Non-localized variants (without {locale}) are also registered.
Features
- Paginated grid of event cards (configurable per page)
- Category sidebar or filter
- Text search across title, description, venue, city, and organizer
- Events are ordered by start date and position
- Featured events can be highlighted
Front-end: Event Detail
/{locale}/events/{slug}
Description
Displays the full event page with all details, ticket types, and the registration form.
Features
- Full event content (description, content, gallery)
- Location details with map (if coordinates provided)
- Date/time display with timezone
- Online event link (shown after registration or to organizer)
- Organizer information
- Ticket type selection with pricing
- Registration form with custom fields (loaded via AJAX)
- Available spots indicator and capacity status
- Related events from the same category
- View counter (incremented on each visit)
Front-end: Registration Flow
The registration process follows these steps:
- Select ticket type & quantity: on the event detail page.
- Fill registration form: first name, last name, email, phone (optional/required), company, job title, plus any custom fields.
- Submit registration:
POST /{locale}/events/{event}/register - Duplicate check: system checks if the email is already registered for this event.
- Registration created: a unique registration number is generated (
EVT-YYYY-#####). - Status assignment:
- If
registration_confirmationis enabled: status =pending - Otherwise: status =
confirmed
- If
- Payment redirect: if the event is paid, redirect to checkout page.
- Confirmation page: if free, redirect to the confirmation page showing registration details.
- Notifications sent: based on notification settings (to registrant, admin, organizer).
/{locale}/events/{event}/register
Required Fields
first_name | Required | Attendee first name |
last_name | Required | Attendee last name |
email | Required | Valid email address |
quantity | Required | Number of tickets (1 to max_tickets_per_registration) |
ticket_type_id | Conditional | Required if the event has ticket types |
phone | Conditional | Required if require_phone is enabled |
custom_fields[*] | Conditional | Based on custom field configuration |
/{locale}/events/registration/{registrationNumber}
Description
Confirmation page showing registration details, ticket info, and registration number. The registrant can save or print this page as their confirmation receipt.
Custom Fields AJAX Endpoint
/api/events/custom-fields/{eventId?}
Description
Returns active custom fields for a specific event (including global fields) as JSON. Used by the registration form to dynamically load custom field inputs.
Response (JSON)
Front-end: Payment & Checkout
For paid events, the registration model implements the Payable interface from the core app,
enabling seamless integration with payment gateways.
/{locale}/events/registration/checkout/{registration}
Description
Displays the payment checkout page for a registration. Shows order summary (event name, ticket type, quantity, total amount) and available payment methods.
/{locale}/events/registration/checkout/{registration}
Description
Processes payment via the selected payment gateway. Supported gateways include Stripe, PayPal, Paddle, and MoMo (depending on which payment add-ons are active).
On Success
The registration’s payment_status is set to paid,
paid_at timestamp is recorded, and the user is redirected to the confirmation page.
On Failure
The payment_status is set to failed and the user is returned to the
checkout page with an error message.
Payable Interface Methods
The Registration model implements these methods for payment gateway integration:
| Method | Returns |
|---|---|
getPayableAmount() | Registration amount (amount_paid) |
getPayableCurrency() | Currency code |
getPayableDescription() | Description string for payment gateway |
getPayableCustomerEmail() | Registrant email |
getPayableCustomerName() | Registrant full name |
getPayableIdentifier() | Registration number |
markAsPaid(method, reference) | Updates payment fields |
getPaymentSuccessUrl() | Confirmation page URL |
getPaymentCancelUrl() | Checkout page URL |
Front-end: User Events
When allow_user_events is enabled, authenticated users can create and manage their own events.
draft status and require admin approval
(publishing) before they appear on the public listing.
| Method | URL | Route Name | Description |
|---|---|---|---|
| GET | /{locale}/events/my-events |
front.events.my-events.localized |
List user’s created events |
| GET | /{locale}/events/create/new |
front.events.create.localized |
Create event form |
| POST | /{locale}/events/create/new |
front.events.store.localized |
Submit new event |
| GET | /{locale}/events/{event}/edit |
front.events.edit.localized |
Edit own event |
| PUT | /{locale}/events/{event} |
front.events.update.localized |
Update own event |
| DELETE | /{locale}/events/{event} |
front.events.destroy.localized |
Delete own event (draft/cancelled only) |
All user event routes require authentication. Non-localized variants are also registered.
Front-end: My Registrations
/{locale}/events/attending
Description
Shows all events the authenticated user has registered for. Matches registrations by user ID and email address. Displays event name, date, registration status, ticket type, and quantity.
Notifications
All notifications extend BaseNotification and are sent via the mail channel.
Each can be individually toggled in settings.
| Notification | Recipient | Trigger |
|---|---|---|
NewEventAdminNotification |
Admins | A new event is created (by a user) |
EventPublishedNotification |
Event organizer | Event status changed to published |
EventCancelledNotification |
All registrants | Event is cancelled |
RegistrationConfirmationNotification |
Registrant | Successful registration submission |
RegistrationConfirmedNotification |
Registrant | Admin confirms a pending registration |
RegistrationCancelledNotification |
Registrant | Registration is cancelled |
NewRegistrationAdminNotification |
Admins | A new registration is received |
NewRegistrationOrganizerNotification |
Event organizer | A new registration is received for their event |
Updating
Step 1: Replace Files
Replace the add-on directory with the new version.
Step 2: Run Migrations
Step 3: Clear Caches
Step 4: Rebuild Assets
If theme views or SCSS files were updated:
Step 5: Verify
Visit Events → All Events in the admin panel and confirm that everything loads correctly. Test the front-end listing and registration flow.
Troubleshooting
Events not showing on front-end
- Ensure events have status
publishedandpublished_atis in the past. - Check that the event’s
start_dateorend_datehas not passed (only active events are shown by default). - Verify the add-on is activated in Admin → Add-ons.
Registration form not showing custom fields
- Ensure custom fields are marked as Active.
- For event-specific fields, verify they are assigned to the correct event.
- Check the browser console for AJAX errors when loading
/api/events/custom-fields/{eventId}.
Registration fails: “Already registered”
The system checks for duplicate registrations by email per event. If the attendee has already registered with the same email address for this event, the registration is rejected. This is by design to prevent duplicate sign-ups.
Payment checkout page not loading
- Ensure at least one payment gateway add-on is installed and active (e.g. Stripe).
- Verify the event is not marked as “free” (
is_free = false). - Check that the registration has a valid
amount_paidandcurrency.
User cannot create events
- Verify
allow_user_eventsis enabled in Events → Settings. - The user must be authenticated (logged in).
- The “My Events” link only appears in the user menu when the setting is enabled.
Notifications not being sent
- Check the relevant notification toggle in Events → Settings.
- Verify your mail configuration in Admin → Settings → Mail is working correctly.
- Check the Laravel log (
storage/logs/laravel.log) for mail sending errors.
Event capacity not enforced
- Ensure
max_attendeesis set on the event (null means unlimited). - The system counts only
confirmedandattendedregistrations toward capacity. - Cancelled and pending registrations do not count against the limit.
CSV export is empty or incomplete
- Apply the desired filters (event, status) before clicking Export.
- Ensure there are registrations matching the current filter criteria.
- Check file encoding if special characters appear garbled: the export uses UTF-8.
“Unable to locate file in Vite manifest” error
This means the Vite build has not been run after adding new theme SCSS/JS files. Run: