v3.4.0 Release Notes

Modified on Thu, 1 Oct at 6:45 PM

Release notes: Core platform v3.4.0

21 September 2026 (6a12a4a)

This release moves the core platform from the 3.3 line to version 3.4.0 and includes every change made since version 3.3.3. It introduces Apple Pay and Google Pay at online checkout, a self-service email that lets customers change or cancel bookings without fees when a site is closed or disrupted, deletion of a customer's personal data on request, and a partner voucher checkout, along with a first set of accessibility improvements to the online booking journey. It also changes how donations, VAT and Gift Aid are calculated when discounts apply, corrects how promotions apply to add-ons and across markets, and makes order updates sent through the order import API more reliable. Several new options are configurable or available on request. Some changes alter existing behaviour: PDF tickets for annual passes now follow the product's Send PDF setting, wallet download is now set for each product, add-on promotions discount only the add-ons linked to them, and donation and Gift Aid figures on discounted bookings may be lower than before where they were previously overstated. Deployment includes database updates, among them corrections to existing promotion settings, and some large data updates continue in the background after the upgrade.

New features and feature updates

Feature update: Pass holder details for each member of a bundle pass

Jira: EXN-44

Need

Family and other bundle passes produce one pass per member, but pass holder details could only be entered once per bundle, so orders could not be completed with a named holder for each pass.

Change

B2C Booking Portal: Each member of a bundle pass now has their own pass holder entry in My Bookings, shown individually as complete or incomplete, and details can be saved for some members and completed later. Wallet passes and ticket downloads stay unavailable, and ticket PDFs are not attached to confirmation emails, until every member's details are captured. Each wallet pass is linked to its named pass holder. Required fields set on the product, including email and custom fields, now appear in the pass holder form.

Testing

1. Buy a family pass and skip the pass holder details. Confirm the order completes.

2. Open the confirmation email and confirm it asks you to add pass holder details and contains no wallet links or ticket PDF.

3. Open the order in My Bookings and confirm there is a separate pass holder entry for each family member, each marked as incomplete.

4. Complete every member's details, including any required email or custom fields, and confirm wallet download becomes available and the full confirmation email is sent.

Feature update: Voucher images when choosing vouchers

Jira: EXN-48

Need

Images set on voucher products were not shown when customers or staff chose vouchers, making vouchers harder to tell apart.

Change

B2C Booking Portal: Voucher cards on the voucher page, and voucher options offered during booking, show the product image where one is set.

Reservations Portal: The same voucher images appear when staff choose vouchers.

Testing

1. Suggested: In the Admin Portal, make sure at least one voucher product has an image set.

2. Suggested: On the booking website, open the voucher page and confirm the image appears on that voucher, with its title, price and add button still visible and working.

3. Suggested: In the Reservations Portal, open the voucher page and confirm the same image appears.

4. Suggested: Confirm vouchers without an image still display correctly.

New feature: Create an account at checkout without verifying email first

Jira: EXN-56

Need

Customers who had to create an account during checkout were sent a temporary password by email and had to enter it and set a new password before they could continue their order. This extra step can put customers off completing their booking.

Change

B2C Booking Portal: Where switched on, customers can create an account at checkout without the verification step. They enter their name, email and a confirm-email field, and continue to payment with their details already filled in. They then receive an email with a one-time password to finish setting up their account, plus a reset password option if that code has expired. When they sign in, recent guest orders made with the same email address are linked to their account and shown in My Bookings. Baskets containing memberships or patronages still use the standard sign-up with verification. Available on request.

Testing

1. With the setting switched on, start a booking on the B2C Booking Portal as a new customer and continue from the basket to the account step.

2. Enter first name, last name, email and confirm email. Check that a mismatched or invalid confirm email stops you continuing.

3. Check that you are not asked for a verification code and that your details are filled in on the next step, including after going back and forward.

4. Complete the order.

5. Open the account email and select the complete account setup link. Check the sign-in window opens with your email filled in, enter the one-time password, set a new password and sign in.

6. Use the reset password link in the same email and check the reset form opens with your email filled in and the reset works.

7. After signing in, open My Bookings and check the order you just placed is shown.

8. Check that a basket containing a membership or patronage still asks for verification.

Feature update: Wallet passes update when a booking moves to a new date

Jira: EXN-75

Need

Customers who had added a ticket to Apple Wallet or Google Wallet and then moved their booking to a different date were left with a pass showing the original date.

Change

B2C Booking Portal: When a booking is amended to a new date or time slot for the same product and ticket type, from the booking portal or the Reservations Portal, existing wallet passes are now updated with the new visit date and a recalculated expiry date that keeps the original validity length. Apple Wallet passes update automatically; Google Wallet passes show the new details once the customer opens the pass and returns from it. If the amendment changes the product or ticket type, the original pass is voided, and passes that were already voided are not affected.

Testing

1. Book a future-dated ticket in the booking portal and add it to Apple Wallet on an iPhone.

2. Amend the booking to a different date, keeping the same product and ticket type.

3. Check the pass in Apple Wallet: after a short delay it shows the new date without the customer re-opening the pass link.

4. Repeat with Google Wallet on an Android phone; open the pass, go back, and confirm it shows the new date.

5. Repeat steps 1 to 4 with the amendment made from the Reservations Portal.

6. For a ticket with a validity period, confirm both the start date and the end date move and the length of the validity period is unchanged.

7. Cancel an order so its pass is voided, then amend the booking, and confirm the pass stays voided.

8. Confirm the amendment itself completes normally.

New feature: Partner voucher checkout

Jira: EXPIAN-337, EXN-62, EXN-133

Need

Some venues accept vouchers issued by a partner scheme as payment for tickets. Those vouchers need to be checked and redeemed with the partner during checkout, and venues need to control which products can be bought with them.

Change

B2C Booking Portal: A partner voucher checkout is available on request. Customers entering through the dedicated voucher booking link see only the products set as eligible for the scheme and enter their voucher before payment. The voucher is checked and redeemed with the partner, after the customer confirms that it will now be redeemed, and appears as a separate line in the basket and order. A voucher can pay for part or all of the order; if it covers the full value, the card payment step is skipped and the final button reads Confirm. A voucher worth up to 50p more than the order is accepted, with a message that the difference is not refundable; larger differences are rejected. A voucher cannot be used in two checkouts at the same time, and it is released if payment fails. Promo codes are not available on the voucher booking link, Gift Aid can still be offered, and partner vouchers cannot be used with some payment methods that complete in a separate step, such as PayPal. The voucher discount is shown in order details, the confirmation email and the PDF ticket.

Reservations Portal: Staff can take partner voucher payments with the same totals, discount, confirmation step and product filtering.

Admin Portal: The product's Integrations tab has a Yes/No setting to make the product available through the partner voucher checkout. Only products set to Yes are shown there; the product's other channel and search settings still apply. Changes can take up to five minutes to appear.

Testing

1. In the Admin Portal, open a product and go to the Integrations tab.

2. Set the partner loyalty scheme option to Yes and save. Reopen the product and check the setting is kept.

3. Using the voucher booking link, add a product to the basket, apply a voucher worth less than the basket and continue. A confirmation message explains the voucher is about to be redeemed; cancelling it does not redeem the voucher.

4. Pay the remainder by card. The order completes, and the voucher discount is shown in the confirmation email and PDF ticket.

5. Repeat the same purchase in the Reservations Portal. Totals, discount and confirmation behaviour are the same.

6. Apply a voucher to a checkout, then try to apply the same voucher in a second browser tab. An error is shown. Remove the voucher from the first tab and it can then be applied in the second.

7. Suggested: Apply a voucher equal to the basket total. The amount to pay becomes zero, the card step is skipped and the final button reads Confirm.

8. Suggested: Using the voucher booking link, check only eligible products are shown and no promo code field is available.

Feature update: Configurable order of address fields at checkout

Jira: EXN-87

Need

Some venues need customers who accept Gift Aid to enter their home address first and then confirm whether their billing address is the same, matching the flow of the checkout page.

Change

B2C Booking Portal: The order of the home address, address confirmation and billing address sections at checkout can now be configured, and the "billing address is the same" option can be ticked by default. While it is ticked, the separate billing address fields are hidden; unticking it shows them. Home address fields still appear only when Gift Aid is accepted. This is available on request; existing checkouts are unchanged.

Testing

1. On a booking portal with this option switched on, add a product with Gift Aid and go to checkout.

2. Accept Gift Aid: the home address fields appear first, followed by the "billing address is the same" checkbox, which is ticked.

3. Untick the checkbox: separate billing address fields appear and can be edited and searched.

4. Repeat without accepting Gift Aid: no home address fields are shown.

5. Decline Gift Aid, then accept it on a second attempt: the home address fields and ticked checkbox appear as in step 2.

Feature update: Accessibility improvements across the online booking flow

Jira: EXPIAN-48

Need

Customers using a keyboard, a screen reader or screen magnification need to be able to find, book and pay for tickets online without barriers.

Change

B2C Booking Portal: This is the first set of accessibility changes to the online booking and checkout journey, working towards the WCAG 2.1 AA standard. Colour contrast and focus outlines have been improved, a skip link takes keyboard users to the main content, and open selectors can be closed with the Escape key. Screen readers now announce basket changes, basket expiry warnings, loading states and errors, and pages have clearer titles, headings and labels. Pages now reflow on small screens and at higher zoom levels without sideways scrolling.

Testing

1. Open the online booking journey and press Tab: every control should show a visible focus outline, and the skip link should move you to the main content.

2. Open a date or ticket selector and press Escape: the selector should close and focus should return to the control that opened it.

3. With a screen reader switched on, add and remove tickets from the basket: each change should be announced.

4. Set the browser zoom to 200%, or use a narrow mobile screen, and move through booking and checkout: text should wrap and no page should need sideways scrolling.

5. Change the site language: page titles and headings should update to match.

New feature: Apple Pay and Google Pay at online checkout

Jira: EXN-90

Need

Customers want to pay quickly with Apple Pay or Google Pay when buying online, and staff need these payments shown clearly in the order history and when allocating refunds.

Change

B2C Booking Portal: Apple Pay and Google Pay can be offered as payment methods at checkout, on request, with a configurable order of payment methods. Apple Pay appears on supported Apple devices in Safari; Google Pay appears on compatible browsers and devices.

Reservations Portal: Transaction history and the refund allocation screen show Apple Pay, Google Pay and Klarna payments by name, with card details where available.

Testing

1. On a booking portal with Apple Pay switched on, open checkout in Safari on a supported Apple device and complete a payment with Apple Pay.

2. Open the order in the Reservations Portal and check the transaction history shows Apple Pay with the card type and last four digits.

3. Repeat with Google Pay on a compatible browser or Android device.

4. Start a refund on each order and check the refund allocation screen shows the payment as Apple Pay or Google Pay.

5. Suggested: Complete a standard card payment and a Klarna payment and confirm both still work and are labelled correctly.

Feature update: VAT as a separate line in the basket summary

Jira: EXN-91

Need

The basket summary did not show VAT, although the confirmation email breaks it out, so customers saw different information before and after paying.

Change

B2C Booking Portal: The basket summary can now show VAT as a separate line below the subtotal, matching the VAT shown in the confirmation email. This is a configurable option, and the label is translated into English, German, French, Dutch, Polish and Swedish.

Testing

1. On a booking portal with the VAT breakdown switched on, add a product that includes VAT and open the basket summary.

2. Check a "VAT" line appears with the VAT amount.

3. Complete the booking and check the VAT amount matches the confirmation email.

4. Repeat in the Reservations Portal summary.

5. Add several items with different VAT amounts and check the VAT figure is correct.

New feature: Choice of card layout when printing membership cards

Jira: EXN-49

Need

Venues that print membership cards could only print in a single layout, so names could not be printed onto other pre-printed card designs.

Change

