Promotions in Booking Wizard

To be Reviewed

End-to-end guide to configuring and scoping promotions through the Booking Wizard flow — supported types, price summary behaviour, new booking stages, modify flow, and current limitations.

Version 12 min read | March 5, 2026 Gallery

Overview

This guide covers how promotions work within the Booking Wizard flow — from Package Search through to Booking Overview and itinerary creation. It is aimed at implementation teams scoping promotions for customers who use Booking Wizard as their primary booking interface.

If you’re working with a customer who wants discounts, promo codes, or automatic pricing adjustments in Booking Wizard, start here. The guide walks through what’s supported today, how the two price summaries differ, what happens at each stage of a new booking, how promotions behave on modify, and where the current gaps are relative to industry expectations.

By the end you should be able to confidently scope a promotions implementation, identify what works out of the box, and flag what needs workarounds or custom development.


Supported Promotion Types

Two promotion types currently work in Booking Wizard:

Standard Promotions (Automatic)

Standard promotions apply automatically when conditions are met. The Booking Wizard reads the promotion assignment on the Package and applies the discount if the booking dates and passenger configuration match the promotion’s eligibility rules.

There is no customer interaction required — the discount appears in the price summary as soon as the conditions are satisfied. This is the most common promotion type for early-bird discounts, seasonal offers, and date-range-based price reductions.

Promo Code Promotions

Promo code promotions require the customer to enter a code during the booking flow. The system validates the code against the promotion record, checks eligibility (dates, passenger configuration, channel), and applies the discount if everything passes.

The promo code input field appears in the Booking Wizard’s price summary panel. The validation happens in real time — the customer sees immediate feedback on whether the code is valid and the updated price.

Free night offers (cheapest / most expensive night)

Promotions can discount the cheapest night or the most expensive night of a multi-night accommodation stay. That only works when the accommodation component creates one itinerary item per night per room — see Free night promotions — setup placeholder at the end of this guide for prerequisites and the space reserved for full configuration steps (pending review).

Discount Calculation Methods

Both promotion types support:

  • Fixed-value discounts — a flat amount deducted from the total (e.g., $200 off)
  • Per-person fixed discounts — a flat amount per passenger (e.g., $50 off per person)

Percentage-based discounts are NOT currently supported in Booking Wizard. This is a known limitation. If a customer requires percentage discounts, see the Opportunities and Gaps section for workaround options.


The Two Price Summaries

This is one of the most important concepts for implementation teams to understand. There are two different price summaries in the customer journey, and they calculate differently.

Package Search Expanded Details

The price summary shown when a customer expands a package in search results is indicative. It is calculated from the Package’s base price plus any automatic promotions that apply at the package level.

This summary:

  • Reflects automatic promotions based on the Package’s promotion assignment
  • Does NOT include promo code discounts (the customer hasn’t entered a code yet)
  • Does NOT account for specific passenger configurations (it uses default assumptions)
  • Is designed for browsing — it gives a ballpark price to help customers compare options

Booking Wizard Price Summary

The price summary inside the Booking Wizard is authoritative. This is the real calculation that includes all applicable promotions — both automatic and promo code — evaluated against the actual passenger and room configuration.

This summary:

  • Includes automatic promotions re-evaluated against the real booking parameters
  • Includes promo code discounts after the customer enters and validates a code
  • Reflects the actual passenger count, room configuration, and dates
  • Is the price that creates the itinerary

Key point: If a customer sees a discounted price in Package Search but a different price in Booking Wizard, it’s usually because the Package Search summary is indicative and doesn’t include all promotion conditions. This is expected behaviour, not a bug. Help customers set expectations around this during implementation.


New Booking Flow

Promotions interact with seven stages of the new booking flow. Understanding what happens at each stage helps when debugging pricing discrepancies or explaining the customer experience.

The customer searches for packages. Automatic promotions are reflected in the search results pricing — packages with active promotions show the discounted indicative price. Promo code promotions are not visible at this stage since there is no mechanism to enter a code in search.

Stage 2: Package Selection

