Release 2.4.0 of pretix

Feb. 4, 2019

Today, we are releasing the next monthly release of pretix. pretix 2.4 includes lots of improvements around cancellations and refunds, but also many tiny and large user interface details you've been waiting for. Big thanks go out to Alexander Schwartz, Alexey Zh, Alvaro Enrique Ruano, amefad, bastardop, Bruno Damasceno Martins, Guillaume Petit, Lorhan Sohaky, Lukas Bockstaller, Maarten van den Berg, Pepi Zawodsky, sohalt, Thomas Schüßler, and Tobias Kunze who contributed to this release. ❤️

pretix 2.4.0 is now available for installation via pip. The new docker images will appear on Docker Hub over the next few hours. All customers of pretix Hosted are already using the new version and do not need to take any action.

Changes to cancellations and refunds

With this update, we bring a number of improvements on the topic of cancelling and refunding orders.

Most importantly, it is now possible to charge a cancellation fee when cancelling a paid order, i.e. you can now properly keep part of the ticket price in case of a refund without pretix warning you about overpaid orders.

In addition, we've implemented optional self-service refunds, i.e. you can now tell pretix that your tickets may be refunded until a certain date subject to a certain cancellation fee and users will be able to perform these refunds without any intervention from your side.

Starting in version 2.4 pretix no longer differentiates between the order states "refunded" and "canceled". Before, an order was "refunded" if it was previously paid and "canceled", if it was never fully paid. Now that pretix is able to recognize individual payments and refunds on their own, this distinction did no longer make much sense: All orders go to "canceled" state when they are no longer valid.

Additionally, when a position is removed from an order, it is no longer deleted but instead canceled individually.

Availability in event list

If you sell lots of popular events, pretix can now finally show which ones are sold out and which ones aren't right in the event overview or calendar, making navigating your events a much less frustrating experience for users. In the attempt to strike a compromise between loading time of the page and accuracy of the information, we opted for a solution that allows for these values to be out of date for up to two minutes, with a tendency to show an available state if the event is sold out instead of the other way around (making sure people click and buy if quota just became available). Also, this feature can be turned off on organizer level if it is too much of a performance burden for you.

ZUGFeRD invoices

If you're selling inside Germany, you might have heard of ZUGFeRD, a German standard to embed structured information into invoices. It works by attaching a machine-readable XML file with invoice information to the human-readable PDF file, thus making it easier to process the invoice both in the seller's and the buyer's accounting process. With pretix-zugferd we are proud to present a plugin for pretix that allows you to generate ZUGFeRD-compatible invoices automatically for your attendees.

HubSpot tracking

Our pretix-tracking module now allows you to specify a HubSpot Portal ID which will then include a HubSpot tracking snippet in the ticket shop. If you run marketing campaigns for your event through HubSpot, this will make it easier for you to take them to a new level.

If you are interested, we published a blogpost with some technical background on how we protect user data from trackers.

Smaller changes and bugfixes

  • A new export has been added to provide raw invoice data and the order data export has been extended to provide order position data.

  • If a quota is unavailable due to blocking vouchers or a waiting list, the frontend now shows "sold out" instead of "reserved", because users should not expect tickets becoming available again any time soon.

  • Product pictures are now shown for add-on products.

  • It is now possible to exclude products from ticket and badge generation explicitly.

  • Tickets and badges can now be downloaded directly from the backend.

  • A custom text can now be set to be shown above the payment method choice.

  • Organizer accounts now can set custom favicons.

  • The list of orders was optimized to load faster on large datasets, especially with a MySQL database.

  • It is now possible to rename the public name of the "bank transfer" payment method, e.g. to "payment by invoice".

  • Invoices now show the total nuber of pages next to the page number.

  • A crash was fixed that occurred when marking an expired order as paid.

  • The list of plugins in the event settings is now sorted alphabetically.

  • A possible race condition in the Stripe plugin has been fixed that lead to payments not being logged correctly.

  • Avoid creating unnecessary payment objects in some cases.

  • If only one add-on is available for selection, a redundant text explaining the choice has been removed.

  • The list of dates of an event series in the backend can now be filtered by date.

  • The design of login and error pages has been modernized.

  • You can now use the date and time of printing in all PDF layouts (tickets, badges, certificates).

  • When choosing an event to copy settings from, the events are now shown with dates.

  • Tax rates are now shown without decimal places if they are integers. Inconsistent number formatting in the widget has been fixed.

  • The widget now follows redirects, e.g. after an organizer moved to a different domain. This doesn't work in Internet Explorer.

  • Changing orders in the backend has been fixed not to move orders to "pending" state unnecessarily.

  • Support for displaying nice date ranges in Spanish.

  • It is now longer possible to delete vouchers which have bene used in a canceled order.

  • Bugs throughout the login, invite and passwort reset views have been fixed that resulted from e-mail addresses being treated case-sensitively on some databases.

  • A crash on deleting expired cart positions has been fixed.

  • SMTP submission failures are now logg1ed to the order log. In some cases, email sending is now retried after an error.

  • The language "Dutch (informal)" has been added.

  • The statistics view has been fixed to accomodate for long product names.

  • It is now possible to delete an event that contains active cart positions.

  • A bug has been fixed that lead to empty PDF files being attached to emails.

Updates to official plugins and tools

  • The pretix Enterprise plugin pretix-campaigns has been released in version 1.2.1 to ensure compatibility with pretix 1.4 and to add recent translations.

  • The plugin pretix-cartshare has been released in version 1.5 to fix a minor bug and add recent translations.

  • The pretix Enterprise plugin pretix-certificates has been released in version 1.2.0 to allow disabling certificates for some products and add recent translations.

  • The pretix Enterprise plugin pretix-posbackend has been released in version 1.2.0 to fix a bug during installation.

  • The pretix Enterprise plugin pretix-reports has been released in version 1.2.0 to ensure compatibility with pretix 1.4 and to add recent translations.

  • The pretix Enterprise plugin pretix-resellers has been released in version 1.2.0 to ensure compatibility with pretix 1.4 and to add recent translations.

  • The pretix Enterprise plugin pretix-shipping has been released in version 1.3.0 to allow printing only a cover letter with a packing list.

  • The pretix Enterprise plugin pretix-tracking has been released in version 1.3.0 to integrate HubSpot tracking.

Plugin API changes

  • The new signal pretix.presale.signals.checkout_all_optional has been added.

  • The new signal pretix.control.signals.order_position_buttons has been added.

  • The order status r ("refunded") no longer exists. All those orders are now c ("canceled"). OrderPosition and OrderFee objects have a new canceled property. Accessors like OrderPosition.objects, OrderFee.objects, order.positions, and order.fees have been changed to only return objects with canceled=False, so the behaviour is the same as before. If you require all objects. please use OrderPosition.all, OrderFee.all, order.all_positions, or order.all_fees respectively.

  • LoggedModel.log_action() now enforces the data argument to be a dictionary.

REST API changes

  • The order status r ("refunded") no longer exists. All those orders are now c ("canceled").

  • It is now possible to look up positions within a check-in list by their secret instead of their ID.

Raphael Michel

Raphael is the founder and main developer of pretix. He is passionate about user-friendly, elegant software, and when he's not busy building software for conference organizers, he enjoys co-organizing con​fer​en​ces himself.

Read more blog posts

Any questions?
+49 6221 32177-50 Mo-Fr 09:00-17:00 Uhr