Articles on: Getting Started

RentalTide Pricing Models & Booking Types

RentalTide Pricing Models & Booking Types

A guide to all pricing structures and booking configurations available in RentalTide.


Pricing Models Overview


1. Daily Pricing

Rent by the day with customizable pricing per day of week.


How it works:

  • Customers select start and end dates
  • Price calculated based on number of days
  • Different prices for each day of week (Monday-Sunday)
  • Optional multi-day discounts
  • Optional custom start time selection per day


Configuration:

  • useDayPricing: true
  • dailyPrices: Set price for each day (Monday-Sunday)
  • minimumDays: Minimum rental length (e.g., 1)
  • maximumDays: Maximum rental length (e.g., 30)
  • multiDayDiscounts: Array of { days, discount } (e.g., 3+ days = 10% off)
  • allowDailyStartTimeSelection: Enable custom start times
  • dailyStartTimes: Available start times per day


Example Use Cases:

  • Multi-day boat rentals
  • Equipment rentals by the day
  • Storage rentals
  • Vacation rentals



2. Hourly Pricing

Rent by the hour with flexible duration options.


How it works:

  • Customers select date, start time, and duration
  • Price calculated based on hours booked
  • Different base prices for each day of week
  • Optional multi-hour discounts (longer = cheaper per hour)
  • Optional time-of-day discounts


Configuration:

  • useHourlyPricing: true
  • Per day of week:
    • basePrice: Price per hour
    • minimumHours: Minimum rental length (e.g., 1 )
    • maximumHours: Maximum rental length (e.g., 8 )
    • multiHourDiscounts: Array of { hours, pricePerHour }
    • timeDiscounts: Array of { startTime, endTime, discountPercentage }


Example Multi-Hour Discount:

multiHourDiscounts: [
{ hours: 1, pricePerHour: 100 }, // 1 hour = $100/hr
{ hours: 2, pricePerHour: 95 }, // 2+ hours = $95/hr
{ hours: 4, pricePerHour: 85 }, // 4+ hours = $85/hr
]

Example Time Discount:

timeDiscounts: [
{ startTime: '06:00', endTime: '10:00', discountPercentage: 20 }, // 20% off morning
{ startTime: '17:00', endTime: '20:00', discountPercentage: 15 }, // 15% off evening
]

Example Use Cases:

  • Jet ski rentals
  • Boat rentals by the hour
  • Kayak/paddleboard rentals
  • Equipment hourly rentals



3. Fixed-Length Rentals

Pre-defined rental durations with specific start times.


How it works:

  • Customers choose from pre-set durations (e.g., "2-hour sunset tour")
  • Each duration has specific available start times
  • Fixed price for each duration
  • Combines with hourly pricing


Configuration:

  • useHourlyPricing: true
  • Per day of week:
  • fixedLengths: Array of fixed duration options


Example:

fixedLengths: [
{
duration: 2,
startTimes: ['10:00', '14:00', '18:00'],
price: 180
},
{
duration: 4,
startTimes: ['10:00', '14:00'],
price: 320
}
]


Example Use Cases:

  • Sunset tours (fixed 2-hour slots)
  • Half-day vs full-day rentals
  • Specific experience packages
  • Guided tour time slots



4. Category Pricing (Per-Person Pricing)

Different prices for different passenger types (Adult, Child, Senior, etc.)


How it works:

  • Each passenger category gets its own complete pricing configuration
  • Customers select quantity for each category
  • Can use daily OR hourly pricing (all categories share the same mode)
  • Each category has independent prices, discounts, and settings


Configuration:

  • useCategoryPricing: true
  • pricingCategories: Array of category configs
  • Each category has:
    • idnamedescriptionsortOrder
    • isDefault: Show first in booking UI
    • Complete daily pricing setup (if useDayPricing)
    • Complete hourly pricing setup (if useHourlyPricing)
    • Multi-boat discounts


