SOV Advertiser Retention
Executive Summary
Section titled “Executive Summary”- SOV keeps few advertisers month to month. Of advertisers whose first charged SOV day was in a given month, 26% are active again the next month, 11% in month 3, 8% in month 6 and 7% in month 12. The curve flattens after month 6 into a small core of about 5–7% that keeps buying.
- Revenue holds up better than the advertiser count. Month-12 spend is 19% of the cohort’s first-month spend (month 1: 44%). The advertisers who stay spend about 2.7× as much as the cohort average did in its first month.
- Use is short and on/off, not a subscription. The median advertiser buys 5 charged days in total, and 79% of first campaigns last 3 days or less. Still, 48% come back after a gap of more than 7 days (median 55 days later), and reactivated advertisers make up about 30% of each month’s active base.
- Owners churn about twice as fast as brokers after the first month. Owners are advertisers whose first SOV listing went through Aqar’s owner licensing flow (
licensing_requests). They are a third of advertisers. They return in month 1 at the same rate as brokers (25% vs 27%), but by month 12 only 4.6% are still buying, against 8.5% of brokers. Owner revenue retention at month 12 is 13%, against 22% for brokers. Owners’ share of SOV spend fell from about 35% in mid-2024 to 14% in September 2026. - Retention has not improved. Month-1 retention has stayed at 24–31% for every quarterly cohort since 2024. Month-12 retention dropped from 11% (2024 Q1 cohort) to about 5% (2025 cohorts).
Definitions
Section titled “Definitions”- Advertiser =
user_idinsadb_sov_daily_biddings. - Charged SOV day = a bidding row with
status = 4andnon_chargeable = false, the same filter as the SOV pricing simulator. This drops campaigns that were created but never ran: 22.1k users created a campaign, 14.6k were ever charged. - Cohort = the calendar month of an advertiser’s first charged day (from 2024-03, the first full month of SOV).
- Month-k logo retention = share of the cohort with at least one charged day in calendar month k after the cohort month. Calendar months flatter month 1 slightly, because a campaign that starts on the 30th and runs into the next month counts as retained.
- Revenue retention = cohort spend in month k ÷ cohort spend in month 0 (
budgetis in points; 100 points = 1 SAR). - Only cohorts old enough to observe month k are included. October 2026 (partial) is excluded.
Retention Curve (All Cohorts Pooled)
Section titled “Retention Curve (All Cohorts Pooled)”| Month k | Eligible advertisers | Active in month k | Logo retention | Revenue retention | Came back at any point by month k |
|---|---|---|---|---|---|
| 1 | 14,229 | 3,755 | 26.4% | 43.5% | 26.4% |
| 2 | 13,847 | 1,974 | 14.3% | 27.2% | 31.8% |
| 3 | 13,487 | 1,496 | 11.1% | 22.5% | 35.4% |
| 6 | 12,484 | 1,012 | 8.1% | 19.4% | 41.5% |
| 12 | 10,634 | 758 | 7.1% | 19.1% | 48.0% |
| 18 | 8,278 | 488 | 5.9% | 17.9% | 52.7% |
| 24 | 5,526 | 299 | 5.4% | 17.8% | 57.4% |
The gap between the last two columns shows the on/off pattern. By month 12 about half the cohort has bought SOV again at some point, but only 7% are buying in any given month.
SQL Query
Section titled “SQL Query”WITH um AS ( SELECT user_id, toStartOfMonth(start_datetime) m, sum(budget) / 100 sar FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' AND start_datetime < '2026-10-01' GROUP BY user_id, m ), f AS ( SELECT user_id AS uid, argMin(m, m) cohort, argMin(sar, m) sar0 FROM um GROUP BY user_id ), j AS ( SELECT f.uid AS uid, f.cohort AS cohort, dateDiff('month', f.cohort, um.m) k, um.sar AS sar FROM um JOIN f ON um.user_id = f.uid ), ks AS ( SELECT arrayJoin([1, 2, 3, 6, 12, 18, 24]) kk ), base AS ( SELECT kk, uniqExact(uid) eligible, sum(sar0) sar0 FROM f CROSS JOIN ks WHERE cohort <= addMonths(toDate('2026-09-01'), - kk) GROUP BY kk ), act AS ( SELECT kk, uniqExactIf (uid, k = kk) active, sumIf (sar, k = kk) sar_k, uniqExactIf ( uid, k >= 1 AND k <= kk ) ever_back FROM j CROSS JOIN ks WHERE cohort <= addMonths(toDate('2026-09-01'), - kk) GROUP BY kk )SELECT kk, eligible, active, round(active / eligible * 100, 1) logo_ret, round(sar_k / sar0 * 100, 1) rev_ret, round(ever_back / eligible * 100, 1) returned_within_kFROM base JOIN act USING kkORDER BY kkOwners vs Brokers
Section titled “Owners vs Brokers”An advertiser is an owner if the listing on their first charged SOV day has a row in licensing_requests, the table behind Aqar’s flow for issuing ad licenses to owners. Everyone else is a broker: their listing carries a license they got through REGA themselves. licensing_requests is only in MySQL, so the queries in this section run on Metabase database 2 against the MySQL sov_daily_biddings. With the same filters, the MySQL counts match ClickHouse exactly (14,229 advertisers eligible for month 1).
Owners make up 4,791 of the 14,229 advertisers (34%). Only 121 of the 7.6k owner-flow listings promoted with SOV never got a license issued, so including unissued requests makes no practical difference.
Retention Curve
Section titled “Retention Curve”| Month k | Broker eligible | Broker logo | Broker revenue | Broker came back by k | Owner eligible | Owner logo | Owner revenue | Owner came back by k |
|---|---|---|---|---|---|---|---|---|
| 1 | 9,438 | 26.9% | 43.6% | 26.9% | 4,791 | 25.3% | 43.3% | 25.3% |
| 2 | 9,179 | 15.9% | 29.6% | 33.4% | 4,668 | 11.0% | 22.2% | 28.8% |
| 3 | 8,934 | 12.5% | 24.5% | 37.6% | 4,553 | 8.3% | 18.3% | 31.1% |
| 6 | 8,270 | 9.3% | 22.1% | 44.6% | 4,214 | 5.8% | 13.6% | 35.4% |
| 12 | 6,966 | 8.5% | 22.2% | 52.5% | 3,668 | 4.6% | 12.7% | 39.5% |
| 18 | 5,346 | 7.2% | 19.7% | 57.4% | 2,932 | 3.4% | 14.2% | 44.0% |
| 24 | 3,604 | 6.5% | 21.1% | 62.2% | 1,922 | 3.3% | 11.0% | 48.4% |
Both groups look the same in month 1, then split. An owner usually has one property to sell or rent, so once it is gone there is nothing left to promote. Brokers keep getting new inventory, and 62% of them come back at some point within two years.
Advertisers with a first charged day before 2026-09:
| Metric | Broker | Owner |
|---|---|---|
| Advertisers | 9,438 | 4,791 |
| Lifetime spend (SAR) | 6.92 M | 2.21 M |
| Average lifetime spend per advertiser (SAR) | 733 | 462 |
| Average charged days | 22.2 | 13.3 |
| Lifetime ≤ 7 charged days | 61.0% | 71.3% |
| Ran 2+ campaigns | 62.4% | 48.3% |
| Average listings promoted | 4.21 | 1.77 |
| Promoted 2+ listings | 55.6% | 25.9% |
One in four owners promoted more than one listing. These are likely owners with several properties, or small brokers who list through the owner flow.
By Category
Section titled “By Category”The category is the one targeted on the advertiser’s first charged day. Only segments with at least 150 advertisers are shown.
| Category | Segment | n (M1) | Month 1 | Month 3 | n (M12) | Month 12 |
|---|---|---|---|---|---|---|
| Apartment for Rent | Broker | 1,416 | 27.7% | 14.0% | 1,056 | 11.9% |
| Apartment for Rent | Owner | 1,800 | 24.7% | 7.7% | 1,342 | 4.4% |
| Land for Sale | Broker | 1,698 | 25.6% | 10.9% | 1,292 | 8.0% |
| Land for Sale | Owner | 780 | 26.8% | 8.9% | 614 | 4.4% |
| Villa for Sale | Broker | 1,880 | 28.7% | 13.8% | 1,386 | 7.0% |
| Villa for Sale | Owner | 547 | 28.7% | 10.1% | 433 | 3.7% |
| Apartment for Sale | Broker | 1,691 | 29.7% | 14.5% | 1,237 | 8.7% |
| Apartment for Sale | Owner | 362 | 29.3% | 9.0% | 275 | 6.2% |
| Villa for Rent | Broker | 245 | 23.7% | 13.7% | 181 | 9.4% |
| Villa for Rent | Owner | 293 | 22.2% | 6.1% | 225 | 3.6% |
| Building for Sale | Broker | 526 | 25.5% | 8.5% | 367 | 8.7% |
| Building for Sale | Owner | 176 | 19.9% | 6.5% | 131 | 4.6% |
| Big Flat for Rent | Owner | 166 | 23.5% | 4.4% | 122 | 5.7% |
| Big Flat for Sale | Broker | 451 | 29.0% | 13.4% | 293 | 6.1% |
| Building for Rent | Broker | 306 | 27.1% | 10.2% | 219 | 9.6% |
| Apartment for booking | Broker | 291 | 15.1% | 6.2% | 260 | 2.7% |
The owner gap holds in every category. It is not caused by owners being concentrated in low-retention categories. Apartment for Rent shows the biggest gap: it is the only category with more owner advertisers than broker advertisers, and brokers keep 11.9% at month 12 against 4.4% for owners.
Owner Share of Monthly SOV
Section titled “Owner Share of Monthly SOV”| Month | Owner advertisers | Broker advertisers | Owner share of spend |
|---|---|---|---|
| 2024-04 | 373 | 583 | 37.6% |
| 2024-08 | 530 | 1,106 | 27.4% |
| 2024-12 | 419 | 881 | 24.3% |
| 2025-04 | 285 | 766 | 21.5% |
| 2025-08 | 286 | 977 | 20.6% |
| 2025-12 | 275 | 838 | 21.6% |
| 2026-04 | 292 | 988 | 18.2% |
| 2026-08 | 275 | 972 | 14.7% |
| 2026-09 | 287 | 933 | 14.1% |
Here each charged day is classified by its own listing, not by the advertiser’s first listing. The number of owner advertisers per month has held at about 250–300 since 2025, but their share of spend keeps falling. Owners now spend less per advertiser, while broker spend grows.
SQL Query
Section titled “SQL Query”-- Metabase database 2 (MySQL): retention curve by owner/brokerWITH b AS ( SELECT user_id, listing_id, start_datetime, budget FROM sov_daily_biddings WHERE status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' AND start_datetime < '2026-10-01' ), fl AS ( SELECT user_id, listing_id FROM ( SELECT user_id, listing_id, ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY start_datetime, listing_id ) rn FROM b ) t WHERE rn = 1 ), lr AS ( SELECT DISTINCT listing_id FROM licensing_requests ), seg AS ( SELECT fl.user_id, IF(lr.listing_id IS NULL, 'broker', 'owner') seg FROM fl LEFT JOIN lr ON lr.listing_id = fl.listing_id ), um AS ( SELECT user_id, DATE(DATE_FORMAT(start_datetime, '%Y-%m-01')) m, SUM(budget) / 100 sar FROM b GROUP BY user_id, m ), f AS ( SELECT user_id, MIN(m) cohort FROM um GROUP BY user_id ), j AS ( SELECT um.user_id, seg.seg, f.cohort, TIMESTAMPDIFF(MONTH, f.cohort, um.m) k, um.sar FROM um JOIN f ON f.user_id = um.user_id JOIN seg ON seg.user_id = um.user_id ), ks AS ( SELECT 1 kk UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 6 UNION ALL SELECT 12 UNION ALL SELECT 18 UNION ALL SELECT 24 )SELECT seg, kk, COUNT(DISTINCT j.user_id) eligible, COUNT( DISTINCT CASE WHEN k = kk THEN j.user_id END ) active, ROUND( COUNT( DISTINCT CASE WHEN k = kk THEN j.user_id END ) / COUNT(DISTINCT j.user_id) * 100, 1 ) logo_ret, ROUND( SUM( CASE WHEN k = kk THEN sar END ) / SUM( CASE WHEN k = 0 THEN sar END ) * 100, 1 ) rev_ret, ROUND( COUNT( DISTINCT CASE WHEN k BETWEEN 1 AND kk THEN j.user_id END ) / COUNT(DISTINCT j.user_id) * 100, 1 ) back_by_kFROM j JOIN ks ON j.cohort <= DATE_SUB ('2026-09-01', INTERVAL ks.kk MONTH)GROUP BY seg, kkORDER BY seg, kkThe category split uses the same b/fl/lr/seg/um/f/j CTEs, with listing_category carried through fl, grouped by cat, seg with the month 1/3/12 conditions from the category × city query above. The usage table aggregates b per user (COUNT(*), COUNT(DISTINCT sov_campaign_id), COUNT(DISTINCT listing_id), SUM(budget) / 100) and joins seg. The monthly share query:
-- Metabase database 2 (MySQL): owner share of monthly SOV (classified per charged day)SELECT DATE_FORMAT(b.start_datetime, '%Y-%m') m, COUNT( DISTINCT CASE WHEN lr.listing_id IS NOT NULL THEN b.user_id END ) owner_users, COUNT( DISTINCT CASE WHEN lr.listing_id IS NULL THEN b.user_id END ) broker_users, ROUND( SUM( CASE WHEN lr.listing_id IS NOT NULL THEN b.budget END ) / SUM(b.budget) * 100, 1 ) owner_spend_pctFROM sov_daily_biddings b LEFT JOIN ( SELECT DISTINCT listing_id FROM licensing_requests ) lr ON lr.listing_id = b.listing_idWHERE b.status = 4 AND b.non_chargeable = 0 AND b.start_datetime >= '2024-03-01' AND b.start_datetime < '2026-10-01'GROUP BY mORDER BY mRetention by Cohort Quarter
Section titled “Retention by Cohort Quarter”| First-charge quarter | Advertisers | Month 1 | Month 3 | Month 6 | Month 12 |
|---|---|---|---|---|---|
| 2024 Q1 (Mar only) | 1,450 | 25.7% | 14.8% | 14.3% | 11.2% |
| 2024 Q2 | 1,909 | 30.5% | 13.9% | 10.1% | 7.7% |
| 2024 Q3 | 2,167 | 26.1% | 10.0% | 7.0% | 8.0% |
| 2024 Q4 | 1,563 | 24.2% | 8.4% | 7.8% | 6.2% |
| 2025 Q1 | 1,189 | 24.1% | 10.3% | 6.5% | 5.7% |
| 2025 Q2 | 1,115 | 26.0% | 10.5% | 5.9% | 4.9% |
| 2025 Q3 | 1,241 | 25.9% | 10.3% | 5.2% | 4.5% |
| 2025 Q4 | 1,002 | 26.5% | 10.3% | 8.0% | |
| 2026 Q1 | 848 | 28.9% | 11.4% | 6.2% | |
| 2026 Q2 | 1,003 | 25.1% | 10.1% | ||
| 2026 Q3 (Jul–Aug) | 742 | 26.3% |
Early retention (months 1 and 3) has held steady. Long-term retention was higher for the March 2024 launch cohort, which probably held the most committed early adopters. New-advertiser volume has also fallen, from about 2,000 a quarter in 2024 to about 1,000 in 2026.
SQL Query
Section titled “SQL Query”WITH um AS ( SELECT user_id, toStartOfMonth(start_datetime) m, sum(budget) / 100 sar FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' AND start_datetime < '2026-10-01' GROUP BY user_id, m ), f AS ( SELECT user_id AS uid, min(m) cohort FROM um GROUP BY user_id ), j AS ( SELECT f.uid AS uid, toStartOfQuarter(f.cohort) q, f.cohort AS cohort, dateDiff('month', f.cohort, um.m) k FROM um JOIN f ON um.user_id = f.uid )SELECT q, uniqExact(uid) users, round( uniqExactIf (uid, k = 1) / uniqExact(uid) * 100, 1 ) m1, if( max(cohort) <= '2026-06-01', round( uniqExactIf (uid, k = 3) / uniqExact(uid) * 100, 1 ), NULL ) m3, if( max(cohort) <= '2026-03-01', round( uniqExactIf (uid, k = 6) / uniqExact(uid) * 100, 1 ), NULL ) m6, if( max(cohort) <= '2025-09-01', round( uniqExactIf (uid, k = 12) / uniqExact(uid) * 100, 1 ), NULL ) m12FROM jWHERE cohort <= '2026-08-01'GROUP BY qORDER BY qRetention by Category and City
Section titled “Retention by Category and City”Segments are set by the targeting (listing_category, city_id) of the advertiser’s first charged day. The table shows segments with at least 150 advertisers.
| Category | City | n (M1) | Month 1 | Month 3 | Month 12 |
|---|---|---|---|---|---|
| Apartment for Rent | Riyadh | 1,998 | 26.9% | 11.3% | 9.1% |
| Villa for Sale | Riyadh | 1,269 | 31.0% | 14.7% | 6.6% |
| Apartment for Sale | Jeddah | 855 | 30.8% | 14.3% | 8.4% |
| Land for Sale | Riyadh | 812 | 26.7% | 11.1% | 5.9% |
| Apartment for Rent | Jeddah | 599 | 25.4% | 7.5% | 6.7% |
| Apartment for Sale | Riyadh | 586 | 31.4% | 13.9% | 9.9% |
| Big Flat for Sale | Riyadh | 453 | 30.2% | 14.8% | 6.6% |
| Land for Sale | Jeddah | 397 | 29.0% | 10.5% | 7.0% |
| Villa for Rent | Riyadh | 375 | 25.9% | 11.7% | 7.7% |
| Villa for Sale | Jeddah | 333 | 26.4% | 8.9% | 6.5% |
| Apartment for Rent | Khobar | 235 | 26.4% | 9.3% | 2.5% |
| Big Flat for Rent | Riyadh | 232 | 24.6% | 6.9% | 7.2% |
| Villa for Sale | Dammam | 208 | 27.4% | 11.1% | 4.2% |
| Apartment for booking | Riyadh | 202 | 14.4% | 6.4% | 2.7% |
| Building for Rent | Riyadh | 197 | 29.9% | 12.2% | 12.4% |
| Building for Sale | Riyadh | 196 | 27.6% | 12.2% | 11.3% |
| Apartment for Sale | Dammam | 195 | 32.3% | 12.0% | 6.4% |
| Building for Sale | Jeddah | 164 | 22.0% | 7.1% | 9.7% |
| Land for Sale | Madinah | 161 | 24.2% | 12.5% | 5.6% |
- Sale listings retain better early. Apartments, villas and big flats for sale in Riyadh, Jeddah and Dammam reach 30–32% in month 1 and about 14% in month 3. Rentals sit at 25–27% and 7–11%.
- Buildings (rent and sale) have the stickiest long-term core, at 10–12% in month 12. These are likely professional brokers with recurring inventory.
- Bookings units retain worst: 14% in month 1 and 3% in month 12 for Riyadh apartments for booking.
- The Eastern Province (Khobar rentals, Dammam villas) loses advertisers faster after month 3.
SQL Query
Section titled “SQL Query”WITH um AS ( SELECT user_id, toStartOfMonth(start_datetime) m, sum(budget) / 100 sar, argMin(listing_category, start_datetime) cat0, argMin(city_id, start_datetime) city0 FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' AND start_datetime < '2026-10-01' GROUP BY user_id, m ), f AS ( SELECT user_id AS uid, min(m) cohort, argMin(cat0, m) cat, argMin(city0, m) city FROM um GROUP BY user_id ), j AS ( SELECT f.uid uid, f.cat cat, f.city city, f.cohort cohort, dateDiff('month', f.cohort, um.m) k FROM um JOIN f ON um.user_id = f.uid ), cities AS ( SELECT city_id, any(city_name) city_name FROM sadb_districts FINAL GROUP BY city_id )SELECT cg.name_en category, ci.city_name city, uniqExactIf (uid, cohort <= '2026-08-01') n_m1, round( uniqExactIf ( uid, k = 1 AND cohort <= '2026-08-01' ) / n_m1 * 100, 1 ) m1, uniqExactIf (uid, cohort <= '2026-06-01') n_m3, round( uniqExactIf ( uid, k = 3 AND cohort <= '2026-06-01' ) / n_m3 * 100, 1 ) m3, uniqExactIf (uid, cohort <= '2025-09-01') n_m12, round( uniqExactIf ( uid, k = 12 AND cohort <= '2025-09-01' ) / n_m12 * 100, 1 ) m12FROM j LEFT JOIN sadb_categories cg FINAL ON cg.category_id = j.cat LEFT JOIN cities ci ON ci.city_id = j.cityGROUP BY category, cityHAVING n_m1 >= 150ORDER BY n_m1 DESCLIMIT 25How Advertisers Use SOV
Section titled “How Advertisers Use SOV”Advertisers whose first charged day was before 2026-09 (14,229):
| Metric | Value |
|---|---|
| Ran 1 campaign only | 42.1% |
| Ran 2+ campaigns | 57.9% |
| Ran 5+ campaigns | 23.9% |
| Median campaigns per advertiser | 2 |
| Median charged days, lifetime | 5 |
| Median charged days, first campaign | 2 |
| First campaign ≤ 3 days | 78.9% |
| Lifetime ≤ 7 charged days | 64.3% |
| Lifetime ≥ 90 charged days | 3.2% |
Activity is grouped into spells: runs of charged days with gaps of no more than 7 days. Advertisers with a first charged day before 2026-07 (13,487):
| Metric | Value |
|---|---|
| Came back after a gap of more than 7 days | 47.5% |
| …within 90 days of the first charged day | 29.8% |
| Median days from first day to return | 55 |
| Average spells per advertiser | 2.59 |
| 4+ spells | 19.0% |
Most advertisers try SOV for a day or two. The ones who come back use it in short bursts, most likely when they have a new listing to push, rather than as an always-on budget.
SQL Query
Section titled “SQL Query”-- campaigns per advertiserWITH c AS ( SELECT user_id, sov_campaign_id, count() cdays, min(start_datetime) st FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' GROUP BY user_id, sov_campaign_id ), u AS ( SELECT user_id, count() campaigns, sum(cdays) tdays, argMin(cdays, st) first_days, min(st) first_st FROM c GROUP BY user_id )SELECT count() users, round(countIf (campaigns = 1) / count() * 100, 1) one_campaign_pct, round(countIf (campaigns >= 2) / count() * 100, 1) repeat_pct, round(countIf (campaigns >= 5) / count() * 100, 1) ge5_pct, quantileExact(0.5) (campaigns) med_campaigns, quantileExact(0.5) (tdays) med_total_days, quantileExact(0.5) (first_days) med_first_campaign_days, round(countIf (first_days <= 3) / count() * 100, 1) first_le3days_pct, round(countIf (tdays <= 7) / count() * 100, 1) lifetime_le7days_pct, round(countIf (tdays >= 90) / count() * 100, 1) lifetime_ge90days_pctFROM uWHERE first_st < '2026-09-01'-- spells (gaps > 7 days start a new spell)WITH d AS ( SELECT user_id, groupArray(DISTINCT toDate(start_datetime)) ds FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' GROUP BY user_id ), s AS ( SELECT user_id, arraySort(ds) a, arrayFilter( (x, i) -> i = 1 OR dateDiff('day', a[i - 1], x) > 7, a, arrayEnumerate(a) ) spell_starts, a[1] first_day FROM d )SELECT count() users, round( countIf (length(spell_starts) >= 2) / count() * 100, 1 ) came_back_after_7d_gap_pct, round( countIf ( length(spell_starts) >= 2 AND dateDiff('day', first_day, spell_starts[2]) <= 90 ) / count() * 100, 1 ) back_within_90d_pct, quantileExactIf (0.5) ( dateDiff('day', first_day, spell_starts[2]), length(spell_starts) >= 2 ) med_days_to_return, round(avg(length(spell_starts)), 2) avg_spells, round( countIf (length(spell_starts) >= 4) / count() * 100, 1 ) ge4_spells_pctFROM sWHERE first_day < '2026-07-01'Monthly Active Advertiser Mix
Section titled “Monthly Active Advertiser Mix”| Month | Active | New | Continuing (active last month) | Reactivated (gap ≥ 1 month) | New share |
|---|---|---|---|---|---|
| 2025-01 | 1,149 | 410 | 439 | 300 | 35.7% |
| 2025-04 | 1,038 | 346 | 386 | 306 | 33.3% |
| 2025-07 | 1,215 | 406 | 433 | 376 | 33.4% |
| 2025-10 | 1,173 | 370 | 485 | 318 | 31.5% |
| 2026-01 | 1,078 | 290 | 438 | 350 | 26.9% |
| 2026-04 | 1,276 | 376 | 447 | 453 | 29.5% |
| 2026-07 | 1,222 | 360 | 495 | 367 | 29.5% |
| 2026-08 | 1,240 | 382 | 495 | 363 | 30.8% |
| 2026-09 | 1,214 | 308 | 520 | 386 | 25.4% |
The active base is flat at about 1,100–1,250 advertisers a month. It is now less dependent on new advertisers (36% → 25–30%). The continuing segment grew from about 440 to about 500, while new-advertiser acquisition shrank.
SQL Query
Section titled “SQL Query”WITH um AS ( SELECT DISTINCT user_id, toStartOfMonth(start_datetime) m FROM sadb_sov_daily_biddings FINAL WHERE _peerdb_is_deleted = 0 AND status = 4 AND non_chargeable = 0 AND start_datetime >= '2024-03-01' AND start_datetime < '2026-10-01' ), x AS ( SELECT user_id, m, min(m) OVER ( PARTITION BY user_id ) first_m, lagInFrame(m) OVER ( PARTITION BY user_id ORDER BY m ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) prev_m FROM um )SELECT m, count() active, countIf (m = first_m) new_users, countIf ( m <> first_m AND prev_m = addMonths(m, -1) ) continuing, countIf ( m <> first_m AND prev_m < addMonths(m, -1) ) reactivated, round(countIf (m = first_m) / count() * 100, 1) new_pctFROM xWHERE m >= '2025-01-01'GROUP BY mORDER BY mImplications
Section titled “Implications”- The first 30 days decide retention. Most churn happens immediately, after a 1–3 day trial. Things to try: a first-campaign nudge (show results after day 2 and suggest extending), or a minimum first package such as the 7-day fixed price.
- Win-back is a real lever. Half of churned advertisers return on their own, typically about 2 months later. A reminder when an advertiser publishes a new listing could pull that return earlier.
- Revenue depends on a small core. About 7% of each cohort is still buying a year later and supplies most of the long-term revenue. Building and sale-listing brokers in Riyadh and Jeddah are the segments to protect.
- Treat owners and brokers as different products. Owners are one-off buyers whose need ends when their property is sold or rented. Optimise their first purchase (packages, price) rather than retention. Retention and win-back efforts belong with brokers, who keep getting new inventory to promote.
- Acquisition is falling. New advertisers per quarter have halved since 2024 while retention stayed flat, so the active base is held up by returning users, not growth.