Reservations Portal: When printing membership cards from the Reservations Portal, staff can now choose a card layout, such as a layout that prints the member's full name. The layouts offered are configured for each venue and are available on request. If no layouts are configured, printing cannot be started and a warning is shown.

Testing

1. Suggested: In the Reservations Portal, open the card printing screen from an order item or from Search Entitlements.

2. Suggested: Confirm a Card Layout choice appears showing the layouts configured for your venue.

3. Suggested: Select a layout, select at least one membership and start printing. Confirm the printed card uses the chosen layout.

New feature: Refunds restricted to staff with refund permission

Jira: EXN-100

Need

Some venues need general staff to be able to take payments but not issue refunds, so that refunds are authorised and processed by a supervisor for audit purposes. Previously anyone who could take a payment could also refund.

Change

Reservations Portal: When a staff member without refund permission amends or cancels an order and a refund is due, the action button reads "Don't have permission to refund, return to order". Selecting it discards the changes and returns to the order so a supervisor can complete it. The refund page shows the same message with a link back to the order.

POS: Staff without refund permission cannot cancel and refund an order; the cancel option is not shown.

Admin Portal: The new role can be assigned to users for the Reservations Portal and POS, on request.

Testing

1. Sign in to the Reservations Portal as an administrator and cancel an order that is due a refund: the cancellation and refund complete.

2. Sign in as a user with the staff role that cannot refund and start the same cancellation: the message "You don't have permission to refund" and a return to order button are shown, and no refund is made.

3. Sign in to POS as an administrator and cancel and refund an order: this completes.

4. Sign in to POS with the staff role: the cancel button is not shown.

Feature update: Reasons and order notes for pass actions

Jira: EXN-124

Need

When staff amended a pass's validity date, suspended or reinstated it, or voided its wallet pass, there was no visible record on the order of what had changed, when or by whom, so staff could not answer customer questions without asking support.

Change

Reservations Portal: Amend validity date, Suspend, Reinstate and Void wallet now each open a window where staff can enter an optional reason. On saving, the ticket is updated and a note is added to the order showing the action, the date and time, the user and the reason if given. Cancelling the window makes no change. Changes made on POS are not yet recorded as notes.

Testing

1. In the Reservations Portal, open an order containing a pass and open the ticket details.

2. Choose Amend validity date, pick a new date, enter a reason and save. The expiry date updates and a note is added to the order with the new date and reason.

3. Repeat without a reason. The change saves and the note is added without a reason.

4. Repeat for Suspend, Reinstate and Void wallet, with and without a reason, and check the ticket state changes and a note is added each time.

5. Open one of the windows and cancel it. Nothing changes and no note is added.

New feature: Delete a customer's personal data on request

Jira: EXN-38

Need

When a customer asked for their personal data to be erased, there was no way to do this from the Reservations Portal; it required a manual process carried out by Expian.

Change

Reservations Portal: Users with the new delete customer permission (included in the Admin role) can now delete a customer's personal data from the Security tab of the customer account, after confirming in a pop-up. This permanently deletes the customer's login account and redacts their name, email, phone number and address from their orders, including other customers on those bookings and guest orders placed with the same email address. Payment records are kept for financial purposes but no longer show card or personal details. Deletion is blocked, with an explanatory message, while the customer has a future booking, an active pass or membership, a valid ticket or an order awaiting a refund. Copies held in previously sent confirmation emails, customer photos and wallet passes are not yet removed by this action.

Testing

1. Sign in to the Reservations Portal as an Admin user and open Customer Accounts.

2. Choose a test customer with only past orders, open the Security tab and select Delete personal data. Confirm in the pop-up.

3. Confirm a "Personal data deleted" message appears and you return to the customer accounts list.

4. Confirm the customer can no longer sign in, and that their past orders still show the same prices and status but with name, email, phone and address redacted.

5. Search orders by the customer's old email or name and confirm nothing is returned.

6. Try the same on a customer with a future booking, an active pass, a valid ticket or an order awaiting refund, and confirm deletion is blocked with an error message and nothing changes.

7. Sign in as a user without the permission (for example a Support role) and confirm the delete section is not shown.

New feature: Self-service email to amend or cancel without fees

Jira: EXN-153

Need

When a site is closed or disrupted, staff need a way to email affected customers and let them choose another date or time, or cancel, without the usual amendment or cancellation fees.

Change

Reservations Portal: New Send self-service email option under Manage bookings in the bookings search, sent by email, with options to waive the amendment fee and to allow cancellation without a fee.

B2C Booking Portal: Customers following the Manage order link can change the date or time without an amendment fee, or cancel without a cancellation fee where allowed. Price differences are refunded or charged as normal. The email heading reads 'Action needed: update your order before start date' and includes a Manage order link.

API and Integrations: When removing an item from a cart, the field used to waive the cancellation fee has been renamed. API users should check their integration.

Testing

1. Set up an amendment fee and a cancellation fee with non-zero values and a product that uses them, then place a test order.

2. In the Reservations Portal, open the bookings search, select the order, choose Manage bookings, then Send self-service email. Only email is offered.

3. Choose to waive the amendment fee and allow cancellation, and send. The email heading reads 'Action needed: update your order before start date' and includes a Manage order link.

4. Follow the link and change only the time. No amendment fee is charged; a price difference is refunded or charged as normal.

5. Follow a link sent with cancellation allowed and cancel the order. No cancellation fee is charged.

6. Follow a link sent with cancellation not allowed. Cancellation is not offered.

7. Amend or cancel an order without using a self-service link. Standard fees still apply.

Feature update: Choose which products can be added to a mobile wallet

Jira: EXN-63

Need

Customers were offered the option to add their order to a mobile wallet even when the order contained items that cannot be held in a wallet, such as vouchers and add-ons, which caused confusion.

Change

Admin Portal: Under the product's Important Info, a new Download to Wallet on/off setting sits next to Send PDF for venues with wallets enabled. At least one of the two must stay on: if one is off, the other cannot be switched off. New products default to Download to Wallet off.

B2C Booking Portal: The add to wallet option appears on the confirmation page and in Manage Order only for products with Download to Wallet on. Confirmation page wording now matches the delivery method: wallet and email, email only, or wallet only.

Testing

1. In the Admin Portal, open a product's Important Info and check the Download to Wallet setting appears next to Send PDF.

2. Try to switch both Send PDF and Download to Wallet off and check this is not allowed.

3. With Download to Wallet on and Send PDF off, book the product on the B2C Booking Portal and check the wallet option is shown and no PDF is downloadable.

4. With both on, book again and check both the PDF and the wallet option are available.

5. With Send PDF on and Download to Wallet off, book again and check no wallet option is shown.

6. Check the confirmation page wording matches each combination.

7. Book a voucher or add-on only and check no wallet option is shown.

Feature update: Donations by market, as a percentage and by sales channel

Jira: EXN-123

Need

Donation amounts could not be varied by sales channel in pricing rules, could not be set as a percentage of the ticket price, and a donation included in the ticket price could not be priced by channel. This made it hard to use pricing rules on products that carry a donation.

Change

Admin Portal: Product donations are configured by ticket type and market, as a fixed amount or a percentage, on top of or included in the ticket price, and can be added to an existing product. Pricing rules can set donation values per sales channel.

B2C Booking Portal: Orders use the donation for the booking channel, including percentage donations and channel overrides from pricing rules.

Reservations Portal: Orders use the donation for the Reservations channel in the same way.

Trade Portal: Orders use the donation for the Trade channel in the same way.

API and Integrations: Orders placed through the API use the donation for the channel requested.

Testing

1. In the Admin Portal, open a product with donations and add a donation as a percentage, on top of the ticket price, for a market. Save and reopen the product to check it has been kept.

2. Repeat with a donation included in the ticket price, and with a donation of 100%.

3. In Pricing Rules, set a different donation percentage for two sales channels and leave a third channel without an override.

4. Place an order through each channel. Each order shows the donation for its own channel, and the channel without an override uses the product's standard donation.

Feature update: Notes in order imports

Jira: EXN-250

Need

When orders were migrated from another system, item notes could not be imported in the same step, so they were lost or had to be added separately.

Change

API and Integrations: The order import can now include notes on each item. Imported notes are saved in the same way as notes added in the Reservations Portal, with their history, and appear in the order notes. Notes are not yet supported when updating a previously imported order.

Testing

1. Suggested: Import an order with a note on one of its items.

2. Suggested: Open the order in the Reservations Portal. The note appears in the order notes for that item.

Feature update: Existing voucher codes in order imports

Jira: EXN-251

Need

When migrating from another system, vouchers already issued to customers could not be imported with their existing codes, so those codes could not be used in Expian.

Change

API and Integrations: The order import can now keep the voucher code supplied by the previous system instead of creating a new one, and can set the voucher's validity dates. Imported vouchers are linked to the voucher product and can be redeemed in the booking flow. Codes that are blank, repeated, already in use or supplied for a product that is not a voucher are rejected.

Testing

1. Suggested: Import an order containing a voucher with its existing code.

2. Suggested: Open the order in the Reservations Portal. The voucher shows the imported code and the correct expiry date.

3. Suggested: Apply the imported code to a new booking. The voucher is accepted.

Feature update: Custom pass end dates in order imports

Jira: EXN-302

Need

When orders are migrated from a previous system, imported passes had their expiry calculated from the product's validity settings, so custom expiry dates held in the previous system were not carried over.

Change

API and Integrations: The order import now accepts an optional end date and end time for each booking. Where provided, it sets the initial expiry of the imported pass. Where it is not provided, expiry is calculated from the product settings as before. Any later amendment follows the normal product rules.

Testing

1. Suggested: Import an order that includes an end date for a pass. Open the order in Reservations. The pass expiry matches the end date in the import file, not the product's default validity.

2. Suggested: Import an order without an end date. The pass expiry follows the product's validity settings as before.

B2C Booking Portal

Booking and checkout

Choosing a different option for a linked product now replaces it in the basket

Jira: EXPIAN-330

Issue

When customers reached the online booking portal through a direct link to a single product, choosing a different date or option added a second item to the basket instead of replacing the first.

Fix

Choosing a new option for a product opened from a direct product link now replaces the existing basket item, so the basket holds only the latest selection. Other items in the basket are not affected.

Testing

1. Suggested: Open the online booking portal using a direct link to a product. Choose a date and option and add it to the basket.

2. Suggested: Choose a different date or option for the same product. The basket now holds only the new selection.

Address tick boxes now appear under the home address at checkout

Jira: EXPIAN-354

Issue

When a customer opted in to Gift Aid, the tick boxes to use the home address as the billing address and to confirm the home address appeared below the billing address section, away from the address they relate to.

Fix

Both tick boxes now appear directly under the home address, above the billing address. Ticking that the billing address is the same still hides the billing address section. The same layout applies in Reservations.

Testing

1. Suggested: Add a product to the basket, opt in to Gift Aid and continue to the customer details step. The two tick boxes appear directly under the home address, followed by the billing address.

2. Suggested: Tick that the billing address is the same as the home address. The billing address section is hidden.

3. Suggested: Repeat for a booking made in Reservations.

Applying a promotion code no longer reverses the route of a return booking

Jira: CORE-8977

Issue

On some return bookings, applying a promotion code in the basket reversed the direction of the outbound journey, and the customer then received an error at checkout and could not complete the booking.

Fix

Applying a promotion code now updates only the price and promotion details. The selected route and direction stay as chosen and the booking can be completed.

Testing

1. In the B2C Booking Portal, start a return booking without changing the default options.

2. Apply a valid promotion code in the basket.

3. Check that the outbound route and direction are unchanged and the price reflects the promotion.

4. Continue to checkout and complete the booking without an error.

5. Repeat, applying the code on the contact details step instead.

Terms and conditions have their own heading at checkout

Jira: EXN-46

Issue

At checkout, the terms and conditions tick box sat under the Marketing preferences heading, so customers might not realise they were agreeing to the terms and conditions.

Fix

