Dandelion is an open-source project. View the code on Github

Streamlined Payments and Order Details

Users will now find it even easier to manage their payments and understand their orders. We've introduced GoCardless Instant Bank Pay, providing a convenient new payment method for event purchases that allows for direct bank transfers. You will also clearly see "GoCardless" displayed in your order history and ticket views for transactions made using this method, offering better transparency. Additionally, organisations now have the option to streamline order descriptions by choosing to hide event names, leading to cleaner and potentially more private purchase records.

Enhanced Tools for Event Organisers

Organisers and hosts will benefit from several new controls and interface improvements designed to simplify event management. When duplicating event ticket types, the sales end date will no longer be automatically copied, giving you immediate flexibility for new event configurations. We’ve also enhanced GoCardless settings, allowing organisations explicit control over monthly donation capabilities and providing clearer setup instructions with better-organized settings. Furthermore, managing your organisation details is easier as the 'Other services' tab has been logically renamed to 'Analytics', with some less common fields moved to an 'Experimental' section for better clarity and navigation, and you can now configure how many events are displayed per page for better browsing.

Improved Event Engagement and Feedback

Your interaction with events and feedback processes has been made more intuitive. Feedback mail links for events will now become visible as soon as an event begins, rather than only after it concludes, ensuring you can provide input promptly. The text for these links will also intelligently update, guiding you whether to "Send feedback mail" or "Resend feedback mail" based on the event's status. Lastly, event question headings have been visually enhanced, making them stand out more clearly and improving the overall readability of event details.

Commits on Jul 24, 2025
eceeaa6

♻️ Refactor payment method checks for improved clarity

Move payment_method? to group related payment methods. Introduce stripe_connect_only? helper method to encapsulate specific Stripe Connect logic. Update donations_to_dandelion? to use the new helper method, simplifying its logic and improving readability.

Commits on Jul 23, 2025
9d5d521

♻️ (models/carousel.rb): Refactor event retrieval logic for clarity

Break down the complex single-line event query into two distinct queries for future and past events. Combine the results and ensure uniqueness.

This improves code readability and maintainability by separating the concerns of fetching future and past events. It also streamlines the process of combining event collections directly rather than through an intermediate ID list.

bbdb5b0

♻️ (models): Improve event description field semantics

Rename 'hide_event_names_from_order_descriptions' to 'use_event_slugs_in_order_descriptions'. The previous name was semantically inverted and less clear.

Update order description logic to use event slugs when the new flag is enabled, providing more meaningful context.

b122e6f

✨ Add option to hide event names from order descriptions

  • Add hide_event_names_from_order_descriptions boolean field to Organisation.
  • Update Order#description to conditionally exclude the event name.

This feature provides organisations with the flexibility to hide event names from order descriptions, which can be beneficial for privacy or to streamline information presented to users.

395b1cf

🐛 (event_duplication.rb): Prevent copying sales end date for duplicated ticket types

Exclude the sales_end attribute when duplicating event ticket types. This ensures that new events created via duplication do not inherit the original event's sales end dates, allowing for proper configuration.

12ae4e3

✨ Display GoCardless payment method in order and ticket views

Add GoCardless specific styling for background and label colors. Display a "GoCardless" label in the orders table and ticket price views when an order is associated with a GoCardless billing request. This provides visual identification for GoCardless transactions. Ensure Coinbase background color is applied with high specificity.

Commits on Jul 21, 2025
26dcdd8

🦺 Add prefix validation for tax_rate_id

Adds a validation rule to ensure tax_rate_id starts with txr_.

This enforces a consistent format for tax rate identifiers, preventing invalid IDs and improving data integrity across events and organisations.

ee67946

♻️ (models/carousel.rb): refactor events to return queryable criteria

The method now plucks event IDs from sub-queries and uses an :id.in query. This ensures a Mongoid::Criteria object is returned, improving efficiency and allowing proper chaining of further queries.

Commits on Jul 20, 2025
57a2d6a

✨ Introduce explicit GoCardless subscriptions toggle

Adds a new gocardless_subscriptions boolean field to the Organisation model. Updates the organisation build form to include this new setting and renames the GoCardless section heading for clarity.

