Description
Tickets & Passes for WooCommerce adds three product types to your shop: Ticket, Timeslot Ticket and Pass. Customers buy them the same way they buy anything else in your store, and every purchase issues a QR code.
The door side is in the box. You get a phone scanner page at /check-in/, a Scanner user role for staff who should not see the rest of wp-admin, and admin dashboards where you can search a ticket, check someone in by hand, resend a QR code, reset it or cancel it. There is no external ticketing service to sign up for and no fee per ticket sold.
Built for venues, attractions, museums, escape rooms, festivals, clubs and anyone else who sells admission and then has to let people in.
The three product types
Ticket is plain admission with a validity window and a set number of uses. Day tickets, entry tickets, gift admission.
Timeslot Ticket is admission for a specific date and time. Slots can be generated on a repeating schedule, so you are not building next month by hand, and unpaid reservations are released again on their own. An abandoned checkout will not sit on a seat.
Pass is valid across a period instead of a single visit: season passes, memberships, annual cards. A pass can include guest passes that the holder gives away, and it can carry a cardholder photo that staff see when they scan it.
Checking people in
The scanner is a full screen page on its own URL. No admin bar, no theme menu, nothing for door staff to get lost in.
- Scan results are colour coded: valid, already used, expired, on cooldown, or not found. You pick the colours.
- It runs in any modern mobile browser. Where the phone has a native barcode detector it uses that, otherwise it decodes in the page. Staff install nothing.
- Pass scans show the cardholder photo, so staff can see whether the person at the door is the person on the pass.
- The Scanner role gives someone check-in access and nothing else.
- The scanner talks to a REST check-in API. If you would rather use a third party scanner app, it can call the same API.
Every check-in decision is made on your server, never on the phone.
For whoever runs the shop
Tickets, timeslot tickets and passes each get their own dashboard with search, manual check-in, resend, reset and cancel. An analytics screen charts check-in activity by day and by hour. Colours and hint text are set per product type, so a ticket looks like it belongs to your site rather than to a plugin. Everything is gated on the manage_woocommerce capability, which means a Shop Manager can run the whole thing without an Administrator account.
For your customers
Tickets and Passes tabs are added to the normal WooCommerce My Account page. From there a customer can view a QR code, download a printable PDF, upload a pass photo if you have asked for one, and hand out any guest passes their pass came with.
Emails
The WooCommerce order emails are extended with the ticket, timeslot ticket or pass details. Four more templates cover resending a ticket, resending a pass, and inviting a guest pass recipient, with separate wording depending on whether that person already has an account. Every subject and message body is edited in wp-admin and supports merge tags for order and ticket details.
Nothing to maintain
An hourly job generates the next batch of recurring timeslots. A per minute job releases timeslot reservations that were never paid for. Both run in the background.
Requirements
- WooCommerce, installed and active. WordPress will not let the plugin activate without it.
- PHP 8.1 or newer.
- HTTPS on the site, because phone browsers only give camera access to secure pages.
Configuration
Settings live under Ticket & Passes > Settings, in six tabs. Only the tabs for the product types you actually sell need configuring.
General
- Display Date Format sets how dates and times are printed across the dashboards and the customer facing pages.
- Enable Analytics Dashboard adds the check-in and sales statistics screen.
Ticket
- Enable Ticket Product adds Ticket to the WooCommerce product type dropdown.
- Accent Color is the card border and button colour used for tickets on My Account > Tickets.
Timeslot Ticket
- Enable Timeslot Ticket Product adds Timeslot Ticket to the product type dropdown.
- Date Picker Hint Text is the line above the date picker telling customers to pick a date and then a time.
- Seven colour settings (accent, text, border, background, hint, day name and month/year title) style the date and timeslot picker.
Pass
- Enable Pass Product adds Pass to the product type dropdown.
- Persons Section Hint Text is the line above the person fields, explaining what to fill in for each person the pass covers.
- Five colour settings (accent, text, border, background and hint) style the per person cards.
- Profile Photo Upload Path is where pass photos are stored, relative to
wp-content/uploads. Keep that folder out of any publicly executable location and without execute permissions.
Scanner / API
- Enable API registers the check-in REST endpoints. Every scanner, built in or third party, goes through them. Switch this off only if you do not check anyone in at all.
- Enable built-in scanner switches the
/check-in/page on. Leave it off if you use a third party scanner app instead, the API keeps working either way. The scanner URL is shown here once it is on. - Three scanner colours: one for a successful check-in, one for a code that is outside its valid window or already used, expired or on cooldown, and one for a request that matches no ticket, timeslot ticket or pass at all.
Five templates, each with an editable subject where one applies and a message body in the normal WordPress editor. Merge tags are available for order and ticket details.
- WooCommerce Order Confirmation and WooCommerce Completed Order add your own text to the WooCommerce order emails when the order contains a ticket, timeslot ticket or pass.
- Resend Ticket and Resend Pass go out when you or the customer resends a QR code from the order screen or the account page.
- Guest Pass Invite – New User and Guest Pass Invite – Existing User go to a guest pass recipient, worded for whether they already have an account.
Source Code and Third-Party Libraries
This plugin ships no compiled or obfuscated code. Every PHP, JavaScript and CSS file
written for this plugin is included in readable, editable form, and no build step
(npm, webpack, Composer, etc.) is required to run or modify it.
The following third-party libraries are bundled unmodified. Each is the upstream
distribution file, at the version listed:
- dompdf 3.1.6 – PDF rendering – https://github.com/dompdf/dompdf – LGPL-2.1
(bundled in inc/functions/lib/dompdf/, installed with Composer, together with its
dependencies dompdf/php-font-lib 1.0.2, dompdf/php-svg-lib 1.0.2, masterminds/html5
2.10.1, sabberworm/php-css-parser 9.4.0 and thecodingmachine/safe 3.4.0) - endroid/qr-code 5.1.0 – QR code generation – https://github.com/endroid/qr-code – MIT
(bundled in inc/functions/lib/qrcodegen/, installed with Composer, together with its
dependencies bacon/bacon-qr-code 3.0.1 and dasprid/enum 1.0.6) - jsQR 1.4.0 – QR decoding in the check-in scanner – https://github.com/cozmo/jsQR – Apache-2.0
(inc/scanner/js/jsqr.js) - ApexCharts 6.9.0 – charts on the analytics screen – https://github.com/apexcharts/apexcharts.js – MIT
(inc/analytics-dashboard/lib/apexcharts.min.js) - Air Datepicker 3.6.0 – date picker for timeslots – https://github.com/t1m0n/air-datepicker – MIT
(lib/air-datepicker/)
The two Composer-installed libraries can be regenerated from their composer.json with
composer install; the three JavaScript libraries are the unmodified dist files
published by their projects on npm, and their readable sources live in the linked
repositories.
Screenshots