The terms and conditions tick box now sits under its own "Terms and conditions" heading, in the same style as the Marketing preferences heading. Headings and messages on the marketing preferences page in the customer account are now translated into the supported languages.

Testing

1. On the booking website, go through checkout to the contact details step.

2. Scroll to the bottom and confirm the terms and conditions tick box appears under its own "Terms and conditions" heading.

Basket timer now starts at checkout and stays visible until the order is placed

Jira: EXPIAN-395

Issue

Where the basket timer is switched on, it started as soon as an item was added and reset with every basket change, disappeared on some checkout pages, and an expired basket could still be paid for, which led to errors on the confirmation page. The timer also read 'Tickets held for', although baskets can contain other items.

Fix

The timer now reads 'Basket items held for' and starts the first time the customer presses Checkout. It keeps counting to the same deadline through the checkout steps, when going back to change the basket and after a page refresh, and disappears once the order is placed. If it runs out, a 'Time is up' message is shown and payment for the expired basket is not accepted.

Testing

1. Start a booking and add products or extras to the basket. No timer is shown.

2. Press Checkout. The timer appears in the order summary, reading 'Basket items held for' with the time remaining.

3. Move through the checkout steps, go back to the booking page, add to the basket and refresh the page. The timer carries on without resetting.

4. Wait on the payment step until the timer runs out. A 'Time is up' message is shown and you cannot pay for the expired basket.

Booking calendar shows availability straight away when a link contains a past date

Jira: CORE-9034 | FD: 5539

Issue

When customers opened the booking page from a link that included a date already in the past, the calendar showed the current month with every date greyed out. Dates only appeared after moving to the next month and back.

Fix

Past dates in booking links are now ignored. The When field starts empty, and the calendar opens on the current month with available dates selectable straight away. Links with a future date still open on that date. Amending a booking in the Reservations Portal is unchanged.

Testing

1. Open the B2C Booking Portal using a booking link that includes a date in a previous month.

2. Check the When field is empty rather than showing the past date.

3. Open the date picker: it should open on the current month with available dates selectable immediately.

4. Repeat with a link containing a future date: that date should be pre-selected and the calendar should open on that month with availability shown.

5. Open the booking page with no date in the link: the calendar should behave as before.

Booking messages now show for the selected date on admission products

Jira: EXN-106, EXPIAN-415

Issue

Information and warning messages set up for the booking journey (for example disruption notices) did not show when a customer chose a date for an admission product, because they only appeared once a time slot was chosen. Messages not linked to a specific product could also fail to appear, and the message panel did not display well on mobile.

Fix

Booking messages now appear as soon as a date is selected for admission products. Messages scoped to a location now show even when no trigger product is set. Messages whose date range has ended no longer appear, and a single show more / show less control expands and collapses the list. The message panel has also been updated to display correctly on mobile screens.

Testing

1. Suggested: In the Admin Portal, set up a warning message and an information message for an admission product, each covering a different date range.

2. Suggested: In the online booking journey, select that product and choose a date inside the warning message's date range: the warning should appear straight away, before any time is chosen.

3. Suggested: Choose a date outside the warning's range but inside the information message's range: only the information message should appear.

4. Suggested: Repeat on a mobile phone and check the messages are readable and the show more / show less control works.

Extras with no charge no longer show a zero price

Jira: EXN-116

Issue

In the extras step, prices and buttons were misaligned, and extras with no charge showed a price of £0.00.

Fix

Extras with a price show the price on the left and the Select button on the right. Extras with no charge show only the Select button.

Testing

1. Start a new booking in the booking portal and go to the extras step.

2. Check an extra with a price shows the price on the left and the Select button on the right.

3. Check an extra with no charge shows only the Select button, with no £0.00 price.

Date field labelled correctly on mobile

Jira: EXN-114

Issue

On mobile, the date field in the booking selector was labelled "Outbound" instead of "When".

Fix

The date field on mobile is now labelled "When", matching the desktop view.

Testing

1. On an Android phone, open the booking portal and select a product and the number of people.

2. Check the date field is labelled "When".

3. Repeat on an iPhone.

Each booking page and checkout step now opens at the top

Jira: EXN-117

Issue

On mobile, moving to the next page of the booking flow (for example from passholder details to billing and payment) opened the new page at the same scroll position as the previous one, so customers had to scroll back up to find the start of the form.

Fix

The booking flow now returns to the top of the page whenever the customer moves to a new page or checkout step, so each form opens at its beginning.

Testing

1. On a mobile device, add a product that needs further details (for example a family pass) to the basket.

2. Complete the details, scroll to the bottom of the page and select Continue.

3. Check that the next page opens at the top, showing the start of the form. Repeat for each checkout step.

Donations stay included when amending an order

Jira: EXN-135

Issue

On sites where donations are always included and the Include donations? option is hidden for new bookings, the option appeared when amending an order and defaulted to off. Donations could be dropped from the amendment and the Gift Aid prompt did not appear for customers who had previously declined it.

Fix

The Include donations? option now follows the same rules for new bookings, amendments and items added during an amendment. Where donations are set to be always included, the option stays hidden and donations remain on throughout the amendment, and the Gift Aid prompt appears as expected.

Testing

1. On a site where donations are always included, make a new booking for a product with a donation. The Include donations? option is not shown, the donation is included and the Gift Aid prompt appears.

2. Amend the booking. The option does not appear and the donation remains included in the total.

3. During the amendment, add a new item with a donation. The donation is included for it and the option stays hidden.

4. Amend a booking for a customer who previously declined Gift Aid. The Gift Aid prompt now appears.

Accessibility improvements on the booking site

Jira: EXN-132

Issue

Some controls on the booking site were hard to use with a screen reader or keyboard: the Who and When selectors and booking options had no readable label, account contact fields were not linked to their labels, the QR code window had no label, and focus outlines were not always visible on the product and ticket selectors.

Fix

Booking selectors and options now give screen readers a label that includes their current value, account contact fields are correctly linked to their labels, and the QR code window in My Bookings now has a readable label. Focus outlines stay visible on the product and ticket selectors when titles run over more than one line, and some buttons and fields now lay out better on small screens and at higher zoom levels.

Testing

1. Using a screen reader, open the booking page and move to the Who and When selectors. Each is announced with its name and current value.

2. Open My Account > contact details and move to the Title and Gender fields. The screen reader announces each field's label.

3. Open My Bookings, open a QR code and check the window is announced with a label.

4. Suggested: Move through the product and ticket selectors with the keyboard and check a focus outline is visible on each.

Basket extras now limited to standalone extras and those linked to the basket

Jira: EXN-139

Issue

Where extras were filtered by location, the extras offered in the basket were not limited to standalone extras and extras linked to the products in the basket.

Fix

The extras list in the basket now applies both the location filter and the standalone or linked-product rule, so only relevant extras are offered. Some sites may see fewer extras offered in the basket than before.

Testing

1. Suggested: Set up a standalone extra, an extra linked to one product and an extra linked to a different product, at the same location.

2. Suggested: Add the first product to the basket and check the extras offered include the standalone extra and the linked extra, but not the extra linked to the other product.

Recommendations no longer skipped when continuing quickly

Jira: EXN-109

Issue

If a customer selected tickets and clicked continue or add to basket before recommendations had loaded, the recommendation step, and often the extras step, was skipped and the booking went straight to checkout.

Fix

The add to basket and continue buttons now show a loading state and wait until recommendations have loaded, so the recommendation and extras steps appear when they should. Products with no recommendations continue to skip the step as before.

Testing

1. Select tickets for a product with recommendations set up and click continue straight away: the button waits, then the recommendation step appears.

2. Repeat on a product where the extras step depends on recommendations: the extras step is not skipped.

3. Change the ticket type or quantity and click continue straight away: the recommendations shown match the new selection.

4. Select tickets for a product with no recommendations: the step is skipped as normal.

5. Make a few bookings at normal speed and confirm the flow behaves as before.

Declining an upgrade recommendation no longer opens an empty extras drawer

Jira: EXN-110

Issue

When a customer declined or closed an upgrade recommendation for a product with no extras, an empty extras drawer opened.

Fix

Declined upgrade recommendations are no longer counted as extras, so if there is nothing else to offer, the extras step is skipped and the booking continues. Where the product does have extras, they are still offered.

Testing

1. Set up an upgrade recommendation that replaces the first product, on a product with no extras.

2. Book that product until the upgrade offer appears, then select "No thanks" or close it.

3. Check the booking continues without opening an empty extras drawer.

4. Suggested: Repeat with a product that has extras and check the extras drawer opens with those extras.

Online orders can no longer be placed without customer contact details

Jira: CORE-9045 | FD: 5566

Issue

Some online orders were paid for but were created without customer details, so no tickets or confirmation email were generated and staff could not amend the booking or resend tickets.

Fix

Online checkout now requires the lead customer's details, including an email address, before an order can be placed. If the customer's details cannot be saved, checkout stays on the details step and shows an error rather than moving on to payment. Ticket PDFs for confirmation and pay-later emails are now retried if the first attempt fails temporarily. Orders taken in the Reservations Portal or on POS, and amendments to existing orders, are not affected.

Testing

1. Make a standard booking in the B2C Booking Portal. The confirmation email arrives with the PDF tickets attached, and the order's Message History shows the email as sent.

2. In the Reservations Portal, create an event booking and send a pay-by-email link. After paying through the link, the customer receives a confirmation email with tickets.

3. Resend the confirmation for an order to the same and to a different email address. The email is received.

4. Amend an existing order. The amendment saves and the amendment email is sent.

Selected visit date is kept when moving between calendar months

Jira: CORE-9050 | FD: 5603

Issue

When a customer selected a visit date and then moved to another month in the calendar without picking a new date, the time slots for the selected date disappeared and the Confirm Selection button was greyed out, so they could not continue.

Fix

The selected date and its time slots now stay selected when the customer moves between months, and Confirm Selection stays available until they choose a different date. Choosing a date in the new month shows that date's time slots as normal.

Testing

1. In the B2C Booking Portal, select a visit date, then move to the next month without picking a new date. The original date stays selected, its time slots are still shown and Confirm Selection stays enabled.

2. Repeat moving to the previous month, and several months away. The selection and time slots are kept and Confirm Selection stays enabled.

3. Select a date, move to another month and pick a date there. Time slots for the new date are shown and Confirm Selection is enabled.

4. Select a date, change month, confirm and complete the booking. The booking completes with the correct date and time slot.

Gift Aid calculations for vouchers and standalone donations

Jira: EXN-187

Issue

Gift Aid was calculated on the full order value even where part of the order was paid with a partner voucher. Standalone donation add-ons were not counted towards Gift Aid, and adding one could clear the customer's Gift Aid consent.

Fix

Where a partner voucher pays for part of an order, the voucher amount is no longer counted towards Gift Aid, in both the estimate shown before payment and the placed order. Gift Aid is never less than zero, and the amount left to pay on the order preview takes the voucher into account. Standalone donation add-ons are now included in Gift Aid, and Gift Aid consent is kept when the basket is edited unless every donation is removed. Membership checkout and order management also now show the confirm home address checkbox, and baskets containing only add-ons now go to the correct checkout step.

Testing

1. Book a Gift Aid-eligible ticket, accept Gift Aid and pay part of the order with a partner voucher. The Gift Aid amount is 25% of the eligible total less the voucher value, and the figure before payment matches the placed order.

2. Repeat with a voucher that covers the whole order. Gift Aid is zero and the Gift Aid prompt is not offered.

3. Book a ticket and a standalone donation, accept Gift Aid and part-pay with a voucher. The checkout summary and the placed order show the same Gift Aid total.

4. Accept Gift Aid on a basket with a donation, then change ticket quantities or extras. Gift Aid consent is kept. Remove every donation and consent is cleared.

5. Open the part-voucher order in the order preview. The amount left to pay and the amount paid account for the voucher.

6. Place a normal Gift Aid order with no voucher. Gift Aid is 25% of the eligible amount, as before.

