Skip to content

User Journey Before Booking

User Journey Before Booking

Date: 2026-01-20 Analysis Period: January - December 2025 Data Sources: sadb_daily_renting_listing_bookings, sadb_user_listing_event_logs


Executive Summary

This analysis examines user behavior patterns before making a booking, including the number of views, engagement events, and booking attempts required before conversion.

Key Metrics

MetricValue
Average booking attempts per user1.7
First-attempt success rate6.1%
Peak success rate (4th-5th attempt)20.6%
Average events before booking61.7
Average listings explored37.1

Top Insights

FindingImpact
First attempts convert poorly (6.1%)Major opportunity to improve onboarding
Same-listing retries convert 4.7x betterEnable easy re-booking flows
50+ events typical before bookingUsers need extensive research support
1-4 week return window optimalTarget re-engagement campaigns here

1. Booking Attempts Analysis

1.1 Attempts Per User Distribution

Booking AttemptsUsers% of Users
1 attempt9,30371.2%
2 attempts2,07115.8%
3 attempts7595.8%
4 attempts3702.8%
5 attempts2091.6%
6+ attempts3582.7%

Summary Statistics:

MetricValue
Average attempts per user1.7
Median attempts1
75th percentile2
90th percentile3
Maximum attempts149

Key Finding: The vast majority (71.2%) of users make only one booking attempt. However, persistent users who make multiple attempts show significantly better conversion rates.

SELECT
max_attempts_per_user,
count(*) AS users,
round(count(*) * 100.0 / sum(count(*)) OVER (), 1) AS pct
FROM
(
SELECT
user_id,
count(*) AS max_attempts_per_user
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND toYear (createdAt) = 2025
GROUP BY
user_id
)
GROUP BY
max_attempts_per_user
ORDER BY
max_attempts_per_user
LIMIT
15

1.2 Conversion by Attempt Number

Attempt #Total BookingsCompletedSuccess RateAvg Value (SAR)
1st attempt13,0707976.1%1,831
2nd attempt3,76758815.6%2,048
3rd attempt1,69633419.7%2,432
4th-5th attempt1,50431020.6%2,108
6th-10th attempt1,09920318.5%2,359
11+ attempt9169510.4%1,381

Key Findings:

  1. First-time bookers have very low success (6.1%)
  2. Success rate improves dramatically with subsequent attempts
  3. Peak conversion occurs at 4th-5th attempt (20.6%) - 3.4x improvement over first attempts
  4. After 10+ attempts, success drops to 10.4% (possibly frustrated users or problematic accounts)
  5. Booking value tends to increase with experience (peaks at 3rd attempt: SAR 2,432)
WITH
user_bookings_numbered AS (
SELECT
user_id,
id AS booking_id,
createdAt,
status,
total_amount,
row_number() OVER (
PARTITION BY
user_id
ORDER BY
createdAt
) AS attempt_num
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND toYear (createdAt) = 2025
)
SELECT
CASE
WHEN attempt_num = 1 THEN '1st attempt'
WHEN attempt_num = 2 THEN '2nd attempt'
WHEN attempt_num = 3 THEN '3rd attempt'
WHEN attempt_num BETWEEN 4 AND 5 THEN '4th-5th attempt'
WHEN attempt_num BETWEEN 6 AND 10 THEN '6th-10th attempt'
ELSE '11+ attempt'
END AS attempt_bucket,
count(*) AS total_bookings,
countIf (status = 'COMPLETED') AS completed,
round(
countIf (status IN ('COMPLETED', 'CONFIRMED')) * 100.0 / count(*),
1
) AS success_rate,
round(
avgIf (
total_amount,
status IN ('COMPLETED', 'CONFIRMED')
),
0
) AS avg_value_successful
FROM
user_bookings_numbered
GROUP BY
attempt_bucket
ORDER BY
CASE
attempt_bucket
WHEN '1st attempt' THEN 1
WHEN '2nd attempt' THEN 2
WHEN '3rd attempt' THEN 3
WHEN '4th-5th attempt' THEN 4
WHEN '6th-10th attempt' THEN 5
ELSE 6
END

2. Same-Listing Retry Behavior

2.1 Conversion by Attempt on Same Listing

Attempt on Same ListingBookingsSuccessfulSuccess Rate
1st attempt17,9931,2627.0%
2nd attempt2,50459623.8%
3rd attempt77021928.4%
4th attempt33010832.7%
5th attempt1585031.6%

Key Finding: Users who retry the same listing have dramatically higher success rates:

  • 2nd attempt: 23.8% (3.4x first attempt)
  • 3rd attempt: 28.4% (4.1x first attempt)
  • 4th attempt: 32.7% (4.7x first attempt)

