Build progress
What works today
Every MVP module, item by item, with links to the working screens in the demo agency.
90%
of planned MVP items are done
Foundation
DoneMulti-tenant core: agencies, people and roles, the inventory every sale points at, and Ethiopian locale basics.
- Tenant table, tenant_id on every row, Postgres row-level security
- Tenant from subdomain (<agency>.realtors.et) or X-Tenant header
- Platform super-admin: create tenants, impersonate (API)
- Roles: Owner/Admin, Sales manager, Supervisor, Rep, Freelancer, Finance
- Org tree via supervisor_id drives visibility
- Email/password login (web), Telegram login stub with initData verification
- Developers, bank accounts, sites, blocks, units, payment plans, agreements: CRUD API
- CSV import for units (all-or-nothing, per-line errors)
- Money as NUMERIC(16,2) ETB, serialized as exact strings
- Ethiopian calendar beside Gregorian, Africa/Addis_Ababa time
- Amharic / English UI scaffold
- +251 phone normalization
- Admin screens to edit inventory (forms)
- Platform console screen, billing
- Audit log
Check-in
In progressGeo-fenced check-in ported from Worthy, now in the Telegram mini app, with rules per tenant. Every attempt is stored with its reason.
- Haversine geofence per site, HQ/branch flagged check-in only
- Per-tenant cutoff in Addis time; reasons geo_fail / time_fail / role_fail
- Tap debounce, 1/hour per field site, 1/day at HQ
- Supervisors see their team's failures as well as successes
- Telegram mini app for reps and supervisors (realtors.et/tg)
- Location via Telegram LocationManager with browser GPS fallback
- Leave requests, Ethiopian holiday calendar, derived attendance
- GPS spoofing guard (mock location, impossible speed, repeat coordinates)
Leads & Sales orders
DoneWorthy's lead flow with an append-only timeline and duplicate-buyer detection; sales orders that reserve a unit and freeze rates.
- Leads: new → follow-up → appointment → site show → closed, forward-only
- Append-only timeline (database trigger), ascending / descending
- Sources: Telegram, TikTok, walk-in, referral, diaspora, Facebook
- Duplicate buyer detection by +251 phone across the agency
- Visibility and reassignment by org tree
- Site shows verified by a geo check-in at the site
- Sales order from a lead: unit reserved with hold expiry, plan copied and editable
- Partners with shares totalling 100%
- Approval by supervisor (own team) or manager; reject frees the unit
- Finance attaches contract and confirms: price, plan, partners and rates frozen
- Transfer to a new buyer with history kept; unit history
- Active / completed driven by verified installments
Collections
DoneTrack installments the buyer pays the developer and prove they arrived. Only verified money counts.
- Installment schedule from the frozen plan (EC + Gregorian due dates, rounding on the last line)
- Construction-stage lines become due when the site reaches the stage
- Record payments: bank / Telebirr, reference, slip photo, allocation across lines
- Duplicate reference guard; finance verify / reject with reason
- Upcoming / due / partially paid / paid / overdue with tenant grace period
- Verified payments activate and complete orders
- Monthly developer reconciliation (Gregorian or Ethiopian month) + CSV export
- Reminder queue (7 days before, due today, overdue escalation)
- Telegram reminders to reps, escalations to supervisors, approval requests
- Buyer-facing SMS
Commissions
DoneLedger lines generated per verified installment: the agency's receivable from the developer plus every earner's payable.
- Agency rate from developer agreement, frozen on the order at confirmation
- Rep rate split by partner shares; supervisor and manager overrides stack
- Spec worked example reproduced as a test (225,000 / 45,000 / 22,500 / 11,250)
- Invoices to developers with VAT and withholding; mark received
- Payables released when the agency is paid; payout runs with four-eyes approval
- Open questions as tenant settings: basis, payable-after-receipt, transfers, own-sales overrides
- Commission accelerators tied to KPI
KPI engine
DoneScorecards per role on verified outcomes first and verified effort second, weighted by period.
- Metric catalog computed from system evidence only (no self-reported calls)
- Results / Book health / Conversion / Activity with daily, weekly, monthly weights
- actual ÷ target capped at 120%; attendance and activity floors gate at 50%
- Targets per person and period; ramp-up (50% / 75%), seasons (fasting, kiremt, diaspora peak), pace
- Versioned scorecards per role (rep, supervisor, manager), frozen into closed periods
- Leaderboards by cohort with streaks; at-risk flag after two weekly drops
- Holiday calendar and leave in working days
- Commission accelerators tied to KPI
Back office
In progressEverything an owner or admin needs to run the agency without asking us: people, rates, settings, and a record of who changed what.
- People: add, invite by email or Telegram, roles, reporting line, TIN and licence, deactivate
- Invite and password-reset links: single use, expire, sent by email or Telegram or copied by the admin
- Forgot password from the sign-in page (never reveals who has an account)
- Developers, bank accounts and commission agreements editable
- Sites, blocks and units: create, edit, bulk price change, payment plan editor
- Commission plans (end and replace, never rewrite), tax rules, policy switches
- Settings: check-in, collections, KPI, Telegram notifications
- Targets per person and period, or for a whole role at once
- Audit log of every change with before and after, append-only
- Self-signup: 30-day trial, 5 rep seats, optional sample inventory, no payment
- Trial reminders 7 days and 1 day before; read-only after expiry, data kept
- Onboarding checklist on the owner's dashboard
- Super-admin console: agencies, trial length, plans and prices, suspend, open as owner
- HTTPS for each new agency subdomain within a minute; uptime alerts via @realtors_et_bot
- Import wizard (Excel or CSV): units, leads, and sales in progress with what's been paid
- Column matching, row-by-row check, error report; nothing saved until you import
- Imported payments carry their commission as settled or owed, as the agency says
- Leave requests and approvals on the web and in Telegram
- Ethiopian public holidays pre-filled (Fasika computed; Eid dates flagged as estimates)
- Holidays and approved leave never count as absences; targets shrink with days away
Safety & operations
DoneWhat keeps agencies' data safe and the service up: audit, sign-in protection, backups off the server, and alerts before anyone calls.
- Append-only audit log with before and after values
- Password reset by email or Telegram, or a link the admin hands over
- Lock after 5 wrong passwords, admin unlock, per-network limits
- A password change signs out every other session
- Only owners can add or change owners and admins
- Uptime and backup-freshness alerts via @realtors_et_bot
- Error tracking for the API and browsers, grouped in the console
- Encrypted off-site backups and a restore drill
- Security review (docs/ops/security-review.md)
- Two-factor sign-in for owners and the console