Knowledge > Products > WiseAI Realtor > Compliance, Privacy & Analytics
WiseAI Realtor — Analytics, Consent, Anti-Bot & Per-Client Legal
Every public REALTOR site we host needs this layer, configured per client (each is its own brokerage, province, policy set, and ad-tag set). These four areas interlock: consent gates analytics/marketing tags; legal pages live in the footer; anti-bot guards the lead forms. Requirements + recommendation only — actual legal text needs counsel/brokerage sign-off.
1. Analytics — what we capture & which third parties we link to
Default = first-party, server-side, privacy-preserving (our moat + needs no consent banner):
- Events: page views, listing views, search queries, QR-sign scans, lead-form submissions, chat starts, voice-call starts, showing-booked — all tied to the lead/contact timeline and the dashboard's source attribution.
- Built on existing infra:
/api/analytics/demo-event,lead_events,campaign_members(see do-not-reinvent.md). No cross-site tracking cookies → no banner required for these.
Optional per-client third-party tags (client owns these; they trigger consent):
- Google Analytics 4 / Google Tag Manager, Meta Pixel, Google Ads conversion, (maybe TikTok/LinkedIn). Configured in Settings → Website/Integrations per client (paste their IDs).
- These are loaded only after consent (see §2), via Google Consent Mode v2.
Third-party connections to disclose (each is an external request the privacy policy + consent must cover): map tiles (Leaflet/OSM or Google Maps/Places), Google Fonts (self-host to avoid), the AI chat/voice widget, REALTOR.ca/board links, any embedded video, the client's ad pixels. Recommendation: self-host fonts, prefer privacy-light defaults, and keep a per-client "data recipients" list that auto-populates the privacy policy.
2. Cookie consent
Canada context: PIPEDA (meaningful consent for personal-info collection) + Quebec Law 25 (strictest — consent + easy withdrawal for tracking/profiling, privacy-by-default; French required) + GDPR/ePrivacy if any EU visitors. Ontario adds AODA (accessible banner).
Recommendation — build a lightweight first-party CMP (we control the stack; avoids per-client Cookiebot/Osano fees):
- Categories: Essential (always on, first-party analytics + security) / Analytics / Marketing.
- Privacy-by-default: non-essential OFF until opt-in; reject is as easy as accept; preferences re-openable from a footer "Cookie preferences" link; consent logged + versioned.
- Gating: third-party tags (§1) do not load until their category is accepted (Consent Mode v2).
- Smart default: if a client enables NO third-party tags, the site uses first-party-only analytics → show a minimal notice, no blocking banner (less friction, still compliant).
- Per-client: branding (logo/colors), province rules (Quebec Law 25 → French + stricter; auto-detect), link to that client's policy.
- Open decision: build vs buy a CMP. Recommend build for control + cost; revisit if multi-jurisdiction complexity grows.
3. Anti-bot (protect lead forms without killing conversion)
Guards: contact, home-value, intake, QR-scan capture, newsletter, chat. Conversion is sacred — never block a real lead (false positives = lost customers).
Recommendation — layered, low-friction (no visible CAPTCHA):
- Honeypot field + form-fill timing + per-IP/route rate-limit + server-side heuristics (existing
bot-detection.ts; intake already has a BotID soft-gate — see FEATURE_REGISTRY). - Escalate only suspicious traffic to Cloudflare Turnstile (invisible, privacy-first, free, no consent cookie).
- Avoid Google reCAPTCHA (privacy/cookie-consent burden) and any CAPTCHA that demands solving (accessibility + UX harm).
- Log bot decisions; alert if false-positive rate rises. Tune false-negative-tolerant.
4. Per-client footer & legal pages
Each client site footer must carry, and link to, client-specific pages:
- Privacy Policy (PIPEDA; + Quebec Law 25 clauses + French if QC) — generated from client details + the §1 data-recipients list.
- Terms of Use.
- Accessibility statement (AODA for Ontario businesses).
- Cookie / consent preferences (re-opens the CMP, §2).
- Required real-estate disclosures: MLS®/REALTOR® trademark attribution ("owned by CREA"), DDF® attribution, listing "courtesy of" brokerage on IDX listings, brokerage identification (legal brokerage name + "Brokerage" + address — RECO advertising rule in Ontario), fair-housing/Human-Rights compliance.
Recommendation — templated, province-aware, shared-base + merge-fields:
- We maintain one base set; each client's pages render from their brokerage/jurisdiction/contact/data-practices. Law changes → update the base once, all clients inherit. Version + timestamp each policy (ties to consent records).
- Province logic: QC → French + Law 25; ON → AODA + RECO; others → PIPEDA baseline.
- Routes already exist:
src/app/s/[slug]/privacy+/terms(make per-client + compliant); add/accessibility+ cookie-prefs.
Where this is configured (UX)
This lives primarily under the WEBSITE pillar — not scattered across the backend. A "Website → Tracking & Compliance" sub-section holds: third-party tag IDs (GA4/Meta/Ads), the consent-banner config (categories, province rules, branding), the legal-page generator (Privacy/Terms/Accessibility), and the data-recipients list. It renders on the public site as the consent banner + footer.
Two cross-cutting carve-outs:
- Anti-bot belongs to any lead-capture surface, not just the hosted site — it also guards the AI chat embed and QR/landing pages we host for bring-your-own-website clients (who have no hosted site from us). So it's a "lead-capture" guard that spans hosted + BYO.
- Brokerage legal identity (legal name, address, RECO #) lives in Business Profile, because it's reused by email + voice disclosures too — the Website footer just renders it.
For bring-your-own-website clients: the consent banner/footer/legal on their own site is their existing vendor's responsibility; our scope is the chat embed + any landing/QR pages we host (which still need anti-bot + a privacy link).
Existing vs new
| Area | Status | Where |
|---|---|---|
| First-party event analytics + attribution | Have | /api/analytics/demo-event, lead_events, campaign_members |
| Anti-bot heuristics + intake BotID soft-gate | Partial (Have) | bot-detection.ts, intake route |
| Privacy / Terms routes | Have (stub) | src/app/s/[slug]/{privacy,terms} — need per-client + compliant |
| Cookie consent CMP (categories + gating + Consent Mode) | Greenfield | new |
| Per-client legal generation (province-aware) + Accessibility page | Greenfield | new |
| Third-party tag manager (GA4/Meta/Ads, consent-gated) | Greenfield | new (Settings) |
| Cloudflare Turnstile escalation | Greenfield | new |
Open decisions / flags
- CMP build vs buy (recommend build).
- Anti-bot: Turnstile vs honeypot-only baseline (recommend honeypot + Turnstile-on-suspicion).
- Maps/fonts provider (privacy-light default; self-host fonts).
- Legal review required before any client goes live — privacy/Terms/Law 25/RECO wording is counsel/brokerage's call, not ours.