Modifies the event ticket type view to conditionally display GoCardless donation options based on this new setting. Updates the monthly donation sync Rake task to only process organisations with gocardless_subscriptions enabled.

This provides organisations with explicit control over GoCardless monthly donor functionality, separating it from Instant Bank Pay. It ensures subscription-related features and tasks only run when opted in.

Commits on Jul 19, 2025
6693872

✨ (organisations): Add GoCardless webhook secret and setup instructions

  • Introduce gocardless_endpoint_secret field for webhook verification.
  • Separate GoCardless settings into a dedicated card in the build view.
  • Provide clear instructions for GoCardless webhook endpoint setup.
  • Improve UI organization by grouping GoCardless related fields.
  • Update description for gocardless_access_token for clarity.
5f00d4c

🎨 (organisations): Rename 'Other services' tab to 'Analytics'

Rename the 'Other services' tab in the organisation build form to 'Analytics'. This provides a more accurate description as the tab primarily contains analytics-related fields.

Move GoCardless access token, instant bank pay, and Patreon API key fields to the 'Experimental' tab. These fields are less commonly used or experimental, decluttering the 'Analytics' tab and improving logical grouping.

c7fb4a3

🐛 (app/controllers/purchase.rb): connect GoCardless client to production environment

Remove explicit sandbox environment setting from GoCardless client. This ensures the client connects to the production environment by default, preventing hardcoded sandbox connections in production deployments.

097e5df

✨ Introduce GoCardless Instant Bank Pay and gathering payments

Add GoCardless Instant Bank Pay as a new payment method for events. This includes UI elements, JavaScript logic, backend controller integration, and webhook handling for successful payments. This expands payment options for users, offering direct bank transfers.

Introduce a dedicated GatheringsPay controller to centralize payment processing for gatherings. This new controller handles Stripe, Coinbase, and EVM payments, along with their respective webhooks, ensuring robust payment tracking for gatherings.

Refactor the not_found route to consistently serve the HTML error page, simplifying content type handling for 404 responses.

Commits on Jul 16, 2025
4d87b93

⬆️ Upgrade dependencies

Upgrade various Ruby gems to their latest patch versions. This ensures the project benefits from the latest bug fixes, performance improvements, and security updates from upstream.

Specifically: - Upgrade activate-tools from 0.0.23 to 0.0.24. - Upgrade mime-types-data from 3.2025.0701 to 3.2025.0708. - Upgrade tilt from 2.6.0 to 2.6.1.

Commits on Jul 15, 2025
b53e4fd

🐛 Fix Event#started? logic and feedback email link visibility

The Event#started? method incorrectly checked if an event had begun. It now correctly determines if the current date is on or after the event's start time.

This allows feedback email links to appear as soon as an event starts, rather than only after it finishes. The link text also adapts to the event's state, showing "Send feedback email" for started events and "Resend feedback email" for finished ones.

dc6c871

📝 Update feedback email body description Add guidance to include a feedback URL in the email body.

Commits on Jul 11, 2025
92042c8

🐛 Handle missing account for order and ticket notifications

Prevent NoMethodError when an order's account is nil in the orders controller. Ensure that ticket notifications are only sent if an account is present. This improves the robustness of the application by gracefully handling scenarios where an associated account might be missing.

4f13910

🐛 (stripe_charge.rb): Add guard clause for nil application fee

Add a guard clause to the ticket_revenue_to_revenue_sharer method. This ensures that if application_fee_amount is nil, the method returns Money.new(0, currency) immediately. Prevents potential errors when application_fee_amount is not set, making the calculation more robust.

79cd37a

🐛 Fix revenue calculation for zero application fees and balance

Previously, revenue calculation methods incorrectly returned zero when both application_fee_amount and balance were zero. This happened because the conditional check balance > 0 && application_fee_amount_money > 0 evaluated to false, leading to a zero fallback.

This commit introduces a specific handling for the application_fee_amount == 0 && balance == 0 case. Now, in this scenario, the methods correctly return the base revenue or donation amount instead of zero, ensuring accurate reporting.

f802b4c

🐛 Fix calculation for zero application fees