Shorter Back button on the extras step on mobile

Jira: EXN-201

Issue

On mobile, the button to go back from the extras step had a long label that wrapped onto two lines, making it taller than the Next button.

Fix

On mobile screens the button now reads "Back", so it matches the size of the Next button. Desktop screens keep the full label.

Testing

1. On a phone, start a booking and open the extras step. The previous-step button reads "Back" and is the same size as the Next button.

2. Suggested: Tap Back and confirm it returns to the previous step.

3. Suggested: Repeat on a desktop screen and confirm the full previous-step label is shown.

Cart error when typing an add-on quantity above remaining capacity

Jira: V3-384

Issue

At the add-ons step, typing a quantity higher than the remaining capacity for an add-on replaced the basket with a general cart error, and the only option offered was to reset the basket.

Fix

The quantity is now reduced to the remaining capacity and the basket stays on screen, with no cart error. Using the plus and minus buttons works as before.

Testing

1. On the booking site, choose a departure where an add-on has limited remaining capacity and continue to the add-ons step.

2. Type a quantity for that add-on higher than the remaining capacity and move to the next field. The quantity is reduced to the remaining capacity and no cart error appears.

3. Use the plus button to reach the remaining capacity, then type a higher value again. The quantity is reduced in the same way.

Payments and refunds

Customer details kept when a pay-later order is paid by someone signed in

Jira: CORE-8791 | FD: 4886, 5543

Issue

When an order created in the Reservations Portal with Pay by Email was paid through the payment link by someone signed in to the booking site, the contact form was filled with the signed-in person's details. After payment, the order's customer details and confirmation email could change to that person instead of the original customer.

Fix

When a pay-later order is completed, the contact details now stay as entered when the order was created, whether the person paying is signed in or not. The confirmation email goes to the order's customer. This also applies when completing payment from the Reservations Portal and when amending an order.

Testing

1. In the Reservations Portal, create a booking with a customer name and email that differ from your own, choose Pay by Email and finish.

2. Sign in to the booking site as a different user, then open the payment link from the email in the same browser.

3. Check the contact form shows the customer's name and email, not the signed-in user's.

4. Complete payment and check the order still shows the original customer and the confirmation email goes to the customer.

5. Open the payment link in a private browser window without signing in and complete payment; the customer details should be unchanged.

6. Sign in to the booking site as a customer and start a new booking (not pay later); the contact form should be prefilled with your own details as before.

Card payment form not loading at checkout for one payment provider

Jira: V3-345

Issue

For one of the supported card payment providers, choosing it as the payment method at checkout showed an error message and the card payment form did not load.

Fix

These payments are now created correctly and the payment form loads. The same correction applies to the page customers return to after a 3D Secure check with another supported card payment provider.

Testing

1. Suggested: On the booking site, add a product to the basket and continue to payment.

2. Suggested: Choose the affected card payment provider as the payment method. The card payment form loads with no error message.

3. Suggested: Complete the payment. The order confirmation is shown.

PayPal payments through Trust Payments include required transaction details

Jira: EXN-231

Issue

Where PayPal through Trust Payments is enabled, payment requests could be rejected by the payment provider, so customers could not complete payment with PayPal.

Fix

PayPal payment requests now send the additional transaction information in the format Trust Payments requires, so it is passed on to PayPal. PayPal through Trust Payments is available on request.

Testing

1. Suggested: On a site with PayPal enabled, add tickets to the basket, continue to payment and choose PayPal.

2. Suggested: Complete payment in the PayPal window. You return to the order confirmation screen and the order shows as paid.

3. Suggested: Repeat and cancel in the PayPal window. You return to the payment choice with a message and can choose again.

Error shown after a successful pay by email card payment

Jira: V3-378

Issue

When a customer paid a pay by email link by card while signed in to a different customer account on the booking site, an error message could appear even though the payment had been taken and the booking confirmed.

Fix

The payment now goes straight through to the confirmation page with no error message, and the pay by email link still opens the order afterwards.

Testing

1. In the Reservations Portal, create a booking, choose Pay by email at payment and send the link.

2. On the booking site, sign in as a different customer account, open the pay by email link and pay by card. The confirmation page appears with no error message.

3. Open the same link again. It still shows the order.

4. Open the link in a private browser window without signing in and pay by card. The confirmation page appears with no error message.

Orders and amendments

Amending a return booking after a departure time change

Jira: V3-362

Issue

If a departure time was changed shortly before a customer amended a return booking on that departure, the amendment could fail and the options for one leg did not load. It worked again on its own after a few minutes.

Fix

When a booked departure has just been retimed, the latest departure times are now loaded straight away, so the amendment loads both legs and shows the new time.

Testing

1. Create and pay for a return booking. In My Bookings, open the order and start an amendment to confirm it loads.

2. In a new tab, search for the same route and dates and add both legs to the basket. Do not check out.

3. In the Admin Portal, open the timetable for that route and change the departure time of the return leg by a few minutes, then save.

4. Within five minutes, refresh the amendment page. Both legs show their options and the return leg shows the new departure time.

Online amendments away from a frozen departure

Jira: V3-379

Issue

Customers amending their own booking online could not move it off a departure whose sales had been frozen. The frozen leg was missing from the online amend page, or Edit Order was disabled, although staff could amend the same booking in the Reservations and Trade Portals.

Fix

A new setting lets customers amend online away from a frozen departure: the frozen leg is listed with alternative departures to choose from. The setting is off by default and available on request. Frozen departures are still never offered as a new choice, and online amendments are still blocked once a product's sales window has closed. Staff amendments are unchanged.

Testing

1. With the setting switched on, book a return journey on the booking site as a customer, then freeze sales on the return departure in the Admin Portal.

2. In My Bookings, open the order and select Edit Order. Both legs are listed and the frozen leg shows alternative departures. Choose one, confirm the changes and check out. The order shows the new time.

3. Repeat with a one-way booking on a frozen departure. Edit Order is available and the leg can be moved.

4. While amending any booking, browse to the date of the frozen departure. The frozen departure is not offered.

5. In the Reservations and Trade Portals, amend the same orders. Behaviour is unchanged.

Customers and accounts

Optional fields no longer block saving My Details

Jira: EXN-119

Issue

Customers opening My Account > My Details could see validation errors straight away against optional fields they had never filled in, such as Title, Gender and Phone Number, and could not save any change until those fields were completed.

Fix

Optional fields on My Details can now be left empty without showing errors or blocking Save. If an optional field is filled in, its value is still checked. Only the fields set as mandatory for your site are marked with an asterisk.

Testing

1. Sign in to the booking site as a customer whose account has only first name, last name and email saved.

2. Open My Account > My Details, change one character in the last name and select Save. The change saves, with the optional fields still empty.

3. Click into and out of each optional field without typing. No error messages appear.

4. Check that only the mandatory fields carry a required asterisk.

Saved marketing and Gift Aid preferences now pre-fill at checkout

Jira: EXN-269

Issue

Marketing and Gift Aid preferences saved in My Account were not applied when the customer placed an order.

Fix

For signed-in customers, Gift Aid is now pre-selected at the start of the booking if they have opted in, and the marketing checkbox is pre-ticked if they have subscribed. Customers can still remove Gift Aid or untick marketing for an individual order, and that choice is kept for the rest of the booking. Customers who are not signed in see no change.

Testing

1. In My Account, opt in to Gift Aid and marketing, then start a booking. Gift Aid is already applied and the marketing checkbox is ticked.

2. Open the Gift Aid window. Gift Aid is shown as selected and can be removed.

3. Remove Gift Aid, go back to search and return to checkout. Gift Aid is not re-applied.

4. Untick marketing and place the order. The order records the customer as not subscribed.

5. In My Account, opt out of marketing and start a booking. The marketing checkbox is unticked and can be ticked.

6. Book without signing in. Gift Aid and marketing behave as before.

Memberships and entitlements

Each pass now needs its own pass holder details before it can be downloaded

Jira: EXPIAN-4

Issue

When a pass was sold at POS without pass holder details, an order for a single pass could use the lead booker's details in place of the missing pass holder. The order was then treated as complete and the pass download was available before the pass holder's details were added.

Fix

The lead booker's details are no longer used in place of missing pass holder details, and details entered for one pass can no longer complete another. Until every pass has its own details, the customer is prompted to complete their booking and the ticket and wallet download are not available. When saving pass holder details from My Bookings, the form now stays open if the save fails so the customer can try again.

Testing

1. Suggested: On POS, sell a single annual pass and skip the pass holder details.

2. Suggested: Open the booking in My Bookings on the online booking portal. You are prompted to complete the pass holder details, and the ticket and wallet download are not available.

3. Suggested: Add the pass holder details and save. The ticket and wallet download become available.

Membership purchases are now always linked to the customer's account

Jira: CORE-9049 | FD: 5596

Issue

If a customer added a membership to their basket before signing in or creating an account, the membership could be paid for without being linked to their account. This created a membership order with no customer name or email. On mobile, the basket summary also offered a guest checkout option for memberships.

Fix

When a customer signs in or creates an account after adding a membership to their basket, the basket is now linked to their account and the order appears in My Bookings with their details. Membership and patronage baskets without a linked account can no longer be paid for or placed. The mobile basket summary no longer offers guest checkout for memberships; guest checkout for admission tickets is unchanged. This applies to new purchases only and does not change existing orders.

Testing

1. Without signing in, add a membership to the basket on a mobile device and tap View basket summary. No guest checkout option is shown.

2. Repeat with an admission ticket. The guest checkout option is still shown and checkout works.

3. Without signing in, add a membership to the basket, then sign in or create an account from the basket. Continue to checkout, enter the customer details and pay by card. The details save without error and the order appears in My Bookings, with the customer's name and email shown on the order in the Reservations Portal.

4. Sign in first, then buy a membership. The purchase works as before.

Products and pricing

Several recommendations on one product now display correctly

Jira: EXN-92

Issue

Where a product had more than one recommendation set up, combining automatic and manual recommendations could stop the automatic ones from appearing. In the extras drawer, time slots for every recommended product appeared under each product, product descriptions could show as raw formatting code, and selecting one recommended product highlighted all of them.

Fix

Each recommendation is now handled separately, so automatic and manual recommendations on the same product can be shown together. Each recommended product shows only its own available times, descriptions display with their formatting, and only the product selected is highlighted. Recommendations whose products are not published are no longer shown. These changes apply in the booking portal and the Reservations Portal.

Testing

1. In the Admin Portal, set up two recommendations against the same product, one automatic and one manual, and publish them.

2. In the booking portal, add that product to the basket and continue.

3. Check both recommendations are offered, and each recommended product lists only its own times.

4. Select one recommended product and check only that card is highlighted.

5. Repeat in the Reservations Portal.

6. Suggested: Check a recommended product description containing formatting (for example bold text or paragraphs) displays correctly rather than as code.

Recommendations now update when ticket types change after choosing a time

Jira: EXN-128

Issue

If a customer chose a time and then changed the ticket types or quantities (for example adding a child after an adult), the selection did not update to match, so recommendations linked to those ticket types were not offered when adding to the basket.

Fix

The booking selection now updates when ticket types or quantities change after a time has been chosen, and recommendations are refreshed to match the updated tickets.

Testing

1. Set up a recommendation that is triggered when a product includes a child ticket.

2. On the booking site, choose the product, add an adult and select a time.

3. Add a child ticket and select Add to basket. The recommendation is now offered.

Recommendation images now show on desktop

Jira: EXN-226

Issue

Images on recommended products in the extras step were missing on desktop, although they showed on mobile.

Fix

Recommended products now use the same image layout as add-ons, so their images are shown on desktop as well as mobile.

Testing

1. On a desktop browser, start a booking for a product with recommendations and reach the extras step. The recommendation images are shown.

2. Repeat on a tablet and a mobile screen. The images are shown.

Correct totals when more than one promotion applies

