🐞 Save Sponsor Links of Any Length — No More Failed Submissions

Sponsor websites with long tracking URLs no longer break the form. 🔗 Previously, any sponsor website address longer than 255 characters triggered a server error and the whole sponsor record failed to save.

Why it matters: Marketing and sponsorship teams rely on long UTM and campaign tracking parameters to measure sponsor ROI. Now those links persist exactly as pasted, so you keep your attribution data and avoid re-entering sponsor details after an unexpected error. ✅

  • The sponsor website field now supports long-form URLs, including full tracking and campaign parameters
  • Submitting a sponsor with an extended URL no longer returns a 500 error
  • Existing sponsor records are migrated automatically — nothing to do on your side

🐞 Mass Message Details Now Load Even Without a Filter

Opening a mass message that wasn't targeted with an audience filter no longer breaks the page. 🎯 Instead of hitting an error, the message details now load normally and display an estimated reach of 0.

Previously, viewing a message with no filter applied triggered a server error, blocking organizers from reviewing their communication before sending it. Now the flow stays uninterrupted, so you can keep reviewing and sending messages with confidence. ✅

  • Mass messages without an audience filter now show an estimated reach of 0 instead of returning an error
  • The message detail page loads reliably in every scenario, filtered or not

🐞 Send Test Emails Without Errors — Even When QR Codes Are Missing

Sending a test email from the Massive Messages tool no longer fails when the sample attendee doesn't have a QR code file available. 📧✅

Previously, the mailer tried to attach the example attendee's QR code without first confirming the file existed. That led to an unexpected server error in two common situations: when the sample attendee was an online attendee (who never gets a QR code generated) or when the temporary QR code folder had already been cleaned up by the scheduled file cleaner. On top of that, the resulting error page itself failed to render, leaving you with a confusing dead end instead of a clear message.

Why it matters: Test emails are the last checkpoint before a campaign goes out to thousands of attendees. Now that check always works, so you can preview and validate your messaging with confidence instead of chasing a mysterious error right before sending. ⏱️

  • Missing QR code files are now safely skipped instead of breaking the test email
  • Online attendees (who have no QR code) can be used as the example recipient without issues
  • No more unexpected error screens after the temporary QR code folder is cleaned up
  • Test email delivery remains unaffected for attendees who do have a valid QR code attached 🎟️

🐞 No More Crashes When Opening Bulk Emails for Unavailable Events

Opening the bulk email editor for an event you can no longer access — because it was archived or belongs to another organization — now returns a clean, expected "access denied" response instead of breaking the page. 🛡️

Previously, the email designer tried to load settings for an event that didn't exist, which resulted in a server error and a dead-end screen with no explanation. Now the permission check happens first, so you get clear feedback and can keep working without reloading or contacting support. ⏱️

  • Bulk email screens now correctly return a 403 response when the related event is archived, deleted, or outside your organization
  • Eliminated the server error (500) previously triggered by the email designer when loading a missing event
  • Added automated test coverage to keep this behavior protected in future releases ✅

🐞 Registration Closing Dates Now Work Exactly as You Set Them

Your event's registration end date is now enforced correctly, with no confusing duplicate error messages and no unexpected blocks on draft registrations. 🗓️

Why it matters: Organizers rely on the registration end date to control capacity and planning deadlines. When that date behaves unpredictably, you either lose legitimate sign-ups or spend time chasing attendees who hit errors they shouldn't have seen. This fix removes that uncertainty entirely.

  • ✅ Fixed a double validation that caused the same error to appear twice when an attendee registered near the registration closing date
  • 📝 Draft attendee records are no longer blocked by the registration end date, so incomplete or in-progress registrations can be saved and completed without friction
  • 🧪 Added regression coverage so the registration end date logic stays reliable in future releases

🐞 Group Registrations Always Reach the Confirmation Screen

Group registrations now complete smoothly every time — even when there's no confirmed attendee yet to display in the summary. 🎉

Previously, the group registration success page could fail with a server error (500) when the confirmation summary tried to render without a valid attendee record (for example, when every attendee in the group was still in draft status). Registrants were left staring at an error page, unsure whether their registration had actually gone through. 😟

Why it matters: your attendees get a clear, reliable confirmation at the end of the sign-up flow, which means fewer abandoned registrations, fewer "did it work?" support tickets, and more trust in your event's registration experience. ✅

  • Fixed a 500 error on the group registration success message when no confirmed attendee was available
  • The confirmation summary now renders gracefully, skipping the personalized message instead of breaking the page
  • Added automated test coverage so this edge case stays fixed in future releases 🔒

