Skip to content

Listing Performance Analysis

Date: 2026-01-14 Analysis Period: 2024-01-01 onwards (2025-10-14 to 2026-01-13 for decay analysis)

Correction (2026-09-28): the original queries filtered status = 1 (Deleted) instead of active listings; queries and results below have been re-run.

  • sadb_listings.status codes: 0 = Active, 1 = Deleted, 4 = Suspended, 11 = Closed.
  • The decay analysis (sections 2 and 3) looks at how listings performed during a past window, so it now uses no status filter. It includes every listing that had daily stats in the window, including ones that have since closed or been deleted. Of the 168,658 listings with stats in the window, 55% are now Deleted, 35% Closed and only about 6% (9,627) currently active (status IN (0, 4) AND published = 1). Filtering to currently active listings would keep only the stale survivors. That subset gets less than half the views (Day 2 avg 10.8) and converts worse (4.3% on Day 2).
  • The window is pinned to the original 3 months (2025-10-14 to 2026-01-13) instead of today() - INTERVAL 3 MONTH, so results cover the same period as the original run.
  • The original figures cannot be reproduced exactly even with status = 1, because more listings have moved to Deleted since January.
  • Section 1 (Time on Market) never used a status filter, so it is unchanged.
  • What changed materially: the “first 2 weeks ≈ 50% of contacts” claim drops to ~36%. Absolute views and conversion rates are lower across the board. Makkah no longer has the highest Week 1 conversion; Riyadh does.

This analysis covers three key aspects of listing performance:

  1. Time on Market - How long listings take to close by category/city
  2. View Decay - How views decrease as listings age
  3. Contact Conversion Decay - How view-to-contact rates change over time
Metric Finding
Time on Market Improved 50-60% from early 2024 to late 2025
View Decay 72% drop by Day 90, Day 2 is peak
Conversion Decay Drops from 7.1% to 4.3% (-39%) over 90 days
Critical Window First 2 weeks generate ~36% of all contacts

Time on market measures days from published_at to close_time for listings that have been closed.

Category Closed Median P25 P75 P90
Room for Rent 4,594 27 8 80 145
Big Flat for Rent 17,791 34 14 70 121
Apartment for Rent 166,552 39 15 82 144
Villa for Rent 23,256 46 17 98 159
Land for Sale 68,011 89 33 148 235
Big Flat for Sale 20,623 88 37 149 235
Villa for Sale 75,864 88 37 155 249
Apartment for Sale 68,130 104 53 180 269

Insight: Rentals move 2-3x faster than sales

City Closed Median P25 P75
الرياض (Riyadh) 302,701 53 19 111
الظهران (Dhahran) 2,638 58 23 117
الهفوف (Hofuf) 4,208 69 25 127
جدة (Jeddah) 72,524 76 30 143
الدمام (Dammam) 23,352 78 28 151
مكة المكرمة (Makkah) 8,787 94 35 167

Insight: Riyadh is the fastest market

Apartment for Rent (Median Days by Cohort)

Section titled “Apartment for Rent (Median Days by Cohort)”
Cohort Riyadh Jeddah Dammam
Jan 2024 51 62 57
Jul 2024 39 39 33
Jan 2025 33 37 33
Oct 2025 32 35 30

Trend: Convergence to ~30-35 days across all cities

Cohort Riyadh Jeddah Dammam
Jan 2024 108 152 141
Jul 2024 94 142 164
Jan 2025 18 60 21
Oct 2025 52 49 30

Trend: Major improvement from 108-152 days to 30-52 days

SELECT
c.name_en AS category,
COUNT(*) AS closed_listings,
ROUND(AVG((l.close_time - l.published_at) / 86400), 1) AS avg_days,
ROUND(
median((l.close_time - l.published_at) / 86400),
1
) AS median_days,
ROUND(
quantile(0.25) ((l.close_time - l.published_at) / 86400),
1
) AS p25_days,
ROUND(
quantile(0.75) ((l.close_time - l.published_at) / 86400),
1
) AS p75_days,
ROUND(
quantile(0.90) ((l.close_time - l.published_at) / 86400),
1
) AS p90_days
FROM
sadb_listings l FINAL
JOIN sadb_categories c FINAL ON l.category = c.category_id
WHERE
l.close_time > l.published_at
AND l.published_at > 0
AND l._peerdb_is_deleted = 0
AND (l.close_time - l.published_at) / 86400 BETWEEN 1 AND 730
AND toDate(l.published_at) >= '2024-01-01'
GROUP BY
c.name_en
HAVING
closed_listings >= 100
ORDER BY
closed_listings DESC
SELECT
d.city_name,
COUNT(*) AS closed_listings,
ROUND(AVG((l.close_time - l.published_at) / 86400), 1) AS avg_days,
ROUND(
median((l.close_time - l.published_at) / 86400),
1
) AS median_days,
ROUND(
quantile(0.25) ((l.close_time - l.published_at) / 86400),
1
) AS p25_days,
ROUND(
quantile(0.75) ((l.close_time - l.published_at) / 86400),
1
) AS p75_days
FROM
sadb_listings l FINAL
JOIN sadb_districts d FINAL ON l.district_id = d.district_id
WHERE
l.close_time > l.published_at
AND l.published_at > 0
AND l._peerdb_is_deleted = 0
AND (l.close_time - l.published_at) / 86400 BETWEEN 1 AND 730
AND toDate(l.published_at) >= '2024-01-01'
GROUP BY
d.city_name
HAVING
closed_listings >= 1000
ORDER BY
closed_listings DESC