The customer selects a package and sees the expanded details panel. This panel shows the indicative price summary including any automatic discounts from promotions assigned to the Package. The customer uses this to decide whether to proceed into the Booking Wizard.

Stage 3: Booking Wizard Opens

The Booking Wizard initialises with the selected package. At this point the system checks promotion eligibility against the channel configuration and the package’s promotion assignments. The initial price shown reflects automatic promotions but uses default passenger/room assumptions until the customer configures them.

Stage 4: Passenger & Room Configuration

The customer configures passengers and rooms. This is where per-person promotions become dynamic — the discount amount recalculates as passengers are added or removed. The price summary updates in real time to reflect the current configuration.

For per-person fixed discounts, the calculation is straightforward: discount amount × number of eligible passengers. Since promotions apply at the room level, the passenger count within each room drives the calculation.

Stage 5: Promo Code Entry

If the customer has a promo code, they enter it in the input field within the price summary panel. The system validates the code in real time:

  1. Checks the code exists and is active
  2. Validates the code against the channel configuration
  3. Checks date eligibility (booking context date (BCD) and/or travel date windows; BCD is resolved per room — see subsection below)
  4. Checks passenger/room eligibility
  5. If valid, applies the discount and updates the price summary immediately

If the code is invalid or ineligible, the customer sees an error message explaining why.

Stage 6: Price Summary Review

The authoritative price summary now shows all applicable discounts broken down as individual line items. The customer can see:

  • The base package price
  • Each automatic discount applied (with the promotion name)
  • The promo code discount (if applicable)
  • The final total after all discounts

This is the last review point before the customer commits to the booking.

Stage 7: Booking Overview / Itinerary Creation

The booking is created and promotions are written to the itinerary as discount line items. Each applied promotion creates a record linked to the itinerary, preserving the promotion name, discount type, and amount for reporting and downstream processing.


Modifying Existing Bookings

Promotions behave differently depending on type when a booking is modified through the Booking Wizard.

Automatic Promotions

Automatic promotions are re-evaluated on modify. The system checks the updated booking parameters (dates, passengers, rooms) against the promotion’s eligibility conditions. If the booking no longer meets the conditions — for example, the travel dates were changed to fall outside the promotion’s valid date range — the promotion is removed and the price adjusts accordingly.

This means a customer could lose a discount if they modify their booking. Implementation teams should make customers aware of this behaviour.

Promo Code Promotions

Promo code promotions remain applied unless explicitly removed. The code is stored on the itinerary record, and the system preserves the discount through modifications. The customer does not need to re-enter the code.

If the promo code’s eligibility conditions are no longer met after modification (e.g., the travel dates fall outside the code’s valid window), the behaviour depends on configuration — in most cases the discount is preserved to avoid a negative customer experience, but this should be validated during implementation.

Adding Services or Passengers

When services or passengers are added to an existing booking:

  • Per-person promotions may recalculate based on the new passenger count
  • New passengers may trigger additional discount eligibility
  • The promotion amount on the itinerary updates to reflect the new calculation

Room-Level Application

Promotions apply at the room level, not the individual passenger level. This is an important distinction when scoping:

  • A per-person discount calculates per passenger but applies to the room total
  • You cannot apply different promotions to different passengers within the same room
  • If a customer needs passenger-level granularity (e.g., different discounts for adults vs. children in the same room), this is a limitation — see the gaps table below

How the booking context date (BCD) is resolved for eligibility

When re-evaluating promotion eligibility in the Booking Wizard (e.g. on modify or when recalculating), the system does not simply use “the passenger booking date”. It resolves a Booking-Context Date (BCD) per room using the following precedence:

  1. Transfer date → 2. Reinstate date → 3. Booking date → 4. Today’s date

Rule: as soon as at least one passenger in the room has a non-null value at a given precedence level, the BCD is the earliest of those values across all passengers in the room at that level. If no passenger has any of the three stamps (transfer, reinstate, or booking date), the BCD falls back to today’s date.