This suggests that users who return to the same listing are highly motivated and should be facilitated with easy re-booking flows.

WITH
booking_details AS (
SELECT
user_id,
listing_id,
createdAt,
status,
row_number() OVER (
PARTITION BY
user_id,
listing_id
ORDER BY
createdAt
) AS attempt_on_listing
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND toYear (createdAt) = 2025
)
SELECT
attempt_on_listing,
count(*) AS bookings,
countIf (status IN ('COMPLETED', 'CONFIRMED')) AS successful,
round(
countIf (status IN ('COMPLETED', 'CONFIRMED')) * 100.0 / count(*),
1
) AS success_rate
FROM
booking_details
WHERE
attempt_on_listing <= 5
GROUP BY
attempt_on_listing
ORDER BY
attempt_on_listing

2.2 Unique Listings Attempted Per User

Unique Listings AttemptedUsers%
1 listing10,52780.5%
2 listings1,65012.6%
3 listings4613.5%
4 listings1971.5%
5+ listings2351.8%

Key Finding: 80.5% of users only attempt to book one listing. The remaining 19.5% who explore multiple listings represent more experienced or persistent bookers.


3. Time Between Attempts

3.1 Time Gap Analysis

Time GapBookings%Success Rate
First booking13,35660.6%6.2%
Same day5,51525.0%16.5%
1-6 days1,8378.3%17.3%
1-4 weeks8533.9%20.5%
1-3 months4912.2%19.3%

Key Findings:

  1. 60.6% of bookings are first-time attempts (lowest success rate: 6.2%)
  2. Same-day retries are common (25%) and convert well (16.5%)
  3. 1-4 week return window has optimal conversion (20.5%)
  4. Even 1-3 month returns maintain good success (19.3%)

Implication: Re-engagement campaigns should target the 1-4 week window for maximum effectiveness.

WITH
user_bookings AS (
SELECT
user_id,
createdAt,
status,
lagInFrame (createdAt) OVER (
PARTITION BY
user_id
ORDER BY
createdAt
) AS prev_booking_time
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND toYear (createdAt) = 2025
)
SELECT
CASE
WHEN days_since_last IS NULL THEN 'First booking'
WHEN days_since_last < 1 THEN 'Same day'
WHEN days_since_last < 7 THEN '1-6 days'
WHEN days_since_last < 30 THEN '1-4 weeks'
WHEN days_since_last < 90 THEN '1-3 months'
ELSE '3+ months'
END AS time_gap,
count(*) AS bookings,
round(count(*) * 100.0 / sum(count(*)) OVER (), 1) AS pct,
round(
countIf (status IN ('COMPLETED', 'CONFIRMED')) * 100.0 / count(*),
1
) AS success_rate
FROM
(
SELECT
status,
dateDiff ('day', prev_booking_time, createdAt) AS days_since_last
FROM
user_bookings
)
GROUP BY
time_gap
ORDER BY
CASE
time_gap
WHEN 'First booking' THEN 1
WHEN 'Same day' THEN 2
WHEN '1-6 days' THEN 3
WHEN '1-4 weeks' THEN 4
WHEN '1-3 months' THEN 5
ELSE 6
END

4. Engagement Events Before Booking

4.1 Event Volume Summary

For users with tracked engagement events before their first booking:

MetricValue
Users with tracked events1,291
Average events before booking61.7
Median events19
Average unique listings interacted37.1
Average events on final booked listing2.5

Key Finding: Users engage extensively before booking - averaging 61.7 events across 37 different listings before making their first booking attempt.

4.2 Event Distribution Before First Booking

Events Before BookingUsers%
1 event614.7%
2-5 events19715.3%
6-10 events16112.5%
11-20 events24619.1%
21-50 events25719.9%
50+ events36928.6%

Key Finding: The most common pattern is 50+ engagement events (28.6% of users) before booking, indicating significant research and comparison behavior.