🐞 Accurate Primary Registrant Data in Session Attendance Exports

Your attendees sessions report now exports the correct primary registrant for every group registration. 🎯

When attendees register as part of a group, each session row needs to point back to the right primary registrant. A mismatch in that reference meant some exported rows showed incorrect or missing primary registrant information, forcing organizers to cross-check their spreadsheets manually before sharing attendance data.

  • ✅ Fixed how the primary registrant is resolved in the attendees sessions Excel export
  • 📊 Session attendance rows now consistently reflect the correct group owner
  • 🧾 No more manual clean-up before sending reports to sponsors, speakers or internal teams

Why it matters: attendance reports are often the final word on who showed up and who paid for them — getting the primary registrant right means your post-event reporting, invoicing and follow-ups are trustworthy from the first export. ⏱️

🐞 Stripe Checkout Now Handles Multiple Payment Sessions Reliably

Attendees who start a Stripe payment, abandon it, and come back to try again will no longer run into stuck or duplicated checkout sessions. 💳 Payments now resolve correctly even when several Stripe sessions exist for the same registration.

This matters because every failed or stuck payment is a registration you might never recover — and a support ticket for your team. Cleaner session handling means fewer abandoned carts and fewer manual reconciliations at the end of the day. ✅

  • Fixed multi-session behavior so a new Stripe checkout attempt no longer conflicts with a previous unfinished one
  • Improved how payment status is synced back from Stripe to the attendee's registration
  • Hardened the payment flow against edge cases where a session expired or was left open in another tab
  • Expanded automated test coverage around Stripe payments to keep these scenarios protected going forward 🧪

🐞 One Invoice Per Attendee, Every Time

Attendees now receive a single, accurate invoice for their registration — no more duplicate invoices showing up for the same person. 🧾✅

Under certain conditions, simultaneous registration or payment events could trigger invoice generation more than once for the same attendee, resulting in duplicate records that had to be reconciled manually. Invoice creation is now serialized per attendee, so only one invoice can ever be generated for a given registration, even when multiple processes run at the same time.

  • Duplicate invoices eliminated: invoice generation is now serialized per attendee, preventing race conditions during high-traffic registration moments 🔒
  • Faster invoice lookups: a new database index on the invoice UUID speeds up retrieval and validation across the platform ⚡
  • Cleaner financial reporting: your invoice totals, exports, and accounting reconciliations now reflect reality without manual cleanup 📊

Why it matters: Duplicate invoices create confusion for attendees and hours of manual reconciliation for your finance team. With this fix, your billing records stay clean and trustworthy from the moment a registration is confirmed.

🐞 Single Sign-On No Longer Breaks on Invalid Language Links

Signing in through SSO now works even when the link contains an unsupported or malformed language code. 🔐🌍

Previously, the SSO flow passed the locale value from the URL straight to the application without validating it. If that value wasn't a language your event actually supports — something that commonly happens with link scanners, email security tools, or manually edited URLs — the request raised an invalid locale error and users hit a 500 error page on /users/sso instead of reaching their event.

Why it matters: attendees and organizers clicking an SSO link can now get in reliably, instead of being blocked at the door by a broken URL parameter that had nothing to do with them. Fewer support tickets, fewer abandoned logins. ✅

  • Unsupported or unrecognized locale values are now rejected safely instead of crashing the request 🛡️
  • The SSO flow correctly falls back to the user's preferred language when the requested one isn't available 🗣️
  • Locale handling is now consistent across the standard and SSO authentication paths 🔄

🐞 Reliable Minimum and Maximum Limits for Workshops

Minimum and maximum workshop limits now behave consistently when configuring an event, so the rules you set are the rules that get enforced during registration. 🎟️

Why it matters: When workshop limits misfire, attendees either over-book sessions or get blocked from ones they should be able to join — and your team ends up fixing registrations by hand. This correction keeps capacity planning accurate from setup through check-in.

  • 🔧 Fixed validation of the minimum and maximum number of workshops an attendee can select.
  • 🌐 Updated the related messages across all supported event languages for clearer, consistent feedback.

🐞 Public Event Calendar No Longer Breaks on Empty Date Filters

The public event calendar widget now handles empty date pickers gracefully instead of failing to load. 📅

Previously, when a visitor opened the calendar without selecting a start or end date, the browser sent an "Invalid Date" value to the API. That unparseable value raised an error and returned a 500 response, leaving your public calendar blank for anyone browsing your events.

