About this software
About EstateDesk – Real Estate CRM & Viewing Calendar
EstateDesk is a Laravel 13 / PHP 8.4 web application with MySQL (SQLite for trials) that keeps property listings, leads and viewings in one multi-agency system. It provides a drag-and-drop lead kanban, a shared viewing calendar with double-booking checks, and email reminders with optional Twilio SMS. An Opportunity Copilot ranks follow-ups and matches properties to leads, and Message Studio produces template drafts, with optional OpenAI drafting when enabled. The package includes full source, migrations, Docker and nginx configs, setup docs, and a test suite under tests/. It is a web app only, with no mobile app.
Why EstateDesk – Real Estate CRM & Viewing Calendar
What makes it better
than the alternatives
- 01
Hard double-booking prevention
ViewingConflictChecker blocks an agent or property being booked twice, with overridable warnings for travel time, client clashes and past times.
- 02
Tokenised client confirm link
Emails and texts carry a no-login link where clients confirm or request a new time, with validated tokens and hash_equals comparison.
- 03
Agency-level tenant isolation
A BelongsToAgency global scope plus policies on properties, leads, viewings, users and agency settings; agents see only their own and unassigned leads.
- 04
Copilot and Message Studio
PropertyMatchmaker explains matches and drafts are reviewed before sending; live AI is off by default and optional.
- 05
Security hardening evidenced in code
Login throttling, session revocation on password change, Twilio signature verification, log redaction, security headers, and guarded demo data.
Properties
- Listings with photos
- price
- rooms
- floor area
- sale or rent
- Statuses: available
- under offer
- sold
- let
- withdrawn
- Search and filters by status
- type and listing type
- Photo upload with cover selection
- size and count limits
- Auto-generated per-agency references
Lead Pipeline
- Kanban board and searchable list
- Stages from inquiry to closed won or lost
- with lost reasons
- Lead sources and agent assignment
- Notes
- calls
- emails and meetings with next follow-up dates
- SMS opt-in consent flag
Viewing Calendar
- Team calendar using FullCalendar with month
- week
- day and list views
- Colour-coded by agent
- drag to reschedule
- Live conflict check on the booking form
- Client reschedule requests surfaced on the dashboard
Reminders and Messaging
- Scheduled email reminders (default 24 h and 2 h) via a 5-minute schedule
- Optional Twilio SMS with signed delivery webhook
- Reminder log with delivery status and send-now buttons
- Queued booking confirmation emails
Opportunity Copilot
- Prioritised follow-up list on the dashboard
- Property matching by budget
- bedrooms
- location and listing type
- Message Studio drafts by intent and tone
- Optional OpenAI live drafting
- disabled in demo mode
Dashboard and Reports
- Today's viewings
- overdue follow-ups
- pipeline counts
- recent activity
- Viewings booked
- completed
- cancelled and no-show over a date range
- Leads
- wins and win rate by agent and by source
Team and Settings
- Roles: owner
- admin
- agent
- Add members with emailed password-set link; deactivate instead of delete
- Agency settings including currency and reminder options
- Profile and password management
Auth and Access
- Login throttling and password reset flow
- Registration off by default
- enabled by config
- Session binding to password hash
- Demo-mode account protection
Deployment and Quality
- Docker compose
- nginx config
- VPS and cPanel setup guides
- Schema SQL
- ERD and migrations
- Feature and unit tests
- composer and npm audit evidence
- Demo data seeder with local photos
| Language | Version | Framework | Used for | Share of code |
|---|---|---|---|---|
| PHP | — | — | Web, API | 87% |
| SQL | — | — | Database | 4.8% |
| JavaScript | — | — | Front-end | 4.6% |
| CSS | — | — | Styling | 3.3% |
| Shell | — | — | Scripts | 0.3% |
- Primary language
- PHP 8.4
- Framework
- Laravel 13 (laravel/framework ^13.38)
- Database
- MySQL 8 / MariaDB 10.6+ (SQLite supported for trials and tests)
- Authentication
- Session-based email and password sign-in (Laravel session guard), active-account check, login rate limiting, password reset by email, and optional self-service agency registration
- Licence
- Single-site
- Screens
- 23
- Database tables
- 12
- Supported languages
- English only (APP_LOCALE=en). No RTL support.
- Browser support
- Modern evergreen browsers; no browser test matrix is included in the digest
| Minimum | Recommended | |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 2 GB RAM (estimate, not measured in the digest) | 4 GB RAM (estimate, not measured in the digest) |
| OS | Linux with PHP 8.4 (required extensions per composer.json), MySQL 8 or MariaDB 10.6+, Node.js 24+ for the asset build, nginx or Docker | Linux with PHP 8.4 (required extensions per composer.json), MySQL 8 or MariaDB 10.6+, Node.js 24+ for the asset build, nginx or Docker |
| Est. monthly hosting | $20 | $20 |
The package includes docker-compose.yml and docs/docker.md. Set the database passwords first, then start the stack. ``` cp .env.example .env # edit .env: APP_KEY, APP_URL, mail and database settings DB_PASSWORD=REPLACE_WITH_RANDOM_DATABASE_PASSWORD DB_ROOT_PASSWORD=REPLACE_WITH_DIFFERENT_RANDOM_ROOT_PASSWORD docker compose up -d --build ```
Follow INSTALL.md and HowToSetup.md. Use the composer setup script, then cache configuration and schedule the reminder command. ``` cp .env.example .env php artisan key:generate composer setup php artisan config:cache # cron entry for the scheduler (reminders run every 5 minutes) * * * * * cd /path/to/estatedesk && php artisan schedule:run >> /dev/null 2>&1 ``` Run a queue worker so queued emails are sent.
Quality report
Manually reviewedHow to read the quality report
What this is. Every project on Vibe96 goes through an automated audit of its source code before a reviewer in Dubai checks it by hand. The score is out of 100; 75 is the minimum to be listed, and any single failing check blocks a listing regardless of the score.
- Security
- No real credentials in the code, every data-changing route protected, admin areas role-gated, no SQL built from user input.
- Code structure
- A developer can navigate and extend it: clear module boundaries, no giant files, little copy-paste.
- Docs & completeness
- The setup guide, example config, schema and required files the builder committed to are actually in the archive.
- Dependency health
- Packages pinned, no known critical vulnerabilities, no abandoned libraries in production paths.
- Build & deploy
- A clean machine can restore, build and start it by following the shipped instructions.
Warnings are problems that didn't block the listing; they stay visible here until a later version clears them. The audit reads the code — it does not run it — so always try the live demo before you buy. Lines of code are counted from the same audited archive.
Reviewer notes (4 minor)
Small improvements the developer has been told about. None of them stop the software from working.
Versions & updates
No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.
What you get
- </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
- ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
- ↻One year of updatesEvery new version the builder publishes, free for 12 months.
- ♧30 days of supportInstallation and defect support through Vibe96 tickets.