{"id":361265,"date":"2026-09-02T13:56:18","date_gmt":"2026-09-02T13:56:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/2kevents-event-tickets-and-door-check-in\/"},"modified":"2026-09-16T22:36:21","modified_gmt":"2026-09-16T22:36:21","slug":"bitforgenet-guest-tickets","status":"publish","type":"plugin","link":"https:\/\/is.wordpress.org\/plugins\/bitforgenet-guest-tickets\/","author":23537276,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.10.1","stable_tag":"1.10.1","tested":"7.1.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Events and Tickets with QR Check-in","header_author":"BitForge Network","header_description":"Professional event, registration, ticketing and door check-in system. Custom events with organizers, venues and line-ups, per-event registration, manual or automated payment validation, unique QR tickets rendered onto designer templates, PDF delivery by email, and live access control at the gate.","assets_banners_color":"6d727b","last_updated":"2026-09-16 22:36:21","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/bitforgenet","header_plugin_uri":"https:\/\/bitforgenet.dev\/plugins\/bitforgenet-guest-tickets\/","header_author_uri":"https:\/\/bitforgenet.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":388,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.8":{"tag":"1.0.8","author":"bitforgenet","date":"2026-09-02 13:56:00","revision":3678117},"1.0.9":{"tag":"1.0.9","author":"bitforgenet","date":"2026-09-02 20:20:09","revision":3678620},"1.10.0":{"tag":"1.10.0","author":"bitforgenet","date":"2026-09-14 19:05:09","revision":3695814},"1.10.1":{"tag":"1.10.1","author":"bitforgenet","date":"2026-09-16 22:36:21","revision":3699294},"1.2.0":{"tag":"1.2.0","author":"bitforgenet","date":"2026-09-05 14:52:39","revision":3682551},"1.2.1":{"tag":"1.2.1","author":"bitforgenet","date":"2026-09-05 15:12:40","revision":3682567},"1.2.2":{"tag":"1.2.2","author":"bitforgenet","date":"2026-09-07 17:37:11","revision":3685341},"1.8.7":{"tag":"1.8.7","author":"bitforgenet","date":"2026-09-12 23:43:59","revision":3693196},"1.9.0":{"tag":"1.9.0","author":"bitforgenet","date":"2026-09-13 01:24:51","revision":3693236},"1.9.1":{"tag":"1.9.1","author":"bitforgenet","date":"2026-09-13 21:33:28","revision":3694209}},"upgrade_notice":{"1.10.1":"<p>Housekeeping. A retired file that no longer had any caller is gone, the two\nbrand images are refreshed, and the directory listing gains a donate link.\nNothing in the plugin behaves differently; a site on 1.10.0 loses nothing by\nwaiting.<\/p>","1.10.0":"<p>The plugin now speaks six languages \u2014 English, French, Spanish, Portuguese,\nGerman and Arabic \u2014 and brings them with it rather than waiting for a language\npack. It follows your site&#039;s language by itself, falls back to French for a\nlanguage it does not have, and can be set outright under Settings \u2192 Language.\nThe booking form, the emails, the door station, the admin screens, the dates and\nthe printed ticket are all covered, and Arabic is drawn properly on the ticket\nitself. Nothing to reconfigure.<\/p>","1.9.1":"<p>The plugin is now <strong>Events and Tickets with QR Check-in<\/strong> in the directory, and\n<strong>Events &amp; Tickets<\/strong> on your own screens. Same plugin, same folder, same\nsettings, same data \u2014 only the name has changed, and nothing needs\nreinstalling or reconfiguring.<\/p>","1.9.0":"<p>Adds a <strong>Help<\/strong> screen inside the plugin, and brings the directory page up to\ndate: the screens are shown at last, the description covers everything added\nsince 1.2.1, and the FAQ has been rewritten. (1.9.1 renamed the plugin again the\nsame day \u2014 see above.)<\/p>","1.8.3":"<p>Fixes a white screen when finishing the assistant, and gives it proper Back and\nContinue buttons \u2014 one question at a time instead of everything at once. Update\nbefore using it: in 1.8.2 the last click still failed.<\/p>","1.8.2":"<p>Fixes &quot;Security check failed&quot; when finishing the assistant. Update before using\nit \u2014 in 1.8.0 and 1.8.1 the last button could not save.<\/p>","1.8.1":"<p>Creating an event no longer asks for a price and a capacity on its own step \u2014\nthe assistant asks for them, together with the room they belong to. Three steps\ninstead of four, and the assistant opens straight after.<\/p>","1.8.0":"<p>New: an assistant that sets up an event by asking what kind of night it is. It\nfills in the places, the zones, the prices and when the ticket goes out, and\neverything it sets stays editable exactly where it always was.<\/p>","1.7.0":"<p>One tab now holds the price, the capacity and the room: <strong>Prices &amp; places<\/strong>.\n&quot;Pricing &amp; capacity&quot; is gone, and the menu moved to <strong>Information &amp; details<\/strong>.\nNothing was lost and no setting needs re-entering. Also fixes a booking form that\ncame back filled in, with a dead button, after the browser&#039;s back button.<\/p>","1.6.1":"<p>Fixes zone prices. If your event is priced by named zones, every zone was shown\nand charged at the price of the event instead of its own. Worth updating before\nyour next sale.<\/p>","1.6.0":"<p>Everything the private build does, this plugin now does: the ticket studio, the\nfloor plan editor, price categories and discount codes. Nothing is held back and\nnothing is capped. Existing settings and data are untouched.<\/p>","1.5.0":"<p><strong>Zone prices reach the booking page.<\/strong> An event with named zones \u2014 A at 40, B\nat 60, C at 80 \u2014 showed every guest the same price, because the booking form\nhad never been told the zones existed. It is told now: each guest picks a zone,\npays its price, and sees how many places it has left. A zone with no price of\nits own costs what the event costs.<\/p>\n\n<p>This is the same link the plugin already used to tie a ticket category to a\npart of the room, followed in the other direction: the room is what tiers an\nevent that nothing else tiers, and it always could.<\/p>","1.4.0":"<p><strong>Seating is in this plugin now.<\/strong> The floor that shows the evening filling, the\nscreen that seats a booking, the button that places a party for you \u2014 all of it.\nOnly the <em>drawing<\/em> of a floor plan stays out: the canvas, the curved rows, the\nround tables, the guest picking their own seat on a map. Managing places and\ndrawing a room are two different things, and only the second one was ever worth\nholding back.<\/p>\n\n<p><strong>Fixed: an event set to &quot;you decide where they sit&quot; decided for you.<\/strong> 1.3.3\nplaced bookings automatically where no seating screen existed, which was a fix\nfor one problem and a worse bug in its own right: the ticket went out before you\nhad looked. Now only &quot;ticket straight away&quot; places on its own \u2014 and the screen\nyou were being sent to actually exists.<\/p>\n\n<p><strong>A zone says what it controls, not whether its seats are numbered.<\/strong> The\nquestion an organizer really answers about a part of a room is <em>do I care where\nthese people sit, or only that they are in?<\/em><\/p>\n\n<ul>\n<li><strong>Access only<\/strong> \u2014 the door counts people in and nobody is told where to sit. A\nstanding area, and equally a seated one where people sit where they like: a\nparty, a concert, a school hall. Chairs may well exist; naming them on a\nticket for a room nobody is directed in only invites an argument.<\/li>\n<li><strong>Numbered places<\/strong> \u2014 every place is named and handed out in order, nearest\nthe stage first, and printed on the ticket.<\/li>\n<\/ul>\n\n<p>One event can mix all of them, which is the point: a standing area, free seating\nbehind it, and a numbered block for invited guests.<\/p>\n\n<p><strong>A zone with no price of its own costs what the event costs<\/strong>, and the field\nnow shows that price rather than sitting empty. <strong>And a room that adds up to\nmore places than the event says it holds now says so<\/strong> \u2014 one of the two numbers\nis wrong, and the door will believe the room.<\/p>","1.3.4":"<p><strong>Fixed: &quot;Confirm payment and send the tickets&quot; was greyed out for good.<\/strong> 1.3.3\nadded a rule that holds a ticket until every guest has a place, and hung it on\nthe wrong button. Confirming a payment records something that has already\nhappened at a desk; it cannot be refused because a seat is undecided. The button\nis never disabled now \u2014 it says <em>Confirm the payment<\/em> when the tickets will have\nto wait, and the reason is printed under it.<\/p>\n\n<p><strong>And the rule no longer has a door with no key.<\/strong> This plugin has no screen for\nplacing guests by hand, so being told &quot;give everyone a place first&quot; was being\ntold to do something it never offered. Where there is no way to place by hand,\nthe plugin now places the booking itself as the payment lands. If it cannot \u2014 no\nfree place left in the category somebody paid for \u2014 it says exactly that, and\nthe fix is in your own hands: add places to the room and the tickets go out on\ntheir own.<\/p>\n\n<p><strong>A paid booking whose tickets never went out now has a button that finishes\nit.<\/strong> <em>Send them now<\/em>, on the booking, once nothing is holding them.<\/p>","1.3.3":"<p><strong>Fixed: a card payment sent tickets with no place on them.<\/strong> The rule that\nholds a ticket until every guest has a place lived in a module this plugin does\nnot include, so an event with a room issued tickets the moment the money landed\n\u2014 with the place blank. The rule now lives with the room itself, which means it\napplies here. The guest is told their payment arrived, and the ticket follows\nwhen you have decided where they sit.<\/p>\n\n<p><strong>&quot;Ticket straight away&quot; now actually places the booking.<\/strong> It was a promise\nwith nothing behind it. The plugin now gives every guest a place as the payment\nlands \u2014 in a category their ticket pays for, keeping the party together where\nthe seats allow \u2014 and only then sends the ticket. If somebody cannot be seated\nin the category they paid for, nobody is moved and the booking waits for you:\nhalf a placed booking is worse than none.<\/p>\n\n<p><strong>Fixed: &quot;This form stays open for .&quot; with nothing in the gap.<\/strong> The sentence\nwaited for a script to fill it in, and read as broken whenever anything stopped\nthat script. The server writes it out in full now, and the script only turns it\ninto a live clock when it can.<\/p>\n\n<p><strong>Fixed: WordPress&#039;s own footer line printed across the last panel<\/strong> of an event\nscreen, under the sticky save bar. Room is made for it.<\/p>","1.3.2":"<p><strong>A ticket category is tied to a part of the room.<\/strong> The plugin still works it\nout from the names on its own \u2014 &quot;Standard admission&quot; finds &quot;Standard&quot; \u2014 but the\nguess is only made when exactly one part of the room fits, and the Pricing\nscreen now has a column to say it outright when the names are too far apart.<\/p>\n\n<p><strong>And a part of the room that a category sells is closed to every other\ncategory.<\/strong> This is the half that was missing. Matching alone answers &quot;where may\nthis guest sit?&quot;, and when the two screens were named differently it has to\nanswer &quot;anywhere&quot; \u2014 which hands a standard ticket the VIP row. Claiming answers\nthe other question, &quot;who is this row for?&quot;, and that one can always be answered.\nA guest whose ticket matches nothing may now sit anywhere nobody else has\nclaimed: never in the VIP row, and never nowhere.<\/p>\n\n<p><strong>Capacity and price follow the same link.<\/strong> A category of tickets takes its\nremaining places from the part of the room it sells, and a part of the room\npriced at zero takes the price of the category that sells it.<\/p>","1.3.1":"<p><strong>Fixed: the plan let you choose a place the dropdown refused.<\/strong> The rule that\nkeeps a standard ticket out of a VIP row was applied to the list of places and\nnot to the plan beside it, so the same booking could be refused a row in one\nplace and given it in the other. It is now one rule, asked by the list, the\nplan, automatic placement and the server alike \u2014 and the &quot;place anyone\nanywhere&quot; box lifts all four together. A rule enforced in one of two places is\nnot a rule.<\/p>\n\n<p><strong>Fixed: a room category priced at zero was sold for nothing.<\/strong> The screen said\nzero meant &quot;the price of the event&quot;, and it did not. A price is now settled in\none order wherever it is needed: what you typed on the room category, or else\nthe ticket category of the same name, or else the price of the event.<\/p>\n\n<p><strong>A category on a ticket that the room does not have no longer locks a guest\nout.<\/strong> &quot;Standard admission&quot; and &quot;Standard&quot; are the same thing to an organizer\nand two different strings to a computer. Where the names do not meet, the\nplugin now says so by allowing rather than by forbidding: a guest with nowhere\nto sit stops an evening, and that is the worse failure.<\/p>","1.3.0":"<p><strong>A place is a coordinate, not a name.<\/strong> Where somebody sits is now written the\nway a room is actually read: the level, then the part of the room, then the row\nor table, then the seat along the row. Each piece appears only when it says\nsomething \u2014 a room with one level never mentions it, and a group names itself\nonly when another group uses the same row letters. So a row is &quot;C&quot;, not\n&quot;Straight rows-C&quot;, and two blocks that both have a row C become &quot;SR\/C&quot; and\n&quot;BAL\/C&quot;. Shorter on the ticket, shorter in the door list, and it fits the\ncolumn it is stored in.<\/p>\n\n<p><strong>Levels.<\/strong> A room can be built on more than one \u2014 stalls and balcony, ground\nfloor and gallery, garden and terrace. Name the level on each zone and it\nbecomes the first thing a ticket says. Leave it empty, as most rooms will, and\nit is never mentioned.<\/p>\n\n<p><strong>A chair at a table is found by its table.<\/strong> Where somebody sits around a round\ntable is nobody&#039;s business and is no longer printed; which table it is, is. A\nchair in a row is found by both numbers, &quot;Row C, seat 12&quot;, because that is how\nsomebody finds it.<\/p>\n\n<p><strong>Fixed: a standard ticket could be seated in a VIP place.<\/strong> A guest is now\noffered only the places the category on their ticket pays for, and automatic\nplacement fills each guest&#039;s own category \u2014 a party of five with one VIP among\nthem is seated in two parts of the room rather than one. The desk can still\noverrule it for a swap, a favour or a wheelchair, but on purpose: there is a\nbox to tick, and the check runs again on the way in.<\/p>\n\n<p><strong>Fixed: pressing back could book you twice.<\/strong> A booking form may now be sent\nonce, within a window you set (fifteen minutes by default), and the page shows\nthe time left. Going back and submitting again shows the guest the booking they\nalready have instead of making a second one \u2014 which also means a guest who has\njust paid cannot go back and reserve the same places again for free.<\/p>\n\n<p><strong>Fixed: the paid confirmation did not say who bought what.<\/strong> A party of five\nwith one VIP among them was told the total and nothing else. The email now\nlists each guest and their category.<\/p>\n\n<p><strong>The printed door list<\/strong> keeps a clear gutter between the place and the ticket\nnumber, and prints the readable coordinate rather than the key.<\/p>","1.2.2":"<p><strong>Fixed: the Stripe key would not save.<\/strong> Pasting a secret key changed nothing\nand the card option stayed greyed out, because the Payments screen was not\nallowed to write the settings it was showing. It is now, and a module can\ndeclare settings of its own on somebody else&#039;s screen rather than having them\nsilently dropped.<\/p>\n\n<p><strong>New: what one person is given.<\/strong> A room now says whether a booking gets a\nwhole table, row or area, or a single chair. It is one question, asked once, on\nthe Room tab -- and everything follows from it: what can be chosen, what goes on\nthe ticket, and what every screen calls a place. A wedding gives out tables; a\ncinema, a theatre or a seminar gives out chairs; standing areas have no chairs\nand stay areas either way. Rooms that already exist are unchanged and keep\nhanding out whole tables and rows.<\/p>\n\n<p><strong>A place is no longer always called a Table.<\/strong> It is called a Seat, a Table, a\nRow or an Area, depending on what it is -- on screen, in the export, on the\nticket and on the printed door list. A room that mixes them says Place. When\nthis plugin was written a place was always a table; it has not been for a while,\nand a cinema seat labelled Table is the plugin admitting it has not understood\nthe evening.<\/p>\n\n<p><strong>Choosing a chair on the plan.<\/strong> Where a room is sold seat by seat, clicking a\nchair on the plan picks that chair. It used to pick the whole row the chair\nstood in.<\/p>\n\n<p><strong>The plan keeps up while you seat a party.<\/strong> Placing four guests one after\nanother, the second used to be offered the place the first had just been given.\nThe plan and the lists now account for the choices already made on the screen,\nwithout a reload.<\/p>\n\n<p><strong>The printed door list shrinks before it cuts.<\/strong> A place, a ticket number, a\nbooking reference or a category too long for its column is set a little smaller\nso it fits whole, and only loses its tail if it still will not fit at the\nsmallest readable size. &quot;Balcony-A12&quot; clipped to &quot;Balco...&quot; tells an usher\nnothing. The place column is wider and the guest column a little narrower.<\/p>","1.2.1":"<p>Two security fixes, both found and reported by Alik. Forwarding headers such as\nX-Forwarded-For are no longer believed by default, so a visitor can no longer\nhand themselves a fresh rate limit by inventing an address; and bookings for\none event now happen one at a time, so two people clicking at the same instant\ncannot both take the last seat. If your site is behind Cloudflare or a reverse\nproxy, tell the plugin so under Settings \u2192 Anti-abuse.<\/p>","1.2.0":"<p>Rooms and places, card payment with Stripe, and the booking page no longer\ndepends on you having made one. Existing events are untouched and keep working\nexactly as before: a room is something you add when you want one, and card\npayment does nothing until you enter a Stripe key of your own.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3697091,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3697091,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500-ar.png":{"filename":"banner-1544x500-ar.png","revision":3697091,"resolution":"1544x500","location":"assets","locale":"ar","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3697091,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-ar.png":{"filename":"banner-772x250-ar.png","revision":3697091,"resolution":"772x250","location":"assets","locale":"ar","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3697091,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.8","1.0.9","1.10.0","1.10.1","1.2.0","1.2.1","1.2.2","1.8.7","1.9.0","1.9.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3694201,"resolution":"1","location":"assets","locale":"","width":1520,"height":639},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3694201,"resolution":"2","location":"assets","locale":"","width":1520,"height":639},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3694201,"resolution":"3","location":"assets","locale":"","width":1520,"height":639},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3694201,"resolution":"4","location":"assets","locale":"","width":1520,"height":639},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3694201,"resolution":"5","location":"assets","locale":"","width":1520,"height":479},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3694201,"resolution":"6","location":"assets","locale":"","width":1520,"height":639},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3694201,"resolution":"7","location":"assets","locale":"","width":1520,"height":639},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3694201,"resolution":"8","location":"assets","locale":"","width":1552,"height":660},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3694201,"resolution":"9","location":"assets","locale":"","width":1552,"height":651}},"screenshots":{"1":"The event assistant. Fifteen kinds of night, drawn rather than listed \u2014 pick the one that looks like your room, and every answer from there decides the next question. The panel on the right builds the room as you go, and shows the prices the booking page will show and the line the ticket will print. It refuses to rebuild a room that already has bookings.","2":"The room builder. Describe the room in numbers \u2014 rows, tables to a row, chairs to a table, levels \u2014 or draw it: drag a stage in, rectangle-select a whole row, shift-click, align, space evenly, nudge with the arrow keys. The plan you draw is the plan the guest picks from and the one you watch on the night.","3":"Prices &amp; places, on one panel. What a ticket will say, how places are given out, the levels, and each part of the room with the price category it is sold as and the first places it hands out. The capacity is counted from the room, not typed beside it.","4":"The booking page. One shortcode on any page. It asks for the name of every person coming \u2014 five names for a booking of five \u2014 and it knows what is left while the form is being filled in, counting the lines above and the other people booking at the same moment.","5":"The floor, on the night. Every part of the room on one screen, filling in real time, with three facts kept apart: sold, seated, and arrived. The pale bar is what has been sold; the solid one inside it is who has walked in.","6":"The door check-in station. A web page on any phone, opened with a per-event door code \u2014 no app to install. Camera, photo or keypad, a live count of who is inside, and one screen per scan: let in, already inside, or not for tonight.","7":"Every ticket issued. One per guest, with its own serial and its own QR code, the place it carries, and whether that guest has walked through the door \u2014 with the minute and the entrance they came in by.","8":"The control room. Every event, what has sold, what is still waiting on a payment, who has arrived \u2014 and the shortcode for the event you are looking at, ready to paste.","9":"Help, inside the plugin. The whole guide on the screen where you are stuck: a first event in ten minutes, then the assistant, the room, payment, tickets, the night, and what to do when something does not arrive. Every step links to the screen it talks about."}},"plugin_section":[],"plugin_tags":[1486,99,1373,4772,4771],"plugin_category":[40,58],"plugin_contributors":[278878],"plugin_business_model":[],"class_list":["post-361265","plugin","type-plugin","status-publish","hentry","plugin_tags-events","plugin_tags-multilingual","plugin_tags-qr-code","plugin_tags-ticketing","plugin_tags-tickets","plugin_category-calendar-and-events","plugin_category-user-management","plugin_contributors-bitforgenet","plugin_committers-bitforgenet"],"banners":{"banner":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/banner-772x250.png?rev=3697091","banner_2x":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/banner-1544x500.png?rev=3697091","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/icon-128x128.png?rev=3697091","icon_2x":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/icon-256x256.png?rev=3697091","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-1.png?rev=3694201","caption":"The event assistant. Fifteen kinds of night, drawn rather than listed \u2014 pick the one that looks like your room, and every answer from there decides the next question. The panel on the right builds the room as you go, and shows the prices the booking page will show and the line the ticket will print. It refuses to rebuild a room that already has bookings."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-2.png?rev=3694201","caption":"The room builder. Describe the room in numbers \u2014 rows, tables to a row, chairs to a table, levels \u2014 or draw it: drag a stage in, rectangle-select a whole row, shift-click, align, space evenly, nudge with the arrow keys. The plan you draw is the plan the guest picks from and the one you watch on the night."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-3.png?rev=3694201","caption":"Prices &amp; places, on one panel. What a ticket will say, how places are given out, the levels, and each part of the room with the price category it is sold as and the first places it hands out. The capacity is counted from the room, not typed beside it."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-4.png?rev=3694201","caption":"The booking page. One shortcode on any page. It asks for the name of every person coming \u2014 five names for a booking of five \u2014 and it knows what is left while the form is being filled in, counting the lines above and the other people booking at the same moment."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-5.png?rev=3694201","caption":"The floor, on the night. Every part of the room on one screen, filling in real time, with three facts kept apart: sold, seated, and arrived. The pale bar is what has been sold; the solid one inside it is who has walked in."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-6.png?rev=3694201","caption":"The door check-in station. A web page on any phone, opened with a per-event door code \u2014 no app to install. Camera, photo or keypad, a live count of who is inside, and one screen per scan: let in, already inside, or not for tonight."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-7.png?rev=3694201","caption":"Every ticket issued. One per guest, with its own serial and its own QR code, the place it carries, and whether that guest has walked through the door \u2014 with the minute and the entrance they came in by."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-8.png?rev=3694201","caption":"The control room. Every event, what has sold, what is still waiting on a payment, who has arrived \u2014 and the shortcode for the event you are looking at, ready to paste."},{"src":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/screenshot-9.png?rev=3694201","caption":"Help, inside the plugin. The whole guide on the screen where you are stuck: a first event in ten minutes, then the assistant, the room, payment, tickets, the night, and what to do when something does not arrive. Every step links to the screen it talks about."}],"raw_content":"<!--section=description-->\n<p><strong>Events &amp; Tickets<\/strong> runs the evening from the first booking to the last guest\nthrough the door. It was built for clubs, bars and party promoters \u2014 the people\nfor whom an event is a door, a list, and a queue outside \u2014 and it has since been\nused for seated dinners, concerts, conferences and weddings, because they are\nthe same problem wearing different clothes.<\/p>\n\n<p>Nothing is capped and nothing is metered. There is no per-ticket fee, no\nexternal service to sign up for, no account to create, and no telemetry. Your\nguest list lives in your own database, on your own server.<\/p>\n\n<h4>It speaks six languages, and it brought them with it<\/h4>\n\n<p>English, French, Spanish, Portuguese, German and <strong>Arabic<\/strong> \u2014 not a promise that\nsomebody will translate it one day, but six finished catalogues in the download.\nInstall it and it is already in your language.<\/p>\n\n<p><strong>It works the language out for itself.<\/strong> Whatever WordPress is set to, the\nplugin follows \u2014 and it follows by language rather than by locale, so <code>pt_BR<\/code>,\n    pt_PT and <code>pt<\/code> all land on Portuguese and <code>ar_DZ<\/code>, <code>ar_MA<\/code> and <code>ar_SA<\/code> all land\non Arabic. A site in a language it does not have falls back to French rather than\nserving a screen that is half one language and half another. If you would rather\nsay it outright, there is one setting: <em>Settings \u2192 Language<\/em>.<\/p>\n\n<p><strong>Everything is translated, not just the buttons.<\/strong> The booking form the guest\nfills in, the emails they receive, the words printed on the ticket itself, the\ndoor station held at the entrance, and the admin screens you work in. Dates too \u2014\nthe month and the weekday come out of the plugin's own catalogue rather than\nWordPress's, so a French ticket does not print <em>September<\/em> under a French\nheading on an English site.<\/p>\n\n<p><strong>Arabic really is Arabic.<\/strong> The screens, the emails and the booking form read\nright to left. And the ticket \u2014 which is a drawn image, not a web page \u2014 is drawn\nwith an Arabic typeface that travels with the plugin, with the letters joined the\nway Arabic joins them and the line put in reading order. A time, a price, a table\nnumber or a ticket reference still runs the other way inside the sentence, as it\nshould. Most plugins that claim Arabic print a row of disconnected letters\nbackwards on the one thing the guest actually holds.<\/p>\n\n<p><strong>The language travels with the booking.<\/strong> A guest who booked in Spanish gets\ntheir ticket in Spanish \u2014 including a ticket re-sent months later, from a screen\nyou are reading in French. And your own words stay yours: event titles, venue\nnames, payment instructions and the success message are your text, and the plugin\nwill not rewrite them.<\/p>\n\n<h4>Who it is for<\/h4>\n\n<ul>\n<li>Clubs, bars and late-night venues<\/li>\n<li>Party and concert promoters<\/li>\n<li>Seated dinners, galas and weddings<\/li>\n<li>Conferences, seminars and school evenings<\/li>\n<li>Associations and community groups<\/li>\n<li>Anyone taking bookings by card, by transfer, by WhatsApp or in cash<\/li>\n<\/ul>\n\n<h4>Set an event up by answering questions<\/h4>\n\n<p>Creating an event opens an assistant, and the assistant is the shortest way to\ndescribe a night that exists. It starts with a drawing rather than a form:\nfifteen kinds of event, from a standing club night to a banquet, a theatre, a\npodium in I or in T, a stadium, a classroom. You point at the one that looks\nlike your room.<\/p>\n\n<p>From there every answer decides the next question, and nothing is asked twice.\nAre seats numbered? Then how is the room laid out \u2014 tables in rows, rows of\nchairs, or no order at all? How many rows, how many tables to a row, how many\nchairs to a table? Are there levels \u2014 a balcony, a terrace, a gallery? Which\nparts are sold at which price? How are you paid, and what should somebody who\npays by transfer be told? Does the ticket leave immediately, or once you have\nassigned the places yourself? Who chooses the place \u2014 the guest, or you?<\/p>\n\n<p>The panel on the right draws the room while you answer, and shows the prices as\nthe booking page will show them and the line the ticket will print. When you\nfinish, the event is ready to sell: places, zones, prices, payment, delivery.<\/p>\n\n<p><strong>The assistant owns nothing.<\/strong> It adds no setting of its own and keeps no\ncolumn of its own \u2014 it fills in the panels that already held each answer, and\nevery one of them stays editable field by field afterwards. An assistant that\nknows something the editor does not is a second source of truth, and this\nplugin has already paid that bill. For the same reason it refuses to rebuild\nthe room of an event that already has bookings: it will not renumber a table\nsomebody has already been sold.<\/p>\n\n<h4>The room is an inventory, and a zone is an interval of it<\/h4>\n\n<p>Say the room once \u2014 six rows of eight tables, ten chairs a table, plus a\nbalcony \u2014 and the plugin numbers every place in it. A zone then claims a slice\nof that inventory: <em>tables 1 to 5<\/em>, <em>rows A to C<\/em>, <em>the whole balcony<\/em>. It\ninvents nothing, so nothing can be sold twice and nothing is quietly lost:\nwhatever no zone claims is named on screen as unclaimed rather than forgotten.<\/p>\n\n<p>A price category is not a zone. A category has a name and a price, and several\nzones can share it \u2014 Premium is Premium on the left balcony and on the right.\n<strong>The booking page sells the categories; the ticket prints the zone<\/strong>, because\nthe zone is what somebody reads at the door.<\/p>\n\n<p>Each zone also says what it controls: access only \u2014 a standing area where\nnobody has a seat \u2014 or exactly where each person sits. One event can hold all\nthree at once: a standing floor, a seated balcony, and a numbered block.<\/p>\n\n<p>And if you want to draw the room instead of describing it, the builder is\nthere: drag tables and rows onto a plan, rectangle-select or shift-click,\nalign, space evenly, nudge with the arrow keys, place a stage, a bar, a door.\nThe plan you draw is the plan the guest picks from, and the plan you watch on\nthe night.<\/p>\n\n<h4>Every guest is a person, not a number<\/h4>\n\n<p>A booking for five asks for five names, and each one gets their own ticket with\nits own QR code. One code cannot let five people in, and the door knows who is\nstanding in front of it.<\/p>\n\n<p>The booking form also knows what is left <strong>while it is being filled in<\/strong> \u2014\ncounted against what the page was rendered with, what the lines above it have\nalready taken, and what somebody else is taking in another browser at the same\nmoment. An option with nothing left is greyed out rather than removed, so\nnobody's choice is ever changed behind their back. The real guarantee is not in\nthe browser, where it could never be: the event is locked, the places are\nrecounted and the booking is refused at the moment of writing.<\/p>\n\n<h4>Tickets that look like tickets<\/h4>\n\n<p>Each one is drawn at 100 x 250 mm, 300 dpi, with the QR engraved into the\nartwork, and delivered as a PDF by email. Mail servers strip attachments more\noften than they admit, so every message also carries a download link for each\nguest.<\/p>\n\n<p>The ticket studio takes your own artwork if you have some \u2014 upload it, generate\ncolour variations, and move every printed field where you want it on a visual\nfield map \u2014 and generates a design for you in the colour of your choice if you\nwould rather not think about it.<\/p>\n\n<h4>The door works<\/h4>\n\n<p>Open the check-in station on any phone \u2014 no app to install. Point it at a\nticket and it answers in one screen: valid, already used, or not for tonight.\nCounters update live, several phones can scan the same event at once, and when\nthe venue's wifi gives up \u2014 it will \u2014 there is a printable roll-call list with\nevery guest and every ticket number on it.<\/p>\n\n<p>The plan says who is actually in the room. A place that has been sold and a\nplace whose guest has walked through the door are two different facts, and only\none of them moves all evening: a guest who has scanned turns green, carries a\ntick and pulses, and a table whose whole party has arrived wears a green ring.<\/p>\n\n<h4>Payment on your terms<\/h4>\n\n<p>Two ways, and neither is the lesser one.<\/p>\n\n<p>Take the money yourself: a booking arrives pending, you confirm it however you\nactually get paid \u2014 bank transfer, WhatsApp, cash at the office \u2014 and the\ntickets go out the moment you do. Nothing is ever issued for money you have not\nreceived. What the guest is told about paying is your own text, written per\nevent, because offline that text <em>is<\/em> the payment.<\/p>\n\n<p>Or let the card do it: add your own Stripe key and the guest pays on Stripe's\npage, comes back confirmed, and gets their tickets without you touching\nanything. Their places are held while they pay and released on their own if\nthey walk away, so the same seat is never sold twice. The money goes straight\nfrom the guest to your own Stripe account \u2014 this plugin is never in between,\nand takes nothing.<\/p>\n\n<h4>What the free plugin does<\/h4>\n\n<p>Everything below is in this plugin. There is nothing to unlock.<\/p>\n\n<ul>\n<li><strong>Unlimited events and unlimited tickets.<\/strong> No cap, no per-ticket fee.<\/li>\n<li><strong>Six languages in the box<\/strong> \u2014 English, French, Spanish, Portuguese, German\nand Arabic, detected from your site or chosen in one setting, covering the\nadmin, the booking form, the emails, the ticket artwork and the door station,\nwith right-to-left layout and real Arabic shaping on the printed ticket.<\/li>\n<li><strong>Event assistant<\/strong> \u2014 fifteen drawn archetypes, one question at a time, and a\nlive preview of the room, the prices and the printed line.<\/li>\n<li><strong>Event editor<\/strong> \u2014 three steps to create one, then panels to refine it:\ninformation and details, prices and places, registration window, description,\nartwork.<\/li>\n<li><strong>Room builder<\/strong> \u2014 describe the room in numbers or draw it: tables, rows,\nlevels, a stage, multi-selection, alignment, even spacing, arrow-key nudging.<\/li>\n<li><strong>Zones and price categories<\/strong> \u2014 a zone is an interval of the room, a category\nis a name and a price that several zones can share.<\/li>\n<li><strong>Organizers library<\/strong> \u2014 name, logo, colours, contact. Reused across events.<\/li>\n<li><strong>Venues library<\/strong> \u2014 address, capacity, notes. Reused across events.<\/li>\n<li><strong>Public booking page<\/strong> \u2014 one shortcode, <code>[bitforgenet_registration]<\/code>. Asks\nfor the name of every person coming, shows what is still available as the\nform is filled in, respects capacity and the registration window, and\nconfirms on screen. If no page carries the shortcode, the plugin shows the\nform itself rather than leaving a dead link.<\/li>\n<li><strong>Bookings screen<\/strong> \u2014 search, filter by event and status, confirm payment,\nadd an internal note, resend an email, cancel, or enter a booking by hand.<\/li>\n<li><strong>Seating and the floor<\/strong> \u2014 every zone on one screen while the evening fills,\na booking seated by hand or placed for you, sold against arrived, and a\nticket that will not print until every guest on it has a place.<\/li>\n<li><strong>Moving somebody who already holds a ticket<\/strong> \u2014 the screen states the three\nconsequences, the buttons stay dead until you type <code>edit place<\/code>, the old\nticket stops working at the door and a second email goes out.<\/li>\n<li><strong>Personal QR tickets<\/strong> \u2014 one per guest, rendered as a PDF, sent by email\nwith a download link alongside.<\/li>\n<li><strong>Ticket studio<\/strong> \u2014 your own artwork, colour variations, and a visual field\nmap for every printed field.<\/li>\n<li><strong>Door check-in station<\/strong> for any phone, opened with a per-event door code,\nwith live counters and multi-station scanning.<\/li>\n<li><strong>Printable roll-call list<\/strong> for the evenings the network fails.<\/li>\n<li><strong>Discount codes<\/strong>, with their own limits.<\/li>\n<li><strong>Card payment with Stripe<\/strong> \u2014 the guest pays on Stripe's own page and comes\nback with their booking confirmed. Their places are held while they pay and\nreleased on their own if they never finish. The money goes straight from the\nguest to your own Stripe account \u2014 this plugin is never in between and takes\nnothing.<\/li>\n<li><strong>Team notifications<\/strong> \u2014 a new booking can be copied to as many colleagues as\nyou like, not just one address.<\/li>\n<li><strong>CSV export with a column picker<\/strong> \u2014 bookings or guests, one event or all,\nevery field the plugin holds, and it remembers what you ticked.<\/li>\n<li><strong>Tools and data<\/strong> \u2014 a system check that tells you why a ticket or an email\ndid not arrive, a test-ticket email, a database check, and an\narchive-and-clear that copies every booking into archive tables before\nemptying the live ones, behind a one-time code sent to an address you\nnominate.<\/li>\n<li><strong>Searchable archive<\/strong> of everything that has been cleared.<\/li>\n<li><strong>Activity log<\/strong> \u2014 who did what, and when.<\/li>\n<li><strong>A Help screen inside the plugin<\/strong> \u2014 the whole guide, on the screen where\nyou are stuck, linking to the screens it talks about. Open to anyone who can\nsee the plugin at all, because the person who most needs it is the one on the\ndoor at midnight.<\/li>\n<li><strong>Delete-all-data on uninstall<\/strong>, if you tick it. Off by default.<\/li>\n<\/ul>\n\n<h4>Nothing is held back<\/h4>\n\n<p>There is no paid edition of this plugin. The assistant, the room builder, the\nticket studio, the price categories, the discount codes and card payment are\nall here, in the plugin you just installed. Nothing is capped, nothing is\nmetered, and no screen ends in an offer.<\/p>\n\n<h4>Reporting a security issue<\/h4>\n\n<p>If you find something, write to the address on\nhttps:\/\/bitforgenet.dev\/ and it will be looked at, fixed and credited here by\nname unless you would rather not be. Please test against your own installation\nrather than somebody else's.<\/p>\n\n<p>Thank you to <strong>Alik<\/strong> for the two issues fixed in 1.2.1.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin stores what a booking needs \u2014 names, email address, phone number \u2014\nin your own database, on your own server. Email goes out through WordPress,\nwhich means through whatever mail service your site already uses. There is no\naccount to create with us and no telemetry: nothing is ever sent to BitForge\nNetwork.<\/p>\n\n<h4>External services<\/h4>\n\n<p>The plugin uses one external service, and only if you set it up yourself.<\/p>\n\n<p><strong>Stripe<\/strong> \u2014 used only when you enter a Stripe secret key under Settings \u2192\nPayments and turn card payment on for an event. Until then no connection to\nStripe is ever made.<\/p>\n\n<p>When a guest chooses to pay by card, the plugin asks Stripe to open a payment\npage and  &hellip;<\/p>\n\n<!--section=installation-->\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.8 or later<\/li>\n<li>PHP 7.4 or later<\/li>\n<li>The GD extension, for rendering the tickets<\/li>\n<li>A working mail setup on the site \u2014 an SMTP plugin if your host's mail is\nunreliable<\/li>\n<\/ul>\n\n<h4>Steps<\/h4>\n\n<ol>\n<li>Plugins -&gt; Add New, search for <strong>Events and Tickets<\/strong>, install and activate.\nOr upload the ZIP under Plugins -&gt; Add New -&gt; Upload Plugin.<\/li>\n<li>Open <strong>Events &amp; Tickets -&gt; Settings<\/strong> and set your currency, your From\naddress and your payment instructions.<\/li>\n<li>Open <strong>Events &amp; Tickets -&gt; Tools &amp; data<\/strong>, run the system check, then send\nyourself a test ticket. Do this before your first real booking, not after.<\/li>\n<li>Create your first event with <strong>Events &amp; Tickets -&gt; Events -&gt; New event<\/strong>.\nThe assistant opens on its own and asks what kind of night it is.<\/li>\n<li>Put the booking form on a page with the shortcode\n   [bitforgenet_registration].<\/li>\n<li>On the night, open <strong>Events &amp; Tickets -&gt; Door scanner<\/strong>, note the door code,\nand give the link and the code to whoever is on the door.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"the%20name%20keeps%20changing.%20is%20it%20the%20same%20plugin%3F\"><h3>The name keeps changing. Is it the same plugin?<\/h3><\/dt>\n<dd><p>Yes. Same plugin, same folder, same settings, same data, same updates \u2014 only\nthe name shown on screen has changed. It was <em>BitForgeNet Guest Tickets and\nDoor Check-in<\/em>, briefly <em>Tickets &amp; Events<\/em>, and it is now <strong>Events and Tickets\nwith QR Check-in<\/strong> in the directory and <strong>Events &amp; Tickets<\/strong> on your own\nscreens. Nothing to reinstall and nothing to reconfigure. It is still published\nby BitForge Network, which is what the Author line says.<\/p><\/dd>\n<dt id=\"is%20there%20a%20limit%20on%20events%2C%20guests%20or%20tickets%3F\"><h3>Is there a limit on events, guests or tickets?<\/h3><\/dt>\n<dd><p>No. Nothing in this plugin is capped or metered, and there is no per-ticket\nfee. What your server can hold is the limit.<\/p><\/dd>\n<dt id=\"is%20there%20a%20paid%20version%3F\"><h3>Is there a paid version?<\/h3><\/dt>\n<dd><p>Not today. Everything this plugin can do is in the plugin you installed \u2014 the\nassistant, the room builder, the ticket studio, the price categories, the\ndiscount codes and card payment included. No screen ends in an offer.<\/p><\/dd>\n<dt id=\"do%20guests%20need%20an%20account%3F\"><h3>Do guests need an account?<\/h3><\/dt>\n<dd><p>No. A guest fills in the form, receives their tickets by email, and shows the\nQR code at the door.<\/p><\/dd>\n<dt id=\"does%20it%20need%20woocommerce%3F\"><h3>Does it need WooCommerce?<\/h3><\/dt>\n<dd><p>No. It has its own booking form and its own bookings screen, and it works on a\nsite with no shop on it.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20use%20the%20assistant%3F\"><h3>Do I have to use the assistant?<\/h3><\/dt>\n<dd><p>No. It opens when you create an event because that is the fastest way through,\nand you can leave it at any point: every answer it writes is a field you can\nopen and change afterwards. It owns no setting of its own.<\/p><\/dd>\n<dt id=\"how%20do%20i%20describe%20a%20room%20that%20is%20not%20a%20grid%3F\"><h3>How do I describe a room that is not a grid?<\/h3><\/dt>\n<dd><p>Two ways, and they end in the same place. Describe it in numbers \u2014 rows, tables\nto a row, chairs to a table, levels \u2014 or draw it in the builder: drop tables,\nrows, a stage and a bar on a plan, select several at once, align them, space\nthem evenly, nudge them with the arrow keys. Either way the plugin numbers\nevery place and hands them out.<\/p><\/dd>\n<dt id=\"can%20one%20event%20have%20standing%20room%20and%20numbered%20seats%3F\"><h3>Can one event have standing room and numbered seats?<\/h3><\/dt>\n<dd><p>Yes. Each zone says for itself whether it controls access only or where each\nperson sits, so a standing floor, a seated balcony and a numbered block can all\nbelong to the same night.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20a%20zone%20and%20a%20price%20category%3F\"><h3>What is the difference between a zone and a price category?<\/h3><\/dt>\n<dd><p>A zone is a piece of the room \u2014 <em>tables 1 to 5<\/em>, <em>the balcony<\/em>. A category is a\nname and a price, and several zones can share one: Premium is Premium on the\nleft balcony and on the right. The booking page sells the categories; the\nticket prints the zone, because that is what somebody reads at the door.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20room%20after%20people%20have%20booked%3F\"><h3>Can I change the room after people have booked?<\/h3><\/dt>\n<dd><p>You can add to it and change prices. You cannot rebuild it: the assistant\nrefuses to renumber a room that already has bookings, because a table number\nsomebody has already been sold has to keep meaning the same table.<\/p><\/dd>\n<dt id=\"two%20people%20booked%20the%20last%20table%20at%20the%20same%20moment.%20what%20happens%3F\"><h3>Two people booked the last table at the same moment. What happens?<\/h3><\/dt>\n<dd><p>One of them gets it and the other is told, before anything is charged. The form\nshows what is left while it is being filled in \u2014 including what somebody else\nis taking in another browser \u2014 but the guarantee is not in the browser: the\nevent is locked, the places are recounted and the booking is refused at the\nmoment it is written.<\/p><\/dd>\n<dt id=\"can%20i%20move%20somebody%20who%20already%20has%20their%20ticket%3F\"><h3>Can I move somebody who already has their ticket?<\/h3><\/dt>\n<dd><p>Yes, and the plugin treats it as what it is: a re-issue, not an edit. The\nscreen states the three consequences, the buttons stay dead until you type\n    edit place, and then the old ticket stops working at the door and a second\nemail goes out with the new one.<\/p><\/dd>\n<dt id=\"can%20i%20take%20payment%20online%3F\"><h3>Can I take payment online?<\/h3><\/dt>\n<dd><p>Yes, with Stripe. Put your own Stripe secret key in Settings \u2192 Payments and\nturn card payment on for the events you want it on. The guest pays on a page\nhosted by Stripe, no card number touches your site, and the money goes straight\nto your own Stripe account: this plugin is never in between and takes nothing\nper ticket, ever.<\/p>\n\n<p>Until you enter a key, nothing changes and no connection to Stripe is made. A\nbooking arrives pending and you confirm it once you have been paid \u2014 by\ntransfer, by WhatsApp, or in cash \u2014 exactly as before.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20make%20guests%20pay%20by%20card%3F\"><h3>Do I have to make guests pay by card?<\/h3><\/dt>\n<dd><p>No. It is a choice per event, and you can also let a guest reserve now and pay\nlater: they get both buttons. If you would rather nothing be reserved until it\nis paid for, there is a single setting for that. What a guest who pays offline\nis told is your own text, written per event \u2014 offline, that text is the\npayment.<\/p><\/dd>\n<dt id=\"does%20one%20booking%20give%20one%20qr%20code%20for%20everybody%3F\"><h3>Does one booking give one QR code for everybody?<\/h3><\/dt>\n<dd><p>No, and that is the point. A booking for five produces five tickets with five\ndifferent codes, each carrying the name of the person it belongs to.<\/p><\/dd>\n<dt id=\"can%20more%20than%20one%20of%20us%20be%20told%20when%20a%20booking%20arrives%3F\"><h3>Can more than one of us be told when a booking arrives?<\/h3><\/dt>\n<dd><p>Yes. The notification address takes a list, and every address on it is really\ncopied in.<\/p><\/dd>\n<dt id=\"the%20tickets%20are%20not%20arriving.\"><h3>The tickets are not arriving.<\/h3><\/dt>\n<dd><p>The plugin sends through WordPress, so anything that fixes email for the rest\nof your site fixes it here. Run <strong>Tools &amp; data -&gt; System check<\/strong> first: it says\nwhether the failure is in the rendering or in the sending. If your host's mail\nis unreliable, install an SMTP plugin and connect a real mailbox \u2014 it will be\npicked up automatically.<\/p><\/dd>\n<dt id=\"the%20email%20arrives%20but%20the%20pdf%20is%20missing.\"><h3>The email arrives but the PDF is missing.<\/h3><\/dt>\n<dd><p>Your mail server is stripping the attachment. Lower the attachment ceiling in\nSettings; every email already carries a download link per guest, so the guest\nstill gets their ticket.<\/p><\/dd>\n<dt id=\"does%20the%20door%20scanner%20need%20internet%3F\"><h3>Does the door scanner need internet?<\/h3><\/dt>\n<dd><p>It needs to reach your own website, the same as any other page. For the\nevenings when the venue's wifi is not to be trusted, print the roll-call list\nfirst: it carries every guest and every ticket number, and it works on paper.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20install%20an%20app%20on%20the%20door%20phone%3F\"><h3>Do I need to install an app on the door phone?<\/h3><\/dt>\n<dd><p>No. The station is a web page. Open the link in the phone's browser, enter the\ndoor code, and allow the camera.<\/p><\/dd>\n<dt id=\"can%20two%20people%20scan%20at%20once%3F\"><h3>Can two people scan at once?<\/h3><\/dt>\n<dd><p>Yes. Every station checks the same database, so a ticket used at one door is\nalready used at the other.<\/p><\/dd>\n<dt id=\"the%20camera%20stays%20black%20on%20the%20door%20phone.\"><h3>The camera stays black on the door phone.<\/h3><\/dt>\n<dd><p>The page must be served over HTTPS \u2014 browsers refuse the camera otherwise. If\nthe site is already on HTTPS, a security plugin or your CDN is probably sending\na blanket camera policy; the scanner screen re-states its own, so clearing the\nCDN cache usually settles it.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20ticket%20artwork%3F\"><h3>Can I use my own ticket artwork?<\/h3><\/dt>\n<dd><p>Yes. The plugin will generate a design for you in the colour you choose if you\nwould rather not think about it, and the ticket studio on the <strong>Ticket designs<\/strong>\nscreen takes your own artwork instead: upload it, generate colour variations of\nit, and move every printed field where you want it on a visual field map.<\/p><\/dd>\n<dt id=\"can%20i%20clear%20the%20test%20bookings%20before%20going%20live%3F\"><h3>Can I clear the test bookings before going live?<\/h3><\/dt>\n<dd><p>Yes. <strong>Tools &amp; data -&gt; Archive and clear<\/strong> copies every booking, guest, ticket\nand scan into archive tables and then empties the live ones. Events, venues,\norganizers and designs are untouched. It asks for a one-time code sent to an\naddress you set, so it cannot be run by accident.<\/p><\/dd>\n<dt id=\"what%20languages%20does%20it%20come%20in%3F\"><h3>What languages does it come in?<\/h3><\/dt>\n<dd><p>Six, finished and in the download: English, French, Spanish, Portuguese, German\nand Arabic. Nothing to install and nothing to wait for.<\/p><\/dd>\n<dt id=\"how%20does%20it%20know%20which%20one%20to%20use%3F\"><h3>How does it know which one to use?<\/h3><\/dt>\n<dd><p>It reads the language WordPress is set to, and it reads it by language rather\nthan by locale \u2014 pt_BR, pt_PT and pt all get Portuguese; ar_DZ, ar_MA and ar_SA\nall get Arabic. A site in a seventh language falls back to French rather than\nshowing you half a translation. You can also say it outright under <strong>Settings \u2192\nLanguage<\/strong>, which is the answer when your site is in one language and your guests\nread another.<\/p><\/dd>\n<dt id=\"does%20it%20change%20the%20language%20of%20my%20site%3F\"><h3>Does it change the language of my site?<\/h3><\/dt>\n<dd><p>No. It moves this plugin and nothing else. WordPress, your theme and every other\nplugin keep the language they had.<\/p><\/dd>\n<dt id=\"is%20the%20ticket%20itself%20translated%2C%20or%20only%20the%20screens%3F\"><h3>Is the ticket itself translated, or only the screens?<\/h3><\/dt>\n<dd><p>The ticket itself. A ticket is a drawn image rather than a web page, so it is the\npiece that usually gets left behind \u2014 here the words on it, the date written out\nin full, and the line that says which table or seat all come out in the guest's\nlanguage.<\/p><\/dd>\n<dt id=\"does%20arabic%20work%20properly%2C%20including%20on%20the%20ticket%3F\"><h3>Does Arabic work properly, including on the ticket?<\/h3><\/dt>\n<dd><p>Yes, and that is a real question rather than a polite one. Arabic letters change\nshape depending on what is beside them, and the line reads right to left; the\nimage library that draws tickets does neither by itself, which is why Arabic on a\nticket usually comes out as a row of disconnected letters in the wrong order. The\nplugin joins the letters and orders the line before anything is drawn, and carries\nan Arabic typeface to draw them with. Numbers inside the sentence \u2014 a time, a\nprice, a table number, a ticket reference \u2014 still run the other way, as they\nshould. The screens, the booking form, the emails and the door station are laid\nout right to left too.<\/p><\/dd>\n<dt id=\"a%20guest%20booked%20in%20one%20language%20and%20i%20work%20in%20another.%20which%20one%20do%20they%20get%3F\"><h3>A guest booked in one language and I work in another. Which one do they get?<\/h3><\/dt>\n<dd><p>Theirs. The language a guest booked in is kept with their booking, so their\nticket and their emails go out in it \u2014 including a ticket re-sent months later\nfrom a screen you are reading in French.<\/p><\/dd>\n<dt id=\"are%20my%20own%20event%20titles%20translated%3F\"><h3>Are my own event titles translated?<\/h3><\/dt>\n<dd><p>No, and they should not be. Your event titles, venue names, payment instructions\nand success message are your words; the plugin translates its own and leaves\nyours alone. A venue selling to guests in two languages writes those lines in\nboth.<\/p><\/dd>\n<dt id=\"can%20i%20correct%20or%20add%20a%20translation%3F\"><h3>Can I correct or add a translation?<\/h3><\/dt>\n<dd><p>Yes. The catalogues are ordinary .po files in the plugin's <code>languages<\/code> folder,\nand the template is there beside them. Better still, put the correction on\nhttps:\/\/translate.wordpress.org\/projects\/wp-plugins\/bitforgenet-guest-tickets\/ \u2014\na language pack from there is loaded ahead of the plugin's own files, so your\nwording wins and everybody gets it.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20help%3F\"><h3>Where do I get help?<\/h3><\/dt>\n<dd><p>There is a <strong>Help<\/strong> screen in the plugin itself \u2014 the whole guide, one click from\nwherever you are stuck. The same text is at\nhttps:\/\/bitforgenet.dev\/plugins\/bitforgenet-guest-tickets\/help\/ \u2014 it walks\nthrough a first event, the room, the door and the night itself. Beyond that,\nthe support forum on this page, or contact@bitforgenet.dev<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.10.1<\/h4>\n\n<ul>\n<li>Removed <code>admin\/views\/event\/pricing.php<\/code>, a tombstone left from the retired\nPricing tab that nothing has called since 1.9.0.<\/li>\n<li>Refreshed the two brand images shipped with the plugin.<\/li>\n<li>Added a donate link to the directory listing. Nothing appears inside\nWordPress: no screen in this plugin ends in an offer, and that has not\nchanged.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li><strong>Six languages, in the download.<\/strong> English, French, Spanish, Portuguese,\nGerman and Arabic. Every screen, the booking form, the emails, the door\nstation and the words printed on the ticket.<\/li>\n<li><strong>The language is worked out from your site<\/strong>, by language rather than by\nlocale: pt_BR, pt_PT and pt all land on Portuguese, ar_DZ, ar_MA and ar_SA all\nland on Arabic. A site in a language the plugin does not have falls back to\nFrench rather than serving half a translation.<\/li>\n<li><strong>New setting: Settings \u2192 Language.<\/strong> Leave it on <em>Follow the site<\/em>, or name\nthe language outright \u2014 for a site in one language selling to guests who read\nanother. The screen says what your site is set to and what the plugin will\nspeak, so there is nothing to guess at.<\/li>\n<li><strong>The language travels with the booking.<\/strong> A guest who booked in Spanish is\nanswered in Spanish, including a ticket re-sent months later from an admin\nscreen in another language, or issued by cron in the middle of the night.<\/li>\n<li><strong>Dates are translated too<\/strong>, out of the plugin's own catalogue rather than\nWordPress's \u2014 so a French ticket does not print \"September\" under a French\nheading on an English site, and a site that has never installed French still\ngets French months.<\/li>\n<li><strong>Arabic is drawn properly on the ticket.<\/strong> The ticket is an image, and the\nlibrary that draws it neither joins Arabic letters nor puts the line in\nreading order. The plugin now does both before drawing, and carries an Arabic\ntypeface to draw with. A time, a price, a table number or a ticket reference\nstill runs the other way inside the sentence.<\/li>\n<li><strong>Right-to-left layout<\/strong> for the admin screens, the booking form, the emails\nand the door station \u2014 the plugin's own containers only, so the rest of your\nsite is untouched. A seating plan is not mirrored: table 1 stays where table 1\nactually is.<\/li>\n<li>The plugin's catalogues are loaded after any language pack from\ntranslate.wordpress.org, so a translator's work always wins over ours.<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li><strong>Renamed, and this time for the search rather than for the branding.<\/strong> The\ndirectory ranks the words of a title, so the title is now\n<strong>Events and Tickets with QR Check-in<\/strong> \u2014 the words somebody actually types.\nOn your own screens and in the admin menu it is <strong>Events &amp; Tickets<\/strong>, two\nwords that fit a sidebar. The brand leaves the title: the Author line already\nsays BitForge Network, and a name is not the place to sign your work twice.<\/li>\n<li>The slug, the text domain, the shortcodes, the option keys, the database\ntables and the update path are untouched, exactly as in 1.9.0. Nothing to\nreinstall, nothing to reconfigure.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Renamed on screen. The slug, the text domain, the shortcodes, the option\nkeys, the database tables and the update path were all untouched: a label,\nnot a new plugin. (1.9.1, the same day, renamed it again \u2014 see above.)<\/li>\n<li>New icon and new directory banners: a ticket and a QR code, which is what the\nplugin actually is. The QR in the artwork is a real one.<\/li>\n<li>The directory page shows the screens again \u2014 eight of them, from the\nassistant to the door station \u2014 and the description finally covers what was\nadded between 1.2.2 and 1.8.7: the assistant, the room builder, zones as\nintervals of an inventory, price categories, live availability in the booking\nform, arrivals on the plan, re-issuing a place, and team notifications.<\/li>\n<li>The FAQ was rewritten around the questions the last two months produced.<\/li>\n<li><strong>New: a Help screen inside the plugin.<\/strong> The whole guide \u2014 setup, the\nassistant, the room and its zones, payment, tickets, seating, the door, and\nwhat to do when something does not arrive \u2014 on the screen where somebody is\nactually stuck, linking to the screens each sentence talks about. It reads\nnothing and writes nothing, and it needs no capability beyond being able to\nopen the plugin: help only an administrator can read is help the person who\nneeded it could not reach.<\/li>\n<li>Nothing else changes: no database change, no stored setting touched, and no\nexisting screen behaves differently.<\/li>\n<\/ul>\n\n<h4>1.8.7<\/h4>\n\n<p><strong>The team notification field takes more than one address.<\/strong> A team is more than\none person. Separate them however you like \u2014 a comma, a semicolon, a space, one\nper line \u2014 and everybody on the list is copied on guest emails and alerted on\nevery new booking. Before, only the first address was ever used.<\/p>\n\n<p><strong>An empty reply-to now follows WordPress.<\/strong> Left blank it means \"whatever this\nsite uses\" rather than \"nobody\", so replies land in the site's own\nadministration inbox without anybody having to think about it. The from address\nbehaves the same way, and both boxes show you the address they would fall back\nto.<\/p>\n\n<p><strong>Fixed: typing an answer in the assistant left <em>Continue<\/em> greyed out.<\/strong> Every\nkeystroke repainted the panel, but only a full redraw ever drew the buttons \u2014 so\nafter typing the payment instructions the only way to move on was to step back\nand forward again. The answer and the button are drawn together now.<\/p>\n\n<p><strong>The floor plan says who is actually in the room.<\/strong> A seat that is sold and a\nseat whose guest has walked through the door are two different facts, and only\none of them changes all evening. A guest who has scanned their ticket turns\n<strong>green<\/strong>, carries a <strong>tick<\/strong>, and breathes gently; a table whose whole party\nhas arrived wears a green ring. There is an <strong>Already in<\/strong> filter, a key under\nthe plan explaining every colour, and the same story in the simple list for\nanyone who never opens the drawing. The movement stops for anyone whose system\nasks for less motion \u2014 the colour and the tick still say everything.<\/p>\n\n<p><strong>Moving a guest who already has a ticket is no longer an ordinary save.<\/strong> It\nis a reissue, and it does three things at once: the tickets they are holding are\n<strong>voided<\/strong> \u2014 the door refuses those QR codes from that moment \u2014 new tickets are\ndrawn with the new places, and a second email goes out. If they have already\nshown somebody the first one, that is the copy that stops working. So the screen\nnow says all of that in plain words, and the buttons stay dead until you type\n    edit place into the box beside them. Not a checkbox, which the hand ticks\nbefore the eye reads; not a browser dialog, which is dismissed by reflex. The\nsame sentence is checked again on the server, because a rule that only lives in\na browser is not a rule.<\/p>\n\n<h4>1.8.6<\/h4>\n\n<p><strong>The booking form now knows what is left while somebody is filling it in.<\/strong>\nThree things have to agree, and until now only the first was ever asked: the\nnumber the page was drawn with, <strong>the guest rows above this one<\/strong>, and whoever\nelse is booking at the same moment somewhere else. Choose VIP for five guests in\na room that has five, and the sixth row greys VIP out as you reach it \u2014 instead\nof letting you type eight names and refusing the lot at the end.<\/p>\n\n<p><strong>It asks again at the moments a decision is being made<\/strong>: a menu opening, a\nchoice changing, the quantity changing, the tab coming back to the front \u2014 and\non a slow tick in between, never while the tab is hidden. One function answers,\nfor the page and for the live refresh alike, so the two can never disagree. It\nis cached for five seconds and thrown away the instant a booking is written, so\nthe next person to open a menu sees the seat go.<\/p>\n\n<p><strong>The quantity stepper stops at what exists<\/strong>, and a line above the guest rows\nsays how many places are still for sale, counting down as they go.<\/p>\n\n<p><strong>A category that sells out under you is said out loud<\/strong>, on the row it affects,\nand the booking cannot be sent until you have picked another. Your choice is\nnever changed behind your back \u2014 first come, first served, and being told so.<\/p>\n\n<p><strong>Fixed \u2014 and this was the hole underneath all of it: a booking held no place in\nits category until somebody had been sat down.<\/strong> The seat count could only see\nguests who already had a place written against them, and where the organizer\nseats people by hand nobody has one until they do it \u2014 hours or days after the\nguest paid. A VIP zone of forty still reported forty places left after forty\npeople had bought it. Every booking now holds its places from the moment it is\nwritten, whether or not anybody has decided where those people are sitting.<\/p>\n\n<p><strong>None of this is the guarantee, and it does not pretend to be.<\/strong> The booking\nitself is still taken under a lock on the event, counted again, and refused with\na plain sentence if the last place went a second ago. The live form exists so\nthat you are told <em>before<\/em> you have typed eight names rather than after.<\/p>\n\n<h4>1.8.5<\/h4>\n\n<p><strong>Fixed: your event was not selling the price categories you gave the room.<\/strong>\nEvery event is handed a \"Standard admission\" ticket category the moment it is\ncreated, and the room only spoke up when nothing else had \u2014 so you could name\nthree price categories in the assistant, see all three on every screen in the\nadmin, and have the booking page sell one. <strong>The room now decides what an event\nsells whenever it describes it<\/strong>, because it is the thing that actually holds\nthe people. A room category you left at zero borrows the price of the ticket\ncategory of the same name, so nothing silently drops to the base price.<\/p>\n\n<p><strong>The ticket-categories list stops competing.<\/strong> With a room in place it folds\naway on <em>Prices &amp; places<\/em> under <strong>Offers that are not places<\/strong> \u2014 early bird,\nmember, child: a price about <em>when<\/em> or <em>who<\/em> rather than <em>where<\/em>. That is the\njob it is actually for.<\/p>\n\n<p><strong>Fixed: the WordPress footer printed across two tabs.<\/strong> One stray closing tag\nat the foot of two templates closed WordPress's own content wrapper early,\nwhich dropped \"Merci de faire de WordPress votre outil de cr\u00e9ation de contenu\"\ninto the middle of the Ticket and Payment tabs. The test bench now counts\nopening and closing tags in every template, because nobody reads a closing tag\nat the foot of a 120-line file and a machine counts them in a millisecond.<\/p>\n\n<p><strong>The floor plan builder can select more than one thing.<\/strong> Drag a rectangle over\nthe floor and it picks up every part it touches; shift-click adds one;\nCtrl+A takes the lot. Then move them together, line them\nup \u2014 left, centre, right, even gaps \u2014 duplicate them or remove them in one go.\nBefore this, the <em>only<\/em> rectangle gesture in the builder struck seats out: the\nobvious way to grab a row of tables quietly crossed out every chair inside it.\nA rectangle now means whatever the tool means, and striking seats out lives\nwith the strike-out tool where it belongs.<\/p>\n\n<p><strong>The stage is picked up like anything else.<\/strong> It needed its own tool before,\nwhich is not something anybody guesses.<\/p>\n\n<p><strong>More of the builder<\/strong>: arrow keys nudge a selection by 10 cm, or a metre with\nShift. Ctrl+D duplicates,\nDelete removes. The panel now opens on <strong>what you have selected<\/strong>\ninstead of on the template gallery, so clicking a table no longer scrolls its\nown settings out of sight. A part has a <strong>Level<\/strong> field, and the room has a\nname field in the builder.<\/p>\n\n<p><strong>The name of the room is asked at the top of the assistant<\/strong>, where you already\nknow it, instead of sitting in a box at the bottom of a tab.<\/p>\n\n<p><strong>Fixed:<\/strong> the Category column of a guest list showed a dash for every guest who\nbooked a part of the room, because it looked in one module's own table instead\nof asking the question properly.<\/p>\n\n<h4>1.8.4<\/h4>\n\n<p><strong>The assistant describes a room the way you would describe it out loud.<\/strong> You\nsay how many rows of tables and how many tables to a row \u2014 that lays the hall\nout once and numbers every table \u2014 and then each zone claims a stretch of it:\n<em>\"the VIP zone runs from table 1 to table 5.\"<\/em> A zone no longer invents places\nof its own, which is what makes the rest possible: the same table can never end\nup in two zones, and a table you left out of every zone is named on screen\nrather than quietly dropped off the sale.<\/p>\n\n<p><strong>A price category is no longer the same thing as a zone.<\/strong> A category has its\nown name and its own price, and several zones can share one \u2014 Premium is\nPremium whether it is the left balcony or the right. The booking page sells the\ncategories; the ticket prints the <strong>zone<\/strong>, because the zone is what somebody\nactually reads at the door.<\/p>\n\n<p><strong>The payment question is now the whole story.<\/strong> As well as how people pay and\nwhen the ticket goes out, the assistant asks what to tell a guest paying off the\nsite, how many places one booking may take, and whether you need a name for\nevery place or one name for the booking. All four are written into the event.<\/p>\n\n<p><strong>Prices &amp; places shows the room instead of asking for it again.<\/strong> The four\nbuttons \u2014 no places, one gauge, zones, a plan \u2014 and the <em>\"What one person is\ngiven\"<\/em> radio group are gone. Both asked what the assistant had just asked, and\nthe two screens could contradict each other: answer \"tables\" in the assistant,\ntick \"a chair\" here, and the plugin starts selling chairs at a table nobody\nbooked. The tab now <strong>draws the room that exists<\/strong>, says in a sentence what a\nticket will print, and gives you the two ways back \u2014 run the assistant again, or\nopen the builder on what it built.<\/p>\n\n<p><strong>The capacity is counted, not typed.<\/strong> With a room in place, the capacity box\nis replaced by the room's own total. Two boxes for one number always ends the\nsame way: one of them is believed at the door.<\/p>\n\n<p><strong>Fixed: a balcony forgot it was a balcony.<\/strong> A block's level and its control\nwere saved to the database and never read back, so both were lost the first time\nthe room was loaded again.<\/p>\n\n<p><strong>Fixed: a hall of tables came back sold chair by chair.<\/strong> The floor plan\nbuilder never sent the room's grain back when you saved, so a room built around\nwhole tables was rewritten as a room of single seats.<\/p>\n\n<h4>1.8.3<\/h4>\n\n<p><strong>Fixed: finishing the assistant broke the site.<\/strong> It wrote its entry to the\nactivity log with the wrong number of arguments, which PHP answers with a fatal\nerror \u2014 so the last click of the assistant produced a white screen. The test\nbench now reads every logging call in the plugin and checks it passes what the\nlog actually asks for.<\/p>\n\n<p><strong>The assistant walks you through it now.<\/strong> It showed every question at once and\nleft you to work out where the end was. It asks <strong>one question at a time<\/strong>, with\n<strong>Back<\/strong> and <strong>Continue<\/strong> at the bottom and a row of steps along the top showing\nwhere you are, what is behind you, and what is still to come. Continue stays\ngreyed out, with a reason, until the question in front of you has an answer \u2014 a\nbutton that disappears just leaves you looking for it.<\/p>\n\n<h4>1.8.2<\/h4>\n\n<p><strong>Fixed: finishing the assistant said \"Security check failed\".<\/strong> Its form was\nsigned with the name of a different action, which is the same as not signing it\nat all \u2014 so the one button that mattered died at the last step. Every form is now\nchecked against the action it posts, by the test bench, so this cannot come back\nquietly.<\/p>\n\n<h4>1.8.1<\/h4>\n\n<p><strong>The creation wizard stops asking what the assistant asks.<\/strong> It had a \"Tickets\"\nstep wanting a price and a capacity, and then the assistant wanted the same two\nnumbers again \u2014 with the zones and the room that give them meaning. One number\nasked on two screens is how two screens end up disagreeing about it. Creating an\nevent is now three steps, and the last button says what happens next: <em>Set up\nplaces and prices<\/em>.<\/p>\n\n<h4>1.8.0<\/h4>\n\n<p><strong>An assistant that sets up an event by asking about it.<\/strong> Prices, zones,\ncapacity and the moment a ticket goes out are one decision described on four\nscreens, and nobody arriving for the first time can know that. So the assistant\nhas the conversation instead \u2014 starting from a picture of the kind of room you\nare filling, not a word for it \u2014 and writes the answers into the tabs.<\/p>\n\n<ul>\n<li>It opens by itself after you create an event, and there is a button for it on\n<strong>Prices &amp; places<\/strong> whenever you want to run it again.<\/li>\n<li><strong>Every answer decides the next question, and the panel beside it shows the\nconsequence<\/strong>: the room being drawn, the prices a guest will see, and what the\nticket will actually print.<\/li>\n<li>It tells you what each answer settles and why \u2014 <em>\"the ticket carries the table,\nso the chair number is not asked: at a round table it tells nobody anything.\"<\/em><\/li>\n<li><strong>It owns nothing.<\/strong> It adds no setting of its own; everything it decides is\nstill there, field by field, on the tab that always owned it.<\/li>\n<li>It will not quietly rebuild a room for an event that already has bookings \u2014\na place is printed on a ticket the moment it is given out.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<p><strong>One tab for money, capacity and places.<\/strong> The price and the capacity lived on\none screen and the room on another, so you could set a capacity of 500 and then\ndescribe a room holding 380 \u2014 and nothing said so until somebody was turned away\nat the door. They are one decision, so they are now one tab: <strong>Prices &amp; places<\/strong>.\nA place there is whatever your event hands out: a seat, a table, a row, or a\nwhole area.<\/p>\n\n<ul>\n<li><strong>Pricing &amp; capacity is gone.<\/strong> The price, the currency and the capacity moved\nto Prices &amp; places, along with the price categories and the zones.<\/li>\n<li><strong>When &amp; where is now Information &amp; details<\/strong>, and holds what a guest is told\nbefore booking \u2014 including <em>this event serves food or drinks<\/em> and the sponsor\nstrip.<\/li>\n<li>Old links to the removed tab land on Prices &amp; places instead of dropping you\nback at the start.<\/li>\n<\/ul>\n\n<p><strong>Fixed: the back button brought a finished booking form back to life.<\/strong> After\nbooking, pressing Back showed the form still filled in, with the submit button\nstill greyed out and the countdown frozen \u2014 a page that looked broken. A booking\ncould never have been made twice (the server has refused that since 1.3.0), but\nthe page now reloads itself, with an empty form, a live clock and a working\nbutton.<\/p>\n\n<h4>1.6.1<\/h4>\n\n<p><strong>Fixed: named zones were all sold at the price of the event.<\/strong> Give three zones\nthree prices and the booking page offered three zones \u2014 at one price. Worse, the\nbooking was charged that price too, so a zone priced higher than the event was\nsold short and one priced lower was overcharged. The room hands the booking form\na zone carrying its own price; the form then asked a separate question \u2014 <em>what\ndoes this cost?<\/em> \u2014 that nothing was answering for a zone. It answers now.<\/p>\n\n<p><strong>Fixed: deleting a zone moved the bookings of the one below it.<\/strong> Zone\nreferences were rebuilt from their position on every save, so removing the first\nzone renamed the second into it, and a booking already sold pointed at a zone its\nguest never bought. Each zone now carries its own reference.<\/p>\n\n<p><strong>Fixed: a zone of 25 places sold 40.<\/strong> A capacity that did not divide evenly\ninto rows was rounded up to fill the last row, silently. The surplus places are\nnow held back, and a zone holds the number you typed.<\/p>\n\n<h4>1.6.0<\/h4>\n\n<p><strong>Four capabilities that used to be withheld are now in the plugin.<\/strong><\/p>\n\n<ul>\n<li><strong>The ticket studio.<\/strong> Bring in your own artwork, generate colour variations\nof it, and place every printed field yourself on a visual field map, on the\nDesigns screen.<\/li>\n<li><strong>The floor plan editor.<\/strong> Draw the room: the stage, curved rows, round\ntables, standing areas and aisles, with numbering that runs whichever way\nyour venue counts \u2014 and a guest who picks their own seat on the plan.<\/li>\n<li><strong>Price categories.<\/strong> VIP, table, early bird, member: several prices on one\nevent instead of one.<\/li>\n<li><strong>Discount codes.<\/strong> Fixed or percentage, limited by date or by number of\nuses.<\/li>\n<\/ul>\n\n<p>Nothing was removed and nothing changed shape: existing events, designs, rooms\nand settings are read exactly as before. If you never open these screens, the\nplugin behaves as it did.<\/p>\n\n<h4>1.2.1<\/h4>\n\n<p>Two security fixes, both reported responsibly by <strong>Alik<\/strong>, who tested 1.0.9 in\nan isolated environment and sent a clear, accurate write-up of each. Both were\nreal. Thank you.<\/p>\n\n<p><strong>Bookings for one event now happen one at a time.<\/strong> Counting the free seats\nand taking one were two separate steps, and between two steps another request\nfits: two people clicking at the same instant could both be told there was one\nseat left, and both take it. The capacity check was never wrong -- it was just\non the wrong side of a gap. That gap is now closed with a lock held for the\nlength of a booking, per event, so a busy night with four events does not queue\ninto one line. Every capacity rule is now inside it: the event's own capacity,\neach price category, and each area of the room. (CWE-362.)<\/p>\n\n<p><strong>Forwarding headers are no longer believed by default.<\/strong> The plugin recognises\na visitor by their address in order to count how often they book. It used to\nread CF-Connecting-IP, X-Real-IP or X-Forwarded-For if they were present --\nbut those are written by whoever is making the request, so anybody could invent\none and get a fresh allowance. Only the address the connection actually came\nfrom is used now. If your site really is behind Cloudflare or a reverse proxy,\nsay so under Settings \u2192 Anti-abuse, and the panel shows you what your server is\nactually sending so the choice is not a guess. Naming your proxies in\nwp-config.php as BFNET_TRUSTED_PROXIES narrows it further. Where a list of\nforwarded addresses is read, the plugin now takes the entry the nearest proxy\nwrote rather than the one at the front, which is the one a visitor can invent.\n(CWE-799.)<\/p>\n\n<p><strong>Also<\/strong>: a second booking limit counted per email address, so getting around\nthe per-connection one is no longer enough on its own.<\/p>\n\n<h4>1.2.0<\/h4>\n\n<p>Everything below arrived since 1.0.9. It was built and tested over several\ninternal builds; this is the first of them anyone is offered, because a version\nthat was superseded the same week is not a version worth installing.<\/p>\n\n<p><strong>Rooms and places.<\/strong> An event can now describe where people sit. Three levels,\nand nobody is made to climb them: a plain capacity, named zones with a capacity\nand a price each, or -- with Pro -- a drawn floor plan. Seats are worked out\nfrom a rule rather than stored, so a four thousand seat auditorium is twenty\nrows in your database and not four thousand. The numbering runs whichever way\nyour venue counts: left to right, right to left, odd and even out from the\ncentre, alternating by row. It can skip row I and O, skip 13, start anywhere,\nand carry a prefix.<\/p>\n\n<p><strong>Card payment with Stripe.<\/strong> Set your own secret key and a guest can pay on\nStripe's own page. No card number reaches your site. A payment is confirmed by\nreading it back from Stripe and by a signed message Stripe sends your site --\nnever by the browser that came back. Your places are held for the length of the\npayment session and released on their own if nobody finishes, so the same seat\ncannot be sold twice. Card payment is optional, per event: an evening paid at\nthe door works exactly as it did before.<\/p>\n\n<p><strong>When the ticket goes out, per event.<\/strong> Acknowledge the booking now and send\nthe ticket once you have decided where somebody sits, or -- when the event has\na room -- send it straight away with the place printed on it.<\/p>\n\n<p><strong>The booking page no longer depends on a page.<\/strong> If a direct link to an event\nhas nowhere to open, the plugin renders the booking form itself inside your\ntheme. It also creates the booking page for you, once, rather than leaving a\nlink that opens nothing.<\/p>\n\n<p><strong>Fixed<\/strong><\/p>\n\n<ul>\n<li>A booking link opened an empty page on sites that had never added the\nshortcode themselves.<\/li>\n<li>Guest rows two and after on the manual booking screen were greyed out instead\nof hidden, because the plugin's own stylesheet beat the browser's rule.<\/li>\n<li>The Reserve button was clipped by themes with their own line height.<\/li>\n<li>Sold-out categories were still offered for booking; a category is now closed\nby the room as well as by its own capacity, and the last place is re-counted\nat the moment the booking is written rather than only when the page was\ndrawn.<\/li>\n<li>Reverting a booking to awaiting payment cleared the check-ins but kept them\nin the history, named.<\/li>\n<\/ul>\n\n<p><strong>Also added<\/strong><\/p>\n\n<ul>\n<li>Add a guest by hand, for the bookings that arrive by phone.<\/li>\n<li>A live floor view of the evening -- what is taken, what has arrived, and what\nis full -- with the room drawn as the organizer drew it.<\/li>\n<li>The confirmation screen says which address the email went to, and to look in\nthe spam folder.<\/li>\n<li>Keyboard in the plan editor: undo, redo, delete, escape, shift to select\nseveral, and a number beside every slider.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>The logo printed on the ticket, on the door's code screen and beside an\norganizer with no artwork of its own is the anvil alone. It had been the full\nlockup, wordmark included, which the renderer fits inside its box: a wide\nimage with words in it shrank to a smudge nobody could read<\/li>\n<li>The plugin's page is rewritten. The feature list now says what this plugin\nactually does -- the organizer and venue libraries, the export column picker,\nthe system check and the archive were all shipped and none of them were\nmentioned, while three of them were wrongly described as belonging to Pro.\nThe Pro section says what Pro adds instead of hinting at it, and the FAQ\nanswers fifteen questions rather than five. No code changed for this<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Every template under admin\/views\/ and public\/views\/ states once, at the top of\nthe file, that the PrefixAllGlobals naming rule does not apply to it. A\ntemplate is included from a method, never at file scope, so its variables\nbelong to that method's scope rather than the global one, and PHPCS -- reading\neach file on its own -- has no way to see where the include happens. No\nvariable was renamed and nothing behaves differently<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>The plugin is renamed. It was submitted as \"2KEvents\", and \"2K\" is a\nregistered trademark of Take-Two Interactive that we have no right to lead a\nname with. The display name, the slug, the text domain, the shortcodes and\nevery PHP prefix now read BitForgeNet \u2014 the name of the site that publishes\nit, bitforgenet.dev<\/li>\n<li>Every stylesheet and script the plugin prints goes out through the enqueue\nAPI. The door station and the two screens around it are their own HTML\ndocuments, served on their own endpoint before the theme runs, so they had\ncarried their CSS and JS inside the page. They now register handles and print\nthem by name, the two runtime values arriving through wp_add_inline_style()\nand wp_add_inline_script()<\/li>\n<li>The admin menu icon is assembled from the mark at runtime and has no file\nbehind it, so it registers a style handle with no source rather than printing\na style tag into the head, and moves to admin_enqueue_scripts<\/li>\n<li>The code prefix is five characters. It was three, which is under the four the\ndirectory asks for<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Finished the tidy-up the last two releases started: every code-quality\nsuppression in the plugin is now either stated once for a whole file or\nwritten on the single line it covers, and none of them can change the\nmeaning of another one elsewhere in the same file. No behaviour changes<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fixed suppression comments that did not cover what they appeared to cover.\nOne kind switched every code-quality rule back on rather than the one it had\nswitched off, quietly undoing notes written elsewhere in the same file; the\nother sat above a nine-line statement instead of around it. No behaviour\nchanges for anyone using the plugin<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Request input is now read the way it should be read: eight admin screens\napplied the integer cast to the whole expression rather than to the  &hellip;<\/li>\n<\/ul>","raw_excerpt":"Name every guest, send each a QR ticket as a PDF, scan them in at the door. Six languages, Arabic included. Unlimited events. No fees.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361265"}],"author":[{"embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bitforgenet"}],"wp:attachment":[{"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361265"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361265"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361265"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361265"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361265"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/is.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}