Pre-built Templates:

  1. Standard (Adult/Child)


    • Adult
    • Child (under 12)


  1. Age-Based
    • Adult (18-64)
    • Senior (65+)
    • Child (2-17)
    • Infant (under 2)


  1. Custom - Build your own


Example Configuration:

useCategoryPricing: true,
useHourlyPricing: true,
pricingCategories: [
{
id: 'adult',
name: 'Adult',
sortOrder: 1,
isDefault: true,
hourlyPrices: {
Monday: { basePrice: 50, minimumHours: 2, maximumHours: 8 },
// ... other days
}
},
{
id: 'child',
name: 'Child (under 12)',
sortOrder: 2,
hourlyPrices: {
Monday: { basePrice: 25, minimumHours: 2, maximumHours: 8 },
// ... other days
}
}
]


Example Use Cases:

  • Tours with adult/child pricing
  • Age-based activity pricing
  • Experience packages per person
  • Any per-person rental



5. Event-Based Pricing

Fixed-price events with optional start times.


How it works:

  • Single fixed price per event
  • Optional specific start time
  • Not based on duration
  • One event season per inventory


Configuration:

  • pricingType: 'event'
  • eventPricings: Array of event configurations
    • eventName: Name of the event
    • price: Fixed price
    • startTime: Optional start time (HH:MM)


Example:

pricingType: 'event',
eventPricings: [
{ eventName: 'Sunset Cruise', price: 75, startTime: '18:30' },
{ eventName: 'Fireworks Tour', price: 95, startTime: '20:00' },
{ eventName: 'Brunch Cruise', price: 65, startTime: '11:00' }
]


Example Use Cases:

  • Special event cruises
  • Holiday experiences
  • Seasonal events
  • Fixed-price experiences



6. Tour Mode

Bookings based on available seats/capacity, multiple customers can join.


How it works:

  • Inventory has a seating capacity
  • Multiple bookings can share the same time slot
  • Bookings fill available seats
  • Can use hourly, daily, or category pricing


Configuration:

  • IsTour: true
  • SeatingCapacity: Number of passengers per tour
  • SellByAssets: false (sell by seat, not by asset)
  • Can combine with any pricing mode


Example:

IsTour: true,
SeatingCapacity: 12,
SellByAssets: false,
useHourlyPricing: true,
useCategoryPricing: true // Optional: different prices per age group


Example Use Cases:

  • Boat tours
  • Whale watching
  • Snorkeling trips
  • Guided experiences
  • Group activities



7. Private Tour

Entire tour must be booked together, no shared bookings.


How it works:

  • All seats must be booked in a single transaction
  • No partial bookings allowed
  • Other customers cannot join
  • Typically higher minimum ticket quantity


Configuration:

  • IsTour: true
  • IsPrivateTour: true
  • SeatingCapacity: Total seats available
  • minimumTicketQuantity: Usually equals seating capacity
  • enforceSessionTimes: true (optional but recommended)


Example:

IsTour: true,
IsPrivateTour: true,
SeatingCapacity: 8,
minimumTicketQuantity: 8, // Must book all seats
enforceSessionTimes: true


Example Use Cases:

  • Private charters
  • Corporate events
  • Family/group experiences
  • Exclusive tours
  • Special occasions


8. Session-Enforced Rentals

Overlapping bookings must have identical start/end times.


How it works:

  • Prevents customers from joining mid-session
  • All bookings in overlapping time must have same times
  • Useful for group activities or tours
  • Ensures coordinated start times


Configuration:

  • enforceSessionTimes: true


Example Scenario:

  • Tour starts at 10:00 AM, runs for 2 hours
  • Customer A books 10:00-12:00
  • Customer B can ONLY book 10:00-12:00 (not 10:30-12:30)


Example Use Cases:

  • Guided tours with set departure
  • Group lessons/classes
  • Coordinated activities
  • Tours with safety briefings



9. Asset Pool Rentals

Multiple inventory items share a pool of physical assets.