WITH
user_first_booking AS (
SELECT
user_id,
min(createdAt) AS first_booking_time
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND toYear (createdAt) = 2025
GROUP BY
user_id
),
user_events AS (
SELECT
ufb.user_id,
count(*) AS events_before_booking
FROM
user_first_booking ufb
JOIN sadb_user_listing_event_logs e FINAL ON ufb.user_id = e.user_id
AND e.createdAt < ufb.first_booking_time
AND e._peerdb_is_deleted = 0
GROUP BY
ufb.user_id
)
SELECT
CASE
WHEN events_before_booking = 0 THEN '0 events'
WHEN events_before_booking = 1 THEN '1 event'
WHEN events_before_booking BETWEEN 2 AND 5 THEN '2-5 events'
WHEN events_before_booking BETWEEN 6 AND 10 THEN '6-10 events'
WHEN events_before_booking BETWEEN 11 AND 20 THEN '11-20 events'
WHEN events_before_booking BETWEEN 21 AND 50 THEN '21-50 events'
ELSE '50+ events'
END AS event_bucket,
count(*) AS users,
round(count(*) * 100.0 / sum(count(*)) OVER (), 1) AS pct
FROM
user_events
GROUP BY
event_bucket
ORDER BY
CASE
event_bucket
WHEN '0 events' THEN 1
WHEN '1 event' THEN 2
WHEN '2-5 events' THEN 3
WHEN '6-10 events' THEN 4
WHEN '11-20 events' THEN 5
WHEN '21-50 events' THEN 6
ELSE 7
END

4.3 Event Types Before Booking

Event TypeCountUnique UsersAvg per User
View53,7961,25243.0
30-sec session13,9141,05413.2
60-sec session4,9807386.7
90-sec session2,2615034.5
WhatsApp2,2613676.2
120-sec session1,2593663.4
Phone reveal1,1512794.1

Key Findings:

  1. Users average 43 views before booking
  2. Session depth matters: 84% engage for 30+ seconds, 59% for 60+ seconds
  3. 29% contact hosts via WhatsApp before booking
  4. 22% reveal phone numbers before booking

5. Post-Cancellation Behavior

5.1 Retry Patterns After Cancellation

When users cancel and try again within 30 days:

BehaviorCases%
Try different listing81792.1%
Retry same listing707.9%

Key Finding: After a cancellation, 92% of users abandon that listing and try a different one. Only 8% retry the same listing.

Implication: When a booking is cancelled, proactively showing alternative listings may help retain the user.

WITH
user_cancellations AS (
SELECT
user_id,
listing_id,
createdAt AS cancel_time
FROM
sadb_daily_renting_listing_bookings FINAL
WHERE
_peerdb_is_deleted = 0
AND user_id > 0
AND status LIKE 'CANCELED%'
AND toYear (createdAt) = 2025
),
follow_up_bookings AS (
SELECT
uc.user_id,
uc.listing_id AS original_listing,
b.listing_id AS retry_listing,
b.status,
dateDiff ('day', uc.cancel_time, b.createdAt) AS days_after_cancel
FROM
user_cancellations uc
JOIN sadb_daily_renting_listing_bookings b FINAL ON uc.user_id = b.user_id
AND b.createdAt > uc.cancel_time
AND b._peerdb_is_deleted = 0
)
SELECT
retry_behavior,
count(*) AS cases,
round(count(*) * 100.0 / sum(count(*)) OVER (), 1) AS pct
FROM
(
SELECT
CASE
WHEN original_listing = retry_listing THEN 'Retry same listing'
ELSE 'Try different listing'
END AS retry_behavior
FROM
follow_up_bookings
WHERE
days_after_cancel <= 30
)
GROUP BY
retry_behavior

6. Recommendations

High Priority

ActionRationaleExpected Impact
Improve first-booking experience6.1% success rate is the biggest leakCould 2x first-attempt conversion
Enable easy re-bookingSame-listing retries convert 4.7x betterReduce friction for returning users
Add comparison toolsUsers view 37+ listings before bookingHelp users make faster decisions

Medium Priority

ActionRationaleExpected Impact
1-4 week re-engagement campaignOptimal conversion window (20.5%)Recover abandoned users
Show alternatives on cancellation92% try different listing after cancelRetain cancelling users
Trust signals for first-timersLow first-attempt success suggests trust issuesReduce abandonment

Product Suggestions

  1. Saved listings / favorites: Users explore 37 listings on average - help them track options
  2. “Continue booking” reminders: 25% retry same day, target with timely nudges
  3. First-booking incentives: Discount or guarantee to boost 6.1% conversion
  4. Post-cancellation recommendations: Automated similar listings when bookings cancel

Technical Notes

Data Limitations

  1. Views table too large (1.26B rows) for direct user-level joins - used event logs instead
  2. Event logs capture logged-in users only - anonymous user behavior not tracked
  3. Stats table empty for bookable listings - pre-aggregated stats not available for daily rentals

Alternative Approaches

For full view analysis, consider:

  • Materialized views aggregating user-level view counts
  • Sampling approach with specific user cohorts
  • Pre-computed user journey metrics table