intermediate
bookings
tours
recurrence

Tour Scheduling and Recurrence

Build recurring tour schedules (Sunset Tour every Wed/Fri/Sat at 6pm) and let customers book a seat from the widget

Levy Fleets TeamMay 18, 20268 min read

Tour Scheduling and Recurrence

Tour schedules let you sell seats on a guided experience that runs on a recurring schedule — like a Sunset E-Bike Tour every Wednesday, Friday, and Saturday at 6pm, with a capacity of 8 vehicles.

Each scheduled departure pulls from your subaccount's vehicle inventory. The customer books a seat (one rider = one vehicle), pays online, signs the waiver, and arrives at the start time.

When to use tour schedules

Use a tour schedule when:

  • You run a guided activity that repeats on the same days and times every week.
  • Multiple customers join the same departure, each riding their own vehicle.
  • You want to cap the group size (8 riders max, etc.).
  • You want a single payer to book multiple seats together (a family of 4, a corporate team).

For one-off group rentals that do not repeat (a private buy-out), use Group Bookings instead.

Create a tour schedule

  1. Open Dashboard > Bookings > Tours.
  2. Click New tour.
  3. Fill in:
FieldExampleNotes
NameSunset E-Bike TourCustomer-facing name
DescriptionA 90-minute guided ride along the coast at sunset.Markdown supported
Vehicle modelEB100 Beach CruiserOne model per tour
Capacity per departure8Maximum riders per start time
Duration90 minutesTime from start to expected return
Price per person$65Charged once per seat
Refundable deposit$0Optional, like any other booking
ActiveyesToggle to disable without deleting
  1. Recurrence. Pick from the wizard:
    • Days of week — multi-select chips (Mon, Tue, Wed, Thu, Fri, Sat, Sun).
    • Times — one or more start times per day (e.g. 10am and 6pm).
    • Window — start date and end date for the schedule (leave end date blank for indefinite).
  2. Save.

The system generates departures for the next 90 days at the configured cadence, with the capacity you set. Each departure is a separate row that customers can book independently.

How the RRULE engine works

The recurrence wizard saves an iCalendar RRULE string on the tour_schedules row. The RRULE engine supports:

  • FREQ=DAILY — every day at the configured times.
  • FREQ=WEEKLY;BYDAY=...;BYHOUR=... — specific weekdays at specific times.

These two patterns cover everything the dashboard wizard can produce. If you have a more complex schedule (only second Saturday of the month, skip national holidays, etc.), the dashboard creates explicit departure rows that you can edit or delete one by one.

You can override capacity on a single departure (e.g. a Saturday that has only 4 spots because two vehicles are in for service) by opening that departure and editing Capacity override.

Customer booking flow

Tours appear in the customer's hosted page and widget under a Tours tab next to Rentals. The flow:

  1. Customer picks the tour from the list.
  2. Sees upcoming departures with seats remaining (8 spots · 3 left).
  3. Picks the departure they want.
  4. Picks the number of seats.
  5. Customer info + inline waiver — for multi-seat bookings, one parent waiver with multiple signers (see Group Bookings).
  6. Payment.
  7. Confirmation with the QR pickup code, ICS attachment, and a "Meet at the shop 15 minutes early" reminder.

Each seat creates a reservation row linked back to the tour departure via tour_departure_id. Operators see them in the standard reservations list and on the pickup queue, marked with the tour name.

Capacity protection

When a customer claims a seat, the system locks the count atomically — there is no race between two customers grabbing the last seat. If the tour has 8 seats and 7 are taken, the 8th customer gets the seat; the 9th gets "Sold out" with a suggestion to pick a different departure.

If a customer cancels (in line with your refund policy), the seat returns to the pool and shows as available again.

Cancelling a departure

If weather forces a cancellation:

  1. Open the departure (or the tour schedule and find the departure).
  2. Click Cancel departure.
  3. Pick whether to refund all booked customers in full or partial.
  4. Confirm.

The system refunds every booking on that departure, emails everyone the cancellation notice, and marks the departure cancelled. Refunds always flow through the reservations — never directly to wallet — so partner payouts and tax remittance remain correct.

Editing recurring schedules

If you change the recurrence on an existing schedule (e.g. add a Sunday tour), the system:

  • Generates the new future departures.
  • Leaves existing departures alone (no retroactive cancellation).
  • Does not touch already-confirmed bookings.

If you need to delete future departures (e.g. seasonal end), set End date on the schedule. Already-booked future departures stay live until you cancel them individually.

Pricing variations

Tours support the same pricing primitives as ordinary rentals:

  • Peak / off-peak / weekend multipliers on the underlying pricing tier.
  • Promo codes scoped to specific tours (e.g. "SUNSET25" for the Sunset Tour only).
  • Bundles — pair the tour with helmets or photo packages as an add-on.
  • Refundable deposits — held via Stripe pre-auth, released after the tour ends cleanly.

Channel managers

We are evaluating channel-manager hooks for Viator and GetYourGuide so a tour booked on those sites lands as a Levy reservation. This is on the roadmap; talk to your account manager if you need it.

Reporting

In Dashboard > Bookings > Tours > > Departures, you see:

  • Total seats sold per departure.
  • Revenue per departure.
  • Capacity utilization (sold / capacity).
  • Cancellation rate.

Useful for figuring out which tour times to drop and which to add.