Appearance
Execution Plan — March to July 2026
Current State (March 2026)
| Component | Status |
|---|---|
| Public listings | ~660 (Kijiji only) |
| Scraper DB (raw) | ~760 raw listings |
| Phone numbers unmasked | 409 (93% success rate on backfill) |
| Listings without phone | ~316 (not shown as actionable) |
| Pipeline | BullMQ — scrape every 30 min, staleness check every 4h |
| Frontend | Bilingual FR/EN, Google Maps, search/filters, favorites |
| Auth | JWT, landlord CRUD, image upload |
| Admin | Fastify + HTMX at :3002, Bull Board at /queues |
| Scrapers | Kijiji only (Playwright + __NEXT_DATA__ parsing) |
Target State (July 2026)
| Component | Target |
|---|---|
| Public listings | 2,000+ actionable (with phone number) |
| Sources | Kijiji + Kangalou + Craigslist (3 scrapers) |
| Organic landlord listings | First 50+ via "Claim your listing" |
| Revenue | First dollars during July 1 peak season |
| SEO | Page 1 for key Montreal rental queries (FR + EN) |
| Monthly visitors | 5,000 → 10,000+ |
Execution Timeline
March 2026: Data Expansion
Goal: Triple listing count via new scrapers.
| Task | Effort | Expected Listings |
|---|---|---|
| Kangalou scraper (HTTP + cheerio) | 3-5 days | ~7,500 |
| Craigslist MTL scraper | 1-2 days | ~100-200 |
| Cross-platform deduplication | 2-3 days | — |
| Phone-only import filter | 1 day | — |
| Description normalization | 1-2 days | — |
Kangalou scraper details:
- HTTP-only — no Playwright needed (zero anti-bot protection)
POST /:lang/api/searchfor discovery →GETdetail pages for full data- Coordinates embedded in HTML (no geocoding needed)
- Phone numbers: create real free account, use auth API (skip for v1 if needed)
- See Kangalou Analysis for full technical spec
Deduplication:
- Fuzzy match on: normalized address + price + bedrooms
- Same listing on Kijiji + Kangalou → keep the one with more data
- Store cross-platform links in
scraper.dedupe_clusterstable
Import filter:
- Only import listings with phone numbers to public site
- Listings without phone still useful for market data / analytics
- Reduces "dead listing" perception for tenants
Description normalization (copyright risk mitigation):
- Don't reproduce verbatim descriptions from source sites
- Normalize/summarize: extract key facts (size, amenities, date, conditions)
- Reduces copyright exposure while preserving useful information
April 2026: Product & Trust
Goal: Features that make tenants come back.
| Feature | Impact | Effort |
|---|---|---|
| "Claim your listing" flow | Landlord → organic transition | 3-5 days |
| CMHC data integration | "Is this rent fair?" | 2-3 days |
| Saved search alerts (email) | Retention + habit | 3-4 days |
| SEO landing pages | Acquisition | 3-5 days |
| Anti-discrimination filter | Legal compliance | 2 days |
"Claim your listing":
- Landlord signs up, searches for their property
- Verify ownership via phone number match (we have the phone from scraping)
- Landlord gains edit access — listing transitions from scraped → organic
- This is the legal on-ramp — permission obtained, no more gray zone for that listing
CMHC data integration:
- Import neighborhood rent averages and vacancy rates
- Show "Avg rent for 2BR in Plateau: $1,433/mo" on listing detail
- "This listing is 15% below average" — drives urgency for tenants
- Data is public (CMHC reports), no scraping needed
SEO landing pages:
/en/apartments/plateau-mont-royal+/fr/appartements/plateau-mont-royal- One page per neighborhood × bedroom count × language = ~200+ pages
- Auto-generated from listing data + CMHC stats
- Target: "apartments for rent in [neighborhood]" in both languages
Anti-discrimination filter:
- Scan listing descriptions for prohibited phrases (FR + EN dictionaries)
- Quebec Charter protected grounds: race, sex, age, religion, disability, etc.
- Flag for manual review or auto-redact before publishing
- Required for legal compliance in Quebec
May 2026: Landlord Acquisition
Goal: First organic listings and first revenue product.
| Feature | Impact | Effort |
|---|---|---|
| Free direct listing flow | Organic supply | 3-4 days |
| Featured listing product | First revenue | 3-4 days |
| Landlord dashboard | Retention | 4-5 days |
| PM company outreach | Volume | Ongoing |
Featured listing product:
- $5/day (Basic) — highlighted in search results
- $10/day (Plus) — top of search + neighborhood page
- $15/day (Premium) — top of search + homepage spotlight
- Benchmarked against StreetEasy ($7-22/day) and Kangalou paid boosts
- Stripe integration, cancel anytime
- Revenue target: 20 landlords × $10/day × 30 days = $6,000/mo
Property management company outreach:
- Montreal has ~200-300 PM companies managing 10-100+ units each
- Offer: bulk listing upload, branded presence, inquiry routing
- Value prop: "your listings are already on our platform via Kangalou/Kijiji — manage them here"
- Target: 5-10 PM companies by end of May
June-July 2026: Peak Season & Revenue
Goal: Capture Moving Day momentum, generate first revenue.
| Feature | Impact | Effort |
|---|---|---|
| Moving Day features | Viral potential, PR | 3-4 days |
| Featured listing revenue | First dollars | Live |
| Tenant screening integration | Revenue stream 2 | 3-5 days |
| Conversion funnel optimization | Growth | Ongoing |
Moving Day features (July 1):
- Countdown timer on homepage (cultural resonance)
- Moving checklist (Hydro-Québec, internet, address change, insurance)
- Utility setup guide (partner referrals for Hydro, internet providers)
- "Last-minute listings" section (urgent, high-conversion)
- PR hook: "X% of Montreal listings on our platform" — media angle
Tenant screening:
- Partner with Naborly (Canadian, $14.99-24.99/check) or similar
- Landlords pay per credit/background check
- Revenue: 10% of 62,700 annual turnovers × $25 = ~$157K/year at scale
- Even 1% capture = $15.7K/year — meaningful for a startup
Q3-Q4 2026: Platform Maturity
| Feature | Impact |
|---|---|
| In-app messaging (tenant → landlord) | Reduce friction, capture data |
| Digital lease (TAL bail form) | Deep platform lock-in |
| Price history & market analytics | Data moat |
| Moving services referral partnerships | Revenue diversification |
| Expand to Quebec City, Gatineau | Geographic growth |
Scraping Risk Management
Risk Assessment by Source
| Source | Risk | Why | If C&D Received |
|---|---|---|---|
| Kijiji | Low-Medium | Adevinta doesn't litigate small scrapers; blocks IPs instead | Comply within 48h, propose data partnership |
| Kangalou | Medium | CORPIQ is organized but small; ToS prohibits scraping | Comply immediately, offer partnership |
| Craigslist | Low | Low volume; they only pursue large-scale commercial scrapers | Comply |
| Realtor.ca | HIGH | CREA has lawyers + motivation; MLS data is licensed | Don't scrape |
| HIGH | Meta actively litigates; aggressive detection | Don't scrape |
Legal Framework
The good news:
- ToS breach = contract claim, not criminal → practical consequence is a C&D letter, not prosecution
- Reading public HTML /
__NEXT_DATA__is not circumvention under Copyright Act - Nobody sues a 2-person startup over 7,500 listings — risk scales with visibility
The real risk:
- Copyright Act s.41.1 (anti-circumvention) — bypassing paywalls, login walls, or CAPTCHAs programmatically is the statutory risk
- reCAPTCHA phone reveal in real browser context = gray area (we're using the browser's own reCAPTCHA, not solving it externally)
- Kangalou phone API: create a real free account, don't solve CAPTCHA programmatically
What we're NOT doing:
- Not scraping Realtor.ca / Centris (CREA litigation history)
- Not scraping Facebook Marketplace (Meta litigation history, aggressive detection)
- Not bypassing login walls or solving CAPTCHAs programmatically
- Not reproducing verbatim descriptions (normalize/summarize instead)
Engineering Mitigations
- Per-source kill switch — instantly remove all data from a specific source (admin toggle)
- Rate limiting — respectful scraping, don't impact source servers
- Description normalization — don't reproduce verbatim (reduces copyright exposure)
- Data minimization — only store what's needed for the listing (Law 25 compliance)
- Add genuine value — map, price analysis, CMHC context, cross-platform dedup
The Transition Strategy
Scraped listings (temporary, gray zone)
→ Attract tenants (content moat, SEO)
→ Attract landlords ("your listing already has views")
→ "Claim your listing" (permission obtained, legal)
→ Direct organic listings (fully clean, no scraping needed)Goal: scraping becomes supplementary by Q4 2026, replaceable by Q2 2027.
Key insight: Every "claim" converts a gray-zone listing into a fully legitimate one. The faster we drive claims, the faster we exit the gray zone.
Legal & Compliance Checklist
Quebec Law 25 (Privacy)
- [ ] Privacy policy covering scraped data collection and purpose
- [ ] Data minimization — only store what's needed for the listing
- [ ] PIA (Privacy Impact Assessment) for scraper system
- [ ] Honor removal requests within 48 hours (admin tool)
- [ ] Data residency — keep all data in Canada (current: local PostgreSQL)
- [ ] Designate "person in charge of protection of personal information"
Anti-Discrimination (Quebec Charter)
- [ ] Auto-detect prohibited phrases in listing descriptions (FR + EN)
- [ ] Flag/require correction before publishing
- [ ] Don't enable search filtering by protected characteristics
- [ ] Document compliance approach for potential TAL inquiries
TAL Compliance (Future Lease Features)
- [ ] Mandatory lease form fields preserved in digital version
- [ ] "Notice to new lessee" disclosure (last rent paid + date)
- [ ] Audit logs for lease acceptance (timestamps, versions)
- [ ] Legal review before launch
Revenue Model with Benchmarks
| Revenue Stream | Price | Volume Driver | Annual Revenue @ 10% Market Share |
|---|---|---|---|
| Featured listings | $5-15/day | Landlord urgency | TBD (need landlord base first) |
| Tenant screening | $15-25/check | 62,700 turnovers/yr | ~$94K-157K |
| Moving referrals | $50-100/referral | 68,000 July 1 movers | Large, seasonal |
| Lead generation | $5-15/lead | Inquiry volume | Scales with traffic |
| Display ads | CPM-based | Monthly visitors | Requires 50K+ visits |
Revenue Benchmarks from Similar Markets
| Platform | Market | Revenue Model | Scale |
|---|---|---|---|
| StreetEasy | NYC | Featured listings $7-22/day | ~$100M+ ARR (Zillow subsidiary) |
| Rentals.ca | Canada | Freemium landlord tools | Growing, venture-backed |
| Naborly | Canada | Tenant screening $15-25/check | Millions ARR |
| Kangalou | Montreal | CORPIQ membership + paid boosts | ~$40-540/listing |
PMF Indicators
- Median time-to-first-inquiry per listing — landlord value signal
- Repeat posting rate — do landlords come back for next vacancy?
- Claim rate — scraped → organic conversion (transition metric)
- Spam/duplicate rate — trust signal for tenants
- SEO traffic growth — month-over-month organic visits
- Saved search count — tenant engagement / retention proxy
Montreal-Specific Moat
Why this can't be easily replicated by a US or national platform:
| Factor | Barrier Height | Why |
|---|---|---|
| Quebec rental law | High | TAL, mandatory bail, rent-fixing %, "notice to new lessee" = deep compliance work |
| Bilingual requirement | High | FR-first is table stakes, not a nice-to-have; full translation of all content |
| Moving Day (July 1) | Medium | Unique cultural event, 68K moves in one day, needs specific product features |
| Law 25 (Privacy) | Medium | Stricter than PIPEDA, requires PIA and data residency |
| Local market knowledge | High | 37+ neighborhoods with specific rent dynamics, not a national average |
| Airbnb restrictions | Medium | Montreal limits STR (since 2025), pushing supply to long-term rental market |
| CORPIQ ecosystem | Medium | Kangalou is locked into an industry association; independent platforms can serve both sides |
Combined effect: A US platform (Zillow, Apartments.com, Zumper) would need 6-12 months of localization work to compete effectively in Montreal. This window is our advantage.