The Brief
Our client operates a booking-based experience business – the kind where customers select a date, choose from a range of add-ons, and complete a purchase that varies in value depending on when they book and what they select. Seasonal pricing is central to how the business runs. Peak periods carry different rates. Promotional windows need to be automated. Add-on pricing needs to reflect the booking date, not a static number set at the product level.
RubyWeb was brought in to solve a specific problem: WooCommerce, WooCommerce Bookings, and WooCommerce Product Add-Ons – in their default configuration – could not support this model. We scoped, built, and delivered a custom WordPress plugin to close that gap entirely.
The Challenge
The core issue was a mismatch between what the platform calculated and what it displayed. WooCommerce Bookings handles the booking logic. WooCommerce Product Add-Ons handles the optional extras. But neither was designed to communicate with each other around dynamic, date-aware pricing rules – and that created a set of compounding problems that affected both the customer experience and the back-end order data.
The business couldn’t automate seasonal pricing reliably. Customers were seeing one price in the cart and being charged another. Order records didn’t reflect the adjusted amounts. Every promotional period required manual intervention to manage – which is not a sustainable operating model for a growing experience business.
- WooCommerce Product Add-Ons had no native support for seasonal pricing based on booking date - prices were static regardless of when a booking was made
- Cart totals were being recalculated correctly by custom logic, but the displayed add-on prices in the cart and at checkout still showed the original base prices - creating customer confusion and trust issues at the point of purchase
- Order metadata and admin order views did not reflect the adjusted seasonal pricing, making fulfilment and reporting unreliable
- Repeated recalculation cycles were causing pricing drift - prices being modified on top of already-modified values rather than from the original baseline
- Different add-on plugins output cart metadata in different structures, meaning a single-approach fix would not cover all cases
- Seasonal promotional pricing had to be managed manually, creating operational overhead and room for error during peak trading periods
Our Approach
We scoped this as a plugin build project, not a configuration exercise. The limitations were architectural – native WooCommerce functionality could not be extended through settings alone. A custom plugin was the right solution, and we designed it to be robust, maintainable, and extensible from the start.
Before writing a line of code, we mapped the full cart processing flow end to end – from the moment a customer selects a booking date and add-ons, through to the order confirmation and admin view. Every point where pricing logic needed to intervene was identified and scoped, so the build addressed the complete problem rather than patching individual symptoms.
We used ACF repeater fields to give site administrators full control over seasonal pricing rules directly from the WordPress admin – no developer involvement required to update rates or add new seasonal windows.
Architecture & UX Decisions
The plugin was built on a snapshot principle to solve the pricing drift problem. Before any seasonal modification occurs, the original add-on prices are captured and stored. All recalculations run against that original snapshot – not against previously modified values. This eliminated the compounding drift issue entirely and made the pricing logic predictable and auditable.
A dedicated display synchronisation layer was built separately from the calculation logic. This was necessary because WooCommerce’s cart rendering and its total calculation run independently – fixing one without fixing the other was what created the original mismatch. The display layer intercepts cart item metadata, rebuilds the add-on display rows, and replaces original prices with seasonal prices at the point of rendering – covering both cart and checkout views.
To handle the metadata structure inconsistency across different add-on plugins, the plugin was built to support multiple metadata formats, resolving against database structures dynamically.
A live AJAX pricing endpoint was also built for the product page itself, so customers see the correct seasonal add-on prices before they even add items to the cart – removing any potential for confusion earlier in the journey.
The Build
The core deliverable was a custom WordPress plugin – built on PHP 8+ and fully integrated with WooCommerce, WooCommerce Bookings, WooCommerce Product Add-Ons, and Advanced Custom Fields.
The full scope of delivery included:
- Custom seasonal rule engine using ACF repeater fields at the product level, supporting override pricing, percentage discounts, and fixed-value discounts
- Booking-date-aware pricing logic extracting booking start timestamps from WooCommerce Bookings cart data with full timezone handling
- Original add-on price snapshot system to prevent recursive recalculation drift
- Full cart recalculation layer covering product totals, add-on totals, cart subtotals, and checkout totals
- Dedicated display synchronisation layer intercepting and rewriting cart and checkout metadata to reflect seasonal pricing visually
- Support for multiple cart metadata structures across different add-on plugin implementations
- Order item metadata updates ensuring admin order views, customer emails, and order history all reflect accurate seasonal pricing
- Frontend AJAX endpoint for live seasonal pricing previews on the product page before cart addition
- Custom debug logger writing to a dedicated log file for ongoing diagnostics and issue resolution
- Full documentation covering the rule structure, pricing modes, cart processing flow, and intended use cases
The Outcome
Seasonal pricing now runs automatically. Customers see the correct price at every stage – on the product page, in the cart, at checkout, and in their order confirmation. The admin order view matches what the customer paid. The operational overhead of managing pricing manually through peak periods has been eliminated.
Specific improvements include:
- Fully automated seasonal pricing for booking add-ons, with no manual intervention required to apply or update rates
- Complete price display consistency across the product page, cart, checkout, and order confirmation – customers are never shown a price that doesn’t match what they are charged
- Accurate order metadata in admin views, customer emails, and order history, giving the business reliable fulfilment and reporting data
- Elimination of pricing drift through the snapshot architecture, making seasonal calculations predictable and auditable
- A rule management interface built into the WordPress admin, giving non-technical team members full control over seasonal pricing windows without developer support
- A scalable plugin architecture with a clear roadmap for future enhancements including multi-currency support, per-person seasonal logic, and a visual pricing matrix editor
The business can now run promotional periods, manage seasonal rate changes, and grow the add-on complexity of its offering – without the platform getting in the way.