Removed redundant && application_fee_amount > 0 from if conditions. The previous condition caused calculations to fall into the else block when application_fee_amount was 0. This was incorrect as the else block is intended for cases where no application fee mechanism is present. The updated condition if application_fee_amount ensures that if an application fee exists (even if its value is zero), the fee-based calculation path is taken. The subsequent check application_fee_amount_money > 0 within the ternary operator then correctly yields Money.new(0, currency) when the fee amount is zero, preventing miscalculations and ensuring accurate revenue reporting.

Commits on Jul 08, 2025
3adab12

🎨 (Gemfile): Reorganize gem declarations for better categorization

Moves the crawler_detect gem from the "Everything else" section to the "Rack" section. This improves the logical grouping and readability of the Gemfile by placing related gems together.

97882de

🎨

💡 Refactor Gemfile for clarity and remove matrix gem

Move maxmind-geoip2 to the main dependency list. Add comments to utility gems to explain their purpose. Remove matrix gem as it is no longer a required dependency.

Commits on Jul 07, 2025
7eaead9

🐛 (delayed_job_error_notifications.rb): Send full error string to Honeybadger context

The last_error is now passed directly to Honeybadger's context without splitting it by newlines. This ensures that the complete error message, including any multi-line details or backtraces, is preserved and sent for more comprehensive error reporting and debugging.

e531c54

♻️ Move Stripe webhook URL definition to respective models

Move the stripe_webhook_url method from the StripeWebhooks concern to the Gathering and Organisation models.

This removes conditional logic from the shared concern, making the webhook URL definition explicit within each model. It improves code clarity and adheres better to the Single Responsibility Principle.

c2dd4f6

🐛 (belongs_to_without_parent_validation): Validate in-memory parent

Add check for in-memory parent object before querying the database. This ensures validations pass for unsaved associated records, particularly with nested attributes, by recognizing objects present in memory. It also reduces unnecessary database queries.

42eeba3

♻️
🔥 Remove DandelionModel and inline Mongoid concerns

Removed the DandelionModel base class. Inlined Mongoid::Document, Mongoid::Timestamps, and BelongsToWithoutParentValidation modules directly into all models that previously inherited from it. This simplifies the model inheritance hierarchy, making each model's dependencies explicit and reducing an unnecessary layer of abstraction.

35084c3

🎨 (dandelion_model.rb): Automate Mongoid collection naming for subclasses

Remove self.abstract_class = true as it is not applicable to Mongoid. Implement an inherited hook to automatically set the MongoDB collection name for subclasses. This ensures that all models inheriting from DandelionModel will have their collection name derived from their class name, reducing boilerplate and enforcing a consistent naming convention.

d8820dd

🏗️ (dandelion_model.rb): Mark DandelionModel as an abstract class

Prevents direct instantiation of the base model. Ensures it serves solely as a parent for other models.

cbb0241

✨ (models): introduce DandelionModel as a base class for Mongoid models
✨ (models): introduce BelongsToWithoutParentValidation concern to skip parent validation
♻️ (models): refactor models to inherit from DandelionModel and use new belongs_to
⬆️ (Gemfile): update Mongoid gem to allow newer versions

Commits on Jul 06, 2025
bc212b6

♻️ perf(event_boost_bid): index event association for performance

Adding an index to the event_id field improves query performance when looking up EventBoostBid records by their associated event.

Commits on Jul 05, 2025
b9ccfd3

✨ (organisations/_events.erb): Make event pagination per_page configurable

The per_page option for event pagination now accepts a params[:per_page] value. This provides greater flexibility for users to control the number of events displayed on a page, overriding the default of 20.

Commits on Jul 03, 2025
292d2de

♻️ Refactor event feedback associations and view logic

Removes the direct 'activity_id' association from EventFeedback and related callbacks. EventFeedback is now implicitly linked to an Activity through its Event, simplifying the data model and reducing redundancy. This eliminates the need for manual 'activity_id' updates and ensures data consistency.

Also removes the 'unscoped: true' local variable from event feedback partials and the corresponding 'unscoped' check within the partial. The responsibility for providing scoped or unscoped feedback collections is now solely with the calling controller or model, simplifying view logic.

Commits on Jul 02, 2025
bce9fd4

🎨 (events): Use h4 for question headings

Change label tag to h4 for questions prefixed with '#'. This improves the semantic structure and visual hierarchy. Questions now appear as distinct headings, enhancing readability.

Mapplication