Jira: EXN-143

Issue

When more than one promotion applied to the same tickets, for example an automatic promotion plus a promo code, the extra discount was worked out from the original totals. VAT and donations were not recalculated for each promotion, so totals could be wrong, and promotion usage limits could be used up by ticket types the promotion did not discount.

Fix

Each promotion is now applied in turn to the running total, with VAT and donations recalculated each time, and the applied promotions list shows each promotion's own discount. Usage limits now count only tickets the promotion actually discounts, and promotions are fully re-checked when an order is amended.

Testing

1. Create two promotions that use the same promo code, each 10% off one ticket type. Add two tickets and enter the code once. Both promotions apply, the second taking 10% off the already reduced price, and each is listed with its own discount.

2. Create a promotion whose condition covers all ticket types but whose discount applies only to Adult, with a usage limit of 2. Book 2 Adult and 2 Child tickets. Only the Adult tickets are discounted and only they count towards the limit.

3. Set up one automatic promotion for exactly 2 adults and another for 3 or more adults. Book 2 adults, then amend the order to 3 adults. Only the 3-or-more promotion now applies and the amendment charge is correct.

4. Apply one promo code, remove it and apply a different code. Only the second code's discount remains.

Capacity and scheduling

Visit date calendar shows dates that cannot be booked for the current basket

Jira: CORE-9066 | FD: 5663

Issue

When the basket contained a mix of ticket types and one of them had no availability on some dates, the calendar still showed those dates as available, although the customer could not select or confirm them.

Fix

The calendar now takes the whole basket into account. Dates that cannot be booked for the current selection are shown greyed out as "Unavailable for your selection" and cannot be selected. Dates with no availability for any ticket type still show as "Sold Out". Baskets with a single ticket type are unchanged.

Testing

1. Add a mix of ticket types to the basket where one type has no availability on some dates. On the visit date calendar, those dates show as "Unavailable for your selection" (grey) and cannot be selected.

2. The next date on which every ticket in the basket is available is shown as available and can be selected.

3. A date with no availability for any ticket type shows as "Sold Out" (red).

4. With only standard tickets in the basket, availability shading is unchanged.

5. Complete a booking on an available date. Prices and totals are unchanged.

Bookings from pre-filled basket links are now checked against capacity tiers

Jira: CORE-8956 | FD: 5251

Issue

Bookings started from an external link that pre-fills the basket skipped the capacity tier check used in the normal booking search. Products could therefore be booked when a capacity tier had been set to zero.

Fix

The same capacity tier check now applies when the booking is submitted, so a basket that relies on a sold-out capacity tier is rejected. Bookings with available capacity complete as before.

Testing

1. In the Admin Portal, set a capacity tier to zero for a product on a chosen date.

2. Open a pre-filled basket link for that product and date and try to complete the booking; the booking should not complete.

3. Search for the same product and date in the Reservations Portal; it should show as unavailable.

4. Repeat the pre-filled link for a date with capacity available; the booking should complete to confirmation.

Day tickets show available dates for signed-in customers and trade bookings

Jira: EXN-223

Issue

For some signed-in customers holding a pass, and for bookings made on behalf of a trade partner, some day tickets showed no available dates or failed with an error during booking. The same tickets worked for customers who were not signed in.

Fix

Availability for these tickets now loads correctly, so they can be booked by signed-in customers in the B2C Booking Portal, on behalf of trade partners in the Reservations Portal, and at POS. This release includes a database update that fills in missing information on existing records.

Testing

1. Suggested: Sign in to the B2C Booking Portal as a customer who holds a pass, choose a day ticket and add a ticket. Dates are available and the booking can be completed.

2. Suggested: In the Reservations Portal, raise a new order on behalf of a trade partner and choose a day ticket. Dates are available.

3. Suggested: At POS, sell a day ticket. The purchase completes without an error.

Tickets and communications

Add-on and location names translated in confirmation emails and PDFs

Jira: V3-57

Issue

Confirmation emails and PDFs showed add-on and location names in English even when a translation had been saved for the customer's language in the Admin Portal. In French, German, Dutch and Polish, the label shown next to the booking channel on the PDF read as an order date rather than how the booking was made.

Fix

Confirmation emails and PDFs now show add-on and location names in the order's language where a translation has been saved and published in the Admin Portal, including for orders booked before the translation was added. Where no published translation exists, the English name is still used. The booking channel label now reads as 'booked via' in French, German, Dutch and Polish.

Testing

1. In the Admin Portal, save and publish a translation (for example French or German) on an add-on option and on a location.

2. Create an order with that add-on and location, with the customer's preferred language set to the translated language.

3. Check that the confirmation email and the PDF show the translated add-on and location names.

4. Check that, for an add-on or location without a published translation, the English name is shown.

5. Suggested: In a French, German, Dutch or Polish PDF confirmation, check that the label next to the booking channel reads as 'booked via'.

Voucher code shown in voucher purchase confirmation emails

Jira: EXN-45

Issue

The voucher code needed to redeem a voucher online was only shown in the PDF attached to the confirmation email, and voucher validity dates could show at the wrong time.

Fix

Voucher purchase confirmation emails now show the voucher code, and voucher dates now display in UK time, consistent with other emails. Redemption guidance shown in the email comes from the product information set in the Admin Portal. This applies to orders containing a single voucher; orders with more than one voucher do not yet show voucher codes in the email.

Testing

1. Buy a single voucher on the booking website.

2. Open the confirmation email and confirm the voucher code is shown, along with the valid from and valid until dates in UK time.

Tickets set for collection can no longer be added to a mobile wallet

Jira: EXN-218

Issue

Ticket types set for collection on arrival could still be added to Apple or Google Wallet from the booking confirmation and the confirmation email, although they are meant to be issued on site.

Fix

Tickets set for collection are no longer offered for wallet download on the confirmation screen or in emails. If every ticket in an order is for collection, the wallet button and email wallet link are not shown. In a mixed order, the wallet pass contains only the tickets that are not for collection. For bundles, the bundle's collection setting applies to every ticket inside it.

Testing

1. Place an order where every ticket type is set for collection. No add to wallet button appears on the confirmation screen or in the confirmation email.

2. Place an order mixing collection and non-collection tickets. The wallet button is shown, and only the non-collection tickets are added to the wallet.

3. Place an order for a bundle set for collection. No wallet button is shown.

4. Place an order with no collection tickets. All tickets download to the wallet as before.

5. At POS, look up a collection-ticket order on arrival. You are prompted to print the collection tickets.

Voucher codes shown in confirmation emails for orders with several vouchers

Jira: EXN-59

Issue

Voucher codes only appeared in the confirmation email when the order contained a single voucher. Orders with more than one voucher, or a voucher alongside other items, sent a confirmation email with no voucher codes.

Fix

All voucher orders now use the standard order confirmation email. Each voucher in the order is shown in its own section with its code, validity dates and redemption information, whether the order has one voucher, several, or vouchers alongside tickets. This applies to orders from the B2C Booking Portal and the Reservations Portal, and to resent confirmations.

Testing

1. Buy a single voucher and check the confirmation email shows the voucher code and redemption information.

2. Buy two or more vouchers in one order and check every voucher code is shown, each with its redemption information.

3. Buy a voucher together with an admission ticket and check the voucher code and the ticket both appear correctly in the same email.

4. Cancel one item in a voucher order and check the remaining vouchers still show their codes.

5. Repeat a voucher order from the Reservations Portal and resend the confirmation; check all voucher codes appear.

Apple Wallet no longer shows a false error when adding a pass

Jira: EXN-158

Issue

On iPhone, tapping Add to Apple Wallet from the wallet link in the confirmation email could show an "Unable to add pass" error, even though the pass was then added a moment later. This happened after the button had been tapped more than once for the same order, and on single-ticket orders if the button was tapped before the page redirected automatically.

Fix

The pass check is no longer affected by earlier taps, and tapping the button now stops the automatic redirect instead of conflicting with it. Customers can add the pass as many times as needed without a false error. Where a pass genuinely cannot be added, the customer now sees a plain message explaining why.

Testing

1. On an iPhone, open the confirmation email for an order with two or more tickets and tap the wallet link.

2. Tap Add to Apple Wallet five or more times. The pass is added each time with no error message.

3. Delete the pass from Apple Wallet, return to the wallet page and tap the button again. The pass is added again with no error.

4. For a single-ticket order, tap Add to Apple Wallet straight away, before the page redirects. The pass is added with no error.

5. For a single-ticket order, wait for the page to redirect automatically. The pass still downloads correctly.

Configuration and branding

Option to hide the venue name in booking options

Jira: EXN-105

Issue

Where several products share a venue, the booking options could show the venue name as the option label, which could mislead customers about what they were buying.

Fix

The venue name shown in booking options can now be hidden, leaving only the price. This is a configurable option; by default the venue name is still shown.

Testing

1. On a booking portal with the venue name hidden, start booking each product and view the available options.

2. Check only the price is shown for each option, with no venue name.

3. Suggested: On a booking portal without this option, check the venue name still appears.

Reservations Portal

Booking and checkout

Customer selector stays visible after clearing the basket

Jira: EXN-51

Issue

When creating a booking for a selected customer in the Reservations Portal, clicking Clear All after going back or closing the add-on window made the customer selector disappear. The page had to be refreshed to bring it back.

Fix

Clearing the basket now removes the selected customer without hiding the customer selector, so staff can choose a customer again straight away.

Testing

1. In the Reservations Portal, start a new booking and select a customer.

2. Add an item to the basket, then click Back or close the add-on window.

3. Click Clear All.

4. Check that the customer selector is still shown and a customer can be selected without refreshing the page.

Checkout address fields now show the latest details

Jira: EXN-125

Issue

In checkout, the address fields could fail to refresh after the address details changed, for example when changing the shipping address or using the same-as-shipping option.

Fix

The billing and shipping address fields in checkout now update straight away to show the current details.

Testing

1. Suggested: Start a checkout that asks for an address and enter a shipping address.

2. Suggested: Change the address, then switch the same-as-shipping option on and off.

3. Suggested: Check that the billing and shipping fields always show the current address with no missing or out-of-date values.

Products hidden from the online catalogue now show available dates in Reservations

Jira: EXN-273

Issue

Products set not to appear in the online booking portal, but still sold by staff, were listed in Reservations but showed no available dates on the calendar, so they looked unbookable. The same could happen when amending or rescheduling a booking for one of these products.

Fix

Reservations and POS now include these products consistently when looking up availability, so their available dates show when booking, amending and rescheduling. The online booking portal and Trade Portal continue to hide them. Where a partner voucher booking link is configured, products eligible for that scheme now appear on that link even if they are hidden from the main catalogue.

Testing

1. In the Admin Portal, set a product so that it is not searchable online, and publish it.

2. In Reservations, start a new booking and choose that product. The calendar shows its available dates and times.

3. Complete the booking, then amend it. The product and its dates are still available in the amendment.

4. In the online booking portal, check that the product does not appear in the catalogue, search results or recommendations.

Lead name and email locked when booking route journeys against a customer account

Jira: V3-377

Issue

When staff booked a route journey on behalf of a customer account, the lead first name, last name and email could still be changed at the billing details step. This meant an order could sit in one customer's account with another person's contact details.

Fix

When the booking belongs to a customer account, the lead first name, last name and email are now read-only at the billing details step for route journeys, as they already were for other checkouts. Phone and other fields can still be edited. The same applies to customers signed in on the booking site. Guest bookings, and accounts with no name recorded, can still edit these fields.

Testing

1. In the Reservations Portal, start a booking on behalf of a customer account that has a name and email recorded, add a journey and go to Billing details. First name, last name and email cannot be edited; phone and other fields can.

2. Complete the booking. The order shows the account's email under Customer Details and appears in that account's My Bookings.

3. On the booking site, sign in as a customer, book a journey and go to Billing details. The same three fields are locked.

4. In the Reservations Portal, make a guest booking with no account selected. All fields can be edited as before.

