Skip to content

Itinerary

The itinerary is the day-by-day timeline view of a trip. Every booking — flight, hotel night, ground transport, activity, restaurant — projects onto the same timeline, grouped by day in your timezone.

Moonjar walks every booking on the trip and projects each into a unified itinerary item with:

  • Title and subtitle — type-specific (a flight shows the route; a hotel shows the property name and city).
  • Start and end — UTC timestamps plus the local timezone of the origin (so flights are timed by their departure city, not by yours).
  • Local day — the YYYY-MM-DD bucket the item lives under in your viewing timezone. This is the day-header in the timeline.
  • Origin and destination for multi-leg types (flights, rail, bus, ferry); a single place for point types (hotels, restaurants, activities).
  • Type-specific details — gates, terminals, room numbers, party size — exposed as a meta object that the trip card uses.
  • Transit gap — the minutes between this item and the previous one, computed server-side so the timeline can show “3h 40m later” between a flight landing and a hotel check-in.
  • Status — confirmed, candidate, cancelled.

Items that cross midnight (a 23:30 flight that lands the next day) stay on their departure day in the timeline; the end timestamp is preserved so the card can render the duration spanning into tomorrow.

Bookings have two states in the itinerary:

  • Confirmed — a real, scheduled booking. Always shown.
  • Candidate — draft / planning state. “Considering this hotel but haven’t booked yet.” Only shown when you’re in the trip’s Planning view; hidden from the live timeline.

Public share links for trips show only confirmed items.

Cruises are special-cased. The booking row covers the whole cruise; each port of call expands as its own line on the day it’s visited, with a parent_id linking back to the cruise booking.

Each item carries a total_cost (when set), so the Planning layout can roll the trip up to a per-day or per-trip subtotal. Cruise port rows have no cost — the cost lives on the parent cruise booking.