In other words, the system iterates over the precedence-ordered fields (transfer date, reinstate date, booking date); for the first field that has at least one non-null value across the room’s passengers, it takes the minimum (earliest) of those values as the BCD; if none of the three fields has any value, it uses today.

Resolving BCD for one room (pseudo-algorithm):

# Precedence: ① transferDate → ② reinstateDate → ③ bookingDate → ④ today
# Rule: as soon as a precedence level has ≥1 value, return the earliest of them

for field in [transferDate, reinstateDate, bookingDate]:
    stamps = [p[field] for p in roomPassengers if p[field] is not null]
    if stamps is not empty:
        return MIN(stamps)
return today

Travel Industry Expectations vs Current Limitations

Understanding where Kaptio’s Booking Wizard promotion capabilities align with — and diverge from — standard travel industry expectations helps set the right expectations during scoping.

FeatureIndustry ExpectationKaptio Today
Percentage discountsStandard across most booking platformsNot supported in Booking Wizard
Per-passenger discountsCommon for child/senior pricing tiersRoom-level only — discount calculates per person but applies at room level
Child pricing via promotionsExpected as a promotion typeWorkaround: use child discount on Package pricing, not promotions
Stacking multiple promotionsSometimes needed for loyalty + seasonal offersOne automatic + one promo code per booking
Package Search showing full discountExpected to match final priceIndicative only — authoritative price is in Booking Wizard
Early-bird / last-minute auto-applyCommon across the industrySupported via date-based promotion conditions

Percentage Discounts

The most commonly raised gap. Many travel operators express discounts as percentages (e.g., “15% off”). Booking Wizard currently only supports fixed-value and per-person fixed discounts. The workaround is to calculate the equivalent fixed amount and configure that, but this doesn’t scale well if package prices vary.

Child Pricing

The travel industry typically handles child discounts as a promotion or pricing rule. In Kaptio, the recommended approach is to configure child pricing directly on the Package pricing rather than using promotions. This gives more control and avoids the room-level limitation.

Promotion Stacking

Booking Wizard supports one automatic promotion plus one promo code promotion per booking. If a customer needs more complex stacking (e.g., a loyalty discount plus an early-bird discount plus a promo code), this requires custom development or a redesign of the promotion structure to consolidate into fewer promotions.


Opportunities and Gaps

Use this table during scoping conversations to quickly assess what’s achievable for a customer’s promotion requirements.

AreaStatusScoping Recommendation
Fixed-value discountsSupportedStandard approach — no custom work needed
Per-person fixed discountsSupportedConfigure on the promotion record; calculates per person, applies at room level
Promo code validationSupportedRequires Channel configuration for the promo code to be validated against
Percentage-based discountsGapCustom development required, or workaround with fixed amounts if package prices are uniform
Passenger-level granularityGapUse room-level promotions; handle child pricing via Package configuration instead
Multi-promotion stackingLimitedOne automatic + one promo code per booking; discuss with customer if more complex stacking is needed
Modify flow preservationSupportedPromo codes persist through modifications; automatic promotions re-evaluate against new booking parameters
Date-based auto-applySupportedConfigure promotion conditions with valid date ranges for early-bird or last-minute offers
Channel-specific promotionsSupportedPromotions can be scoped to specific channels via configuration

Scoping tip: When scoping promotions for a new customer, start by mapping their existing promotion types to the supported/gap table above. This quickly identifies what works out of the box vs. what needs workarounds or custom development. Getting this mapping done early avoids surprises later in the project.


Minimum Night Stays

Minimum night stay rules control whether a price or discount applies based on the booking length (allocation). This is configured on pricing records, not on inventory — allocation minimums are a pricing-engine concern.

Where Minimum Night Stays Are Configured

There are two places where allocation minimums can be set:

  1. Directly on the pricing recordItem_Price__c.AllocationMinimum__c is a numeric field (default 0) that specifies the minimum booking length for that price row to be selected. The pricing engine only matches a price if the booking’s allocation meets or exceeds this value. When the field is null it is enforced to 0 on save, meaning the price has no minimum stay restriction.

  2. On a Business Rule linked to a pricing record or discountBusinessRule__c.AllocationMinimum__c is described in the metadata as the “minimum value of allocation to include the Business Rule into the calculation price process.” Business Rules can also set an AllocationMaximum__c, creating an allocation range. When a Business Rule is linked to a price or a discount, the pricing engine evaluates the booking’s allocation against the rule’s range to decide whether that price or discount qualifies.

