Enterprise AI Property Sales Platform
Automating 500+ hours of manual real estate operations β powered by conversational AI, intelligent lead matching, and one-click multi-channel outreach.
Real estate agencies lose hundreds of hours every month to manual lead qualification, property-client matching, and outreach drafting. AirEstate replaces that workflow with a single, AI-native platform:
| Manual Process | AirEstate Automation |
|---|---|
| Agent spends 20 min qualifying a call | ARIA qualifies in 5 conversational turns |
| Analyst manually matches clients to listings | Matching engine runs in < 1s on every new ingestion |
| BDR drafts 30 personalised WhatsApp messages | Batch outreach drafted and dispatched in one click |
| Property data entry from 10+ listing portals | Paste URL β AI extracts structured JSON in seconds |
Inspired by Intercom, built with Groq
- Collects Name, Phone, Budget, Location & Urgency through natural dialogue
- Auto-qualifies leads against a $1M threshold (server-side enforced β AI label is advisory only)
- Fires a Telegram alert for High-Value leads (β₯ $3M) in real-time
- Beautiful WhatsApp/Intercom-style chat UI with animated typing indicator
Real-time metrics, lead cards, AI buyer profiles
- 4 live metrics: Total Leads Β· Qualified Β· Pipeline Value Β· Avg. Budget
- SVG donut chart for Lead Source Distribution (no external chart library)
- Clickable lead rows β AI-generated 2-sentence buyer profile (cached, API called once per lead)
- Perfect Match pulse badge highlights leads matched to newly ingested properties
- Follow-up email generator with one click
Paste a URL, get structured JSON β powered by LLM scraping simulation
- Bulk URL input (one per line)
- 4-stage animated progress bar: Fetching β Parsing β Matching β Saving
- Toast notification on success: "Property added to inventory"
- Extracted fields: Title Β· Price Β· Location Β· SQFT Β· Beds/Baths Β· Amenities Β· Type
The "money shot" of the demo
- Ingest a property β matching engine automatically identifies qualified buyers
- Perfect Match badge pulses on matched leads in the CRM
- Navigate to Outreach Center β collapsible match rows with WhatsApp-style message previews
- Click Confirm & Send All β animated per-name progress bar β Telegram summary alert
- Lead statuses update to
Followed-upacross the entire platform
Every integration is optional β the app never crashes due to missing credentials
| Service | Provider | Fallback |
|---|---|---|
| AI Chat | Groq (qwen-qwq-32b / llama-3.1-8b) |
Hardcoded demo response |
| Resend REST API | console.log with full payload |
|
| Twilio / Meta Graph API | Simulated success, logged | |
| Telegram | Bot API | Simulated success, logged |
web/
βββ app/
β βββ layout.tsx β Root shell + ErrorBoundary
β βββ page.tsx β Main orchestrator (all React state)
β βββ error.tsx β Segment error boundary (Next.js)
β βββ global-error.tsx β Critical error boundary
β βββ api/
β βββ chat/ β ARIA conversation + lead extraction
β βββ ingest/ β URL β Groq β Property JSON + matching
β βββ leads/ β GET / POST / DELETE (seed reset)
β βββ properties/ β GET
β βββ profile/ β AI buyer profile generation
β βββ outreach/ β Batch status update + WhatsApp dispatch
βββ components/
β βββ Header.tsx β Fixed topbar (logo Β· status Β· user)
β βββ Footer.tsx β Version Β· status Β· links
β βββ ChatWidget.tsx β ARIA chat interface
β βββ LeadDashboard.tsx β CRM panel with metrics + lead table
β βββ PropertyIngestor.tsxβ URL input + progress + property cards
β βββ TutorialModal.tsx β 3-step Framer Motion modal
β βββ OutreachPreview.tsx β Batch outreach UI
β βββ ErrorBoundary.tsx β Reusable class-based boundary
β βββ SkeletonLoader.tsx β Shimmer placeholders (5 variants)
βββ services/
β βββ email.ts β Resend + demo fallback
β βββ whatsapp.ts β Twilio / Meta + demo fallback
β βββ telegram.ts β Bot API + demo fallback
βββ hooks/
β βββ useLeads.ts β Data fetching hook with optimistic updates
βββ utils/
β βββ format.ts β formatCurrency Β· parseBudget Β· cx Β· etc.
βββ lib/
β βββ types.ts β All TypeScript interfaces
β βββ db.ts β File-backed JSON database
β βββ groq.ts β Groq client + stripThink()
β βββ matching.ts β matchLeads Β· draftWhatsApp Β· buildBatch
β βββ mockData.ts β 5 seed leads + 2 seed properties
β βββ prompts.ts β ARIA_SYSTEM Β· PROPERTY_PARSE Β· PROFILE
βββ tests/
βββ __tests__/
β βββ matching.test.ts β Vitest: matching engine
β βββ TutorialModal.test.tsx β Vitest: component rendering
β βββ demo-mode.test.ts β Vitest: graceful fallback
βββ python/
βββ matching.py β Python mirror of TypeScript logic
βββ conftest.py β Shared pytest fixtures
βββ test_matching.py β pytest: lead-property matching
βββ test_extraction.py β pytest: Groq JSON extraction
βββ test_demo_mode.py β pytest: demo mode + boundaries
- Node.js 20+
- Python 3.11+ (for pytest suite)
- A free Groq API key (optional β app runs in Demo Mode without it)
git clone https://github.com/your-username/airestate.git
cd airestate/web
npm installcp .env.local.example .env.local
# Edit .env.local β only GROQ_API_KEY is needed for full AI functionalitynpm run dev
# β http://localhost:3000# TypeScript / Vitest
npm run test
# Python / pytest (from repo root)
cd tests/python && pip install pytest pytest-cov && pytest -v| Variable | Required | Description |
|---|---|---|
GROQ_API_KEY |
Recommended | Powers ARIA chat + property parsing |
GROQ_MODEL |
Optional | Model ID (default: llama-3.1-8b-instant) |
RESEND_API_KEY |
Optional | Real email dispatch via Resend |
RESEND_FROM_ADDRESS |
Optional | Sender address (default: aria@airestate.com) |
TWILIO_ACCOUNT_SID |
Optional | WhatsApp via Twilio |
TWILIO_AUTH_TOKEN |
Optional | Twilio authentication |
TWILIO_WHATSAPP_FROM |
Optional | Twilio sandbox number |
WHATSAPP_PROVIDER |
Optional | twilio (default) or meta |
META_WHATSAPP_TOKEN |
Optional | Meta Business API token |
META_WHATSAPP_PHONE_ID |
Optional | Meta phone number ID |
TELEGRAM_BOT_TOKEN |
Optional | Telegram bot for HV lead alerts |
TELEGRAM_CHAT_ID |
Optional | Chat/channel for notifications |
All variables are optional. When unset, the relevant service logs to console and returns { ok: true, mode: 'demo' } β the UI remains fully functional.
GitHub Actions runs on every push to main and every pull request:
βββββββββββββββββββββββββββββββββββββββββββ
β frontend β
β βββ npm ci β
β βββ ESLint β
β βββ TypeScript typecheck (tsc --noEmit)β
β βββ Vitest (demo mode β no API keys) β
β βββ next build β
β β
β python β
β βββ pip install pytest pytest-cov β
β βββ pytest -v (matching + extraction) β
β β
β ci-pass (gate β requires both above) β
βββββββββββββββββββββββββββββββββββββββββββ
| Layer | Technology |
|---|---|
| Framework | Next.js 15 (App Router) |
| Language | TypeScript 5.5 |
| Styling | Tailwind CSS 3.4 β custom design tokens |
| Animations | Framer Motion 11 |
| Icons | Lucide React |
| Toasts | react-hot-toast |
| AI | Groq SDK (qwen-qwq-32b / llama-3.1-8b-instant) |
| Resend REST API | |
| Twilio Business API / Meta Graph API | |
| Telegram | Bot API (webhooks) |
| Database | File-backed JSON (zero-dependency, swap-ready) |
| TS Tests | Vitest + Testing Library + jsdom |
| Python Tests | pytest + pytest-cov |
| CI/CD | GitHub Actions |
- Fork the repository
- Create a feature branch:
git checkout -b feat/your-feature - Run tests before committing:
npm run test && cd tests/python && pytest - Open a pull request β the CI gate must pass
MIT Β© AirEstate. Built as a portfolio demonstration of AI-native SaaS architecture.




