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 Count | Listings | Total Views | Total Contacts | Contacts/1K Views |
|---|---|---|---|---|
| 0 (None) | 78K | 31.7M | 1.30M | 41.12 |
| 1 | 107K | 78.1M | 2.67M | 34.12 |
| 2-3 | 66K | 48.5M | 1.53M | 31.58 |
| 4-6 | 81K | 79.7M | 2.60M | 32.64 |
| 7-10 | 135K | 125M | 4.00M | 31.99 |
| 11-15 | 68K | 65.7M | 2.02M | 30.78 |
| 16-20 | 36K | 32.6M | 0.97M | 29.84 |
| 21+ | 33K | 29.3M | 0.83M | 28.31 |
By Category
| Category | 0 imgs | 1-3 imgs | 4-7 imgs | 8-12 imgs | 13+ imgs |
|---|---|---|---|---|---|
| Apartment for Rent | 44.7 | 36.9 | 36.3 | 35.7 | 34.8 |
| Land for Sale | 35.6 | 38.5 | 27.9 | 26.6 | 19.8 |
| Villa for Sale | 31.2 | 22.7 | 21.5 | 21.0 | 21.6 |
| Villa for Rent | 41.8 | 34.8 | 33.3 | 34.3 | 33.4 |
| Apartment for Sale | 31.1 | 26.9 | 24.9 | 25.9 | 27.2 |
Notable: Land for Sale shows optimal conversion at 1-3 images (38.5/1K), then drops sharply.
By City
| City | 0 imgs | 1-3 imgs | 4-7 imgs | 8-12 imgs | 13+ imgs |
|---|---|---|---|---|---|
| الرياض (Riyadh) | 43.3 | 37.0 | 35.0 | 34.0 | 31.5 |
| جدة (Jeddah) | 41.5 | 31.2 | 29.9 | 28.9 | 27.0 |
| الدمام (Dammam) | 41.1 | 28.8 | 28.8 | 31.2 | 26.9 |
| مكة (Makkah) | 43.0 | 29.2 | 28.9 | 30.0 | 26.4 |
| المدينة (Madinah) | 37.4 | 24.6 | 25.8 | 25.8 | 25.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
- For sellers prioritizing contact volume: Use 7-10 images to maximize total contacts
- For sellers prioritizing efficiency: Use 4-6 images for optimal conversion rate
- For land listings: 1-3 images is sufficient; more images reduce conversion
- 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_viewsFROM 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_idGROUP BY li.img_bucketORDER BY img_bucket