# Admin / Back-Office Feature Study & Synthesis > Companion to `_matrix.md`. Where that doc covers the **public** portals, this one covers the > **admin / agent / back-office** surface — the tools each competitor gives agents, brokerages, > landlords, developers, and internal staff. Sourced from the 8 teardowns in `admin/`. > Clean-room: public login-page discovery, agent-onboarding docs, help centers, pricing pages, > and publicly-served SPA route tables / i18n bundles. **No logins, no auth bypass, no protected data.** > Compiled 2026-07-11. Legend: ✅ yes · ◑ partial / gated / inferred · ❌ none · — not observed --- ## Table A — Admin architecture | Portal | Role model | Where the admin lives | Deployment split | White-label CRM | |---|---|---|---|---| | **Homex** | 4 roles: Admin / Agent / Landlord / Tenant (one shared `/dashboard`, role-scoped) | `/login` → `/dashboard/*` on the same Next.js app | ❌ same app as public site | ❌ (it *is* the product) | | **LIFULL / Proppit** | Individual agent · agency-admin + child accounts · developer/project team | **Proppit** SPA at `pro.lamudi.com` / `proppit.com`; Dot Property native `/login` | ✅ separate SPA product | ✅ **Proppit** — powers Lamudi + MyProperty, feeds Dot Property + 4 regional sites from one login | | **OnePropertee** | Buyer · Seller · Broker/Partner (contract) · Developer (beta) · internal "Buyer Assistance Officer" | login-gated "Property Hub"; public `/pricing`, `/help/*` | ◑ Meteor app, one codebase | ❌ | | **Hoppler** | **~20-role enum** (consumer → partner/associate/internal broker → sales-director → listing-approver → superadmin) | **KUMITA** broker SPA at `/kumita-brokers/*` | ✅ separate CSR SPA vs SSR public site, shared Java API | ❌ (KUMITA is Hoppler-only, not resold) | | **Filipino Homes** | Buyer · Agent/broker · Team-leader · Staff · Developer (inferred) | `/login`,`/dashboard/`,`/editor/`,`/admin/`,`/asa-gpt` + sibling logins on `leuteriorealty.com`, `contest.…`, `realestatetraining.ph` | ◑ **federated / multi-login sprawl** | ◑ `leuteriorealty.com` "our CRM" — not sold outside | | **REAL.ph** | Buyer · Agent (`user_type=agent` = owners + pros) · Admin/moderator | self-serve `/register`; **`/admin/login`** AdminLTE 2 back office; `/agent-tools` (Renture) | ◑ Laravel app + separate admin panel | ✅ **Renture** — agent website/marketing builder (sales-assisted) | | **Berenta** | Single signup; `user_type` numeric w/ privileged internal values; `is_verified` | `/plans`,`/credits`,`/user/properties/*` (gated); internal `re-admin-*` panel (inferred) | ◑ Laravel app | ❌ | | **Carousell** | Personal vs Professional; CarouBiz subscription; enterprise = signed CSA | `support.carousell.com` help; app/web seller hub | ◑ React SPA | ❌ | | **Presello** | wp-admin staff roles; Profile Builder front-end role | `/wp-login.php` (open), `/wp-admin/`, `/login/` | ❌ WordPress monolith | ❌ | | **Property Source** | wp-admin staff only | `/wp-login.php` (hidden 302→404), `/wp-admin/` | ❌ WordPress monolith | ❌ | | **Aggregators (Thribee)** | Single advertiser/org account, sales-provisioned | `thribee.com/…/cod.login` ("Partners Admin") | ✅ separate advertiser console | n/a (it's the buyer-side console) | **Two architecture archetypes emerge:** (1) a **separate authenticated admin app** talking to a shared API (Proppit, Hoppler KUMITA, REAL's AdminLTE, Thribee) — the pattern that scales; and (2) an **admin bolted onto the public site** (Homex same-app `/dashboard`, the two WordPress sites' wp-admin) — simpler but coupled. Filipino Homes is the cautionary third case: 15 years of organic growth produced a **federated sprawl** of separate logins (portal / CRM / LMS / contests), each its own account system. --- ## Table B — Admin capability inventory | Portal | Listing input | Lead CRM | Analytics | Promotion admin | Billing model | Verification / moderation | |---|---|---|---|---|---|---| | **Homex** | per-unit CRUD | basic inbox → Telegram | summary tiles only | ❌ | ❌ (internal tool) | ❌ | | **LIFULL / Proppit** | manual · external-CRM push · **XML feed** (auto-distributes network-wide) | Proppit "Enquiries" inbox | overview + per-listing Excel/CSV export | Boost / Superboost / Featured (credit-based 7/14/30d) | flat tiers **₱4,299–₱14,999/mo** | Lamudi "Fully Verified" agent badge | | **OnePropertee** | single-listing wizard (free, unlimited) | ✅ **Leads CRM** (auto statuses; source-tagged) | boost-only impression graph | Boost · Free Refresh · Lead Boost Direct | **LeadCoins** + commission ledger (1%/mo late interest) | mobile-verify to post; PRC-license gate for Partnership | | **Hoppler** | per-broker wizard (dup-check); My/Team Listings | ✅ **full pipeline** (Accepted→Call→Viewing→Offer→Collections); 41-source attribution | dashboard widgets (inquiries, deals, views, lost) | ❌ | commission invoice/collection tracker | `ROLE_LISTING_APPROVER` gate | | **Filipino Homes** | agents post own listings | realtime Socket.IO chat CRM (`leuteriorealty`) | public view counters | ❌ | commission (undetailed) | PRC-licensed agents | | **REAL.ph** | per-listing CRUD | ◑ (Renture "lead capture", inferred) | `listing_visits_count` (public!) | `featured_property` flag | Renture trial→sales call | ✅ **full state machine**: `stage`, `admin_verified`, `approved_by`, `returned_notes`, `proof_of_ownership` | | **Berenta** | publish/unpublish + bulk delete/mark-sold; admin tier override | `/inquiries-*` inbox + "Help Me Find a Place" reverse-lead | ❌ (no charts) | Feature/Premium tiers (PayPal/credits/bank) | 3-tier freemium + **manual bank-transfer approval queue** | `is_verified` flag (mechanism unclear) | | **Carousell** | free quota + Coins overflow; "Listing Importer" (bulk, name only) | contracted leads export (CSA-gated) | ✅ **Account Insights** (clicks, AI Revenue-vs-Spend ROI, competitor insights) | Coins: Bump/Spotlight/Shoutout; Bulk Bump | Coins wallet + CarouBiz sub + CSA arrears | DTI Trustmark (generic, not property) | | **Presello** | Toolset `property` CPT + front-end forms | WPForms + WhatsApp routing | Facebook Pixel/CAPI + A/B | Popup Maker only | ❌ | ❌ | | **Property Source** | CPT UI `for_sale`/`for_lease` (+ stray `property` CPT) | CF7 → **HubSpot** | Rank Math (AI-visibility SEO) | ❌ | dormant WooCommerce | ❌ | | **Aggregators (Thribee)** | **pull-based XML feed only** (no authoring) | webhook / CSV lead export | real-time CPC dashboard (clicks/spend/CPL) | ✅ **core product**: CPC premium positions + organic-rank bidding | monthly per-brand invoicing | image-quality rejection only | --- ## Cross-cutting patterns 1. **Manual vs feed ingestion are structurally different pipelines.** Even LIFULL's mature Proppit treats XML-feed listings and hand-managed listings as separate flows with **different quota + publishing rules** (feed listings auto-publish at reduced visibility past cap; manual listings must hand-pick paid slots). Thribee is feed-*only*. Lesson: if we ever add bulk/CSV import, design it as a first-class ingestion mode with its own quota/state rules — not a bolt-on to the manual form. 2. **A lead CRM is where the serious players differentiate — and the shape is a staged pipeline, not a table.** Hoppler (Accepted→Call→Viewing→Offer→Collections + 41-source attribution) and OnePropertee (auto-status Leads CRM) model the *deal lifecycle*; the weaker players (Homex inbox→Telegram, Berenta inbox) stop at capture. Our matching-feed + bookings already imply a pipeline — model it explicitly with action verbs and stages. 3. **Verification is a state machine with documents + rejection notes.** REAL.ph exposes the whole shape (`stage`, `admin_verified`, `approved_by`, `returned_by`, `returned_notes`, `proof_of_ownership`, `authority_to_sell`, `contract_agreement`) and Hoppler gates publish behind `ROLE_LISTING_APPROVER`. Build the enum + verifier/rejection fields into the schema now, even if the demo doesn't exercise them. 4. **The public API is where admin data leaks.** Both **Homex** (owner name/phone/email via `/api/public/units`) and **REAL.ph** (entire moderation model via `?addons=yes`) dump raw admin row shapes to anonymous callers. The fix is the same for us: a strict **allowlisted public DTO** so admin-only fields (verifier, notes, owner PII, internal flags) can *never* serialize to the public build. This is our single most important guardrail. 5. **Monetization admin splits into three models:** flat subscription tiers (Proppit ₱4.3k–15k/mo; Berenta ₱850–2.5k/mo), consumable credits/coins (OnePropertee LeadCoins, Carousell Coins), and CPC auction (Thribee). None matters for the demo — but our schema should carry a neutral `featured`/`tier` field so any of them can attach later without a migration. 6. **Commission ledgers are real back-office objects, not features.** OnePropertee runs signed 1-year broker agreements with arrears enforcement; Hoppler tracks commission invoices/collections per deal. If GSR's model involves broker commission splits, that's a first-class ledger entity, planned for — not an afterthought. --- ## Recommendation for property-portal's future admin/CMS **Architecture — build a headless custom admin, kept separate from the static public site.** The WordPress route (Presello's plugin sprawl, Property Source's fragmented `property`/`for_sale`/`for_lease` models) shows the cost of a CMS-plugin stack; the scalable players all run a **separate authenticated admin app against a shared API** (Proppit, KUMITA, REAL's AdminLTE). Our public site is a static export — so the admin should be a **structurally separate deployable** (its own auth, its own runtime), writing to the same domain types in `lib/`, with the static site regenerated from that data. This keeps the demo's cheap-hosting story intact while leaving a clean seam. **Concrete schema additions to make now (cheap, and they close the gaps above):** | Add to the listing/data model | Why | Source of the lesson | |---|---|---| | **Verification state machine** — `status` enum + `verifiedBy` / `returnedNotes` + document slots (`proofOfOwnership`, `authorityToSell`) | verification is table-stakes back-office; retrofitting an enum is painful | REAL.ph, Hoppler | | **Public DTO boundary** — an allowlisted serializer for the static build; admin/PII fields never cross it | prevents the Homex/REAL leak class *by construction* | Homex, REAL.ph | | **Lead/inquiry as a staged pipeline** — `stage` (New→Contacted→Viewing→Offer→Closed/Lost) + `source` attribution | this is how serious CRMs are shaped; pairs with our matching feed + bookings | Hoppler, OnePropertee | | **Neutral `featured` / `tier` field** | lets any monetization model attach later without migration | Proppit, Carousell, Berenta | | **`viewCount` per listing** (server-incremented, admin-visible) | universal analytic; every serious player has it | REAL.ph, Hoppler, Filipino Homes | | **First-class feed I/O (later)** — schema stays exportable to a Thribee-style XML feed; bulk CSV *import* as its own ingestion mode | Thribee's PH "Homes" feed spec maps ~1:1 to our fields; keeps aggregator distribution optional | Thribee, Proppit | **Explicitly out of the demo** (note the seam, don't build): real auth, commission ledger, paid tiers/credits, agent website builder (Renture/`/editor`), AI agent-assist (ASA GPT), multi-seat agency management. Each is a real product surface for the competitors, but none is needed to win the demo — and all attach cleanly to the schema above. **One idea worth a small demo touch:** an internal **"match/triage queue"** admin view (mirroring OnePropertee's Buyer Assistance and our own matching feed) that shows incoming buyer intent as a worklist — the clearest way to *show* the concierge story to GSR without building the whole CRM.