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: Upload the Add-on

In the admin panel, go to Admin → Extensions → Add-ons and click the Upload Add-on button. Select the add-on’s ZIP file: the system extracts it automatically and the add-on appears in the installed add-ons list.

Step 2: Activate the Add-on

Find Events Registration Management in the list and click Activate. Its migrations, seeders (if any) and permissions are set up automatically.

Step 3: Configure

Navigate to Admin → Events → Settings to configure event categories, ticket types, registration forms, and notifications. See Configuration.

Purchase Code (License Key)

Events Registration is sold as a separate product, so it has its own purchase code (license key), distinct from the purchase code of the main application and from the one of every other add-on. You are asked for it when you activate Events Registration in Admin panel → Add-ons.

Our products are sold on three platforms. The way you receive a purchase code depends on where you bought the product.

Platform / Marketplace How you get the purchase code Where to find it again
bedigit.com Store
In-site purchase (Shop)
Generated automatically when the order is paid, then sent by email, either in its own license email, or inside the order confirmation email. My Account → My Licenses on bedigit.com
Gumroad Created as soon as Gumroad notifies us of the sale, then sent in a separate email, in addition to the Gumroad receipt. The license email, your Gumroad Library, and My Account → My Licenses on bedigit.com
Envato Market
CodeCanyon
Issued by Envato, not by us, and never sent by email: you download it yourself from your Envato account. Envato account → Downloads → License certificate & purchase code
Check your spam folder. For both bedigit.com Store and Gumroad purchases, the purchase code is delivered by email. Automated license emails are very often filtered, so if the message is not in your inbox, look in your spam / junk folder before contacting support, and add our sender address to your contacts or allow list.

1. bedigit.com Store (in-site purchase)

  • As soon as the order’s payment status becomes Paid, a license key is generated automatically for every licensed item in the order (one key per purchased unit: buying 3 units gives 3 distinct keys).
  • It is emailed to the address used on the order, either in a dedicated license email or inside the order confirmation email. Check your inbox and your spam / junk folder.
  • The key stays available in your account under My Account → My Licenses. Keys are masked in the list; open the license detail page to reveal and copy the full key, see the domains it is activated on, and deactivate a domain to free an activation slot.
  • The matching invoice is under My Account → My Orders.

2. Gumroad

  • A Gumroad purchase produces two separate emails: the Gumroad receipt (sent by Gumroad, giving access to the files) and a license key email (sent by bedigit.com) that contains your purchase code.
  • The license key email is generated as soon as Gumroad notifies us of the sale, so it normally arrives within seconds of the payment. Here too, check your inbox and your spam / junk folder.
  • When the Gumroad product uses Gumroad’s own license-key feature, the same key also appears in your Gumroad receipt and under Library → your purchase on gumroad.com.
  • Use the same email address on bedigit.com as on Gumroad: your keys are then linked to your account automatically and listed under My Account → My Licenses, even if you register after the purchase. You can also add a Gumroad key manually from My Account → My Gumroad Licenses.

3. Envato Market (CodeCanyon)

  • Envato purchase codes are issued and delivered by Envato Market, never emailed by us, so there is nothing to look for in your spam folder: you retrieve the code from your Envato account.
  • Log in to your Envato / CodeCanyon account, open the Downloads page, find the item, and choose License certificate & purchase code from the Download dropdown. The code is written in that certificate.
  • An Envato purchase code looks like 12345678-90ab-cdef-1234-567890abcdef (8-4-4-4-12 characters). It never changes, and renewing item support does not issue a new one.
  • Official Envato article: Where Is My Purchase Code?
Lost your purchase code? Search your mailbox (spam folder included) for “license” or “purchase code”, then check My Account → My Licenses on bedigit.com for Store and Gumroad purchases, or Downloads → License certificate on Envato. If it is still missing, open a ticket on our Help Center with your order number (Store), Gumroad sale ID or buyer email (Gumroad), or Envato username and item name (Envato).

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

There are two ways to update this add-on: via the admin panel (recommended) or manually replacing files.

Method 1: Admin Panel Upload (Recommended)

  1. Download the latest .zip file of this add-on.
  2. Go to Admin panel → Add-ons and click the Upload button.
  3. Select or drag the .zip file into the upload area.
  4. A confirmation prompt will show the current and new version numbers. Click Replace to proceed.
  5. Go to Admin panel → System Update (/admin/update) to apply any pending database migrations.

Method 2: Manual File Replacement

Step 1: Replace Files

Replace the add-on directory with the new version.

Step 2: Run Migrations

php artisan migrate

Pending migrations run once, so the command is safe to repeat.

Step 3: Clear Caches

php artisan config:clear
php artisan route:clear
php artisan view:clear

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.

Uninstallation

Switching an add-on off without losing anything is a deactivation: go to Admin panel → Add-ons, find Events Registration Management and click Deactivate.

  • Its routes, views, admin menu entries and permissions stop being registered, and its front-end pages stop answering.
  • Its database tables and all the data they hold are kept, and its files stay under extensions/addons/events/. Nothing is deleted.
  • The purchase code recorded at activation is kept too, so activating the add-on again does not ask for it.
  • Deactivation is refused while another active add-on depends on this one: deactivate that add-on first.

Click Activate on the same card to switch it back on. Pending migrations are re-run, assets are republished, and the add-on picks up exactly where it left off.

Removing

Removing is permanent and destroys the add-on's data. The Remove button only appears on a deactivated add-on, so removal is always two steps:

  1. Deactivate Events Registration Management (see Uninstallation).
  2. Click Remove on its card and confirm the prompt.

The admin panel then, in one pass:

  • runs the add-on's uninstall hook, if it ships one, while its code is still on disk;
  • revokes the permissions declared in its addon.json;
  • rolls back its migrations (this drops its database tables and every row they hold) and purges its entries from the migrations table, so a later reinstall migrates from scratch;
  • deletes its published assets: public/addons/events/, public/vendor/events/ and storage/app/public/addons/events/;
  • deletes the add-on directory extensions/addons/events/;
  • deletes its row in the addons table (the recorded purchase code goes with it) and clears the application cache.
This cannot be undone. Back up your database before removing an add-on whose data you may still need: installing it again later creates empty tables, not your old content.

Removal is refused, with an explanatory message and before anything is destroyed, when the add-on is still active, when another active add-on depends on it, or when the web server (PHP) user cannot delete extensions/addons/events/. In that last case, give that user write permission on the directory and on its parent, then try again.

Deleting the folder over FTP or SSH is not equivalent: the add-on's tables, its entries in the migrations table and its addons row are all left behind, and its card stays in the list. Use Remove in the admin panel instead.

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:

Events Registration Management v1.0.0: Part of the Larapen CMS platform.

© BeDigit. All rights reserved.

Was this article helpful?

Thank you for your feedback!

Still need help? Create a support ticket

Create a Ticket
Apr 07, 2026