Query: Monthly Cohort Analysis by Category + City

Section titled “Query: Monthly Cohort Analysis by Category + City”
SELECT
toStartOfMonth(toDate(l.published_at)) AS cohort_month,
c.name_en AS category,
d.city_name,
COUNT(*) AS closed_listings,
ROUND(
median((l.close_time - l.published_at) / 86400),
1
) AS median_days
FROM
sadb_listings l FINAL
JOIN sadb_categories c FINAL ON l.category = c.category_id
JOIN sadb_districts d FINAL ON l.district_id = d.district_id
WHERE
l.close_time > l.published_at
AND l.published_at > 0
AND l._peerdb_is_deleted = 0
AND (l.close_time - l.published_at) / 86400 BETWEEN 1 AND 365
AND toDate(l.published_at) >= '2024-01-01'
AND c.name_en = 'Apartment for Rent'
AND d.city_name IN ('الرياض', 'جدة', 'الدمام')
GROUP BY
cohort_month,
c.name_en,
d.city_name
HAVING
closed_listings >= 50
ORDER BY
d.city_name,
cohort_month

Views decrease significantly as listings age. Day 2 is typically the peak (not Day 1, due to indexing delays).

Listing Age Avg Views Median Views % of Peak
Day 1 18.5 11 79%
Day 2 23.4 12 100%
Day 3 19.7 10 84%
Day 7 15.9 8 68%
Day 14 13.1 6 56%
Day 30 10.4 5 44%
Day 60 7.8 4 33%
Day 90 6.5 3 28%
Category Week 1 Week 2 Wk 3-4 Mo 2 Mo 3 Decay
Apartment Rent 32.6 25.3 21.1 17.0 14.7 –55%
Villa Rent 20.5 15.3 12.9 10.5 9.3 –55%
Villa Sale 14.6 11.0 9.5 8.1 6.9 –53%
Land Sale 8.6 5.8 4.8 4.1 3.6 –58%
Apartment Sale 6.7 5.5 5.0 4.3 3.6 –46%
City Week 1 Week 2 Wk 3-4 Mo 2 Mo 3 Decay
الدمام 23.4 17.3 14.2 10.4 9.0 –62%
الرياض 20.8 15.5 12.7 9.8 7.7 –63%
جدة 14.4 11.4 9.7 7.9 6.6 –54%
مكة 11.6 8.8 7.5 6.0 4.6 –60%

Land Sale still has the steepest view decay among categories. Apartment Sale now decays least (-46%). Makkah no longer has the steepest decay among cities; Riyadh and Dammam do, and Jeddah still decays least.