Why it matters: your event calendar is often the first thing prospective attendees see — a blank page means lost registrations. Now the calendar always renders, whether or not a date range is applied. 🎯

  • Invalid or empty start_date / end_date parameters are now safely ignored instead of crashing the request
  • The calendar simply returns all upcoming events when no valid date bound is provided
  • Valid date ranges continue to filter exactly as before — no change to existing behavior
  • Added test coverage to prevent this regression from returning

🐞 Create Purchase Items in Any Language — Including CJK and Emoji

Purchase item names and descriptions now accept the full range of Unicode characters, so Japanese, Chinese, Korean, and 4-byte characters like emoji no longer cause creation to fail. 🌏

Previously, these fields were stored using a legacy latin1 encoding, which silently rejected any character outside the Western alphabet. Organizers selling tickets, add-ons, or merchandise to international audiences would hit an error the moment they tried to save an item name in their local script. ✍️

Why it matters: teams running events in Asian markets can now name their purchase items exactly as attendees expect to see them — no transliteration workarounds, no failed saves, and no confusing checkout experiences. 🧾

  • Migrated the purchase_items table to utf8mb4 encoding
  • Full support for CJK characters and 4-byte UTF-8 (including emoji 🎉) in item names and descriptions
  • Existing purchase item data is preserved through the migration

🐞 API Pagination Now Works with Simple Page Parameters

Requests to the API using a simple ?page=1 parameter no longer fail — pagination now accepts both scalar and JSON:API-style page parameters. 🎉

Previously, our pagination logic assumed every request followed the JSON:API convention of page[number] and page[size]. Any integration sending a plain ?page=2 passed a value the handler couldn't interpret, which resulted in an error instead of a response. That meant developers had to rewrite working code just to match an undocumented expectation.

Why it matters: your integrations keep working the way they were written, so you spend less time debugging opaque API errors and more time building. 🚀

  • ✅ ?page=1 and other scalar values are now correctly treated as the page number
  • ✅ Existing page[number] / page[size] hash parameters continue to behave exactly as before — no migration needed
  • ✅ Added test coverage around pagination parameter handling to prevent regressions

🐞 Attendee Updates No Longer Fail on Empty Attachment Fields

Saving or updating an attendee no longer returns an error when a custom attachment field is empty or was already cleared. 🎉

Previously, the system attempted to delete a file that didn't exist, which resulted in a 500 error and blocked the entire save. Now blank attachment data is safely skipped, so attendee records update cleanly every time.

  • ✅ Attendee records with empty custom attachment fields now save without errors
  • 🗑️ Clearing an attachment twice no longer breaks the request
  • 🛡️ Added test coverage to keep this behavior stable going forward

Why it matters: Organizers and attendees can complete registrations and profile edits without hitting unexpected failures, removing a frustrating blocker in the middle of data entry.

🐞 Stripe Payment Statuses Stay Up to Date, Always

Pending Stripe payments now sync reliably, even when an incomplete payment record sneaks into the queue. 💳✅

Previously, a single payment created without a Stripe checkout session ID could crash the entire background job that verifies pending payments. When that happened, every other payment in the batch was left stuck in a pending state — meaning registrations weren't confirmed, and your team had to chase down payment statuses manually.

What changed:

  • ⏭️ Payments missing a Stripe checkout session identifier are now skipped automatically instead of breaking the verification process.
  • 🛡️ The status check returns early for orphaned payment records, so one bad row can no longer stop the whole batch.
  • 🔁 All other pending payments in the same batch continue to be verified and updated as expected.

Why it matters: your attendees get their payment confirmations on time and your finance and operations teams stop spending time reconciling payments that silently stayed pending. 🎯

🐞 Emojis Now Save Correctly in Modules, Speakers, and Leads

You can now use emojis and other special characters 🎉 in module content, speaker profiles, and lead information without running into save errors. Previously, adding a character like 🚀 or certain non-Latin symbols would cause the save to fail with an unexpected error, forcing you to strip your content down to plain text.

Why it matters: Your event content stays on-brand and expressive — no more losing work or rewriting descriptions because a single emoji broke the save. ✨

  • Text fields across app modules, speakers, and leads now fully support 4-byte UTF-8 characters (emojis, extended symbols, and a wider range of international scripts) 🌍
  • Resolved the StatementInvalid error that appeared when saving content containing these characters ✅
  • Existing content is preserved and migrated automatically — no action needed on your side 🔄

🐞 Clearer Response When a Guest Event Isn't Found

Guest pages no longer return a confusing 403 Forbidden error when the related event can't be found. 🎯