Installation
1. Install the plugin
In wp-admin, go to Plugins > Add New > Upload Plugin, choose the zip file and click Install Now. Or unzip it and upload the folder to /wp-content/plugins/ over FTP.
2. Activate it
Activate from the Plugins screen. WooCommerce has to be active first. Activation creates the plugin’s database tables and refreshes your permalinks, so the new My Account tabs and the scanner URL work straight away.
3. Turn on the product types you need
Go to Ticket & Passes > Settings. Each product type has its own tab: Ticket, Timeslot Ticket and Pass. Tick Enable on the tabs you want. Anything you leave off stays out of your way.
4. Turn on the scanner
On the Scanner / API tab, enable the API and the built-in scanner. The tab then shows you the scanner URL, which is /check-in/ on your own domain.
5. Where to find the new product types
Go to Products > Add New and pick Ticket, Timeslot Ticket or Pass from the Product data dropdown, the same dropdown that holds Simple and Variable. The fields for that type appear below it: validity, uses, capacity, recurring schedule and so on.
6. Where to find the scanner and the Scanner role
The scanner lives at /check-in/, and there is a Scanner link in the Ticket & Passes menu that opens it. Open it on a phone and log in.
To give a door person access without giving them the rest of your site, edit their user under Users and set their role to Scanner. Administrators and Shop Managers can already use the scanner.
FAQ
-
Does it need WooCommerce?
-
Yes. The plugin adds WooCommerce product types and will not activate without WooCommerce active.
-
Can I sell tickets and passes in the same shop?
-
Yes. All three product types can be on at once, and they can sit in the same cart and the same order as your normal products.
-
Who is allowed to check people in?
-
Users with the Scanner role, and users with the
manage_woocommercecapability, which covers Administrators and Shop Managers. The scanner page turns everyone else away. -
Do door staff have to install an app?
-
No. The scanner is a web page that uses the phone camera. It needs a browser and HTTPS, which is what the camera API requires.
-
Does the scanner work offline?
-
No. Every scan is checked against your site as it happens, so the phone needs a connection at the door. That is also why nobody gets a cancelled ticket through by putting the phone in airplane mode.
-
Can the same ticket be used twice?
-
That is up to the product. Each ticket and pass has a maximum number of uses, and passes can have a cooldown so the same code cannot be scanned again immediately.
-
Can I check people in without a phone?
-
Yes. Each dashboard in wp-admin has a manual check-in action, so you can find the ticket and let someone in from a computer.
-
What happens to my data if I delete the plugin?
-
Settings, scheduled tasks and the Scanner role are removed. Your tickets, passes and check-in records are kept, so removing the plugin to test a conflict cannot wipe a season of admission history.
If you do want all of it gone, add this to
wp-config.phpbefore you delete the plugin:define( 'TPFW_REMOVE_ALL_DATA', true );That drops the plugin’s database tables and deletes the generated QR codes, guest passes, PDFs and pass photos. It cannot be undone. Take a backup first.
-
Does deactivating remove anything?
-
No. Deactivating stops the plugin and clears its scheduled tasks. Settings and records are left alone, and reactivating picks up where you left off.
-
Is the QR code on its own enough to let someone in?
-
The QR code identifies the ticket. On passes that carry a photo, staff also see the cardholder photo at check-in and can compare it with the person in front of them.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Tickets & Passes for WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Tickets & Passes for WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.6
- Added a per-product note for tickets, timeslot tickets and passes. The note is set on the product’s settings tab and follows the purchase through to the order emails, the resend emails, the PDF, the order details on the frontend and the My Account tickets and passes tabs.
- Added an editor for the WooCommerce completed order email, so the text that goes out beside the QR codes can be written from the email settings screen like the order confirmation text. It supports the same tags: {{site_name}}, {{site_login}}, {{site_url}}, {{myaccount_url}}, {{customer_name}} and {{product_note}}.
- All email types now ship with default text and placeholders. Resend and gifted pass emails previously sent nothing at all until the templates were filled in by hand.
- The email settings screen now shows the default template when a field has not been customised, instead of an empty box.
- Reworded the default order confirmation text so it no longer says the QR codes are below it. The codes are not issued until the order is completed, so that email has nothing to show yet.
- Added cancel and refresh buttons to the QR check-in scanner.
- Added navigation icons to the My Account tickets and passes tabs.
- Renamed “Customer Note” to “Product Note” on the ticket, timeslot ticket and pass settings tabs, and moved the help tip in front of the field so the note card lines up with every other card.
- Fixed the order confirmation text never being sent: the whole block was skipped whenever the order had no QR codes yet, which is every order that has not been completed.
- Fixed “Valid From” and “Valid To” sharing a line in the mini cart.
- Fixed the ticket, timeslot ticket and pass dashboards printing an empty “0 items” line above the page title, by no longer registering pagination before the item count is known.
- Fixed the first dashboard column (“User ID”) losing its centring. WordPress renders that column as a table header cell, which the centring rule did not cover.
- Fixed the date picker being cut off inside the product settings boxes in wp-admin, and made it scroll itself into view when opened.
- Rewrote readme.txt. The description now explains the three product types, the scanner and the Scanner role in plain language, the installation guide is cut down to installing the plugin, enabling the product types and the scanner, and finding both afterwards, and the email settings section now mentions the completed order template added in this release.
1.0.5
- Removed the Event Calendar block. It did not work reliably, and it will return once it can be rebuilt properly.
- Updated the readme.txt screenshot list to match the screenshots currently available.
1.0.4
- The ticket and pass PDF stylesheets are handed to the PDF renderer through its own stylesheet API, so the plugin no longer writes a block into any markup it produces.
1.0.3
- Settings are now sanitized per field rather than by a single catch-all callback: textareas keep their line breaks, colour fields are validated as HEX, and the email templates keep the markup they are meant to carry.
- Fixed the Scanner / API settings screen registering the wrong option groups, which left it printing a nonce for a group that was never registered.
- Every value the ticket, timeslot ticket and pass dashboards output is now escaped as it is echoed.
- The ticket and pass PDF styles moved out of inline blocks into their own stylesheets.
- The JavaScript variables this plugin puts on the page now carry the tpfw prefix, and every option name is written out in full so it can be found by a search.
- Corrected the misspelled “generel” in the shared settings option name and everything built from it.
1.0.2
- Every name this plugin registers or stores now carries the four character
tpfwprefix: PHP classes, functions and constants, options, database tables, product and order line meta keys, the three product types, the Scanner role and the My Account endpoints. - Scripts are now loaded in the footer.
- Fixed the timeslot date picker not appearing on the product page with block themes.
- Updated bundled ApexCharts to 6.9.0 and Air Datepicker to 3.6.0.
- Documented bundled third-party libraries and their sources in the readme.
1.0.1
- All backend pages added by this plugin are now prefixed with tpfw, so they cannot collide with pages added by other plugins.
1.0.0
- Initial release.