SELECT
s.day_time - toInt32(l.published_at / 86400) AS listing_age_days,
COUNT(DISTINCT s.id) AS listings_count,
SUM(s.views) AS total_views,
ROUND(AVG(s.views), 2) AS avg_views_per_listing,
ROUND(median(s.views), 1) AS median_views
FROM
sadb_stats_listings_stats s FINAL
JOIN sadb_listings l FINAL ON s.id = l.id
WHERE
toDate(s.day_time) BETWEEN '2025-10-14' AND '2026-01-13'
AND l.published_at > 0
AND s.day_time >= toInt32(l.published_at / 86400)
AND l._peerdb_is_deleted = 0
-- no status filter: listings that have since closed or been deleted are included
AND (s.day_time - toInt32(l.published_at / 86400)) BETWEEN 0 AND 90
GROUP BY
listing_age_days
ORDER BY
listing_age_days
SELECT
c.name_en AS category,
CASE
WHEN listing_age_days BETWEEN 0 AND 7 THEN '1. Week 1'
WHEN listing_age_days BETWEEN 8 AND 14 THEN '2. Week 2'
WHEN listing_age_days BETWEEN 15 AND 30 THEN '3. Week 3-4'
WHEN listing_age_days BETWEEN 31 AND 60 THEN '4. Month 2'
ELSE '5. Month 3'
END AS age_bucket,
ROUND(AVG(views), 2) AS avg_views,
ROUND(median(views), 1) AS median_views
FROM
(
SELECT
s.id,
l.category,
s.day_time - toInt32(l.published_at / 86400) AS listing_age_days,
s.views
FROM
sadb_stats_listings_stats s FINAL
JOIN sadb_listings l FINAL ON s.id = l.id
WHERE
toDate(s.day_time) BETWEEN '2025-10-14' AND '2026-01-13'
AND l.published_at > 0
AND s.day_time >= toInt32(l.published_at / 86400)
AND l._peerdb_is_deleted = 0
-- no status filter: listings that have since closed or been deleted are included
AND (s.day_time - toInt32(l.published_at / 86400)) BETWEEN 0 AND 90
) t
JOIN sadb_categories c FINAL ON t.category = c.category_id
WHERE
c.name_en IN (
'Apartment for Rent',
'Villa for Sale',
'Land for Sale',
'Apartment for Sale',
'Villa for Rent'
)
GROUP BY
c.name_en,
age_bucket
ORDER BY
c.name_en,
age_bucket

Conversion rate (contacts / views) also decays over time, but less dramatically than raw views.

Listing Age Avg Views Avg Contacts Conversion %
Day 0 16.2 1.75 10.8%
Day 2 23.4 1.65 7.1%
Day 7 15.9 0.90 5.6%
Day 14 13.1 0.71 5.4%
Day 30 10.4 0.52 5.0%
Day 60 7.8 0.35 4.5%
Day 90 6.5 0.28 4.3%
Metric Week 1 Month 3 Decay
Views 18.5 avg 7.0 avg –62%
Contacts 1.17 avg 0.31 avg –74%
Conversion % 6.3% 4.4% –31%

Share of all contacts in the window by listing age: Week 1 23%, Week 2 14%, Weeks 3-4 22%, Month 2 25%, Month 3 17%. The first two weeks generate ~36% of contacts, down from the ~50% originally reported. That is still the most contact-dense period per day of listing age.

Category Week 1 Week 2 Wk 3-4 Mo 2 Mo 3 Decay
Apartment Rent 7.2% 6.5% 6.2% 5.9% 5.8% –19%
Villa Rent 6.3% 5.6% 5.3% 5.2% 5.3% –16%
Land Sale 6.7% 4.6% 4.3% 3.8% 3.4% -49%
Apartment Sale 3.6% 3.5% 3.5% 3.4% 3.3% –8%
Villa Sale 3.4% 2.7% 2.5% 2.3% 2.2% -35%

Insight (holds): Rentals maintain conversion better, and Land sales have the steepest decay. Land’s Week 1 rate (6.7%) is now just below Apartment Rent’s (7.2%) rather than tied with it.

City Week 1 Week 2 Wk 3-4 Mo 2 Mo 3 Decay
مكة 6.4% 5.9% 5.0% 4.5% 3.8% –41%
الرياض 6.8% 5.8% 5.5% 5.1% 4.7% –31%
الدمام 6.1% 5.4% 5.0% 4.5% 4.7% –23%
جدة 5.8% 5.1% 4.7% 4.4% 4.2% –28%

Makkah still has the steepest conversion decay, and it now ends lowest at Month 3. Riyadh, not Makkah, has the highest Week 1 conversion. Jeddah has the lowest Week 1 baseline.

