Skip to content

Contact Rate vs. Images Per Listing Analysis

Date: 2026-01-14 Period: 2024-01-01 to present Data Sources: sadb_listings, sadb_phone_get_logs, sadb_stats_listings_stats

Summary

Contact rate (phone reveals per 1,000 views) has a negative correlation with image count. Listings with no images convert at 41 contacts/1K views, dropping to 28 contacts/1K views for listings with 21+ images — a 31% decrease.

However, listings with more images receive significantly more views and total contacts in absolute terms.

Overall Results

Image CountListingsTotal ViewsTotal ContactsContacts/1K Views
0 (None)78K31.7M1.30M41.12
1107K78.1M2.67M34.12
2-366K48.5M1.53M31.58
4-681K79.7M2.60M32.64
7-10135K125M4.00M31.99
11-1568K65.7M2.02M30.78
16-2036K32.6M0.97M29.84
21+33K29.3M0.83M28.31

By Category

Category0 imgs1-3 imgs4-7 imgs8-12 imgs13+ imgs
Apartment for Rent44.736.936.335.734.8
Land for Sale35.638.527.926.619.8
Villa for Sale31.222.721.521.021.6
Villa for Rent41.834.833.334.333.4
Apartment for Sale31.126.924.925.927.2

Notable: Land for Sale shows optimal conversion at 1-3 images (38.5/1K), then drops sharply.

By City

City0 imgs1-3 imgs4-7 imgs8-12 imgs13+ imgs
الرياض (Riyadh)43.337.035.034.031.5
جدة (Jeddah)41.531.229.928.927.0
الدمام (Dammam)41.128.828.831.226.9
مكة (Makkah)43.029.228.930.026.4
المدينة (Madinah)37.424.625.825.825.1

Pattern is consistent across all major cities.

Key Insights

1. The “Curiosity Gap” Effect

Listings with 0 images have the highest conversion because users must call to learn more. Images satisfy curiosity and reduce the urgency to contact.

2. Trade-off: Rate vs. Volume

  • 0 images: 41 contacts/1K views, but only 1.30M total contacts
  • 1 image: 34 contacts/1K views, but 2.67M total contacts (2x more)
  • 7-10 images: 32 contacts/1K views, but 4.00M total contacts (3x more)

More images attract more views, leading to more absolute contacts despite lower conversion rates.

3. Category-Specific Patterns

  • Land listings: 1-3 images optimal (land doesn’t need many photos)
  • Residential rentals: Stable conversion at 4-8 images
  • Villas for sale: Diminishing returns after 1-3 images

4. Optimal Image Count

The “sweet spot” for most categories is 4-8 images:

  • Enough visual content to attract views
  • Maintains ~32 contacts/1K views conversion
  • Best balance of visibility and conversion

Recommendations

  1. For sellers prioritizing contact volume: Use 7-10 images to maximize total contacts
  2. For sellers prioritizing efficiency: Use 4-6 images for optimal conversion rate
  3. For land listings: 1-3 images is sufficient; more images reduce conversion
  4. Product consideration: Consider prompting users with 0 images to add at least 1-3 photos to increase visibility

SQL Queries

Main Analysis Query

WITH
listing_images AS (
SELECT
id AS listing_id,
category,
district_id,
multiIf (
imgs = '',
0,
length (imgs) - length (replaceAll (imgs, ',', '')) + 1
) AS img_count,
CASE
WHEN imgs = '' THEN '0 (No images)'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 = 1 THEN '1'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 BETWEEN 2 AND 3 THEN '2-3'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 BETWEEN 4 AND 6 THEN '4-6'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 BETWEEN 7 AND 10 THEN '7-10'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 BETWEEN 11 AND 15 THEN '11-15'
WHEN length (imgs) - length (replaceAll (imgs, ',', '')) + 1 BETWEEN 16 AND 20 THEN '16-20'
ELSE '21+'
END AS img_bucket
FROM
sadb_listings FINAL
WHERE
status = 1
AND _peerdb_is_deleted = 0
AND toDate (create_time) >= '2024-01-01'
),
listing_stats AS (
SELECT
id AS listing_id,
SUM(views) AS total_views
FROM
sadb_stats_listings_stats FINAL
WHERE
toDate (day_time) >= '2024-01-01'
GROUP BY
id
),
listing_contacts AS (
SELECT
resource_id AS listing_id,
COUNT(*) AS phone_reveals
FROM
sadb_phone_get_logs FINAL
WHERE
resource = 'listing'
AND toDate (createdAt) >= '2024-01-01'
AND _peerdb_is_deleted = 0
GROUP BY
resource_id
)
SELECT
li.img_bucket,
COUNT(DISTINCT li.listing_id) AS listings,
SUM(ls.total_views) AS total_views,
SUM(lc.phone_reveals) AS total_contacts,
ROUND(
SUM(lc.phone_reveals) * 1000.0 / NULLIF(SUM(ls.total_views), 0),
2
) AS contacts_per_1k_views
FROM
listing_images li
LEFT JOIN listing_stats ls ON li.listing_id = ls.listing_id
LEFT JOIN listing_contacts lc ON li.listing_id = lc.listing_id
GROUP BY
li.img_bucket
ORDER BY
img_bucket