How it works:

  • Create an asset pool with physical items
  • Multiple inventory listings can use the same pool
  • Prevents double-booking physical assets
  • Different inventory items, same equipment


Configuration:

  • Create Asset Pool with assets
  • Link inventory items to pool:
    • assetPoolId: ID of the pool
    • useEntirePool: true (use all assets)
    • OR pooledAssetIds: Specific assets from pool


Example Scenario:

  • Pool: "Kayaks" with 10 kayaks
  • Inventory 1: "Single Kayak Rental" (uses 1 from pool)
  • Inventory 2: "Tandem Kayak Rental" (uses 1 from pool)
  • Inventory 3: "Kayak Tour" (uses 6 from pool)


Example Use Cases:

  • Multiple rental types for same equipment
  • Different tour packages using same boats
  • Upsells (premium vs standard using same pool)



10. Asset-Based Rentals

Sell by number of assets/units rather than capacity.


How it works:

  • Customer books a specific number of units
  • Each unit has a capacity
  • Total capacity = units × capacity per unit
  • Can allow customers to select specific assets


Configuration:

  • SellByAssets: true
  • AssetsAvailable: Number of units available
  • SeatingCapacity: Capacity per unit
  • ShowAssetChoice: true (optional - let customers pick specific ones)


Example:

SellByAssets: true,
AssetsAvailable: 5, // 5 jet skis
SeatingCapacity: 2, // 2 people per jet ski
ShowAssetChoice: true // Customer can pick "Jet Ski #3"


Example Use Cases:

  • Jet ski rentals (book 2 jet skis)
  • Boat rentals (book specific boat)
  • Equipment with individual units
  • Named/numbered assets



Multi-Day & Multi-Hour Discounts


Multi-Day Discounts

Encourage longer rentals with tiered discounts.


How it works:

  • Discount applies when booking X or more days
  • Can have multiple tiers
  • Applies to daily pricing


Example:

multiDayDiscounts: [
{ 2: 5 }, // 2+ days = 5% off
{ 3: 10 }, // 3+ days = 10% off
{ 7: 20 } // 7+ days = 20% off
]



Multi-Hour Discounts

Lower per-hour rate for longer rentals.


How it works:

  • Price per hour decreases as duration increases
  • Set specific price-per-hour for each tier
  • Applies to hourly pricing


Example:

multiHourDiscounts: [
{ hours: 1, pricePerHour: 100 },
{ hours: 3, pricePerHour: 90 },
{ hours: 5, pricePerHour: 80 }
]



Multi-Boat Discounts

Discount for booking multiple units simultaneously.


How it works:

  • Discount applies when booking multiple boats/units
  • Percentage off total price
  • Works with any pricing mode


Example:

boatDiscounts: [
{ boats: 2, discount: 10 }, // 2 units = 10% off
{ boats: 3, discount: 15 }, // 3 units = 15% off
{ boats: 5, discount: 20 } // 5+ units = 20% off
]


Example Use Cases:

  • Group bookings
  • Family packages
  • Corporate events
  • Party packages



Schedule Exceptions

Override pricing and hours for specific dates.


How it works:

  • Define special dates (holidays, events, weather)
  • Override hours, close, or adjust pricing
  • Markup or discount specific days


Configuration:

  • scheduleExceptions: Array of exception configs
    • date: Specific date (YYYY-MM-DD)
    • description: Why special
    • isClosed: Close on this date
    • openTime / closeTime: Override hours
    • dayPriceMarkup: Percentage markup for daily pricing
    • hourlyPriceMarkup: Percentage markup for hourly pricing
    • overrideMultiHourDiscounts: Custom discounts for this date
    • overrideTimeDiscounts: Custom time discounts


Example:

scheduleExceptions: [
{
date: '2026-07-04',
description: 'Independence Day',
dayPriceMarkup: 25, // 25% price increase
hourlyPriceMarkup: 25
},
{
date: '2026-12-25',
description: 'Christmas',
isClosed: true
},
{
date: '2026-08-15',
description: 'Off-Peak Special',
hourlyPriceMarkup: -20, // 20% discount
openTime: '07:00',
closeTime: '22:00'
}
]



