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

81 done0 in progress9 planned

Foundation

Done

Multi-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 progress

Geo-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

Done

Worthy'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

Done

Track 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

Done

Ledger 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

Done

Scorecards 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 progress

Everything 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

Done

What 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