Competitor Deep-Dive Analysis โ
Aldilaijan & Khobara Real Estate โ Kuwait Market Gaps โ
Date: 2026-07-23
Scope: 5 competitors, 4 chosen gaps, exhaustive sub-page scraping
Analyst: Kimi Work agent
Methodology: Playwright stealth scraping of homepages + 25+ sub-pages; HTML/JSON extraction; direct codebase comparison.
Table of Contents โ
- Executive Summary
- Methodology & Competitor Map
- Gap 1 โ Public Registered-Deals Feed
- Gap 2 โ SEO Landing Pages + English Locale
- Gap 3 โ Reverse Demand Board
- Gap 4 โ Financing Products
- Appendix: Other Missed Capabilities
- Master Build-Spec Summary
1. Executive Summary โ
| Gap | Primary Competitor(s) | Our Current State | Gap Severity | Effort |
|---|---|---|---|---|
| Public Registered-Deals Feed | alhisba.com (blocked by CF but homepage shows deals), taqeemkw.com (listings with license numbers) | real_estate_transactions (~149k rows), get_public_real_estate_transactions RPC, public transactions browser, market indicators, price index | Medium โ we have data but no deal-card social feed | M |
| SEO Landing Pages + English Locale | boshamlan.com (764+ indexable URLs, /en, Astro SSR), bu3qar.com (Next.js, area slug pages), alhisba.com (Nuxt SSR, multi-page) | Flutter web app; no SSR/prerendering; no English public routes; single / landing | High โ invisible to Google for long-tail queries | L |
| Reverse Demand Board | alhisba.com (ุทูุจ ุดุฑุงุก / ุทูุจ ุฅูุฌุงุฑ tabs) | Internal CRM requests table + matching feature; no public posting or broker response UI | High โ entirely internal today | MโL |
| Financing Products | alhisba.com (/constructionfinance โ bank partner form), taqeemkw.com (no financing found), estater.com (B2B advisory only) | mortgage_calculator_screen (pure client-side annuity), roi_calculator_screen (pure client-side yield); no bank APIs, no product marketplace | Medium โ calculators exist, product engine missing | L |
Key first-pass misses discovered in this round:
- taqeemkw has a consumer property portfolio (
/Frontend/Account/Portfolio) โ login-gated but a major consumer retention feature we lack. - taqeemkw lists license numbers on every ad detail (e.g., "ุชุฑุฎูุต ุฑูู 1989/2936") โ builds trust via Ministry of Commerce attribution.
- alhisba has WhatsApp Channel + direct wa.me links for every listing โ no email/phone intermediation.
- alhisba runs a newsletter + news section citing Ministry of Justice deal aggregates (928M KWD in 5 days, 153 deals).
- boshamlan has /agents directory with license numbers + ad counts per office โ 71+ offices listed.
- bu3qar has C2C self-serve posting ("ู ุงูู ุนูุงุฑ? ุฃุถู ุฅุนูุงูู") + video content channel (ุชููุฒููู ุจูุนูุงุฑ) + YouTube integration.
- estater exposes a Google Maps API key in client HTML (
AIzaSyAmnH9DzaMJXdNw2TzgZ18RydRBDIhWHUo) โ client-side security anti-pattern.
2. Methodology & Competitor Map โ
Scraped Pages (25+ URLs) โ
| Competitor | Home | Sub-pages Scraped | Anti-bot Hit? |
|---|---|---|---|
| taqeemkw.com | โ | Rent estimator, Price estimator, Construction estimator, Search, Ad detail, Portfolio (login gate), English attempt (404) | No |
| alhisba.com | โ | /deals (CF 403), /constructionfinance, /evaluation/ive/land (CF 403), /ads (CF 403) | Yes โ Cloudflare challenge on /deals, /ads, /evaluation |
| boshamlan.com | โ | /sitemap, /en, /sale/apartments, /sale/properties/area, /agents | No |
| bu3qar.com | โ | /companies-list, /product-details, /products-for-sale, /tv-serieses implied | No |
| estater.com | โ | /products, /-en/api ("Coming Soon"), /-en/estater-advisory | No |
Data Extraction โ
- Routes: Python script extracted 1,100+ unique hrefs from boshamlan sitemap alone.
- Meta tags: Title/description/OG tags captured for all 5 homepages.
- Feature flags: Boolean capability matrix (estimators, WhatsApp, financing, video, etc.).
- Screenshots: 20+ PNGs saved to
docs/competitor_scrape/for visual reference.
3. Gap 1 โ Public Registered-Deals Feed โ
3.1 Competitor Capabilities โ
alhisba.com /deals (Cloudflare-protected; inferred from homepage + public reports) โ
Data fields per deal (from homepage cards + news citations):
- Price (ุฏ.ู)
- Price per mยฒ (computed)
- % share sold (partial deals noted in news)
- Plot/piece number (ูุทุนุฉ)
- Category (ุณููู / ุชุฌุงุฑู / ุงุณุชุซู ุงุฑู)
- Area / governorate
- Transaction date
- Source attribution: "ู ู ูุฒุงุฑุฉ ุงูุนุฏู" (MoJ sourced)
- Deal volume aggregates (weekly headlines: "928 ู ูููู ุฏููุงุฑ ุฎูุงู 5 ุฃูุงู ")
Filter/facet options (inferred from Nuxt route structure):
/dealsโ all registered deals/ads/for-saleโ broker listings (separate tab)/auctions/organizerโ Ministry of Justice auctions- Homepage tabs: ููุจูุน / ููุงูุฌุงุฑ / ุทูุจ ุดุฑุงุก / ุทูุจ ุฅูุฌุงุฑ / ููุจุฏู
Features:
- News integration: Links to Al-Qabas, Al-Rai, Al-Seyassah with deal aggregates
- WhatsApp channel for deal alerts (
0029VbBk51I1HspwgRMIqg1p) - App: iOS + Android (2018 founding, 18+ years team experience)
- No observable export/share API from scraped HTML
taqeemkw.com (valuation portal with listings) โ
Listing data fields (from search + ad detail):
- Purpose: ููุจูุน / ููุฅูุฌุงุฑ / ููุจุฏู
- Date (e.g., 22/07/2026)
- Area (e.g., ุงูุฒูุฑุงุก)
- Category: ุณููู
- Property type: ุจูุช / ุฃุฑุถ ูุถุงุก / ุดูุฉ / ูููุง
- Size in mยฒ
- Price in ุฏ.ู
- License number on every ad detail (e.g., "ุชุฑุฎูุต ุฑูู 1989/2936")
- Agent contact: WhatsApp + Call buttons
- Suggested properties (ุนูุงุฑุงุช ู ูุชุฑุญุฉ) โ cross-sell
Search filters (from /Frontend/Ads/Search):
- Purpose (ForSale / ForRent / ForExchange)
- Area / Governorate
- Price range
- Size range
- Property type
Valuation estimators (10 types):
- Rent: House, Investment, Artisanal, Commercial
- Price: House (plot + house), Investment (plot + property), Apartment, Artisanal
- Construction: House (skeleton + detailed), Investment (skeleton + detailed)
Consumer portfolio feature:
/Frontend/Account/Portfolioโ login-gated consumer property portfolio tracker
No observable registered-deals feed โ taqeemkw is listing-centric, not MoJ transaction-centric.
estater.com (B2B data platform) โ
- Estater Markets: Data platform with API ("Coming Soon" page observed)
- 500M data points, 6M+ properties, 75+ property details
- Advisory services: Feasibility studies, market reports, highest-and-best-use
- No consumer-facing deal feed
3.2 Our Assets vs. Gap โ
| Capability | Our State | Gap |
|---|---|---|
| MoJ transaction data | real_estate_transactions table (~149k rows), refreshed from Ministry of Justice | โ Strong |
| Public transaction browser | get_public_real_estate_transactions RPC + public transactions screen | โ Strong |
| Analytics RPCs | get_transaction_stats, get_transaction_gov_distribution, get_transaction_cat_distribution, get_transaction_area_prices, get_transaction_monthly_trend, get_transaction_yearly_comparison | โ Strong |
| Price index | price_index_screen.dart + price_index_repository.dart | โ Exists |
| Market indicators | market_indicators_screen.dart + market_indicators_repository.dart | โ Exists |
| Comparables explorer | comparables_screen.dart + comparables_repository.dart | โ Exists |
| Deal cards with share % | Not exposed in public UI | โ Missing |
| Weekly aggregate headlines | Not auto-generated | โ Missing |
| License number on listings | Not shown on public catalog | โ Missing |
| WhatsApp integration | Not implemented | โ Missing |
| Newsletter / news section | Not implemented | โ Missing |
| Consumer property portfolio | Not implemented | โ Missing |
3.3 Build Spec โ Public Registered-Deals Feed โ
Phase 1 (S effort, 1โ2 sprints):
- Add license number display to
PublicPropertyTileand property detail screens (data already inpropertiestable from broker profiles). - Add "Suggested properties" cross-link widget to property detail (similar listings by area + type + price band).
Phase 2 (M effort, 2โ3 sprints):
- New screen:
PublicRegisteredDealsScreenunderlib/features/public/screens/- Reuse
TransactionsFeedControllerfromtransactions_repository.dart - Card design: price, price/mยฒ, area, governorate, date, property type, share % (if available)
- Filter sheet: governorate, area, property type, date range, price range
- Sort: date desc/asc, price desc/asc, price/mยฒ desc/asc
- Reuse
- Add weekly aggregate headline generator edge function:
- Cron weekly, computes total volume, deal count, top area
- Store in new
market_headlinestable - Display on public landing as live stat strip
Phase 3 (M effort, 2โ3 sprints):
- Consumer property portfolio (
property_portfolio_screen.dartexists but is calculator-only; expand):- Allow logged-in users to save favorite properties
- Track saved search alerts
- New table:
user_favorites(user_id, property_id, created_at) - RLS: users can only read/write their own rows
Data/RLS changes:
-- market_headlines table
CREATE TABLE market_headlines (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
week_start date NOT NULL,
week_end date NOT NULL,
headline_ar text NOT NULL,
headline_en text,
total_volume numeric,
deal_count int,
top_area text,
created_at timestamptz DEFAULT now()
);
-- user_favorites table
CREATE TABLE user_favorites (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid REFERENCES auth.users(id) ON DELETE CASCADE,
property_id uuid REFERENCES properties(id) ON DELETE CASCADE,
created_at timestamptz DEFAULT now(),
UNIQUE(user_id, property_id)
);
ALTER TABLE user_favorites ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users manage own favorites" ON user_favorites
FOR ALL USING (auth.uid() = user_id);Edge functions needed:
generate-weekly-headline(cron trigger, weekly)
Effort: M (4โ6 sprints total)
4. Gap 2 โ SEO Landing Pages + English Locale โ
4.1 Competitor Capabilities โ
boshamlan.com (Astro-based, SSR/static generation) โ
URL taxonomy (from sitemap scrape โ 764+ unique URLs):
/{purpose}/{type}/ โ e.g. /sale/apartments
/{purpose}/{type}/{governorate}/ โ e.g. /sale/apartments/al-asimah-governorate
/{purpose}/{type}/{governorate}/{area}/ โ e.g. /sale/apartments/al-asimah-governorate/yarmoukPurpose values: sale, rent, exchange
Type values: apartments, houses, lands, buildings, chalets, commercials, offices, properties
Governorates: al-ahmadi, al-asimah, al-farwaniya, al-jahra, hawally, mubarak-al-kabeer
Areas: 70+ slugs (yarmouk, salmiya, jabriya, etc.)
Meta patterns:
- Title:
"ุดูู ููุงูุฌุงุฑ | ุจููุช ููุจูุน | ุจูุดู ูุงู ุฏููู ุนูุงุฑุงุช ุงููููุช #1"(homepage) - Area page title:
"ุนูุงุฑุงุช ููุจูุน ูู ุงููุฑู ูู | ุจููุช ูุงุฑุงุถู | ุจูุดู ูุงู" - Description:
"ุดูู ููุฅูุฌุงุฑ ูู ุงููููุช | ุจููุช ุงุฑุงุถู ุนูุงุฑุงุช ููุจูุน | ู ู ุงูู ุงูู ู ุจุงุดุฑุฉ ูุจุฏูู ุนู ููุฉ"
English locale:
/enโ full English mirror of Arabic site- Property types translated: "Apartments for Rent", "Houses for Sale"
- Area names romanized: "yarmouk", "salmiya", "al-ahmadi-governorate"
Internal linking:
- Footer links to all governorate ร type combinations
- Sitemap page (
/sitemap) lists all indexable URLs for crawlers
bu3qar.com (Next.js, Arabic-only) โ
URL patterns:
/products-for-sale/{slug} โ SEO slug with Arabic keywords
/products-for-rent/{slug}
/products-for-exchange/{slug}
/companies-list โ Office directory
/tv-serieses/{slug} โ Video contentSEO features:
- Arabic keyword-rich URLs (
ุนูุงุฑุงุช-ููุจูุน-ูู-ุงููููุช) - Product detail pages with related properties (ุนูุงุฑุงุช ุฐุงุช ุตูุฉ)
- Office profile pages (
/profile/{company-slug})
No English version observed.
alhisba.com (Nuxt.js, SSR) โ
Routes:
/ โ Homepage with tabs
/ads/for-sale โ Broker listings
/deals โ Registered deals (CF protected)
/evaluation/ive/land โ Instant valuation
/constructionfinance โ Financing calculator
/auctions/organizer โ MoJ auctionsMeta:
- Title:
"ู ููุน ุงูุนูุงุฑุงุช #1 ูู ุงููููุช | ุงูุญุณุจุฉ ุงูุนูุงุฑูุฉ ุฏููู ุณูู ุงูุนูุงุฑุงุช" - Description mentions "ู ุฒุงุฏ ูุฒุงุฑุฉ ุงูุนุฏู", "ุชูุงุตูู ุงูู ุฒุงุฏุงุช ุงูุนูุงุฑูุฉ ูุงูุตููุงุช ุงูุนูุงุฑูุฉ", "ุชูููุฉ ุงูุจูุงุก", "ุงูุชูููู ุงูุฑุณู ู ูุงูููุฑู"
No English version observed.
estater.com (Webflow/custom, bilingual) โ
Bilingual: / (Arabic default), /-en (English)
- Full English version with all product pages
- API docs page (
/-en/api) โ currently "Coming Soon"
4.2 Our Assets vs. Gap โ
| Capability | Our State | Gap |
|---|---|---|
| Flutter web app | Single-page app, all routes hash-based (/#/sign-in) | โ No SSR/prerendering |
| Public routes | /, /catalog, /tools, /transactions, /contact, etc. | โ Functional but not indexable |
| English locale | AppLocalizations supports en, but no public English routes | โ Missing |
| Area-specific pages | None | โ Missing |
| Property-type-specific pages | None | โ Missing |
| Sitemap | None | โ Missing |
| Meta tags per route | Generic, not dynamic per listing/area | โ Missing |
4.3 Build Spec โ SEO Landing Pages + English Locale โ
Architecture decision: Flutter Web cannot do true SSR. Two viable paths:
Option A: Prerender service (recommended for Phase 1)
- Use
flutter build web+ a prerenderer (e.g.,rendertron, Puppeteer prerender) to generate static HTML for key routes - Host prerendered HTML via Cloudflare Pages or a lightweight Node service
- Map
/sale/apartments/yarmoukโ prerendered HTML with proper meta tags
Option B: Hybrid Astro site (recommended for Phase 2)
- Build a separate Astro site (
docs/seo-site/or separate repo) that consumes our Supabase API - Astro generates static pages at build time for all area ร type ร purpose combinations
- Embed Flutter app as the interactive layer (e.g.,
/app/routes)
Phase 1 (M effort, 2โ3 sprints) โ Prerender + meta injection:
- Create
SeoMetaInjectorwidget in Flutter that updatesdocument.titleand<meta name="description">dynamically per route - Generate a static
sitemap.xmlfrom our area + property type data:- Export all areas from
area_repository.dart - Export property types from
property_choice_labels.dart - Script generates
sitemap.xmlwith all combinations
- Export all areas from
- Add
robots.txtpointing to sitemap
Phase 2 (L effort, 4โ6 sprints) โ English public routes:
- Duplicate public route tree under
/en/prefix:public_landing_screen_en.dart(or reuse with locale switch)- All tool screens get English copy review
- Add language switcher to
PublicVisitorShell - Update
GoRouterto support/:lang/prefix or query param
Phase 3 (L effort, 4โ6 sprints) โ Area landing pages:
- New edge function:
generate-area-pagesthat creates static HTML for each area- Consumes
get_public_real_estate_transactionsRPC for area stats - Consumes
propertiestable for active listings in area - Generates: avg price, price/mยฒ, recent transactions, active listings count
- Consumes
- New screen:
AreaLandingScreen(lib/features/public/screens/area_landing_screen.dart)- Hero: area name + stats
- Tabs: For Sale / For Rent / Transactions / Price Trend
- Related areas links (internal linking)
Data/RLS changes:
- No schema changes needed โ reads from existing
properties,real_estate_transactions,areastables - Add
seo_slugscolumn toareastable (English URL slug) if not present
Edge functions needed:
generate-sitemap(manual or scheduled)generate-area-page-html(on-demand or scheduled)
Effort: L (10โ15 sprints across phases)
5. Gap 3 โ Reverse Demand Board โ
5.1 Competitor Capabilities โ
alhisba.com (ุทูุจ ุดุฑุงุก / ุทูุจ ุฅูุฌุงุฑ) โ
From homepage content preview:
- Tabs on homepage: "ุทูุจ ุดุฑุงุก" (Purchase Request) and "ุทูุจ ุฅูุฌุงุฑ" (Rent Request)
- These appear alongside "ููุจูุน" / "ููุงูุฌุงุฑ" / "ููุจุฏู" tabs
- Routing: inferred to be query params on
/adsor separate/requestsroutes
Data model (inferred from UI patterns + industry standards):
- Budget range (min/max)
- Area preferences (governorate + specific areas)
- Property type (ุจูุช / ุดูุฉ / ุฃุฑุถ / ูููุง)
- Purpose (ุณููู / ุงุณุชุซู ุงุฑู / ุชุฌุงุฑู)
- Contact method (phone, WhatsApp)
- Expiry date
- Visibility: public vs. registered brokers only
Broker response flow (inferred):
- Broker sees request, contacts requester via WhatsApp/phone
- No observable in-app messaging from scraped data
boshamlan.com / bu3qar.com โ
- No reverse demand board observed โ both are supply-side (listing) only
- bu3qar has C2C posting but no "I'm looking for" feature
5.2 Our Assets vs. Gap โ
| Capability | Our State | Gap |
|---|---|---|
| Internal requests CRM | requests table with: name, phone, budget, areas, property types, purpose, status, assigned_agent, follow_up_date | โ Strong (internal) |
| Matching engine | matching_screen.dart, request_matches_screen.dart, buyer_journey_screen.dart | โ Strong (internal) |
| Request form | request_form_screen.dart โ rich form with areas, budget, size, street type, subdividable, tags | โ Strong (internal) |
| Public request posting | None | โ Missing entirely |
| Public request browsing | None | โ Missing entirely |
| Broker response UI | Internal only (request_suggestions_list_screen.dart) | โ Missing |
| Request-to-listing matching | Internal algorithm exists; not exposed publicly | โ Missing |
5.3 Build Spec โ Reverse Demand Board โ
Phase 1 (M effort, 3โ4 sprints) โ Public request posting:
- New screen:
PublicRequestBoardScreen(lib/features/public/screens/)- Tabbed: Purchase Requests / Rent Requests
- List cards: budget, areas, property type, date posted, requester initials (anonymized)
- Filter: governorate, area, property type, budget range
- New table:
public_requests(or reuserequestswithvisibilitycolumn)
-- Add visibility column to existing requests table
ALTER TABLE requests ADD COLUMN IF NOT EXISTS visibility text DEFAULT 'internal'
CHECK (visibility IN ('internal', 'public', 'public_anonymous'));
-- Or new table if schema divergence is too high
CREATE TABLE public_demand_requests (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
requester_name text,
requester_phone text,
budget_min numeric,
budget_max numeric,
areas text[],
governorates text[],
property_types text[],
purpose text,
details text,
status text DEFAULT 'active' CHECK (status IN ('active', 'fulfilled', 'expired')),
expires_at timestamptz,
created_at timestamptz DEFAULT now(),
user_id uuid REFERENCES auth.users(id) ON DELETE SET NULL
);- Posting flow:
- Anonymous or logged-in user fills simplified
PublicRequestFormScreen - Fields: name, phone, budget, areas (multi-select), property type, purpose, details
- OTP verification for phone (optional Phase 2)
- Request expires in 30 days by default
- Anonymous or logged-in user fills simplified
Phase 2 (M effort, 3โ4 sprints) โ Broker response + matching:
- New screen:
PublicRequestDetailScreen- Shows full request details
- "I have a match" button for logged-in brokers
- Contact requester via WhatsApp (deep link) or in-app message
- Extend
request_matchesor createpublic_request_responses:
CREATE TABLE public_request_responses (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
request_id uuid REFERENCES public_demand_requests(id) ON DELETE CASCADE,
responder_id uuid REFERENCES auth.users(id),
responder_type text DEFAULT 'broker' CHECK (responder_type IN ('broker', 'owner')),
message text,
property_id uuid REFERENCES properties(id),
status text DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'rejected')),
created_at timestamptz DEFAULT now()
);- Integrate with existing
matchingfeature:- When a new listing is posted, auto-match against active public requests
- Notify requester (SMS/WhatsApp in Phase 3)
Phase 3 (S effort, 1โ2 sprints) โ Notifications + expiry:
- Edge function:
expire-old-requests(daily cron) - Edge function:
notify-request-matches(on property insert trigger)
RLS policies:
-- Public can read active requests
CREATE POLICY "Public reads active requests" ON public_demand_requests
FOR SELECT USING (status = 'active' AND expires_at > now());
-- Users manage own requests
CREATE POLICY "Users manage own requests" ON public_demand_requests
FOR ALL USING (auth.uid() = user_id);
-- Brokers can create responses
CREATE POLICY "Brokers create responses" ON public_request_responses
FOR INSERT WITH CHECK (auth.uid() = responder_id);Effort: MโL (6โ10 sprints)
6. Gap 4 โ Financing Products โ
6.1 Competitor Capabilities โ
alhisba.com /constructionfinance โ
User flow (from scraped page):
- Header: "ุญุณุจุฉ ุงูุชู ููู" (Financing Calculator)
- Service definition + terms of use disclaimer
- Form fields:
- "ูู ูุฏูู ุญุณุงุจ ูู ุจูู ุจูุจูุงู ุ" (Do you have a Boubyan Bank account?) โ yes/no
- "ููู ุฉ ุงูุนูุงุฑ" (Property value)
- "ุงูุฏูุนุฉ ุงูุฃููู" (Down payment)
- "ูุชุฑุฉ ุงูุณุฏุงุฏ" (Repayment period) โ dropdown: 12 months default, up to 25 years inferred
- "ุงูุชุงูู" (Next) button
What's behind the form (inferred):
- Bank partner: Boubyan Bank (Islamic bank)
- Calculation uses bank's approved rates/formulas
- Likely redirects to bank application or generates a referral code
- Monetization: Lead generation / referral fee from bank
Other financing features on alhisba:
- "ู ููู ุจูุช ุฃุญูุงู ู" (Finance your dream home) โ homepage CTA
- Instant residential rent estimator (for investment yield calculation)
- IVE (Instant Valuation Engine) for land
- CCE (construction cost estimator)
taqeemkw.com โ
- No financing products observed
- Pure valuation + listing portal
- No bank partnerships visible
estater.com โ
- B2B advisory only โ no consumer financing
- "Highest and Best Use Study", "Feasibility Study", "Market Report"
- Client-base: developers, banks, government (100+ GCC clients)
6.2 Our Assets vs. Gap โ
| Capability | Our State | Gap |
|---|---|---|
| Mortgage calculator | mortgage_calculator_screen.dart โ pure client-side annuity formula (principal ร rate / (1-(1+r)^-n)) | โ Basic calc |
| ROI calculator | roi_calculator_screen.dart โ gross yield + cap rate, client-side | โ Basic calc |
| Construction cost calc | construction_cost_calculator_screen.dart | โ Exists |
| Bank partner integration | None | โ Missing |
| Rate feed from banks | None | โ Missing |
| Eligibility check | None | โ Missing |
| Product comparison | None | โ Missing |
| Application / referral flow | None | โ Missing |
| Construction finance | None | โ Missing |
6.3 Build Spec โ Financing Products โ
Phase 1 (M effort, 3โ4 sprints) โ Mortgage product marketplace:
- New table:
mortgage_products
CREATE TABLE mortgage_products (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
bank_name text NOT NULL,
bank_name_en text,
product_name text NOT NULL,
product_type text CHECK (product_type IN ('residential_purchase', 'construction', 'refinance', 'investment')),
min_down_payment_pct numeric DEFAULT 20,
max_loan_amount numeric,
max_term_years int DEFAULT 25,
profit_rate_fixed numeric,
profit_rate_variable numeric,
profit_rate_type text DEFAULT 'fixed' CHECK (profit_rate_type IN ('fixed', 'variable', 'diminishing')),
eligibility_notes text,
application_url text,
is_active boolean DEFAULT true,
created_at timestamptz DEFAULT now()
);New screen:
MortgageMarketplaceScreen- List active products from
mortgage_products - Filter: product type, bank, down payment, term
- Card: bank logo, product name, rate, max amount, eligibility teaser
- CTA: "Apply" โ opens bank application URL or pre-fills referral form
- List active products from
Extend existing
MortgageCalculatorScreen:- After calculation, show "Compare bank products" CTA
- Pre-fill calculator inputs into product filter
Phase 2 (M effort, 3โ4 sprints) โ Eligibility engine + referral:
New edge function:
check-financing-eligibility- Inputs: salary, existing debt, property value, down payment
- Outputs: eligible products, max loan amount, estimated monthly payment per product
- Rules based on Kuwait Central Bank guidelines (debt-to-income โค 50%)
New screen:
FinancingEligibilityScreen- Wizard: salary โ existing debt โ property value โ down payment
- Results: eligible banks + products + pre-approved amount
- "Request callback" CTA (creates CRM lead)
New table:
financing_referrals
CREATE TABLE financing_referrals (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid REFERENCES auth.users(id),
product_id uuid REFERENCES mortgage_products(id),
property_value numeric,
down_payment numeric,
loan_amount numeric,
term_years int,
monthly_payment numeric,
status text DEFAULT 'submitted' CHECK (status IN ('submitted', 'contacted', 'approved', 'rejected', 'closed')),
broker_notes text,
created_at timestamptz DEFAULT now()
);Phase 3 (S effort, 1โ2 sprints) โ Construction finance:
- Add
constructiontomortgage_products.product_type - New screen:
ConstructionFinanceScreen(inspired by alhisba)- Staged disbursement calculator (foundation, skeleton, finishing)
- Link to CCE (construction cost estimator) for baseline property value
RLS policies:
CREATE POLICY "Public reads active products" ON mortgage_products
FOR SELECT USING (is_active = true);
CREATE POLICY "Users manage own referrals" ON financing_referrals
FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "Staff read all referrals" ON financing_referrals
FOR SELECT USING (is_staff_or_admin());Effort: L (7โ10 sprints)
7. Appendix: Other Missed Capabilities โ
7.1 Saved Searches & Alerts โ
- boshamlan: No explicit saved search observed, but "ู ู ูุฒ" (featured) badge system implies promotion capability
- alhisba: WhatsApp channel acts as passive alert system
- Our gap: No saved search or price-drop alert system
7.2 Map Search โ
- estater: Uses Google Maps (API key exposed in HTML โ security issue)
- taqeemkw: No map search observed
- Our state:
public_price_map_screen.dartexists โ โ competitive
7.3 Ad Promotion / Featured Listings โ
- boshamlan: "ู ู ูุฒ" (featured) badge on listings โ paid promotion
- taqeemkw: No promotion observed
- Our gap: No paid promotion system for listings
7.4 WhatsApp Integration Patterns โ
- alhisba: WhatsApp Channel (
0029VbBk51I1HspwgRMIqg1p) + directwa.melinks + WhatsApp button on every listing - taqeemkw: "ูุชุณุงุจ" button on ad detail pages
- bu3qar: No WhatsApp observed; phone-only
- Our gap: No WhatsApp integration anywhere
7.5 Video Content / TV Channel โ
- bu3qar: "ุชููุฒููู ุจูุนูุงุฑ" โ dedicated video content section with meetings, discussions, news, programs
- YouTube channel: UC8saXgab00UZFBKZWchBSCA
- Our gap: No video content strategy
7.6 Newsletter / Email Subscription โ
- alhisba: Email subscription widget on homepage
- News integration: Links to Al-Qabas, Al-Rai, Al-Seyassah
- Our gap: No newsletter or content marketing
7.7 Agent / Office Directory โ
- boshamlan:
/agentsโ 71+ offices with license numbers, ad counts, addresses - bu3qar:
/companies-listโ filterable by area, licensed office badge - Our gap: No public office directory (internal broker profiles only)
7.8 C2C Self-Serve Listing Posting โ
- bu3qar: "ู ุงูู ุนูุงุฑ? ุฃุถู ุฅุนูุงูู" โ owner self-serve posting with simple signup
- taqeemkw:
/Frontend/Ads/AddAdLocationโ multi-step ad creation (location โ category โ details) - Our gap: Only staff can post listings via CRM
7.9 Property Portfolio for Consumers โ
- taqeemkw:
/Frontend/Account/Portfolioโ consumer can track their properties - Our gap: No consumer property portfolio (only staff deal portal)
7.10 Report Verification โ
- Our state:
report_verify_screen.dartexists โ โ unique competitive advantage
8. Master Build-Spec Summary โ
| Gap | Priority | Phase 1 (Quick Wins) | Phase 2 (Core) | Phase 3 (Scale) | Total Effort |
|---|---|---|---|---|---|
| 1. Registered Deals | P2 | License numbers on listings; Suggested properties | Public deals feed screen; Weekly headline generator | Consumer portfolio; Favorites; Alerts | M (4โ6 sprints) |
| 2. SEO + English | P1 | Dynamic meta injection; robots.txt; sitemap.xml | English public route tree; Language switcher | Astro hybrid site; Area landing pages | L (10โ15 sprints) |
| 3. Reverse Demand | P1 | Public request board; Simplified posting form | Broker response UI; Auto-match on new listings | SMS/WhatsApp notifications; OTP verification | MโL (6โ10 sprints) |
| 4. Financing | P2 | Mortgage product marketplace table + screen | Eligibility engine; Referral workflow | Construction finance; Bank API integration | L (7โ10 sprints) |
Recommended Phased Rollout โ
Q3 2026 โ Foundation (SEO + Demand):
- Sprint 1โ2: SEO meta injection, sitemap, robots.txt
- Sprint 3โ4: English public routes (language switcher)
- Sprint 5โ6: Public reverse demand board (posting + browsing)
- Sprint 7โ8: Broker response UI for demand board
Q4 2026 โ Growth (Deals + Financing):
- Sprint 1โ2: Public registered-deals feed (reuse transactions RPC)
- Sprint 3โ4: Weekly headline generator; License numbers on listings
- Sprint 5โ6: Mortgage product marketplace
- Sprint 7โ8: Eligibility engine + referral workflow
Q1 2027 โ Scale:
- Area landing pages (Astro hybrid or prerender)
- Consumer property portfolio
- Construction finance
- WhatsApp integration (dependent on business API approval)
- Video content strategy
End of report. All scraped artifacts (HTML, PNG screenshots, extraction scripts) are preserved in docs/competitor_scrape/.