Combining Pricing Models


Valid Combinations

✅ Daily + Hourly Pricing

  • Both can be enabled simultaneously
  • Customer chooses which mode when booking

✅ Category Pricing + Daily

  • Each category has its own daily pricing

✅ Category Pricing + Hourly

  • Each category has its own hourly pricing

✅ Category Pricing + Fixed Lengths

  • Each category has fixed-length options

✅ Tour + Any Pricing Model

  • Tours can use daily, hourly, or category pricing

✅ Asset Pool + Any Model

  • Asset pooling works with all pricing types


Invalid Combinations

❌ Event Pricing + Regular Pricing

  • Must choose one: pricingType: 'event' OR pricingType: 'regular'

❌ Category Pricing + Old Category Pricing

  • Use either new useCategoryPricing OR legacy categoryPricing field (not both)



Common Pricing Scenarios

Scenario 1: Jet Ski Rental

useHourlyPricing: true,
SellByAssets: true,
AssetsAvailable: 10,
SeatingCapacity: 2,
hourlyPrices: {
Monday: {
basePrice: 75,
minimumHours: 1,
maximumHours: 4,
multiHourDiscounts: [
{ hours: 1, pricePerHour: 75 },
{ hours: 2, pricePerHour: 70 }
]
}
}


Scenario 2: Multi-Day Boat Charter

useDayPricing: true,
SellByAssets: true,
AssetsAvailable: 1,
dailyPrices: {
Monday: 500,
Tuesday: 500,
Friday: 650,
Saturday: 800
},
multiDayDiscounts: [
{ 3: 10 },
{ 7: 20 }
],
minimumDays: 2


Scenario 3: Whale Watching Tour

IsTour: true,
SeatingCapacity: 25,
SellByAssets: false,
useCategoryPricing: true,
useHourlyPricing: true,
pricingCategories: [
{
id: 'adult',
name: 'Adult',
hourlyPrices: {
Monday: { basePrice: 65, minimumHours: 3, maximumHours: 3 }
}
},
{
id: 'child',
name: 'Child (4-12)',
hourlyPrices: {
Monday: { basePrice: 45, minimumHours: 3, maximumHours: 3 }
}
}
],
fixedLengths: [
{ duration: 3, startTimes: ['09:00', '13:00', '17:00'], price: 65 }
]


Scenario 4: Private Charter

IsTour: true,
IsPrivateTour: true,
SeatingCapacity: 12,
minimumTicketQuantity: 12,
enforceSessionTimes: true,
useHourlyPricing: true,
hourlyPrices: {
Monday: {
basePrice: 150,
minimumHours: 3,
maximumHours: 8
}
}


Scenario 5: Kayak with Asset Pool

assetPoolId: 'pool-kayaks',
useEntirePool: false,
pooledAssetIds: ['kayak-1', 'kayak-2', 'kayak-3'],
SellByAssets: true,
useHourlyPricing: true,
hourlyPrices: {
Monday: {
basePrice: 25,
minimumHours: 2,
maximumHours: 8
}
}


Scenario 6: Fixed-Length Tour Packages

IsTour: true,
SeatingCapacity: 20,
useHourlyPricing: true,
hourlyPrices: {
Monday: {
basePrice: 50,
minimumHours: 2,
maximumHours: 4,
fixedLengths: [
{
duration: 2,
startTimes: ['10:00', '14:00', '18:00'],
price: 95
},
{
duration: 4,
startTimes: ['10:00', '14:00'],
price: 175
}
]
}
}


Quick Reference Matrix

Pricing Model

Daily

Hourly

Fixed Length

Category

Event

Tour

Private

Asset Pool

Daily

Hourly

Fixed Length

Category

Event

Tour

Private Tour

Asset Pool


Updated on: 15/01/2026

Was this article helpful?

Share your feedback

Cancel

Thank you!