=== Eventnetic - Event Tickets, Booking and Calendar ===
Contributors: eventnetic
Tags: events, event tickets, ticketing, event booking, calendar
Requires at least: 6.4
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Sell event tickets on WordPress: dates, capacity, ticket types, a booking form, a calendar, and payment at the door. No per-ticket fees.

== Description ==

Eventnetic turns a WordPress site into a box office. Create an event, decide what a
ticket costs and how many there are, put the booking form on a page, and take the
money. Nothing else has to be installed and there is no account to open anywhere.

It is a plugin for events rather than appointments: people buy a ticket for a date,
not a slot with a member of staff. A cinema showing a film on five Sundays, a venue
with a support act and a headliner, a workshop with eight benches and a deposit up
front: that is the shape it is built around.

The plugin is free with no cap on how many events you run or how many tickets you
sell, and [Eventnetic takes no cut of the money](https://eventnetic.com/blog/best-online-ticketing-platforms-no-transaction-fees?utm_source=wordpress.org&utm_medium=plugin-page).
If you later add a card gateway, that company charges its own processing fee, but
nothing comes to us per ticket. You can [see it running before you install anything](https://eventnetic.com/demo?utm_source=wordpress.org&utm_medium=plugin-page).

= Why Eventnetic is different =

* **Standalone.** No WooCommerce, no page builder, no form plugin, no calendar plugin underneath it.
* **No per-ticket fee, ever.** Not in the free plugin and not on a paid plan.
* **Your data, your server.** Customers, bookings and money stay in your own database.
* **One screen, not twelve settings pages.** The admin is an application of its own: lists that filter and sort, a calendar, and forms that tell you what is wrong before you save.
* **The booking form cannot be broken by a theme.** It renders inside a shadow root, so the theme's CSS cannot reach into it and it cannot reach out.

= ✨ Features =

**Events**

* Unlimited events, tickets, bookings and customers. Nothing is capped.
* Single-day, multi-day and full-day events
* Capacity per event, counted as bookings arrive, and it refuses to drop below what is already sold
* Status per event, open or closed or cancelled, with the reason shown to the visitor
* Events at a venue, online, or both, with a joining link and password released a set number of minutes before the start
* A timezone per event, for when one of them is somewhere else
* Categories with colours, venues and staff, all reusable across events
* A cover image, a colour and a gallery per event
* Duplicate an event; delete in bulk
* One click builds the WordPress page for an event with the booking form already on it
* An admin calendar with month, week and day views: drag an event to another day, click a day to create one
* schema.org `Event` data on the page, so search engines read the date, the venue and the price

**Tickets and pricing**

* Several [ticket types](https://eventnetic.com/features/ticket-types?utm_source=wordpress.org&utm_medium=plugin-page) per event, in the order you want them
* Each type either draws on the event's capacity or holds a quota of its own
* A sale window per ticket type: when it goes on sale and when it stops
* Minimum and maximum per order
* Deposits per ticket type, a percentage or a fixed amount, with the balance left owing on the order
* Ask each attendee for their own name, email and phone, per ticket type
* 151 currencies, with symbol position, thousands and decimal separators, and 0 to 4 decimal places
* A ticket type that has already sold cannot be deleted by accident

**The booking form**

* A step at a time: date, tickets, your details, attendees, payment, confirmation. A step that means nothing for an event is not shown.
* Prices are quoted by the server. Nothing the browser says about money is believed.
* Tickets are held while somebody is checking out, with a countdown, and released if they wander off
* Guest booking, with no WordPress account needed
* Pay a deposit or pay in full, whichever you make the default
* Sold out and booking-closed states that say why
* **Find my booking** by code and email: status, amount due, ticket codes, the joining link for an online event, Add to Google Calendar and an `.ics` file
* Customers can cancel their own booking, if you switch it on. It is off until you do.
* Rate limiting, a honeypot and a minimum fill time as standard, plus optional Google reCAPTCHA v3 or Cloudflare Turnstile

**Bookings and the door**

* A bookings list with search and filters: booking status, payment status, event, date, category, booked between two dates
* Take a booking by hand from the desk, choosing what was paid and how
* A [door list](https://eventnetic.com/documentation/the-door-list?utm_source=wordpress.org&utm_medium=plugin-page) per event: search by code, name, email or phone; filter by date, ticket type and who is already inside
* [Check people in](https://eventnetic.com/features/scan-at-the-door?utm_source=wordpress.org&utm_medium=plugin-page) by typing a code or with a keyboard-wedge barcode scanner. One code is one seat, and it is used once.
* A booking is marked as arrived once its last seat is in
* CSV export of bookings and of attendees, honouring whatever you have filtered
* Customer records built as bookings arrive; a customer who has bookings cannot be deleted by accident
* A payments screen: record a payment, refund it, void it, and read the transaction log for any order

**Emails and automation**

* A [workflow builder](https://eventnetic.com/features/workflows?utm_source=wordpress.org&utm_medium=plugin-page) rather than a fixed set of emails: pick a trigger, add actions, test each one
* 15 triggers, including booking created, status changed, payment received, refunded, attendee checked in, event starts, event ends, date cancelled, date reopened and customer created
* Time offsets on triggers, so a reminder can go three days before the event or an hour after it ends
* Filters on triggers, so a workflow only runs for the status or payment method you mean
* Around 60 merge placeholders across event, booking, customer and attendee, each with a sample
* One-click links in your own email to approve, reject or cancel a booking without logging in
* Three workflows are set up on install: booking confirmation, payment received and booking cancelled
* A queue screen showing what is planned, what ran, what failed and what can be retried
* Mail through `wp_mail` or your own SMTP server

**Payments**

* [Pay at the door](https://eventnetic.com/features/payments?utm_source=wordpress.org&utm_medium=plugin-page) with no gateway and no account: cash, a card machine at the venue, or a bank transfer you mark as paid by hand
* Your own wording for the payment instructions the customer sees
* Orders with lines, totals, what is paid and what is still due
* Refunds, voids, and rules enforced on the server so an order cannot be overpaid or over-refunded
* Drag the payment methods into the order the customer sees them in

**Putting it on the site**

* Five shortcodes: `[eventnetic_booking]`, `[eventnetic_events]`, `[eventnetic_calendar]`, `[eventnetic_my_bookings]`, `[eventnetic_thank_you]`
* The same five as Gutenberg blocks, in their own block category
* The same five as Elementor widgets, in their own widget category
* A [calendar](https://eventnetic.com/features/booking-shortcodes?utm_source=wordpress.org&utm_medium=plugin-page) with month, week, day and list views, rendered on the server, so it is readable by search engines and works with JavaScript off
* An event catalogue with search, category filters and a "from" price

**Design and the technical side**

* Named appearance styles with eight colour tokens and three layout tokens, eight presets to start from, and a style you can pick per shortcode
* Every widget mounts in a shadow root, so no theme can break it and it cannot leak styles out
* Assets load only on pages that actually have a widget on them
* A REST API under `eventnetic/v1`, and around 85 actions and filters for extending it
* [Translation ready](https://eventnetic.com/features/translation-ready?utm_source=wordpress.org&utm_medium=plugin-page), with RTL support
* A setup wizard, a checklist, and a system information panel that checks cron, folders and PHP extensions
* Uninstall removes its tables, its options and its uploads folder. Nothing is left behind.

== 🧰 What people run on it ==

Cinemas and film clubs, music venues, theatres, comedy nights, conferences, workshops
and classes, guided tours, museums and exhibitions, festivals, meetups, retreats,
tastings, markets and fairs, charity dinners, and anything sold as timed entry.

A few of them written up in full: [a single-screen cinema](https://eventnetic.com/blog/cinema-ticketing-wordpress?utm_source=wordpress.org&utm_medium=plugin-page),
[a music venue deciding who pays the booking fee](https://eventnetic.com/blog/music-venue-ticketing-wordpress?utm_source=wordpress.org&utm_medium=plugin-page),
[a workshop taking money up front](https://eventnetic.com/blog/workshop-booking-deposits-wordpress?utm_source=wordpress.org&utm_medium=plugin-page),
[a three-day conference bought once](https://eventnetic.com/blog/conference-ticketing-wordpress?utm_source=wordpress.org&utm_medium=plugin-page),
[a walking tour with no building](https://eventnetic.com/blog/walking-tour-booking-wordpress?utm_source=wordpress.org&utm_medium=plugin-page), and
[timed entry for eighteen people on a stair](https://eventnetic.com/blog/timed-entry-ticketing-wordpress?utm_source=wordpress.org&utm_medium=plugin-page).

== ⭐ Eventnetic Pro ==

The free plugin is not a trial and does not expire. [Eventnetic Pro](https://eventnetic.com/pricing?utm_source=wordpress.org&utm_medium=plugin-page)
adds features rather than lifting a cap, and everything above keeps working exactly
as it does now. What it adds:

* **[Seat maps](https://eventnetic.com/features/seat-maps?utm_source=wordpress.org&utm_medium=plugin-page)**: draw the room once and reuse it. Rows with aisles and curves, round and rectangular tables, nested stands and tiers, standing areas, and a traced floor plan underneath. Numbering by letters or numbers, odd and even, reversed, skipping thirteen. Seats belong to the date, so A7 sold on one Tuesday is free on the next.
* **[PDF tickets and QR codes](https://eventnetic.com/features/pdf-tickets?utm_source=wordpress.org&utm_medium=plugin-page)**: a printable pass per seat, three designs to start from, attached to the confirmation email. The QR carries the same code the free check-in screen already reads.
* **Card payments**: [Stripe](https://eventnetic.com/features/payments?utm_source=wordpress.org&utm_medium=plugin-page), PayPal, or hand the checkout to WooCommerce and use whatever that shop already accepts.
* **[Discount codes](https://eventnetic.com/features/coupons?utm_source=wordpress.org&utm_medium=plugin-page)**: percentage or fixed, for the whole order or only certain tickets, with a minimum spend, a date range and usage limits.
* **[Taxes](https://eventnetic.com/features/taxes?utm_source=wordpress.org&utm_medium=plugin-page)**: percentage or fixed, applied to everything or scoped to a venue, a category or an event.
* **[Invoices](https://eventnetic.com/features/invoices?utm_source=wordpress.org&utm_medium=plugin-page)**: gapless numbering series that reset yearly or monthly, editable templates, issued automatically when money arrives, and downloadable by the customer.
* **[Waiting lists](https://eventnetic.com/features/waiting-list?utm_source=wordpress.org&utm_medium=plugin-page)**: per event and per ticket type. When somebody cancels it offers only as many places as actually came free, and the offer expires.
* **[Repeating dates](https://eventnetic.com/features/recurring-dates?utm_source=wordpress.org&utm_medium=plugin-page)**: one class, ten Tuesdays. Each date keeps its own capacity, its own bookings and its own door list.
* **Price per date**: a different price, quota or sale window on the dates that need one, and nothing stored for the dates that do not.
* **[Custom booking fields](https://eventnetic.com/features/custom-booking-fields?utm_source=wordpress.org&utm_medium=plugin-page)**: thirteen field types, asked once per order or once per seat, with conditional logic and file uploads. The answers appear on the door list, in the CSV and in your emails.
* **[Zoom](https://eventnetic.com/features/online-events?utm_source=wordpress.org&utm_medium=plugin-page)**: meetings and webinars, a separate room per date, and a join link of their own for every registered attendee.
* **[SMS, WhatsApp, Telegram and webhooks](https://eventnetic.com/features/channels?utm_source=wordpress.org&utm_medium=plugin-page)**: the same workflow builder, more ways for it to reach people.

There is a page that lists [exactly what the free plugin does and what Pro adds](https://eventnetic.com/documentation/free-and-pro?utm_source=wordpress.org&utm_medium=plugin-page),
side by side.

== 📚 Documentation ==

The [documentation](https://eventnetic.com/documentation?utm_source=wordpress.org&utm_medium=plugin-page)
is written as short pages you can read in a minute. The useful ones to start with:

* [Your first event, start to finish](https://eventnetic.com/documentation/your-first-event?utm_source=wordpress.org&utm_medium=plugin-page)
* [The pages your site needs](https://eventnetic.com/documentation/the-pages-your-site-needs?utm_source=wordpress.org&utm_medium=plugin-page)
* [How a booking happens](https://eventnetic.com/documentation/how-a-booking-happens?utm_source=wordpress.org&utm_medium=plugin-page)
* [Payment methods](https://eventnetic.com/documentation/payment-methods?utm_source=wordpress.org&utm_medium=plugin-page)
* [The shortcode reference](https://eventnetic.com/documentation/shortcode-reference?utm_source=wordpress.org&utm_medium=plugin-page)
* [What workflows are](https://eventnetic.com/documentation/what-workflows-are?utm_source=wordpress.org&utm_medium=plugin-page)
* [When something does not work](https://eventnetic.com/documentation/troubleshooting?utm_source=wordpress.org&utm_medium=plugin-page)

== 🔌 Works with ==

WordPress 6.4 and up, PHP 8.1 and up. The block editor and Elementor are both
supported out of the box, and the shortcodes work in any theme or builder that can
render one. Optional, and only when you configure them: Google reCAPTCHA v3,
Cloudflare Turnstile, and your own SMTP server. On Pro: Stripe, PayPal, WooCommerce,
Zoom and Twilio. There is a page on [integrations](https://eventnetic.com/documentation/integrations?utm_source=wordpress.org&utm_medium=plugin-page).

== Installation ==

1. Upload the plugin through **Plugins → Add New → Upload Plugin**, or install it
   from the WordPress plugin directory and activate it.
2. A short setup asks for the business name, the currency and how you want to be
   paid, and offers to create the pages the booking form needs.
3. Create an event under **Eventnetic → Events**, give it at least one ticket type,
   and publish the page the setup made. If you would rather place it yourself, put
   `[eventnetic_booking event="12"]` on any page, where 12 is the event id.
4. Add `[eventnetic_calendar]` to a page if you want a calendar of everything that
   is coming, and `[eventnetic_events]` for a catalogue people can search.

Both are also available as blocks and as Elementor widgets. The full walk-through is
[Your first event, start to finish](https://eventnetic.com/documentation/your-first-event?utm_source=wordpress.org&utm_medium=plugin-page).

== Frequently Asked Questions ==

= Does Eventnetic need WooCommerce, a page builder or a form plugin? =

No. It is standalone. Everything above happens in Eventnetic itself, with no other
plugin installed. WooCommerce is supported on Pro for people who already run a shop
and want the checkout to go through it, but it is a choice, not a requirement.

= Can I take payment without a payment gateway? =

Yes, and most people start that way. "Pay at the door" is switched on during setup
and needs no account: cash, a card machine at the venue, or a bank transfer you mark
as paid by hand. See [payment methods](https://eventnetic.com/documentation/payment-methods?utm_source=wordpress.org&utm_medium=plugin-page).

= Are there per-ticket fees? =

None from us, on any plan. If you add Stripe or PayPal later, they charge their own
processing fee on each transaction, the same as they would anywhere else. Nothing is
taken by Eventnetic. We wrote up [what the alternatives actually cost](https://eventnetic.com/blog/wordpress-event-ticketing-fees-comparison?utm_source=wordpress.org&utm_medium=plugin-page).

= What are the limits of the free version? =

There is no limit on events, tickets, bookings or customers. The free plugin holds an
event on a single date and takes payment at the door; seat maps, PDF tickets, card
gateways, repeating dates and the rest are on Pro. The
[free and Pro page](https://eventnetic.com/documentation/free-and-pro?utm_source=wordpress.org&utm_medium=plugin-page)
lists both sides in full.

= Does it work with my theme? =

Yes. The booking form renders inside a shadow root, so the theme's CSS cannot reach
into it and it cannot reach out. It looks the same on every theme, and you set its
colours in Eventnetic rather than fighting the theme for them.

= Can I check people in at the door? =

Yes, in the free plugin. The door list is searchable by name, code, email or phone,
and you check somebody in by typing their code or scanning it with a keyboard-wedge
barcode scanner. One code is one seat and it is accepted once. Pro adds the printable
[PDF ticket with a QR code](https://eventnetic.com/features/pdf-tickets?utm_source=wordpress.org&utm_medium=plugin-page)
for the scanner to read.

= Does it do assigned seating? =

On Pro. You draw the room once, with rows, tables, stands and standing areas, and
reuse it for every event held there. Seats belong to the date rather than the event,
so the same seat can be sold again next week. See [seat maps](https://eventnetic.com/features/seat-maps?utm_source=wordpress.org&utm_medium=plugin-page),
or [how a room that holds 104 gets built](https://eventnetic.com/blog/wordpress-seating-chart?utm_source=wordpress.org&utm_medium=plugin-page).

= Can I sell a class or a season that repeats? =

On Pro. A repeating event keeps one page and one set of ticket types, while each date
carries its own capacity, its own bookings and its own door list. There is a
[write-up of selling one class across ten Tuesdays](https://eventnetic.com/blog/wordpress-recurring-event-tickets?utm_source=wordpress.org&utm_medium=plugin-page).

= Can I run online events? =

The free plugin handles online and hybrid events: you paste the joining link and
password, and they are released to ticket holders a set number of minutes before the
start. Pro connects [Zoom](https://eventnetic.com/features/online-events?utm_source=wordpress.org&utm_medium=plugin-page)
and creates the meeting or webinar for each date itself.

= Do customers need a WordPress account? =

No. Guest booking is on by default. Afterwards they find their booking with the code
and the email address they used, on the page carrying `[eventnetic_my_bookings]`.

= Is it translation ready? =

Yes. Both the PHP and the admin application ship `.pot` files and load a text domain,
and right-to-left languages are supported.

= Does it send my data anywhere? =

Not by itself. The plugin sends no analytics, no telemetry and no licence checks, and
it does not call home. Two optional features contact a third party once you configure
them; they are described under **External services** below.

== External services ==

Eventnetic works without contacting anything outside your site. Two features, both
switched off until you configure them, call a third party:

**Google reCAPTCHA** is used only if you switch bot protection on under
**Settings → Integrations → Bot protection** and choose Google, which needs a site
key and a secret key from your own Google account. Two things then happen, and both
stop the moment the setting is switched back off:

* A page carrying the booking form loads `https://www.google.com/recaptcha/api.js`
  into the visitor's browser. This is how the check is made, and there is no way
  to run reCAPTCHA without it. Google may set cookies and will see the visitor's
  IP address and the page they are on.
* When the form is submitted, the token their browser produced is sent from your
  server to `https://www.google.com/recaptcha/api/siteverify`, together with your
  secret key and the visitor's IP address, and Google answers whether it looks
  like a person. Nothing else is sent.

Terms: https://policies.google.com/terms / Privacy: https://policies.google.com/privacy

**Cloudflare Turnstile** is the same feature with Turnstile chosen instead, and the
same two steps: `https://challenges.cloudflare.com/turnstile/v0/api.js` is loaded
into the visitor's browser, and the token is verified from your server at
`https://challenges.cloudflare.com/turnstile/v0/siteverify`.
Terms: https://www.cloudflare.com/website-terms/ / Privacy: https://www.cloudflare.com/privacypolicy/

Captcha is off when the plugin is installed. Until you turn it on and enter your
own keys, no page loads anything from either service and nothing is sent to them.

The plugin sends no analytics, no telemetry and no licence checks, and it does not
call home.

== Screenshots ==

1. The dashboard: what is coming up, and how the month has gone.
2. An event, with its dates, capacity and ticket types.
3. The bookings list, filtered and sorted.
4. The door list, searchable by name.
5. The booking form as a visitor sees it.
6. Settings, on one screen with a search.

== Changelog ==

= 1.0.0 =
* First release on the WordPress plugin directory.

== Upgrade Notice ==

= 1.0.0 =
First release.

== Source code ==

The admin screens and the booking form are a React application, and the files
under `react/dist/` that the browser loads are compiled and minified. Nothing
has to be fetched from anywhere to read or rebuild them. Both the source and
the toolchain that produces the bundles ship inside this plugin:

* `react/src/` is our source, TypeScript and TSX, one directory per screen
* `react/package.json` is the dependency list and the build script
* `react/package-lock.json` is the resolved version of every dependency, so a
  rebuild draws the same source it was built from
* `react/vite.config.ts` and `react/tsconfig*.json` are the build configuration
* `react/dist/` is the compiled output, which is what the plugin loads at runtime

To rebuild `react/dist/` from source, from the `react` directory:

`npm ci`
`npm run build`

That runs `tsc -b && vite build`, the same command that produced the files in
this package. `npm run dev` starts Vite for development, and `npm test` runs the
unit tests.

**Third-party libraries.** The compiled bundles also contain open-source
libraries, minified in with our own code by Vite. They are not written by us and
their unminified source is not in `react/src/`; every one is a published npm
package, declared with its exact version in `react/package.json` and
`react/package-lock.json`, and fetched from https://www.npmjs.com by the
`npm ci` above. The notable ones, with their public source repositories:

* React: https://github.com/react/react
* FullCalendar: https://github.com/fullcalendar/fullcalendar
* TanStack Query: https://github.com/TanStack/query
* TanStack Table: https://github.com/TanStack/table
* TipTap: https://github.com/ueberdosis/tiptap
* Radix UI: https://github.com/radix-ui/primitives
* dnd-kit: https://github.com/clauderic/dnd-kit
* Hugeicons (`@hugeicons/*`, the source of icon chunks such as `MapsLocation01Icon` and `PaintBoardIcon`): https://github.com/hugeicons/hugeicons
* react-phone-number-input (the `flags` chunk): https://gitlab.com/catamphetamine/react-phone-number-input
* react-hook-form: https://github.com/react-hook-form/react-hook-form
* Zod: https://github.com/colinhacks/zod
* DOMPurify: https://github.com/cure53/DOMPurify

The full, authoritative list of dependencies is `react/package.json`; each is a
published npm package under its own OSI-approved licence, with its repository
linked from its page at https://www.npmjs.com.

The PHP is not compiled and is included as written. `vendor/` holds Composer's
generated autoloader only, no third-party PHP libraries.

== Licence ==

Eventnetic is licensed under the GPL, version 2 or later.

The bundled JavaScript libraries listed under "Source code" above are each
distributed under their own OSI-approved, GPL-compatible licences (MIT in almost
every case). None is modified from its published release. `vendor/` contains only
Composer's generated autoloader, no third-party PHP.

The Geist font files under `react/dist/` (`.woff`, `.woff2`) come from the
`@fontsource/geist` npm package (https://github.com/fontsource/font-files) and
are licensed under the SIL Open Font License 1.1, which is GPL-compatible.