Payments and refunds

Full range of pay by email time limits for memberships, gift vouchers and renewals

Jira: CORE-8670

Issue

When using Pay by Email for a membership, membership gift voucher or membership or patronage renewal, the 'Time to complete payment' list offered only 15 minutes and 2 hours.

Fix

These products now offer the full list of time limits: 15 minutes, 2 hours, 1 day, 3 days, 7 days, 14 days, 30 days, 60 days, 90 days and 120 days. For dated or timed tickets, the options are still limited to those that expire before the visit date.

Testing

1. Add a membership gift voucher to the basket, go to checkout and select Pay by Email.

2. Open the 'Time to complete payment' list and check that it shows 15 minutes, 2 hours, 1 day, 3 days, 7 days, 14 days, 30 days, 60 days, 90 days and 120 days.

3. Repeat with a new membership and with a membership or patronage renewal; the same full list should appear.

4. Add a dated ticket for a visit a few days away and select Pay by Email; only options that expire before the visit date should be offered.

5. Add a ticket for a visit more than 120 days away; the list should go up to 120 days.

Refunds now complete for orders paid by PayPal and further card payment methods

Jira: EXN-7 | FD: 4890

Issue

Refunds issued from an order could fail for orders paid with PayPal or with some card payment methods, so the refund could not be processed automatically.

Fix

Refunds now complete for every refundable payment method supported on the order, including partial refunds and orders with more than one payment. The refund appears in the order's transaction section.

Testing

1. Place an order on the booking website and pay by PayPal.

2. In the Reservations Portal, open the order, issue a partial refund and confirm it succeeds and appears in the order's transaction section.

3. Cancel the order with a refund and confirm the refund succeeds and appears in the transaction section.

4. Repeat with an order paid by card.

Orders and amendments

Amendments no longer fully repriced or charged a time change fee after a timeslot's time is edited

Jira: PO-1803

Issue

If staff changed the start or end time of an existing timeslot in the Admin Portal after an order was placed, a later amendment to that order (for example adding an add-on) treated it as a change of timeslot. The whole order was repriced at current prices instead of charging only for the change, and amendment fees for time changes could be added when they should not have been.

Fix

Amendments now recognise the timeslot itself rather than its time, so editing a timeslot's times in the Admin Portal no longer counts as the customer changing timeslot. The original prices are kept and only the change is charged, and amendment fees set up for time changes apply only when the customer moves to a different timeslot. Moving to a different timeslot still triggers repricing, and fees for other changes, such as adding tickets, apply as before.

Testing

1. Create an order in the Reservations Portal or the online booking portal.

2. In the Admin Portal, change the ticket type prices for the product and change the start time of the booked timeslot.

3. In the Reservations Portal, amend the order by adding an add-on.

4. Check that you are charged only for the add-on, with no repricing of the tickets already booked and no time change amendment fee.

5. Amend an order to move it to a different timeslot and check that repricing applies.

Custom size supplements now charged correctly when an order is amended

Jira: PO-1804

Issue

When an order booked with standard sizes was amended to set custom sizes, the price was not recalculated. The size supplement configured on the product was not added, the amount to pay was zero and any promotion was calculated on the price without the supplement.

Fix

Changing a custom size during an amendment now recalculates the price and charges or refunds the difference in size supplement, with promotions recalculated on the new price. The supplement charged is now stored with the order, so later amendments that do not change the size keep the supplement already paid, even if the supplement rate has changed in the Admin Portal. The current rate is used only when the size is increased or decreased, and returning to a standard size refunds the units at the rate originally paid. Orders amended with custom sizes before this release may show an unexpected charge or refund on their next amendment.

Testing

1. In the online booking portal or the Reservations Portal, create an order with standard sizes.

2. In the Reservations Portal, amend the order and set a custom size. Check that the size supplement is added to the price and the amount to pay reflects the added units, with any promotion recalculated.

3. In the Admin Portal, change the size supplement rate, then amend the order again to add an add-on only. Check that the supplement already charged is unchanged.

4. Amend the order again to change the custom size. Check that the price is recalculated.

5. Amend an order booked with a custom size back to the standard size and check that the supplement originally paid is refunded.

Pass amendments allowed when general amendments are switched off

Jira: EXN-76, EXPIAN-314

Issue

When a product's rules did not allow amendments, amendments to passes on the booking were also blocked, even where pass amendments were allowed.

Fix

Pass amendments can now go ahead when general amendments are switched off, as long as pass amendments are allowed. Other amendments are still blocked when amendments are switched off.

Testing

1. Suggested: Set up a product whose rules do not allow amendments but do allow pass amendments.

2. Suggested: Open a booking for that product and make a pass amendment: it should save.

3. Suggested: On the same booking, try a standard amendment, such as a date change: it should still be blocked.

External reference search for existing orders

Jira: V3-249 | FD: 5385

Issue

Searching for an order by its external reference in the Reservations Portal returned no results for some existing orders, even though the reference appeared on the order and in reports.

Fix

The update that fills in external references for existing orders now runs in the background after the release is deployed, in small batches, so it does not hold up bookings or amendments while it runs. Once it has finished, existing orders can be found using the External Reference search filter. It may take some time after deployment before all older orders appear in search results.

Testing

1. In the Reservations Portal, go to Search, open Advanced Filters and choose External Reference.

2. Enter the external reference of an order created before the update. The order is returned.

3. Search by order reference, customer name and email address. Results are unchanged.

Orders stay attributed to the staff member who made them after amendment

Jira: CORE-9093 | FD: 5707

Issue

When a second staff member amended an order, or took a pay-on-arrival payment on it, the order's Reservations User changed to that second person. Reports based on the order's sales user then showed the wrong staff member.

Fix

An order now keeps the staff member who originally placed it as its Reservations User, including after amendments and pay-on-arrival payments by other users. Each amendment still records the staff member who made it in the order history. New orders are attributed to the staff member who places them, as before.

Testing

1. As User A, place and pay for an order in the Reservations Portal. In the order's More Information, Reservations User shows User A.

2. Sign in as User B, amend the same order and complete the amendment. Reservations User still shows User A.

3. In the order History, view the amended revision. The amendment is shown as made by User B.

4. Place a pay-on-arrival order as User A and complete the arrival payment as User B. Reservations User remains User A.

5. As User B, place a new order. Reservations User shows User B.

Remove customers step no longer appears unnecessarily when amending an order

Jira: EXN-93

Issue

When amending an order with several pass holders without removing any tickets, for example to add a promotion code, staff and customers could be asked to remove customers from the booking before continuing.

Fix

The remove customers step now takes account of pass holders and members linked to the order, and no longer counts the lead customer, so it only appears when customers need removing because tickets have been removed. This applies to amendments in the Reservations Portal and the booking portal.

Testing

1. Place an order for an annual pass with more than one pass holder.

2. Open the order in the Reservations Portal, choose to amend it and add a promotion code.

3. Continue: the amendment proceeds without asking you to remove customers.

4. Suggested: Amend an order and remove a ticket, and check the remove customers step still appears where a customer is no longer covered by a ticket.

Customers and accounts

Trade partner search no longer fails on brackets

Jira: EXN-150

Issue

In the Reservations Portal, typing an opening bracket "(" into the trade partner search stopped the page working.

Fix

The trade partner search now handles brackets and similar characters, and the page stays usable. Matching results are still listed.

Testing

1. In the Reservations Portal, open the trade partner search.

2. Type a search term containing an opening bracket, for example a partner name followed by " (".

3. Check the page stays usable and matching trade partners are listed.

Order email can be updated to match the linked customer account

Jira: CORE-8991 | FD: 5290

Issue

After an order such as a membership was reassigned to a different customer account, staff could not change the order's email to that account's address. The change was rejected with 'Email Address already in use', even though the address belonged to the account the order was now linked to.

Fix

The order email can now be changed to the address of the customer account the order is linked to. Changing it to an address that belongs to a different account is still blocked, because the order email is also that account's sign-in. Email matching is now exact, so an address is no longer blocked just because it forms part of another account's email. Reassigning an order to another account still leaves the order's name, email and phone unchanged; edit them separately afterwards.

Testing

1. In the Reservations Portal, open an order linked to a customer account, go to More Information, then Customer User, and reassign the order to a different account.

2. Edit the customer details on the order (for a membership, Lead Member Details), change the email to the address of the account you reassigned it to, and save; it should save without an 'already in use' message.

3. In the same edit, also change the first name and telephone; check the linked account's profile shows the updated details.

4. Try changing the order email to the address of a third, unrelated account; it should be rejected and the order email should stay unchanged.

5. Change a linked order's email to a new, unused address and save; the customer should be able to sign in to the booking site with the new address.

6. Edit only the phone or name on a guest or trade order; it should save as before.

Memberships and entitlements

Membership discounts set for all add-on options or all ticket types now apply

Jira: CORE-8928 | FD: 5111

Issue

A membership discount set up to apply to 'all options' of an add-on, or to all ticket types, was saved in a way that matched nothing, so customers using the membership were charged full price. Separately, the ticket PDF could show 'Ordered on: Web Direct' for orders placed in the Reservations Portal.

Fix

Membership discounts for all add-on options or all ticket types are now saved and applied correctly, and existing affected promotions are repaired automatically when the release is deployed. The ticket PDF now shows the channel the order was placed through when the payment record does not identify it.

Testing

1. In the Admin Portal, set up a membership with a 50% discount on all options of an add-on.

2. Buy the membership for a customer, then make a booking for that customer that includes the add-on; the add-on should be charged at 50% of its price.

3. Make a booking in the Reservations Portal and open the confirmation PDF; 'Ordered on' should show the Reservations Portal channel, not Web Direct.

Products and pricing

Single journeys now use the standard price for capacity options

Jira: CORE-8993 | FD: 5402

Issue

On products with capacity options that have both a standard price and a combination (return) price, single journeys could show the combination price instead of the standard price. This could happen after new prices were uploaded, and affected earlier products as well as new ones.

Fix

Single journeys now use only the standard (non-combination) price for capacity options, at search, in the basket, at checkout and when the booking is created. This applies in the Reservations Portal and the B2C Booking Portal.

Testing

1. Suggested: In the Admin Portal, upload prices for a product with a capacity option where the standard price and the combination (return) price are clearly different, and check both in Prices Overview.

2. Suggested: In the Reservations Portal, search for a single journey on that product, add the capacity option and check the price shown matches the standard price.

3. Suggested: Add it to the basket and continue to checkout; the price should stay at the standard price at every step.

4. Suggested: Repeat in the B2C Booking Portal; the result should be the same.

'No Combos' promotions no longer discount add-ons on combo bookings

Jira: CORE-8893 | FD: 5088

Issue

A promotion set to 'No Combos' in the Combine Promo with Combos setting was still applied to add-ons when the booking formed part of a combo. Separately, when booking a return in the Reservations Portal, return combos were not calculated and the chosen return time could fail to select.

Fix

Add-on promotions now follow the 'No Combos' setting in the same way as ticket promotions: they are not applied when the booking is part of a combo, and still apply to standalone bookings. In the Reservations Portal, return journeys now calculate combos in the same way as the B2C Booking Portal, and the selected return time is added to the basket with the outbound.

Testing

1. In the Admin Portal, set up an add-on promotion with 'No Combos' selected.

2. In the Reservations Portal, book a single journey, add the eligible add-on and enter the promotion code; the add-on should be discounted.

3. Book a return that forms a combo, add the same add-on and enter the code; the code should be rejected and the add-on should stay at full price.

4. Check that the result stays the same in the basket and at checkout, and repeat both bookings in the B2C Booking Portal.

5. Repeat with a promotion set to 'All Combos'; it should still discount the add-on on the combo booking.

Donations and VAT calculated correctly when discounts apply

Jira: EXN-53

Issue

