Events and venues
Selling a ticket is not selling a mug. A ticket is for a specific night, in a specific tier, and it stops existing when the doors close.
Events, occurrences, tiers
An event is the thing with a name. Occurrences are the nights it happens — generate a run of them at once rather than making twelve events. Ticket types are the tiers on sale for those nights, each with its own price and its own allocation.
Availability is drawn, never cached
The ticket picker renders nothing about stock on the server. The published markup carries the title and the date and price list, and every tier says it is checking until the widget has asked the server. That is deliberate: the page around it is cached for up to half an hour, and a seat count in cached HTML is a lie within minutes.
Which is also why the copy on this page never promises a ticket is available.
On the door
Each issued ticket carries a code that renders as a QR, and check-in is its own service — so the door list is the same record as the sale, not a spreadsheet somebody exported.
The other three.
Every one of these is a different job for a website, and most businesses are a mix of two.
Build the version of this that is yours.
Nothing above needs deciding in advance. Turn a module on when the business actually needs it.