Previously, if a guest link pointed to an event that didn't exist (or was no longer available), the guests area tried to read attendee information from a missing event and failed with a misleading permission error. Organizers and guests were left thinking they lacked access, when the real issue was simply a missing event.

Why it matters: fewer false "access denied" reports means less time spent troubleshooting permissions and faster answers for your attendees. 🚀

  • Guest requests for missing events now fail gracefully instead of raising an unexpected error
  • No more misleading 403 responses that suggest a permissions problem
  • Added test coverage to keep this behavior stable going forward ✅

🐞 Test Emails Now Send Reliably, Even for Massive Recipient Lists

Sending a test email from a bulk notification no longer fails when your campaign targets a very large audience. 📧

Previously, requesting a test email triggered a full load of every filtered recipient just to confirm the list wasn't empty — which could exhaust the database's sort memory and cause the request to error out on big events. Now the system only fetches a single sample recipient, and if that lookup still can't complete, the test email is sent anyway without an example recipient.

Why it matters: organizers running large-scale campaigns can preview their emails before hitting send, instead of being blocked at the exact moment the stakes are highest. ✅

  • Test email checks now retrieve a single recipient instead of the entire filtered attendee list
  • Graceful fallback keeps the test email flowing even if the sample lookup fails
  • Added error handling in the bulk notifications email controller for a cleaner, more informative response instead of an unexpected failure 🛡️

🐞 City Lookups No Longer Break on Invalid Regions

Requesting the list of cities for a region that doesn't exist now returns a clear 404 Not Found response instead of failing with a server error. 🗺️

Previously, calling GET /api/v3/countries/:country_id/regions/:region_id/cities with an invalid or placeholder region_id (such as the example value shown in our API docs) caused the endpoint to return a 500 error, making it hard to tell whether the problem was on your side or ours.

Why it matters: integrations can now handle missing regions gracefully with standard error handling, instead of retrying or alerting on what looked like an outage. Fewer false alarms, faster debugging, and a smoother experience when exploring the API. ✅

🐞 Reliable Multi-Session Validation for Activities

Activities now validate multiple sessions correctly at the session level, so misconfigured schedules are caught the moment you save instead of surfacing later as booking errors. 🗓️

Why it matters: Catching session conflicts up front prevents attendees from registering for overlapping or invalid sessions, saving your team from manual clean-up and last-minute schedule fixes on event day. ✅

  • Multi-session rules are now enforced consistently at the activity level, including when activities are created or updated through the API 🔌
  • Clear, localized validation messages so organizers know exactly what to correct — available in English, Spanish, French, German, Arabic and more 🌍

🐞 No More Duplicate Invoice Numbers Under Heavy Traffic

Invoice numbers are now generated one at a time, so every invoice issued for your event gets its own unique, sequential number — even when dozens of attendees are registering and paying at the exact same moment. 🧾

Previously, when two purchases landed at the same instant, the invoice counter could hand out the same number twice, resulting in rejected invoices or duplicated records that had to be reconciled by hand. That's now resolved.

Why it matters: Clean, gap-free invoice sequences are a hard requirement for accounting and tax compliance in most countries. This fix removes an entire class of manual cleanup work for your finance team after high-traffic registration pushes. 💰

  • Invoice sequence increments are now fully serialized, so two concurrent purchases can never claim the same number
  • If a collision is detected at the database level, invoice creation automatically retries and lands on the next available number
  • Applies transparently to all event invoices — no configuration or action required on your side ✅

🐞 Registration No Longer Breaks on Invalid Attendee Type Links

Registration forms now quietly ignore invalid or unrecognized attendee_type values in the URL instead of failing, so attendees always reach a working form. 🎟️

Previously, if a registration link carried a malformed, out-of-range, or copy-pasted attendee type parameter that didn't belong to the event, saving a draft registration could return a server error (500) and stop the sign-up in its tracks. Now the attendee type is only applied once it has been verified as belonging to that specific event — otherwise the system falls back to the default behavior and registration continues normally.

  • ✅ Invalid or junk attendee_type query parameters are ignored instead of triggering an error
  • 🔒 Attendee types are validated against the event before being assigned, preventing cross-event mismatches
  • 💾 Draft registrations save reliably, even from broken or edited links
  • 🧪 Added regression coverage on the public registration flow to keep this from returning

Why it matters: Broken registration links are one of the fastest ways to lose an attendee. This fix means a mistyped or truncated URL shared over email, chat, or social media still leads to a usable form, protecting your conversion rate and saving your team from chasing avoidable support tickets. 🚀