SELECT
s.day_time - toInt32(l.published_at / 86400) AS listing_age_days,
SUM(s.views) AS total_views,
SUM(s.calls + s.msgs + s.whatsapp) AS total_contacts,
ROUND(
100.0 * SUM(s.calls + s.msgs + s.whatsapp) / NULLIF(SUM(s.views), 0),
2
) AS conversion_pct,
ROUND(AVG(s.views), 1) AS avg_views,
ROUND(AVG(s.calls + s.msgs + s.whatsapp), 2) AS avg_contacts
FROM
sadb_stats_listings_stats s FINAL
JOIN sadb_listings l FINAL ON s.id = l.id
WHERE
toDate(s.day_time) BETWEEN '2025-10-14' AND '2026-01-13'
AND l.published_at > 0
AND s.day_time >= toInt32(l.published_at / 86400)
AND l._peerdb_is_deleted = 0
-- no status filter: listings that have since closed or been deleted are included
AND (s.day_time - toInt32(l.published_at / 86400)) BETWEEN 0 AND 90
GROUP BY
listing_age_days
ORDER BY
listing_age_days
SELECT
c.name_en AS category,
CASE
WHEN listing_age_days BETWEEN 0 AND 7 THEN '1. Week 1'
WHEN listing_age_days BETWEEN 8 AND 14 THEN '2. Week 2'
WHEN listing_age_days BETWEEN 15 AND 30 THEN '3. Week 3-4'
WHEN listing_age_days BETWEEN 31 AND 60 THEN '4. Month 2'
ELSE '5. Month 3'
END AS age_bucket,
SUM(views) AS total_views,
SUM(contacts) AS total_contacts,
ROUND(100.0 * SUM(contacts) / NULLIF(SUM(views), 0), 2) AS conversion_pct,
ROUND(AVG(views), 1) AS avg_views,
ROUND(AVG(contacts), 2) AS avg_contacts
FROM
(
SELECT
s.id,
l.category,
s.day_time - toInt32(l.published_at / 86400) AS listing_age_days,
s.views,
s.calls + s.msgs + s.whatsapp AS contacts
FROM
sadb_stats_listings_stats s FINAL
JOIN sadb_listings l FINAL ON s.id = l.id
WHERE
toDate(s.day_time) BETWEEN '2025-10-14' AND '2026-01-13'
AND l.published_at > 0
AND s.day_time >= toInt32(l.published_at / 86400)
AND l._peerdb_is_deleted = 0
-- no status filter: listings that have since closed or been deleted are included
AND (s.day_time - toInt32(l.published_at / 86400)) BETWEEN 0 AND 90
) t
JOIN sadb_categories c FINAL ON t.category = c.category_id
WHERE
c.name_en IN (
'Apartment for Rent',
'Villa for Sale',
'Land for Sale',
'Apartment for Sale',
'Villa for Rent'
)
GROUP BY
c.name_en,
age_bucket
ORDER BY
c.name_en,
age_bucket
SELECT
d.city_name,
CASE
WHEN listing_age_days BETWEEN 0 AND 7 THEN '1. Week 1'
WHEN listing_age_days BETWEEN 8 AND 14 THEN '2. Week 2'
WHEN listing_age_days BETWEEN 15 AND 30 THEN '3. Week 3-4'
WHEN listing_age_days BETWEEN 31 AND 60 THEN '4. Month 2'
ELSE '5. Month 3'
END AS age_bucket,
SUM(views) AS total_views,
SUM(contacts) AS total_contacts,
ROUND(100.0 * SUM(contacts) / NULLIF(SUM(views), 0), 2) AS conversion_pct
FROM
(
SELECT
s.id,
l.district_id,
s.day_time - toInt32(l.published_at / 86400) AS listing_age_days,
s.views,
s.calls + s.msgs + s.whatsapp AS contacts
FROM
sadb_stats_listings_stats s FINAL
JOIN sadb_listings l FINAL ON s.id = l.id
WHERE
toDate(s.day_time) BETWEEN '2025-10-14' AND '2026-01-13'
AND l.published_at > 0
AND s.day_time >= toInt32(l.published_at / 86400)
AND l._peerdb_is_deleted = 0
-- no status filter: listings that have since closed or been deleted are included
AND (s.day_time - toInt32(l.published_at / 86400)) BETWEEN 0 AND 90
) t
JOIN sadb_districts d FINAL ON t.district_id = d.district_id
WHERE
d.city_name IN ('الرياض', 'جدة', 'الدمام', 'مكة المكرمة')
GROUP BY
d.city_name,
age_bucket
ORDER BY
d.city_name,
age_bucket

  • Listings not converting by Day 30 are getting ~44% of peak traffic
  • Consider automated refresh prompts at Day 14 and Day 30
  • If no contacts by Week 2, listing may be overpriced
  • Sales listings (especially land) need pricing attention early
  • Rentals: High volume, maintain conversion - focus on response time
  • Land Sales: Urgency-driven buyers - price aggressively early
  • Villa Sales: Longer cycle expected - patience but monitor conversion
  • Riyadh: Fastest market, most competitive - quick response essential
  • Makkah: Lowest traffic and fastest conversion decay - capture early (corrected: its Week 1 conversion is not the highest)
  • Jeddah: Slower decay but lower baseline - quality over speed

  • Analysis Period: 2024-01-01 onwards (regulatory changes make earlier data incomparable)
  • View/Conversion Analysis: The 3 months to the original run date (2025-10-14 to 2026-01-13). No status filter, so listings that have since closed or been deleted are included (see the correction note).
  • Time on Market: Filtered to 1-730 days (excludes outliers)
  • day_time format: Days since Unix epoch (not Unix timestamp)
  • published_at format: Unix timestamp (seconds)