Package Design
Create multi-service packages that bundle accommodation, activities, spa, and other services into a single bookable product with flexible pricing and cross-business-unit revenue allocation.
Common Tasks
How to Create a Package (New Package, Build Package)
Create a new reservation package that bundles multiple services from one or more business units into a single product guests can book.
- Go to Packages in the left sidebar (under Reservations)
- Click New Package
- Fill in the package details:
- Name — e.g. "7-Night Dive Safari"
- Description — what the package includes
- Package Type — category label (e.g. Standard, Luxury)
- Currency — primary currency for pricing
- Set the Pricing Mode (see Key Concepts below for details):
- Fixed — flat price per guest regardless of component costs
- Dynamic — sum of component costs minus an optional discount
- Duration-Scaled — per-night rate that decreases for longer stays
- Enter the Package Price (used by Fixed mode; Dynamic calculates from components)
- Set guest and night constraints: Min Guests, Max Guests, Min Nights, Max Nights
- Optionally set Valid From and Valid To dates for seasonal packages
- Click Save to create the package in Draft status
Result: The package is created in Draft status. You can now add components and configure pricing before activating it.
How to Add Components to a Package (Add Service, Add Activity)
Components are the individual services that make up a package — rooms, dive trips, meals, spa treatments, etc. Each component belongs to a specific business unit.
- Open the package in the Package Builder
- In the Components section, click Add Component
- A Service Picker opens — select a business unit, then pick a service
- The component is added with default values from the service (price, pricing model)
- Configure the component:
- Display Name — override the service name for this package context
- Component Price — the unit price for this component
- Quantity — default quantity (e.g. 2 rooms, 1 activity)
- Day Offset — which day of the stay this component starts (Day 0 = arrival)
- Duration — how many days this component spans (leave empty to span the full stay)
- Required — whether this component is mandatory
- Customizable — whether the guest can modify dates, quantity, or resources at booking
- Drag components to reorder them using the drag handle on the left
Result: The component appears in the package builder with a pricing hint showing the calculated cost (e.g. "$100/night x 2 rooms x 3 nights = $600").
How to Set Up a Repeats-Daily Component (Daily Breakfast, Daily Cleaning)
Some services repeat every day of the stay — breakfast, room cleaning, daily activity passes. Use the Repeats Daily toggle to create one booking per day automatically.
- Add the service as a component (see above)
- Enable the Repeats Daily toggle on the component row
- Optionally set Day Offset to start the repetition from a specific day (e.g. offset 1 to skip the arrival day)
- Optionally set Duration to limit how many days it repeats (leave empty to repeat for the entire stay from the offset)
Result: When the package is booked, the system creates one reservation item per day for this component. For a 5-night stay with offset 0 and no duration limit, it creates 5 separate bookings. Revenue is split evenly across the days.
Note: The repeat day count is calculated as: if Duration is set, min(duration, nightCount - offset); otherwise nightCount - offset. A component at offset 2 in a 5-night stay repeats for 3 days.
How to Add Modifiers to a Component (Meal Plan, Equipment Upgrade)
Components can have modifiers that adjust pricing — meal plans for accommodation, equipment upgrades for activities, etc. Modifiers can be pre-selected (locked into the package) or marked as guest-choice (selected by the guest at booking time).
- In the component row, click the modifier picker (tags icon)
- Available modifier groups for that service are listed (e.g. "Meal Plan", "Equipment")
- Select an option from each group you want to include
- For each selected modifier, choose:
- Pre-selected — this option is locked into the package; the guest gets it automatically and it affects the package price calculation
- Guest Choice — the guest picks from available options during the reservation wizard; the price adjusts based on their choice
Result: Pre-selected modifiers are included in the package price calculation. Guest-choice modifiers appear in the Package Customization step of the reservation wizard.
How to Configure Revenue Allocation (Cross-BU Packages)
When a package contains services from multiple business units (e.g. hotel rooms from BU-A and dive trips from BU-B), configure how the package revenue is split.
- In the package builder, find the Revenue Allocation section
- Select the allocation method:
- Proportional — revenue is split based on each component's base price (or custom allocation weight). If a room is 60% of the cost and activities are 40%, revenue splits 60/40
- Transfer Price — non-primary BUs receive a fixed transfer price; the primary BU absorbs the difference. Useful when subsidiary costs are known
- For Transfer Price mode, set the Primary BU (the BU that receives the remainder) and a Transfer Price on each non-primary component
- For Proportional mode, optionally set a custom Allocation Weight on components to override the default (base price weighting)
Result: When the package is booked, journal entries automatically split revenue across business units using the configured method. Inter-BU settlements are created for the appropriate amounts.
How to Activate a Package (Publish Package, Go Live)
Packages start in Draft status and must be activated before they appear in the reservation wizard.
- Open the package in the Package Builder
- Ensure at least one component is added
- For Duration-Scaled packages, ensure Min Nights is set (validation will block activation otherwise)
- Click Activate
Result: The package status changes to Active and it becomes available for booking in the reservation wizard.
How to Duplicate a Package (Clone Package, Copy Package)
Create a copy of an existing package to use as a starting point for a variation (e.g. seasonal pricing, different guest tier).
- Go to Packages and find the package to duplicate
- Click Duplicate (or the duplicate icon in the actions menu)
- Optionally enter a New Name
- The duplicate is created in Draft status with all components copied
Result: A new Draft package is created with the same components and pricing configuration. Edit and activate when ready.
How to Archive a Package (Retire Package, Deactivate)
Remove a package from the booking catalog without deleting it. Archived packages are preserved for historical reporting.
- Open the package
- Click Archive
Result: The package status changes to Archived. It no longer appears in the reservation wizard but existing reservations using it are unaffected.
Note: A package with existing reservation applications cannot be deleted, only archived.
Key Concepts
Package Lifecycle (Draft, Active, Archived)
Packages have three statuses:
- Draft — initial state; editable, not bookable. Add and configure components here
- Active — published and available in the reservation wizard. Can be edited and re-saved
- Archived — removed from booking, preserved for reporting. Existing bookings are unaffected
Pricing Modes
The pricing mode determines how the final package price is calculated from the components:
- Fixed — the package has a flat price per guest, regardless of individual component costs. Set the Package Price field; this is multiplied by the guest count. Revenue is allocated back to components proportionally. Best for all-inclusive packages where you want a clean advertised price.
- Dynamic — the price is the sum of all component base prices, minus an optional discount. Configure the discount as Percentage (e.g. 10% off the total) or Fixed Amount (e.g. $200 off). The final price adjusts automatically as components change. Best for flexible packages where pricing reflects actual service costs.
- Duration-Scaled — the per-night component rate decreases for longer stays. Each component has a Duration Discount per Day field (e.g. $10/day). The effective unit rate formula is:
max(0, unitPrice - discountPerDay x extraDays)whereextraDays = nightCount - 1. For example, a $100/night room with $10/day discount: Night 1 = $100, Night 2 = $90, Night 3 = $80. Min Nights is required for this mode.
Components and Component Types
Each component links to a service from a specific business unit. Components have these key properties:
- Component Price — the unit price (per night, per person, per session, etc. depending on the service's pricing model)
- Quantity — default quantity (rooms, sessions, equipment units)
- Day Offset — which day the component starts (0 = arrival day)
- Duration — how many days the component spans; empty means it spans to the end of the reservation
- Repeats Daily — creates one booking per day (see task above)
- Required vs Optional — required components are always included; optional ones can be toggled by the guest
- Customizable — allows guest to modify dates, quantity, or resource selection during booking
- Display Order — drag-and-drop ordering in the package builder
Components inherit the pricing model from their service (PerNight, PerPerson, PerDay, PerUnit, Fixed, etc.). The pricing hint in the component row shows a contextual calculation, e.g. "$100/night x 2 rooms x 3 nights = $600" or "$50/person x 4 guests = $200".
Component Date Logic (Offsets and Durations)
Components use relative dates (offsets from reservation start) rather than absolute dates. This makes packages flexible across any booking date range:
- No duration set — the component spans from its offset day to the reservation end date
- Duration set — the component spans from offset day for the specified number of days
- Repeats daily — repeat count =
min(duration, nightCount - offset)if duration is set, otherwisenightCount - offset
Example: A 5-night package with: Room (offset 0, no duration = 5 nights), Dive Trip (offset 1, duration 1 = Day 2 only), Breakfast (offset 0, repeats daily, no duration = 5 days).
Revenue Allocation Methods
When a package spans multiple business units, the package price must be split into revenue for each BU. Two methods are available:
- Proportional — each component's share =
allocationWeight / totalWeight. By default,allocationWeightequals the component's base price, but can be overridden. The last component receives the rounding remainder to ensure the allocations sum exactly to the package price. - Transfer Price — non-primary BUs receive a fixed Transfer Price (or fall back to base price if not set). The Primary BU receives the remainder:
packagePrice - sum(otherBU allocations). This is useful when you know the exact cost to "buy" services from subsidiary BUs.
Revenue allocations flow into the accounting system as journal entries: each BU receives a revenue credit proportional to its allocated share. Inter-BU receivables and payables are created for cross-BU settlements.
Itinerary Timeline
The package builder includes an Itinerary Timeline that visually shows each component mapped to days of the stay. This helps verify that offsets, durations, and repeating components line up correctly. The timeline updates in real time as you add or adjust components.
Package Modifiers (Pre-Selected vs Guest Choice)
Components can include service modifiers in two modes:
- Pre-selected — baked into the package. The modifier's price adjustment is included when calculating the component's base price. The guest cannot change it
- Guest Choice — presented to the guest in the reservation wizard's Package Customization step. The guest picks from available options and the price adjusts accordingly
Modifier adjustments can be Fixed ($) (add a dollar amount to the unit price) or Percentage (%) (add a percentage of the unit price).
Package Availability Checking
Before a package can be booked, the system checks:
- Guest count is within Min Guests / Max Guests
- Night count is within Min Nights / Max Nights
- Current date is within Valid From / Valid To (if set)
- Package status is Active
- Each component has available resources for the requested dates
Component-level availability details are returned with error messages if any component cannot be fulfilled (e.g. "No rooms available for Oct 15-20").
Booking a Package (Reservation Wizard)
How Packages Work in the Reservation Wizard
When creating a reservation, the guest (or staff) can select a package instead of booking individual services:
- In the reservation wizard, on the Services step, select a package from the Packages tab
- The system initializes component bookings from the package definition, calculating dates from the reservation start date and component offsets
- If the package has customizable components or guest-choice modifiers, a Package Customization step appears
- In the customization step, the guest:
- Selects resources for accommodation components (e.g. pick a room)
- Selects time slots for activity or spa components
- Chooses modifier options for guest-choice modifiers (e.g. selects a meal plan)
- The Summary Sidebar shows the package price (from the pricing calculation), savings compared to booking individually, and per-BU allocation breakdown
- On the Review step, all component bookings are shown with their dates, resources, and modifiers
- On confirmation, the system creates reservation items, resource allocations, and journal entries for all components in a single transaction
What Happens When a Package Is Applied
When the reservation is confirmed, the package application service:
- Creates a Package Application record linking the package to the reservation with the final price, discount, and allocation method
- For each component: creates one or more Reservation Items (one per day for repeatsDaily, one otherwise)
- Allocates resources to each item (user-selected or auto-suggested)
- Stores component allocations with the exact revenue split per business unit
- For repeatsDaily components, divides the allocated price evenly across the daily items
- Creates tax calculations and journal entries following the same accounting flow as individual service bookings
Pricing Examples
Fixed Mode Example
Package: "All-Inclusive Week" at $500/guest
Components: Room ($200/night x 7 = $1,400), Breakfast daily ($30 x 7 = $210), 2 Dive Trips ($150 x 2 = $300)
Total base cost: $1,910
Package price: $500 x 2 guests = $1,000
Savings: $910 (47.6%)
Revenue split (Proportional): Hotel BU gets $733 (73.3%), Dive BU gets $267 (26.7%)
Dynamic Mode Example
Package: "Dive & Stay" with 10% discount
Components: Room ($150/night x 5 = $750), 3 Dive Trips ($120 x 3 = $360)
Total base cost: $1,110
Discount: 10% = $111
Package price: $999
Duration-Scaled Mode Example
Package: "Extended Stay" with $15/day discount on room
Room component: $200/night, discount $15/day, minNights = 3
5-night stay (extraDays = 4):
- Effective rate: max(0, $200 - $15 x 4) = $140/night
- Room total: $140 x 5 nights = $700 (vs $1,000 at full price)
Savings: $300 (30%) on the room component alone
Troubleshooting
Cannot Activate Package — "Min Nights Required"
Cause: The package pricing mode is set to Duration-Scaled but Min Nights is not configured.
Fix: Open the package in the Package Builder and set the Min Nights field. Duration-Scaled pricing requires a minimum stay to calculate the discount correctly.
Package Not Showing in Reservation Wizard
Cause: The package is in Draft or Archived status, or the guest/night count does not meet the package constraints, or the booking dates fall outside the validity period.
Fix: Verify the package status is Active. Check that the reservation's guest count and night count fall within the package's min/max constraints. If the package has validity dates, ensure the booking dates are within range.
Component Shows "No Resources Available"
Cause: The service linked to this component has no available resources (rooms, boats, etc.) for the requested dates.
Fix: Go to Service Management and check that the service has resources with Available status. For time-slotted services, verify schedules cover the requested days. Check Room Allocations or the relevant allocation view to ensure the resources are not already booked for those dates.
Revenue Allocation Does Not Sum to Package Price
Cause: Rounding in proportional allocation or misconfigured transfer prices.
Fix: The system assigns rounding remainders to the last component in proportional mode. If using Transfer Price mode, ensure the sum of all transfer prices is less than or equal to the package price; the primary BU absorbs the remainder. If allocations appear incorrect, check the Allocation Weight or Transfer Price values on each component.
Cannot Delete a Package
Cause: The package has existing reservation applications (it has been booked at least once).
Fix: Use Archive instead. Archiving removes the package from the booking catalog while preserving it for historical records and reporting.