🐞 No More Error Screens When an Export Isn't Ready

Downloading an Excel export that hasn't finished generating now returns a clean 404 page instead of an unexpected application error. 📄

Previously, if an organizer clicked the download link before the export file was actually stored, the system tried to serve a file that didn't exist yet and crashed with a TypeError. That meant a confusing error screen and no clear indication of what went wrong or what to do next. 😬

Why it matters: organizers get a predictable, understandable response instead of a broken page — so they know the export simply isn't ready yet and can retry in a moment, without filing a support ticket or worrying that their data was lost. ✅

  • Requests for exports with no stored file now render the standard 404 page
  • Eliminates the TypeError raised when attempting to send a nil file
  • Added regression test coverage to keep this behavior locked in 🔒

🐞 Meeting Summary Reports Export Reliably Every Time

Exporting the Meetings Summary report no longer leaves you guessing when something goes wrong. 📊 We fixed the error handling behind this report so failed exports are caught, reported clearly in the export modal, and no longer end in a silent or stuck download.

Why it matters: networking reports are often pulled right before a stakeholder meeting or post-event wrap-up — knowing instantly whether your file is ready (or why it isn't) saves you from re-running exports and chasing support. ⏱️

  • Improved error handling across the Meetings Summary Excel export process 🛠️
  • Clearer feedback in the export modal when an export cannot be completed ✅
  • More reliable export flow for networking reports, avoiding stuck or silently failing downloads 🚀

🐞 Resend Emails Without Losing Your Place

Resending a massive message now takes you straight to the editor of the newly duplicated message. 📧

Previously, choosing Resend on a massive message could leave you on a broken or unexpected page because the duplicated message's ID wasn't being passed to the editor. You had to go back to the list and hunt for the copy before you could tweak recipients, subject, or content.

Why it matters: resending a campaign is now a single, uninterrupted flow — click resend, land in the editor, adjust, and send. No backtracking, no guessing which copy is the right one, and less risk of editing (or sending) the wrong message. ✅

  • Resend now redirects correctly to the edit page of the cloned massive message
  • The duplicated message is reliably identified, so no more dead-end redirects
  • Faster follow-up sends for reminders, re-invitations, and campaign repeats 🚀

🐞 Clear Error Message When Deleting an Activity's Last Session

Attempting to delete the last remaining session of an activity now returns a clear, readable validation message instead of failing with a server error. 🎯

Previously, this action triggered a 500 error, leaving organizers with no explanation of what went wrong or why the session couldn't be removed. Now the platform responds with a proper 422 validation response and a human-readable message explaining that an activity must keep at least one session. ✅

Why it matters: organizers no longer hit a dead end when managing sessions — they immediately understand the rule and can adjust their agenda without contacting support or retrying the same failing action. ⏱️

  • Deleting the last session of an activity now returns a proper validation error (422) instead of a server error 🚫
  • The error message is displayed on the activity itself, so it renders correctly in the interface 💬
  • Session management via the API behaves consistently and predictably 🔗

🐞 No More Error Pages When an Attendee Type Is Missing

Opening an attendee type that no longer exists — because it was archived, belongs to another event, or the link was outdated — now takes you straight back to the attendee types list with a clear "not found" message instead of showing a server error page. 🎯

Previously, these links crashed the page, leaving you stuck with no explanation and no way forward except hitting the back button. Now the system handles the situation gracefully, so bookmarked or shared links to removed attendee types never interrupt your workflow. ✅

  • Editing a missing, archived, or cross-event attendee type now redirects to the index page with a friendly not-found notice
  • Viewing groups for a missing attendee type follows the same safe behavior
  • Eliminates unexpected 500 errors caused by outdated or invalid attendee type links 🚀

🐞 Networking Agendas Now Display Your Event Logo Correctly

Your event logo now renders reliably on attendee networking agendas. 🖼️ Previously, the logo could fail to load on the networking agenda page, leaving attendees with a broken image instead of your branding.

Why it matters: the networking agenda is one of the most-viewed pages during an event — attendees check it repeatedly to see who they're meeting and when. A broken logo undercuts your brand at exactly the moment attendees are paying closest attention. ✨

  • Fixed the logo image on attendee networking agendas so it resolves the correct CDN URL before rendering
  • Aligned the networking agenda template with the exhibitor agenda template for consistent, predictable branding across both views
  • No configuration needed — existing events pick up the fix automatically 🎉

🐞 Search Attendees by Company Name — Apostrophes Included

Searching for companies, contacts, or locations while assigning meeting locations now works reliably, even when names contain apostrophes or other special characters. 🔍

Previously, a company like "O'Brien Consulting" or a contact named "D'Angelo" would break the underlying search query and return a server error instead of results — forcing organizers to guess or scroll manually through long lists.

Why it matters: Business conference organizers assigning meeting locations can now trust search to just work, with no dead ends or error pages in the middle of scheduling. ✅

  • Company, contact name, and location filters in the location-assign search now handle apostrophes and special characters correctly
  • Eliminated the 500 error that appeared when searching for names with quotes
  • Search inputs are now safely bound, making the query more robust and secure 🔒

🐞 No More Error Pages When Updating a Missing Exhibitor Attendee

Updating an exhibitor attendee that no longer exists now shows a clear "not found" message instead of crashing with a server error. 🙌

Previously, if an attendee had been deleted, archived, or belonged to a different event, saving changes from the exhibitor area would hit an unexpected error page — leaving exhibitors stuck with no explanation and no way forward.

Why it matters: exhibitors get an immediate, understandable message and can continue working right away, instead of losing their place and reaching out to support to figure out what went wrong. ✅

  • Attendee updates now gracefully handle deleted, archived, or out-of-event records
  • Users are redirected with a friendly not-found alert instead of seeing a 500 error
  • Fewer dead ends and support tickets during busy event days 🎯

🐞 Search Your Mail Lists Without Hitting an Error

Keyword search inside mail lists now returns results reliably instead of failing with a server error. 🔍

Previously, search terms weren't being passed correctly to the database query, which left the keyword placeholder unresolved in the underlying full-text search and caused the request to fail outright. Any attempt to filter a mail list by keyword ended in a 500 error, forcing you to scroll through contacts manually.

Why it matters: finding the right recipients in large mail lists is often the first step before sending a campaign — this fix removes a hard blocker and saves you from manually combing through thousands of records. 📬

  • Mail list keyword search now correctly binds search terms to the query
  • No more server errors when filtering contacts by keyword
  • Search behavior is covered by additional automated tests to prevent regressions ✅

🐞 No More Unexpected Errors When Editing Attendees

Editing an attendee record that no longer exists — or that belongs to a different event — now returns a clean, predictable permission response instead of an unexpected server error. 🛠️

Why it matters: Stale browser tabs, bookmarked links, and duplicated event workflows are everyday realities for busy organizers. Instead of hitting a confusing error page, your team now gets a clear signal and can keep working without interrupting registration management. ✅

  • Access is now validated before the attendee record is read, preventing crashes on missing or cross-event attendee IDs 🔒
  • Attempts to update an attendee that isn't available in the current event context return a proper access-denied response 🚫
  • Added automated test coverage to keep this behavior stable in future releases 🧪

🐞 Bulk Emails No Longer Stop at a Single Bad Contact

Bulk emails with recipient conditions now keep delivering even when one recipient record fails, so a single problematic contact can no longer interrupt an entire send.

Previously, an error on one guest, list member, or exhibitor could abort the whole delivery, leaving part of your audience without the message and no clear indication of what went wrong. Each recipient is now processed independently, so the rest of your campaign goes out as planned. 📬

  • Recipient failures are now isolated in the guests, contact list, and exhibitors sends, the same way they already were for attendees
  • Corrected an inverted failure counter in the exhibitors send, so delivery reports now show accurate sent and failed totals
  • Delivery errors are now recorded so our team can spot and resolve issues faster

Why it matters: Your communications reach the maximum possible audience on the first attempt, and the numbers you see in your delivery summary reflect what actually happened.

💪 Stronger Verification for Wompi Payments

Every Wompi payment status is now confirmed directly with Wompi rather than trusted from the incoming notification. Eventtia takes only the transaction ID from the notification, then reads the authoritative status from Wompi before updating the payment record.

Why it matters: a forged or tampered notification can no longer mark an order as paid, so your registration and ticket revenue is protected from fraudulent approvals — and the payment statuses you see in Eventtia always match what Wompi actually processed. 🔒

  • Payment status is read directly from Wompi as the single source of truth
  • Reference, amount and currency reported by Wompi are checked against the stored payment before any update is applied
  • Transactions that can't be verified are no longer approved
  • No configuration changes required — the safer verification applies automatically to all Wompi payments

🐞 Accurate Birthdate and Event Dates on Attendee Records

Attendee birthdates and event dates now display and save correctly, so the information you see in attendee records matches what was actually submitted.

Date handling issues could previously cause birthdates to be stored or shown incorrectly and event dates to appear in an inconsistent format, which made attendee data harder to trust when filtering, exporting, or reporting.

  • Corrected the birthdate field on attendee records so values are captured and displayed as entered
  • Standardized event date formatting for consistent presentation across attendee data

Why it matters: Clean, reliable date data means fewer manual corrections, more accurate segmentation by age or event timing, and exports you can hand off with confidence. 📅

🐞 Reliable Spam Protection on Your Registration Forms

We fixed an issue in our reCAPTCHA verification service that could cause validation requests to fail unexpectedly, occasionally blocking legitimate attendees from completing a registration or contact form.

Why it matters: reCAPTCHA is the first line of defense against bot submissions and junk registrations. When verification fails, you either lose real registrations or let spam through — both cost you time cleaning up your attendee list. This fix makes sure the check runs correctly every time, so your forms stay open to real people and closed to bots. 🛡️

  • Corrected how verification requests are sent to Google's reCAPTCHA service
  • Improved handling of the verification response so form submissions are validated consistently
  • No action required on your end — the fix applies automatically to all forms already using reCAPTCHA

🔒 Attendee Data Now Protected by Authentication

Action required if you have integrations reading attendee data. The API v2 attendee endpoints now require a valid user token. Calls made without one will no longer return data.

Attendee information retrieved through the API is now accessible only with a valid user token, closing a gap that could expose participant data to unauthenticated requests.

Why it matters: attendee records contain personal details such as names, emails, and registration data. Enforcing authentication ensures only authorized integrations can read them, helping you stay aligned with your organization's privacy and data-protection commitments. 🔒

For your developers:

  • The API v2 attendees list endpoint now requires a valid user token
  • The API v2 attendees search-by endpoint now requires a valid user token
  • Requests without valid credentials are rejected instead of returning attendee data

If you run scripts or integrations against these endpoints, update them to send a valid user token before this release reaches your events.

🛁 Event Descriptions Now Display Clean, Readable Text

Event descriptions in listings and template previews now render as clean plain text instead of exposing raw HTML tags.

Previously, descriptions written with rich text formatting could leak markup such as <p> or into the event item view, making listings look broken and unprofessional to attendees browsing your events. Descriptions are now properly sanitized before display.

  • HTML tags no longer appear in event descriptions shown in event cards and lists
  • Event template previews render descriptions correctly, matching what attendees will see
  • No action required — the fix applies automatically to existing events and templates

Why it matters: your event listings stay polished and trustworthy without organizers having to strip formatting by hand. ✨

🇧🇷 Clearer Brazilian Portuguese Messages for Attendees

Brazilian Portuguese (pt-BR) attendee messages now read naturally, with correct grammar and gender agreement across form labels and validation errors. 🇧🇷

Why it matters: awkward or incorrect wording makes attendees hesitate at the exact moment you need them to complete registration. Accurate, native-sounding error messages tell people precisely what to fix, reducing form abandonment and support requests from your Brazilian audience.

  • Corrected the translation of the Country field for attendees.
  • Fixed grammatical agreement in the Country and City validation message, which now correctly reads "devem ser preenchidos" for this compound field.
  • Adjusted feminine/masculine agreement in attendee field messages so wording matches each field name.
  • Updated global pt-BR wording for consistency across the platform.

No action is required on your side — the improved translations apply automatically to any event or registration form displayed in Brazilian Portuguese.

🐞 Session Attendee Search Now Works for Every Session

Searching for attendees to add to a session no longer fails when the session isn't restricted to specific attendee types. The attendee list now loads reliably, every time. 🎯

Why it matters: organizers building agendas often create sessions open to all attendee types. Previously, those sessions returned an error instead of a searchable attendee list, forcing you to reconfigure the session just to register someone. Now registration flows continue uninterrupted, saving time during high-pressure, on-site check-in and last-minute agenda changes.

  • Fixed the error that appeared when searching attendees for a session with no attendee-type restrictions
  • Those sessions now return the full list of eligible attendees

🤗 Emoji Now Work in Survey Answers

Attendees can now include emoji in their survey responses without the submission failing. Previously, replies containing emoji were rejected outright, which meant lost feedback and confused respondents. 🎉

Why it matters: survey feedback is only useful if it actually reaches you. Emoji are a natural part of how people express sentiment, and blocking them silently cost you responses you never knew were missing.

  • Survey answers now accept emoji, symbols, and a wider range of non-Latin scripts
  • Website survey replies containing emoji save correctly instead of failing
  • Existing survey answers are unaffected — no action needed on your side

🐞Email Buttons Now Display Exactly as You Designed Them

Custom buttons in the email editor now render with the correct width and stay properly contained within their content box — so what you see in the editor is what your attendees receive in their inbox.

Why it matters: misaligned or stretched call-to-action buttons make campaign emails look unpolished and can hurt click-through rates. This fix removes the need to manually tweak layouts or re-send corrected communications.

  • Custom buttons respect their configured width instead of overflowing or collapsing
  • Button content stays correctly aligned inside its container across email templates
  • Editor preview now matches the final rendered email more closely

🐞Calendar Invites Now Read Cleanly on iPhone

Event descriptions in calendar invites (.ics files) no longer display raw HTML tags when opened in Apple Calendar on iPhone, iPad, or Mac. Attendees now see clean, readable event details exactly as you wrote them.

Why it matters: The calendar invite is often the last thing an attendee sees before your event starts. When it arrives full of <p> and tags, key logistics like the venue address, dress code, or join link get buried in markup — and your event looks unpolished before anyone walks in the door. 📱

What changed under the hood:

  • Event descriptions are now sanitized before being written into the .ics file, stripping HTML markup while preserving the intended line breaks and paragraph spacing.
  • Applies to all attendee calendar invites generated by Eventtia, so no action is required on your side — existing events benefit automatically.
  • Rich text formatting entered in the event description editor is converted into plain-text equivalents that every calendar client renders correctly, not just Apple's.

🐞 Attendee Names Now Display Exactly as Entered

Attendee names are no longer auto-formatted, so they appear in the attendee list and in Excel exports exactly as they were registered.

Automatic capitalization rules were altering names that don't follow standard patterns — surnames with apostrophes (O'Brien), prefixes (McDonald, van der Berg), or intentional lowercase spellings were being rewritten. Removing that formatting layer means every attendee sees their name written correctly on your lists, reports, and any downstream document built from them. ✍️

