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)
Note: The add-on works standalone for free events. Payment gateway add-ons are only required if you want to charge for registrations.

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, sets published_at, and sends a notification to the organizer (if enabled).
  • Cancel: sets status to cancelled and 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:
ActionTransitionEffect
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
textText inputNo
textareaTextareaNo
numberNumber inputNo
selectDropdown selectYes
checkboxCheckbox(es)Yes
radioRadio buttonsYes
dateDate pickerNo
urlURL inputNo
emailEmail inputNo
fileFile uploadNo

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

MethodURLRoute NameDescription
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

GET /{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:

  1. Select ticket type & quantity: on the event detail page.
  2. Fill registration form: first name, last name, email, phone (optional/required), company, job title, plus any custom fields.
  3. Submit registration: POST /{locale}/events/{event}/register
  4. Duplicate check: system checks if the email is already registered for this event.
  5. Registration created: a unique registration number is generated (EVT-YYYY-#####).
  6. Status assignment:
    • If registration_confirmation is enabled: status = pending
    • Otherwise: status = confirmed
  7. Payment redirect: if the event is paid, redirect to checkout page.
  8. Confirmation page: if free, redirect to the confirmation page showing registration details.
  9. Notifications sent: based on notification settings (to registrant, admin, organizer).
POST /{locale}/events/{event}/register
Required Fields
first_nameRequiredAttendee first name
last_nameRequiredAttendee last name
emailRequiredValid email address
quantityRequiredNumber of tickets (1 to max_tickets_per_registration)
ticket_type_idConditionalRequired if the event has ticket types
phoneConditionalRequired if require_phone is enabled
custom_fields[*]ConditionalBased on custom field configuration
GET /{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

GET /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.

GET /{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.

POST /{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:

MethodReturns
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.

Note: User-created events start with draft status and require admin approval (publishing) before they appear on the public listing.
MethodURLRoute NameDescription
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

GET /{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.

Backup first: Always back up your database before running migrations on a production system.

Troubleshooting

Events not showing on front-end

  • Ensure events have status published and published_at is in the past.
  • Check that the event’s start_date or end_date has 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_paid and currency.

User cannot create events

  • Verify allow_user_events is 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_attendees is set on the event (null means unlimited).
  • The system counts only confirmed and attended registrations 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:

Was this article helpful?

Thank you for your feedback!

Still need help? Create a support ticket

Create a Ticket