When a discount or promotion applied to a product with a donation, donation and VAT figures could be wrong. With donations on top of the price, a fully discounted ticket removed the donation from every ticket on the line; with donations included in the price, the donation was not reduced by the discount and could exceed the amount paid; and donations included in the price were still being charged VAT.

Fix

Donations are now always excluded from VAT, and VAT is worked out from the price after discounts. With donations on top of the price, only a ticket whose own price is discounted to zero loses its donation; other tickets keep theirs. With donations included in the price, the donation now reduces in proportion to the discount and can no longer exceed the total. This applies wherever orders are priced, including the B2C Booking Portal and POS, and to amendments. Donation and Gift Aid figures on discounted lines will be lower than before where they were previously overstated.

Testing

1. Set up a product with a donation on top of the base price and a promotion that discounts only one ticket. Add three tickets and check that the two undiscounted tickets keep their full price and donation.

2. Set up a promotion giving 100% off on some tickets. Add more tickets than the promotion covers and check that only the fully discounted tickets lose their donation, and the rest keep full price and donation.

3. Set up a membership with the donation included in the price and apply a voucher. Check that the donation reduces in proportion to the discount and Gift Aid is based on the reduced donation.

4. Amend an existing order with a donation and promotion (for example change the date) and check that the donation and totals are recalculated in the same way.

5. Suggested: On any order with a donation, check that the VAT shown is calculated on the price excluding the donation.

Capacity and scheduling

Amendments are checked against the availability of the channel making the change

Jira: EXN-12 | FD: 4491

Issue

When staff amended a booking that was originally made online, adding an item could fail with "Failed to add to cart" if online sales for that option had been closed by setting its online limit to zero, even though the Reservations channel still had availability. In some cases amendments touching that date and time could also fail with an error.

Fix

Amendments made in the Reservations Portal, POS, booking website and trade portal are now checked against the availability of the channel making the change, not the channel the booking was first made on. The overall capacity limit still applies. Amendments no longer fail when an option has a zero limit for one channel and bookings only from other channels.

Testing

1. In the Admin Portal, set the online channel limit to 0 for one option on a chosen date and time, leaving the Reservations channel with availability.

2. On the booking website, start a new booking for that date and time and confirm the option is not available.

3. In the Reservations Portal, make a new booking for that date and time and confirm the option is available.

4. Recall a booking originally made on the booking website in the Reservations Portal, add the option and confirm it adds to the basket without an error and the amendment completes.

Redemption and attendance

Pass holder names shown when redeeming tickets

Jira: EXN-72

Issue

When redeeming tickets against an order in the Reservations Portal, each ticket showed only its type, code and scan count. Staff could not tell which person each pass belonged to, for example on a family pass.

Fix

The redeem window now shows the customer's first and last name against each ticket, with a clear message where no name was captured. Customer names also appear when cancelling tickets and in ticket details, suspended tickets are shown with their status, and the redeem screen text is now translated into all supported languages.

Testing

1. Make a booking in the Reservations Portal or B2C Booking Portal and fill in the customer details for each ticket.

2. In the Reservations Portal, open the order and click Redeem.

3. Check that each ticket shows the customer's first and last name.

4. Suggested: Open an order where no customer details were captured and check the ticket shows a 'no customer' message instead of a blank.

5. Suggested: Open an order with a suspended pass and check the ticket is marked as suspended.

Sales shifts and cash management

Cancelled orders now appear in sales shift totals

Jira: CORE-8845 | FD: 4956

Issue

When front-of-house staff cancelled an order, both the original sale and its refund disappeared from the sales shift view. The sales shift totals then did not match the main payments and sales reports, which still showed them.

Fix

Sales shifts now include cancelled orders, showing both the original sale and the offsetting refund, so the payment totals for each shift match the payments and sales reports.

Testing

1. Suggested: On a POS device, make a card sale and then cancel the order.

2. Suggested: In the Reservations Portal, open Sales Shifts, select a date range covering that shift and view the shift.

3. Suggested: Check that both the sale and its refund appear and that the card total for the shift matches the payments report.

Reporting and data

Clear message when a report cannot be downloaded because of its title

Jira: EXN-155

Issue

Some reports could not be downloaded to CSV and gave no clear reason. This happened when the report title contained characters that cannot be used in a file name.

Fix

When a download fails for this reason, a message now explains that the report title contains unsupported characters and asks you to update the title and try again. The message stays on screen for 10 seconds and can be closed manually.

Testing

1. Open any report and add a character such as – to its title.

2. Download the report as CSV. A message appears explaining the problem with the title.

3. Remove the character from the title and download again. The report downloads without errors.

Tickets and communications

Confirmation emails for large group bookings now send

Jira: CORE-9013 | FD: 5370

Issue

Confirmation emails for very large group bookings failed to send, including when resent or after an amendment. Message History showed the email as failed, even though staff were told it had been sent.

Fix

Confirmation emails and ticket PDFs can now be generated for much larger bookings, so confirmations for large group bookings send, resend and send after amendments as expected.

Testing

1. Suggested: Create or open a group booking with a large number of tickets (for example more than 80 guests).

2. Suggested: In the Reservations Portal, resend the confirmation from the order and open More actions > View Message History; the latest email should show as sent, not failed.

3. Suggested: Amend the booking and check the updated confirmation also sends.

4. Suggested: Send a confirmation for a normal-sized booking and check it still sends as before.

Trade Portal

Booking and checkout

Phone number can be made optional for trade bookings

Jira: EXN-255

Issue

Where a site had made the phone number optional, it was still required when booking through the Trade Portal.

Fix

Where the phone number is configured as optional for trade bookings, it is now optional in the Trade Portal and when booking on behalf of a trade partner in the Reservations Portal. This setting is configurable.

Testing

1. In the Trade Portal, start a new booking and go to contact details. The phone number is not mandatory and the booking can be completed without it.

2. In the Reservations Portal, start a new booking on behalf of a trade partner. The phone number is not mandatory and the booking can be completed without it.

Trade partners set to hide prices no longer see prices when choosing tickets and extras

Jira: EXN-293

Issue

Where a trade partner was set to hide prices, the Trade Portal could still show 'From' prices when choosing ticket types and prices in the extras step.

Fix

The ticket-type selector, the extras step and the ticket-type price list now follow the trade partner's hide-prices setting. Extras can still be selected while prices are hidden. Trade partners set to see prices see them as before.

Testing

1. Sign in to the Trade Portal as a trade partner set to hide prices and start a new booking. No 'From' prices are shown when choosing ticket types.

2. Open the extras step. No prices are shown for extras or in the ticket-type price list, and extras can still be selected.

3. Continue to the basket, checkout and confirmation. No prices are shown.

4. Repeat as a trade partner set to show prices. 'From' prices are shown as before.

Payments and refunds

Cancelling trade orders no longer shows an error or unnecessary payment options

Jira: PO-1808

Issue

When an order made through the Trade Portal, or in the Reservations Portal on behalf of a trade partner, was cancelled, the cancellation and refund went through but an error message was shown asking the user to try again, and every retry failed. Where the cancellation left nothing to pay or refund, checkout showed the payment options even though no payment was due.

Fix

If a payment or refund that has already been recorded is sent again, it is now accepted without an error and no duplicate payment or refund is created. When a cancellation or amendment leaves nothing to pay, the payment step now shows 'No payment is required for this change.' with a Done button, and clicking Done completes the change. This applies in the Trade Portal and the Reservations Portal. Cancellations with a genuine refund and normal purchases are unchanged.

Testing

1. Create an order through the Trade Portal, or in the Reservations Portal on behalf of a trade partner, then cancel it from checkout.

2. Check that the order is cancelled, the refund is recorded once and no error message appears.

3. Cancel an order where nothing is left to pay or refund. Check that the payment step shows 'No payment is required for this change.' with no payment options, and that clicking Done completes the cancellation.

4. Check that a cancellation with a genuine refund still goes to the refund page, and that a normal purchase shows the usual payment options.

Orders and amendments

Passenger and contact details on trade partner bookings are now kept

Jira: PO-1782 | FD: 4754

Issue

On some trade partner bookings, passenger names and contact details that were added or changed appeared to save but were not kept on the booking.

Fix

Passenger and contact details entered on trade partner bookings are now kept, including after the booking is amended, and can be edited from the order details page. This also applies to bookings made in Reservations on behalf of a trade partner.

Testing

1. In the Trade Portal, create a booking with passenger details. The details are stored and can be edited from the order details page.

2. Amend the booking to add or remove a passenger. The details remain correct and can still be edited.

3. In Reservations, create a booking on behalf of a trade partner and repeat the steps above. The details are stored and can be edited.

Tickets and communications

Hidden prices setting now applies to trade partner confirmation emails

Jira: EXN-99

Issue

Where the setting to hide prices in the Trade Portal and emails was switched on, prices were hidden in the portal but fees and payment totals still appeared in booking confirmation emails sent to trade partners.

Fix

Booking confirmation emails for trade partner orders now also hide fees, donations and payment totals, such as subtotal, VAT and total paid, when the setting is on. Cancellation and amendment terms remain visible. Orders placed by staff on behalf of a trade partner in the Reservations Portal follow the same setting, and emails for other orders continue to show prices.

Testing

1. In the Admin Portal, switch on "Hide prices in trade portal and emails".

2. Place an order in the Trade Portal and open the confirmation email: no product, line item, fee or total prices appear.

3. Place an order on behalf of a trade partner in the Reservations Portal and check the email in the same way.

4. Switch the setting off, place another order, and check prices appear in the email as normal.

Admin Portal

Products and pricing

Promotions can again require the customer to hold an active product

Jira: EXN-129

Issue

It was no longer possible to set up a promotion that applies only when the customer already holds a particular active product, such as a free day ticket for annual pass holders. This option had been available in an earlier version.

Fix

The option has been restored in the Admin Portal. In promotion settings, when the promotion applies automatically, you can select one or more products that the customer must own and hold active. The promotion then applies only when booking on behalf of a customer who holds that product, or when the customer is signed in to the booking site with that product active on their account.

Testing

1. In the Admin Portal, open a promotion, set it to apply automatically and select the product the customer must hold.

2. Place an order for that product against a customer account.

3. Book for that customer (in the Reservations Portal on their behalf, or signed in on the booking site) a product the promotion covers. The promotion applies.

4. Repeat for a customer without the required product. The promotion does not apply.

Add-on promotions discounting add-ons that are not linked to them

Jira: V3-365

Issue

A promotion set to discount all options of an add-on could also discount other add-ons in the basket that were not linked to the promotion.

Fix

The discount now applies only to options of the add-ons linked to the promotion. Other add-ons in the basket keep their price and no longer count towards the promotion's quantity conditions or discount limit. To discount another add-on, link it to the promotion. Existing bookings keep their price; the change applies when a booking is priced or an amendment is repriced.

Testing

1. In the Admin Portal, open a promotion with one linked add-on, set to all options with a discount.

2. In the Reservations Portal, build a basket containing that add-on and a second add-on that is not linked, then apply the promotion code. Only the linked add-on is discounted.

3. Link the second add-on to the same promotion, then save and publish. Apply the code to the same basket again. Both add-ons are discounted.

Multi-market promotions not applying in every market

Jira: V3-387

Issue

After the promotions update, some promotions set up in more than one market with a discount on all options of an add-on, or on all ticket types, were left configured for only one market. In the other markets the discount stopped applying, and the Linked Add-Ons tab for those markets showed no records.

Fix

A one-off data correction runs when this release is deployed and adds the missing market settings, copying any existing limits. These promotions now apply in every market they were set up for. Markets that already had settings, and whole-basket promotions, are unchanged.

Testing

1. In the Admin Portal, open a promotion set up in more than one market with an all-options add-on discount, and go to the Linked Add-Ons tab.

2. Check each market tab. Each shows the add-on row with the discount.

3. In the Reservations Portal, build a basket containing that add-on in each market in turn and apply the promotion code. The discount applies to the add-on in every market.

Tickets and communications