A pricing record cannot have both a Business Rule assignment and its own AllocationMinimum__c/QuantityMinimum__c values — the system enforces that these two mechanisms are mutually exclusive.

How Allocation Maps to Nights

In the Kaptio data model, “allocation” represents booking length. The Allocation__c field on Itinerary_Item__c is a text value such as “3 Nights” or “5 Days”. A companion formula field (AllocationDays__c) extracts the numeric portion — parsing “3 Nights” to 3 and “5 Days” to 5. When the pricing engine evaluates prices and discounts, it compares the booking’s allocation (this numeric value) against the minimum and maximum thresholds.

Interaction with the Booking Wizard

When a customer configures a booking in the Booking Wizard, the pricing engine runs the allocation check as part of price selection. If the booking length does not meet a price’s allocation minimum, that price row is silently excluded — the engine moves to the next matching price. There is no error message or validation warning shown to the customer. The same applies to discounts: if a discount’s Business Rule specifies an allocation minimum of 3 and the booking is for 2 nights, the discount does not apply and the customer sees the undiscounted price.

This means minimum night stay restrictions are invisible to the customer. They do not see “minimum 3 nights required” — they simply see the pricing that matches their booking configuration. Implementation teams should account for this during scoping: if a customer expects an explicit minimum-stay message in the Booking Wizard, that would require custom development.

Interaction with Promotions and Discounts

This is the key reason minimum night stays are relevant to promotions scoping. Discounts (which power promotions) can have Business Rules attached, and those Business Rules can include allocation range conditions. The DiscountService checks isDiscountAllocationApplicable — evaluating the discount’s Business Rule allocation range against the booking’s allocation — before applying the discount to the price calculation.

In practice this means:

  • A promotion can be configured to only apply for bookings of 3+ nights by linking a Business Rule with AllocationMinimum__c = 3 to the discount
  • A promotion can be restricted to a specific range (e.g., 3–7 nights) using both AllocationMinimum__c and AllocationMaximum__c on the Business Rule
  • If the booking length falls outside the range, the promotion’s discount is excluded from the price calculation — the customer sees no discount line item

The pricing engine sorts matched prices by AllocationMinimum__c descending, so more specific allocation-based prices (higher minimums) take precedence over generic ones. This ordering applies to both direct price minimums and Business Rule–linked prices.

Scoping Considerations

ScenarioApproach
Promotion applies only for 3+ night staysAttach a Business Rule with AllocationMinimum__c = 3 to the discount
Different pricing tiers by stay length (e.g., 1–2 nights vs 3–5 nights vs 6+ nights)Use separate pricing records with appropriate AllocationMinimum__c values, or separate Business Rules
Customer wants an explicit “minimum stay” error messageNot supported out of the box — the pricing engine silently excludes non-matching prices. Custom development required
Promotional pricing for a specific stay range (e.g., 5–7 night packages only)Use a Business Rule with both AllocationMinimum__c and AllocationMaximum__c on the discount

Note: ParameterizedRule is a separate concept — it belongs to the payment schedule engine (deposits, final balance, due dates) and is not related to minimum night stay logic.


Free Night Promotions (Cheapest / Most Expensive Night Free)

This section is a placeholder. Detailed setup instructions are pending review and will be added in a future update.

Free night promotions discount a specific night within a multi-night accommodation stay — either the cheapest night or the most expensive night. To use this promotion type, the accommodation component must have Create Item Per Night Per Room (CreateItineraryItemPerNightPerRoom__c) enabled. The promotion engine needs individual night line items to identify which night to discount. See Package Configuration — Day Range & Night Fields for details on this setting.

Setup steps, eligibility conditions, and worked examples will be documented here once the guide is reviewed.


See Also

Back to Gallery