What changed:

  • The attendee index now shows first and last names as originally submitted, with no automatic capitalization applied.
  • Excel exports of attendees preserve the same original spelling, keeping your reports consistent with your registration data.
  • Names containing apostrophes, mixed casing, or special characters are no longer modified.

No action is required on your side — existing attendee records will simply display their original values from now on.

♻️Cloned Events Keep Their Notification Schedules

When you duplicate an event, its pre-event and post-event notifications now carry over with their scheduling intact — no more rebuilding your reminder sequence from scratch on every clone.

Why it matters: teams that run recurring or multi-city events rely on cloning as their starting point. Losing notification timings meant re-entering every reminder by hand, and a missed one meant attendees never got their confirmation or follow-up. This fix removes that manual step and the risk that comes with it. 🔁

  • Notification schedule dates are now correctly recalculated when an event is duplicated, staying aligned with the new event's dates
  • Pre-event and post-event notifications are included in the clone instead of being dropped
  • Added safeguards on the event record to prevent invalid or missing event references from breaking the duplication process

🐞 Smoother Cross-Origin Requests for Embedded Content

We resolved an issue with CORS (Cross-Origin Resource Sharing) handling that could cause certain requests from external domains, including embedded website builder content, to be blocked or behave unexpectedly.

Why it matters: this fix ensures that integrations, embedded widgets, and third-party origins load reliably without unexpected browser errors, saving time troubleshooting and providing a smoother experience for both organizers and attendees.

🔒Password Gate Now Fully Resets Website Sessions

Enabling the password gate on your event website now automatically clears any active visitor session cookies, ensuring the protection takes effect immediately for everyone.

Why it matters: Previously, visitors who had already accessed your site could bypass a newly enabled password gate thanks to their existing session. This fix closes that gap, giving organizers confidence that turning on password protection instantly secures the site for all users — no manual cache clearing or waiting required.

🐞More Reliable Attendee Leads Data

We've resolved an issue affecting the attendee leads API response, ensuring your team gets accurate and complete lead information every time.

This fix means fewer surprises when pulling lead data through integrations or exports — helping sales and event staff follow up on the right contacts without missing a beat.

🐞Your Language Preference Now Sticks Across Sessions

The platform now remembers your preferred language through a dedicated cookie, so you no longer need to reset it every time you log in or switch pages.

Why it matters: Multilingual teams and international users save time and avoid friction by having their chosen language persist reliably across the entire platform. Combined with a new language switcher directly in the navbar, changing languages is now a one-click action that stays applied wherever you go.

  • New cookie-based language preference that persists across sessions
  • Added a language switcher directly in the private navbar for quick access
  • Hardened cookie handling with additional security safeguards