Events
v1.1.2Sell tickets to dated events and courses — a seats-left calendar, Stripe checkout, and optional QR tickets with door check-in, all inside your own site.
Overview
The Events module turns any WordPress page into a ticketed calendar of dated events and course sessions, each with its own seat pool.
Events is built for workshops, courses, classes and one-off events — anything with a fixed date, a limited number of seats, and (optionally) paid tickets. Visitors see a month calendar (or list) of upcoming dates with seats-left, pick a quantity, and register. Everything stays inside your own site.
What you can do
- Publish events with a price per ticket, custom intake fields and a per-order ticket cap
- Schedule any number of dates (occurrences), each with its own seat pool
- Show a month calendar / list / cards with live seats-left, so you never oversell
- Take payment at registration with Stripe, or collect on location
- Optionally issue a QR ticket per seat, emailed to the buyer, with a staff check-in scanner
- Send automatic confirmation emails to attendees and notifications to organizers
- Translate every front-end label, with one-click presets for EN / NL / FR / DE / ES
Requirements & compatibility
Events runs on any modern WordPress host. Payments and QR check-in use their own free pieces.
| Requirement | Minimum | Recommended |
|---|---|---|
| WordPress | 6.0 | 6.5 or newer |
| PHP | 7.4 | 8.1 or newer |
| PHP GD extension | Only for QR tickets | Enabled (standard on most hosts) |
| HTTPS | For payments & the camera scanner | Site-wide |
Optional integrations
| Integration | Used for | Needed? |
|---|---|---|
| Stripe | Online card payments | Only if you sell paid tickets |
Installation & activation
Events ships inside WPStack — nothing extra to download. Switch it on per site from the modules panel.
Activate the module
In WPStack → Modules, flip Events on. A new Events item appears in the WPStack menu.
Set your basics
Open Events → Settings → General and set the time zone, currency and date/time format.
Create an event
Under Events → Events, add an event — name, price per ticket, and any custom fields.
Add a date
Under Events → Dates, schedule an occurrence of that event and set its seat capacity.
Publish the page
Add the [wpstack_events] shortcode (or the Elementor widget) to any page.
The building blocks
Events is made of a few connected pieces. Set them up in this order.
1 · Event
The thing people book — e.g. “Pottery Workshop”. Holds the price per ticket, per-order cap, payment mode, custom fields and (optionally) QR tickets. Under Events → Events.
2 · Date
A scheduled occurrence of an event (a single day or a date range), with its own seat pool, times and status. Under Events → Dates.
3 · Organizer
Optional. The person running an event; assign one to a date and they’re emailed a notification for each registration. Under Events → Organizers.
4 · Registration
Every order (N tickets) an attendee makes. Manage them under Events → Registrations; if QR tickets are on, individual tickets appear under Events → Tickets.
Events
An event is the reusable definition. Create as many as you like under Events → Events.
| Setting | Type | Default | What it does |
|---|---|---|---|
| Name & description | text | — | Shown on the events page. An optional image can be added too. |
| Price / ticket | number | 0 | Price per ticket. Leave blank/0 for a free event. |
| Max tickets / order | number | 10 | Caps the quantity picker on the registration form. |
| Payment mode | select | On location | on_location (pay in person / free) or online (pay the full amount now via Stripe). |
| Payment gateways | select | Stripe | Which connected gateway online payments use. |
| Custom fields | builder | none | Extra intake questions captured at registration (text, number, select, checkbox…), with optional conditional logic. |
| Color | color | #3f6c51 | Accent used for this event on the calendar. |
| Issue QR tickets | toggle | Off | When on, buyers enter a name per ticket, get one QR code per seat by email, and each can be checked in at the door. See QR ticketing. |
Dates & seats
A date is one occurrence of an event. Each date has its own seat pool, so the same event can run many times.
| Setting | Type | Default | What it does |
|---|---|---|---|
| Event | select | — | Which event this date is an occurrence of. |
| Start / end date | date | — | A single day, or a range for multi-day courses. |
| Start / end time | time | — | Optional times shown on the calendar and in emails. |
| Capacity (seats) | number | 0 | The seat pool for this occurrence. Availability is capacity − tickets sold, so it never oversells. |
| Organizer | select | none | Optional — who runs it; they get a notification for each registration. |
| Status | select | Open | Only open dates appear on the front end. |
Organizers
Organizers are optional contacts for the people who run your events.
Each organizer has a name, email, phone and short bio. Assign one to a date and they’re emailed a notification for every registration on that date (otherwise the site admin is notified). Organizers are purely for notifications — attendees don’t see them unless you show them.
Managing registrations
Every order lands under Events → Registrations, grouped by upcoming, completed and cancelled.
- One order can hold several tickets — capacity is always counted as the sum of tickets.
- Set an order to confirmed / completed / cancelled; cancelling frees its seats back into the pool.
- Export CSV of registrations for any event or status.
- Open an order to see attendee details, custom-field answers, payment status, and (if enabled) its QR tickets.
QR ticketing (optional)
Turn on “Issue QR tickets” on an event to give every seat its own scannable ticket. Off by default — nothing changes for events that don’t use it.
Enable per event
On the event, tick Issue QR tickets. Only that event’s dates issue tickets.
Buyers name each seat
At checkout, the buyer enters an attendee name for each ticket in the order.
Tickets are emailed
The confirmation email includes one QR code per seat, each with its attendee name and a unique code.
Manage them
Every ticket appears under Events → Tickets — filter by event/status, search, and check in or undo manually.
Door check-in scanner
A staff-only page that scans ticket QR codes with the device camera and checks attendees in.
Add the scanner page
Put [wpstack_events_scanner] on a private page. Only signed-in users who can manage the site see the scanner.
Scan
Open it on a phone over HTTPS, tap Start camera, and point at a ticket. You can also type a code by hand.
Instant result
Each scan shows a big ✓ Checked in, an amber Already checked in (with time), or a red Invalid / cancelled — with a beep.
Payments (Stripe)
Sell tickets online with Stripe, or collect payment on location.
Connect Stripe
Under Settings → Payment, enter your Stripe keys.
Set the event to “online”
On the event, set Payment mode to online and choose Stripe. Leave it on_location to collect in person.
Test first
Use Stripe test keys to confirm the checkout, then switch to live keys.
Settings reference
The Settings screen is split into tabs. Here’s what each one controls.
| Setting | Type | Default | What it does |
|---|---|---|---|
| General | tab | — | Time zone, currency & symbol, and date/time format. |
| tab | — | Confirmation email + organizer notification (sender, subject, message) with placeholders like {event} {date} {tickets} {name}. | |
| Labels | tab | — | Override every front-end label; one-click language presets for EN / NL / FR / DE / ES. |
| Style | tab | — | Front-end layout (calendar / list / cards), light or dark theme, grid columns and accent colors. |
| Payment | tab | — | Connect and configure the Stripe gateway. |
| Shortcodes | tab | — | The events shortcode and a quick setup checklist. |
Embedding the events page
Place the calendar anywhere with a shortcode or the Elementor widget.
The events calendar: upcoming dates with seats-left, and an in-page registration form.
calendar (default), list or cards.Staff-only QR check-in page (must be signed in with manage-options).
[wpstack_events]
[wpstack_events event="42" view="list"]Labels & translation
Every word on the events page can be changed under Settings → Labels.
Override step names, field labels, buttons, seats-left wording and email row labels. A language preset (English, Dutch, French, German, Spanish) fills every label and sets the calendar language in one click — a great starting point you can then tweak.
Frequently asked questions
An event is the reusable definition (price, fields, tickets). A date is one scheduled occurrence of it, with its own seats — so one event can run on many dates.
Availability is a date’s capacity minus the total tickets in its confirmed/completed orders. The server re-checks at write time, so two people can’t oversell the last seats.
Only if you set an event’s payment mode to online (full price × tickets via Stripe). Leave it on_location for free or pay-in-person events.
No — it’s off by default and per event. With it off, registrations work as a simple order + confirmation email. Turn it on only when you want scannable tickets and door check-in.
Yes. With QR tickets on, they name each seat and receive one QR per seat, each checked in independently at the door.
Yes. Settings → Labels lets you override every label, with one-click presets for English, Dutch, French, German and Spanish.
Troubleshooting
The most common issues and how to clear them.
| Symptom | Likely cause | Fix |
|---|---|---|
| No dates on the calendar | No open date, or the date already ended | Add a date under Events → Dates and set its status to Open. |
| Event shows “Sold out” | The date’s seat pool is full | Raise the date’s capacity, or cancel an order to free seats. |
| Payment step is skipped | Event payment mode is on_location | Set it to online and connect Stripe under Settings → Payment. |
| QR image is blank in the email | PHP GD extension is missing | Enable GD on the host (or ask support); the ticket code still works for manual check-in. |
| Scanner camera won’t open | Not on HTTPS, or an older browser | Serve over HTTPS and use Chrome or Safari 17+; otherwise type the code by hand. |
Changelog
[wpstack_events_scanner]) and a Tickets admin tab.