The Send PDF product setting now also applies to annual passes

Jira: EXPIAN-289

Issue

Annual pass bookings were left out of PDF ticket attachments whatever the product's Send PDF setting, so the setting had no effect for those passes.

Fix

Whether a PDF ticket is attached to confirmation and amendment emails now depends only on the product's Send PDF setting, in the product's Important Information tab. Cancelled items are still never included in the PDF. Annual pass bookings for products with Send PDF switched on will now receive a PDF ticket, where previously they did not.

Testing

1. Suggested: In the Admin Portal, open an annual pass product, go to the Important Information tab and set Send PDF to On. Make a booking for it. The confirmation email includes the PDF ticket.

2. Suggested: Set Send PDF to Off and make another booking. The confirmation email has no PDF attached.

POS

Products and pricing

POS now receives only promotions set up for the POS channel

Jira: CORE-5918, CORE-8998

Issue

The POS received the general list of promotions for a market, which was not filtered by sales channel and did not include sale date ranges. Promotions intended for other channels could therefore appear on the POS.

Fix

The POS now uses a promotions list filtered to the POS sales channel, which includes each promotion's sale date range. Promotions set up only for other channels are no longer returned to the POS.

Testing

1. Suggested: In the Admin Portal, set up one promotion available on the POS channel and another available only on a different channel, in the same market.

2. Suggested: On a POS device, open the promotions list for that market.

3. Suggested: Check that only the POS promotion is listed and the other-channel promotion does not appear.

Scanning

Redemption and attendance

Redeeming large group bookings is more reliable

Jira: PO-1810

Issue

When a very large order was redeemed in one go, the redemption succeeded, but some ticket and redemption records used for reporting could fail to save, and other ticket operations could be slowed for around a minute.

Fix

Ticket and redemption records for reporting are now saved in batches rather than one at a time, so redeeming a large order puts much less load on the system. If a batch fails to save, each ticket is retried individually. There is no change to how redemption is carried out.

Testing

1. Create an order, then in the Reservations Portal build a report on the tickets data source and check that the new tickets appear with the correct price and booking reference.

2. Redeem a group booking in one go using group check-in on the scanner. Check that the tickets show as redeemed and that the redemptions appear in the tickets data source with the correct scan time, user and location.

3. Cancel an order and check that its tickets show as invalidated in the tickets data source.

4. Records are written shortly after each action, so allow a few seconds and refresh before checking.

API and Integrations

Public API

Order updates imported through the API now skip cancelled items

Jira: CORE-8980 | FD: 5304

Issue

When an external system sent an order update through the API that included changes to an item already cancelled, the whole update failed with a server error and was retried repeatedly.

Fix

Changes to items that are cancelled, being cancelled or abandoned are now skipped, and the rest of the update is applied. If nothing in the update can be applied, the API returns a clear validation error naming the affected items. Cancelled items and their cancellation fees are no longer altered by these updates.

Testing

1. Suggested: Create a return booking and cancel one leg in the Reservations Portal.

2. Suggested: Send an order update through the API that changes both legs.

3. Suggested: Check that only the active leg is updated and the cancelled leg, including its cancellation fee, is unchanged.

Combo capacity tiers kept when orders are amended through the order import

Jira: PO-1800

Issue

When an order that included a combo was amended through the order import (used by external booking systems), the tickets lost the capacity tier that the combo had applied. Some tickets were counted against the standard product's tier instead, and tickets whose tier existed only on the combo were not counted against any tier, so tier availability could drift.

Fix

When a combo is carried forward on an imported amendment, the tickets now keep the capacity tiers committed with the combo, including tiers configured only on the combo. If an imported amendment would leave a ticket without its capacity tier being counted, the amendment is now rejected with an error and the order is left unchanged, rather than being saved with incorrect tier counts. Cart and POS amendments, new orders and imported amendments of orders without capacity tiers are unchanged.

Testing

1. Place an order for a product with capacity tiers where a combo applies, and check in the Reservations Portal that the tickets use the combo's capacity tier.

2. Amend the order through the order import, for example by changing a quantity or time.

3. Check that the combo is still on the order and the tickets still use the combo's capacity tier.

4. Suggested: Amend the order through the order import a second time and check that the capacity tier stays the same.

5. Suggested: On an order without a combo, attempt an imported amendment to a quantity above the tier limit and check that the amendment is rejected and the order is unchanged.

Order updates imported through the API no longer fail after a timetable change

Jira: CORE-8982 | FD: 5302

Issue

Order updates sent through the API could fail with an 'unable to identify instance' error when an unchanged leg's departure had since been retimed or removed from the timetable, or when a cancelled duplicate departure existed at the same date and time.

Fix

When an update repeats a leg's date and time unchanged, the booking keeps its original departure instead of looking it up again. When a changed leg matches both an active and a cancelled departure at the same time, the active departure is used. Updates to departures that have genuinely been removed are still rejected.

Testing

1. Suggested: Take an existing order whose outbound departure has since been retimed in the timetable.

2. Suggested: Send an order update through the API that repeats the outbound leg's original date and time and changes only the return leg.

3. Suggested: Check that the update is accepted and the outbound leg is unchanged.

Order updates through the API no longer rejected for older bookings on capacity tiers

Jira: CORE-9043 | FD: 5568

Issue

Some order updates sent through the order import API, such as amendments and check-ins from an external system, were rejected with a capacity tier error. This affected older bookings where the capacity tier had been paid for but never recorded as used when the booking was made.

Fix

These updates are now accepted. Updates are still rejected where a booking previously used a capacity tier and the update would lose it.

Testing

1. Suggested: Send an amendment through the order import API for an older booking whose capacity tier was paid for but never recorded as used; it should be accepted.

2. Suggested: Send an amendment for a booking that has used a capacity tier where the update would lose that tier (for example increasing the quantity on a full tier); it should still be rejected.

Order updates sent through the order import API are no longer rejected on capacity tier checks

Jira: CORE-9057, CORE-9080

Issue

Routine order updates sent from an external system through the order import API, such as check-ins or amendments made after departure, could be rejected because a capacity tier could no longer be applied to the booking. This left the booking in Expian out of step with the external system.

Fix

Imported orders and amendments now always keep the capacity tier selected for each ticket, in the same way imports already bypass capacity limits. Imported updates are no longer rejected on capacity tier checks, and tier counts in the Admin Portal can now show as oversold after imports. Bookings made through the booking portals and regular amendments still respect tier availability.

Testing

1. Suggested: Send an order update through the order import API that repeats the current quantities of an existing booking. The update is accepted.

2. Suggested: Send an imported amendment that increases a quantity beyond a tier's remaining space. The update is accepted and the tier shows as oversold in the Admin Portal.

3. Book the same product and departure in the B2C Booking Portal when the tier is full. The time slot is not available.

4. Make a regular amendment in the Reservations Portal. Behaviour is unchanged.

Market searches with an unrecognised market now return a not-found error

Jira: none

Issue

A market search using a market identifier that did not exactly match, for example with different capitalisation, returned a general server error.

Fix

These searches now return a clear not-found error, so integrations can tell that the market identifier is wrong.

Testing

1. Suggested: Using the public API, run a market search with a market identifier that does not exist, or with its capitalisation changed: the response should be a not-found error, not a server error.

2. Suggested: Repeat with the correct market identifier: results should be returned as before.

Third-party integrations

Gift Aid pop-up events now sent to Google Tag Manager

Jira: EXN-101

Issue

The Gift Aid pop-up in the booking portal was not sending its tracking events to Google Tag Manager, so venues could not see how customers responded to it.

Fix

The Gift Aid pop-up now sends a "pop_up" event of type "gift_aid" when it appears, when the customer accepts or declines, and when the decline confirmation step appears.

Testing

1. Open Google Tag Manager preview mode for the booking portal.

2. Book a product with Gift Aid and wait for the Gift Aid pop-up: a pop_up event with action "appear" is recorded.

3. Accept Gift Aid: an event with action "yes" is recorded.

4. Repeat, decline Gift Aid: an event with action "appear-confirm-decline" is recorded when the decline confirmation appears, and "no" when the decline is confirmed.

Platform

Security

Card reader connection requests from POS now require a signed-in device

Jira: EXN-36

Issue

A request used by POS to connect to card readers did not check that it came from a signed-in POS device.

Fix

This request now requires a valid POS sign-in, in line with other POS requests. The POS app already sends its sign-in with this request, so card payments and refunds on POS work as before.

Testing

1. Sign in to the POS app, take a card payment and confirm the card reader connects and the order is created.

2. Refund a card payment on POS and confirm it completes.

Infrastructure

Tighter access controls on internal message processing

Jira: DEVOPS-676

Issue

Access permissions on the internal queues that pass work to email sending, report generation and webhook replay were broader than needed.

Fix

These permissions have been restricted so that only the Expian services that need each queue can use it, and only for the actions they need. Emails, reports and webhook replays continue to work as before. There is no change to day-to-day use.

Testing

1. Suggested: Place a test order and confirm the confirmation email arrives as before.

2. Suggested: Run a report from the reports screen and confirm it is generated as before.

Removal of an unused internal tool

Jira: DEVOPS-675

Issue

An unused internal tool for starting and stopping Expian demonstration environments did not meet current security standards.

Fix

The tool has been removed. It was not part of client environments. There is no change to day-to-day use.

Direct reporting database connections recover after reporting database maintenance

Jira: DEVOPS-602

Issue

For clients connecting their own reporting tools directly to the reporting database, the connection could stop working after the reporting database was changed during maintenance, and did not come back after the connecting server restarted.

Fix

The connection service now picks up changes to the reporting database automatically and starts again after a restart. There is no change to day-to-day use.

Infrastructure updates can now be deployed through the standard release process

Jira: DEVOPS-553

Issue

Updates to the underlying hosting infrastructure had to be applied to each environment manually.

Fix

Infrastructure updates can now be deployed as part of the standard release process for existing environments. For now this is switched on per deployment while environments are brought into line. There is no change to day-to-day use.

Dedicated environment for testing urgent fixes

Jira: DEVOPS-616, DEVOPS-618

Issue

Testing an urgent fix could require changes to a client's own test environment while it was in use for other testing.

Fix

A separate shared test environment, with its own deployment process, is now available for checking urgent fixes before release, so a client's own test environment does not need to be changed. There is no change to day-to-day use.

Private network connections to the reporting database

Jira: DEVOPS-622

Issue

Connecting to the reporting database from another cloud account required a site-to-site VPN.

Fix

An optional private network connection to the reporting database is now available on request, including from other regions. Connection requests must be approved by Expian before they work. There is no change to day-to-day use.

More reliable refresh of test environments

Jira: DEVOPS-619, DEVOPS-641, DEVOPS-663, DEVOPS-672

Issue

Refreshing a test environment with current product set-up from the live system was a manual process.

Fix

Expian now has a controlled process for refreshing non-production test environments with the product set-up from the live system, with the option to keep existing staff sign-ins. It cannot be run against live environments. There is no change to day-to-day use.

Platform monitoring rules standardised

Jira: DEVOPS-523

Issue

Platform monitoring and alerting rules were set up separately for each environment.

Fix

Older environment-specific monitoring rules have been retired as part of a move to a single standard set of monitoring applied across all environments. There is no change to day-to-day use.

Shorter upgrade windows for large data updates

Jira: DEVOPS-659

Issue

Some large data updates had to finish before an upgrade could complete, which could hold up the upgrade for a long time.

Fix

Large background data updates can now run after an upgrade has completed, in small batches, so they no longer hold up the upgrade and are designed to avoid blocking the live system while they run. There is no change to day-to-day use.

Migrations

Eight migrations ship, including automatic repairs of promotion conditions (CORE-8928, V3-387), a wallet visibility flag (EXN-63), a product promo service date backfill (EXN-223), a partner voucher claim table and a guest order linking index. The theme paragraph mentions them as a deployment consideration without naming them.

Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article