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.statuscodes: 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.
Executive Summary
Section titled “Executive Summary”This analysis covers three key aspects of listing performance:
- Time on Market - How long listings take to close by category/city
- View Decay - How views decrease as listings age
- Contact Conversion Decay - How view-to-contact rates change over time
Key Findings
Section titled “Key Findings”| 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 |
1. Time on Market Analysis
Section titled “1. Time on Market Analysis”Overview
Section titled “Overview”Time on market measures days from published_at to close_time for listings that have been closed.
By Category (Median Days)
Section titled “By Category (Median Days)”| 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
By City (Median Days)
Section titled “By City (Median Days)”| 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
Monthly Cohort Trends
Section titled “Monthly Cohort Trends”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
Villa for Sale (Median Days by Cohort)
Section titled “Villa for Sale (Median Days by Cohort)”| 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
Query: Time on Market by Category
Section titled “Query: Time on Market by Category”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_daysFROM sadb_listings l FINAL JOIN sadb_categories c FINAL ON l.category = c.category_idWHERE 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_enHAVING closed_listings >= 100ORDER BY closed_listings DESCQuery: Time on Market by City
Section titled “Query: Time on Market by City”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_daysFROM sadb_listings l FINAL JOIN sadb_districts d FINAL ON l.district_id = d.district_idWHERE 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_nameHAVING closed_listings >= 1000ORDER BY closed_listings DESCQuery: 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_daysFROM 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_idWHERE 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_nameHAVING closed_listings >= 50ORDER BY d.city_name, cohort_month2. View Decay Analysis
Section titled “2. View Decay Analysis”Overview
Section titled “Overview”Views decrease significantly as listings age. Day 2 is typically the peak (not Day 1, due to indexing delays).
Overall View Decay Pattern
Section titled “Overall View Decay Pattern”| 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% |
View Decay by Category
Section titled “View Decay by Category”| 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% |
View Decay by City
Section titled “View Decay by City”| 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.
Query: View Decay by Listing Age
Section titled “Query: View Decay by Listing Age”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_viewsFROM sadb_stats_listings_stats s FINAL JOIN sadb_listings l FINAL ON s.id = l.idWHERE 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 90GROUP BY listing_age_daysORDER BY listing_age_daysQuery: View Decay by Category (Bucketed)
Section titled “Query: View Decay by Category (Bucketed)”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_viewsFROM ( 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_idWHERE 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_bucketORDER BY c.name_en, age_bucket3. Contact Conversion Decay Analysis
Section titled “3. Contact Conversion Decay Analysis”Overview
Section titled “Overview”Conversion rate (contacts / views) also decays over time, but less dramatically than raw views.
Overall Conversion Decay
Section titled “Overall Conversion Decay”| 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% |
Decay Comparison
Section titled “Decay Comparison”| 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.
Conversion by Category
Section titled “Conversion by Category”| 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.
Conversion by City
Section titled “Conversion by City”| 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.
Query: Conversion by Listing Age
Section titled “Query: Conversion by Listing Age”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_contactsFROM sadb_stats_listings_stats s FINAL JOIN sadb_listings l FINAL ON s.id = l.idWHERE 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 90GROUP BY listing_age_daysORDER BY listing_age_daysQuery: Conversion by Category (Bucketed)
Section titled “Query: Conversion by Category (Bucketed)”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_contactsFROM ( 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_idWHERE 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_bucketORDER BY c.name_en, age_bucketQuery: Conversion by City (Bucketed)
Section titled “Query: Conversion by City (Bucketed)”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_pctFROM ( 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_idWHERE d.city_name IN ('الرياض', 'جدة', 'الدمام', 'مكة المكرمة')GROUP BY d.city_name, age_bucketORDER BY d.city_name, age_bucketBusiness Implications
Section titled “Business Implications”1. Listing Refresh Strategy
Section titled “1. Listing Refresh Strategy”- Listings not converting by Day 30 are getting ~44% of peak traffic
- Consider automated refresh prompts at Day 14 and Day 30
2. Pricing Guidance
Section titled “2. Pricing Guidance”- If no contacts by Week 2, listing may be overpriced
- Sales listings (especially land) need pricing attention early
3. Category-Specific Strategies
Section titled “3. Category-Specific Strategies”- 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
4. City-Specific Insights
Section titled “4. City-Specific Insights”- 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
Data Notes
Section titled “Data Notes”- 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
statusfilter, 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)