events

Event ticketing and venue booking app built on Payload, Next.js and the payload-reserve plugin

events screenshot
1 / 1
events screenshot

Overview

Summary generated from the README

A festival ticketing demo that uses the payload-reserve plugin with per-reservation capacity, where each booking deducts ticket quantity from a venue's seats. It uses Next.js App Router, MongoDB, Stripe Checkout, next-intl for English and French, and Tailwind CSS. It needs Node 20.9 or newer, pnpm, a local MongoDB and the Stripe CLI for webhook forwarding.

Features

  • Per-reservation capacity mode with a custom ticket quantity field
  • Venue and event type restrictions for compatible pairings
  • Setup and cleanup buffer between events and a 48-hour cancellation notice
  • Stripe Checkout with a webhook handler and a task that cancels unpaid bookings
  • Collections for artists, seasons, announcements and testimonials
  • Seed script with event types, venues, schedules and sample content

Good for

  • Building ticketing sites for festivals, theaters or concert venues
  • Learning how to configure payload-reserve with custom reservation fields
  • Prototyping a booking flow with venue capacity and Stripe payments

From the author

Events demo — payload-reserve event booking & ticketing

Get started

npx giget@latest gh:elghaied/payloadreserve-demos/apps/events my-app

README

Eclat Festival — payload-reserve Demo

Live: events.payloadreserve.com

An event ticketing app built with Payload CMS 3.x + Next.js 15 (App Router). Demonstrates per-reservation capacity mode — customers purchase ticket quantities for events at specific venues, with venue-event type restrictions and seasonal programming.

Part of the payload-reserve-demos monorepo.


What This Demo Shows

ConceptImplementation
Per-reservation capacityEach booking deducts ticket quantity from venue seat count
Custom reservation fieldsticketQuantity (1–10) added via extraReservationFields
Venue-event restrictionsCertain event types only available at compatible venues
Setup/cleanup buffers30-minute buffer between events for staging
Long cancellation window48-hour cancellation notice period
Seasonal programmingEvents organized by seasons (Spring, Summer, Autumn, Winter)

Tech Stack

LayerTechnology
FrameworkNext.js 15 (App Router, React 19)
CMS / APIPayload CMS 3.x
DatabaseMongoDB (via @payloadcms/db-mongodb)
Pluginpayload-reserve
PaymentsStripe Checkout
i18nnext-intl (English + French)
StylingTailwind CSS v4
TestingVitest (integration) + Playwright (e2e)

Prerequisites

  • Node.js >=20.9.0
  • pnpm >=10
  • MongoDB running locally
  • Stripe CLI installed (for webhook forwarding)

Quick Start

# From monorepo root
pnpm install
cp apps/events/.env.example apps/events/.env   # Fill in your values
cd apps/events && pnpm seed                     # Seed sample data
pnpm dev:events                                 # From root, or: cd apps/events && pnpm dev

Project Structure

apps/events/src/
├── app/
│   ├── (frontend)/[locale]/        # Public-facing pages
│   │   └── book/                   # Booking flow (event type → venue → date/time → tickets)
│   ├── (payload)/                  # Payload admin panel + REST/GraphQL API routes
│   └── api/stripe-webhook/         # Stripe checkout.session.completed handler
├── collections/
│   ├── Users.ts                    # Admin users
│   ├── Media.ts                    # Image uploads
│   ├── Artists.ts                  # Performer/director/artist profiles (6 artists)
│   ├── Seasons.ts                  # Festival calendar (Spring, Summer, Autumn, Winter)
│   ├── Announcements.ts            # Featured shows and upcoming events
│   └── Testimonials.ts             # Festival reviews
├── globals/                        # Homepage, SiteSettings
├── seed/
│   ├── index.ts                    # Main seed script
│   ├── event-types.ts              # 6 event types ($12–$40, 90–180 min)
│   ├── venues.ts                   # 5 venues (50–500 seats)
│   ├── schedules.ts                # Venue availability
│   ├── artists.ts                  # 6 artists (pianist, actor, visual artist, filmmaker, dancer, historian)
│   ├── seasons.ts                  # 4 seasonal programs
│   ├── announcements.ts            # Featured events
│   ├── testimonials.ts             # Sample reviews
│   └── images.ts                   # Venue and artist photos
├── tasks/
│   └── cancelStaleReservations.ts  # Auto-cancel unpaid bookings
├── i18n/                           # next-intl routing config
├── payload.config.ts               # Main config — plugin, collections, jobs
└── payload-types.ts                # Auto-generated types

Plugin Configuration

payloadReserve({
  slugs: {
    services: 'event-types',
    resources: 'venues',
    schedules: 'schedules',
    reservations: 'bookings',
  },
  defaultBufferTime: 30, // minutes — setup/cleanup between events
  cancellationNoticePeriod: 48, // hours
  extraReservationFields: [
    {
      name: 'ticketQuantity',
      type: 'number',
      min: 1,
      max: 10,
      defaultValue: 1,
    },
  ],
})

payload-reserve Collections

SlugDescription
event-typesEvent categories with price, duration, and description
venuesPerformance spaces with seat capacity and event-type restrictions
schedulesVenue availability windows
bookingsTicket reservations with ticketQuantity custom field
customersAttendee records (separate from admin users)

Seed Data

Event Types

TypePriceDuration
Concert$35120 min
Theater$40150 min
Exhibition$1590 min
Film Screening$12120 min
Workshop$2590 min
Dance$30120 min

Venues

VenueCapacitySupported Events
Grande Salle500Concert, Theater, Dance
Salon Noir100Theater, Film, Workshop
Galerie Lumiere80Exhibition, Workshop
Studio Eclat50Film, Workshop
La Terrasse200Concert, Film, Dance

Artists

  • Lucien Marais — Pianist
  • Camille Beaufort — Actor/Director
  • Yuki Tanaka — Visual Artist
  • Reda Benali — Filmmaker
  • Eloise Dupont — Dancer
  • Marc-Antoine Levy — Historian

Commands

# From monorepo root
pnpm dev:events          # Start dev server
pnpm build:events        # Production build

# From apps/events/
pnpm dev                 # Start dev server
pnpm devsafe             # Wipe .next cache + dev
pnpm seed                # Seed database
pnpm test                # Run all tests
pnpm test:int            # Vitest integration tests
pnpm test:e2e            # Playwright e2e tests

URLs

URLDescription
http://localhost:3004Frontend (defaults to /en)
http://localhost:3004/frFrench locale
http://localhost:3004/adminPayload admin panel
http://localhost:3004/apiPayload REST API

More Business & agency templates

hotel screenshot

hotel

Hotel booking site with room pools, multi-night date-range reservations and Stripe checkout

0
v3
Next.js
Updated 2 months ago
restaurant screenshot

restaurant

Restaurant reservation site with party-size bookings, dining experiences, and Stripe checkout

0
v3
Next.js
Updated 2 months ago
salon screenshot

salon

Salon booking app with specialists, schedules, Stripe payments and English and French localization

0
v3
Next.js
Updated 2 months ago