# Competitive Study — REAL.ph (Admin / Agent SaaS Surface)
**Target:** https://www.real.ph/
**Method:** Clean-room, public-signal-only reconnaissance (robots.txt, sitemap index + child sitemaps, homepage/footer/nav HTML, public JS bundles, public JSON listing-filter API, agent profile pages, product marketing pages). No login, no credential submission, no authenticated route access. Every inference is marked `(inferred)`; everything else is a direct observation with a quoted URL/string.
**Date observed:** 2026-07-11.
---
## 1. Admin surface overview
REAL.ph is a Laravel application (confirmed by the exposed admin login page title `AdminLTE 2 | Log in`, standard Laravel `XSRF-TOKEN` cookies on every response, and a Laravel-style JSON pagination envelope on its listing API) sitting on top of a jQuery-driven public front end (`new-app.min.js`, `_auth.js`, `search-filter.js`, `custom-selector.class.js`, jQuery `slick` carousel plugin). It exposes three distinct admin/agent-facing layers:
1. **A back-office admin panel** at `/admin/login`, built on **AdminLTE 2** (a well-known open-source Bootstrap/AdminLTE Laravel admin theme) — used internally for listing verification/moderation (see §6).
2. **A self-serve agent/seller account** created through the same public `/register` flow used by buyers (role selector, see §3), which unlocks listing creation, a “Listings” area, and profile management surfaced publicly at `/re/{slug}`.
3. **Renture** — a separate, sales-assisted SaaS product (30-day trial or demo-call onboarding) for agent websites, listing presentations, and virtual open houses, marketed from `/agent-tools`.
REAL.ph itself is one property of **August 99, Inc.**, a 25+-year real-estate-tech group whose sibling brands are **Agent Image** (US real-estate website/marketing agency, agentimage.com), **Loft** (loft.ph — coworking/corporate services), and **Real** (real.ph, this marketplace) *(inferred lineage from public web search results, not from real.ph's own pages — the `/partners` page itself does not name Agent Image, august99.com, or loft.ph, though august99.com and loft.ph do appear as outbound footer links on the real.ph homepage)*.
---
## 2. Discovered entry points (public paths, HTTP-status checked)
| Path | Observed behavior |
|---|---|
| `https://real.ph/sitemap_index.xml` | Sitemap index — lists 6 child sitemaps (below) |
| `https://real.ph/pages_sitemap.xml` | Static/marketing pages |
| `https://real.ph/listings_sitemap.xml` | Individual listing pages |
| `https://real.ph/developments_sitemap.xml` | Developer project pages |
| `https://real.ph/agents_sitemap.xml` | 4,089 agent profile URLs, pattern `https://real.ph/re/{slug}` (e.g. `/re/Atienza-Realty`, `/re/AyalaLand-AldrinHernandez`) |
| `https://real.ph/developers_sitemap.xml` | Developer company pages |
| `https://real.ph/hotsheets_sitemap.xml` | 62 URLs, all under `/listing-report/{slug}` (e.g. `/listing-report/condos-for-sale`, `/listing-report/bgc-properties`) — see §6 |
| `https://www.real.ph/login` | Public login modal: buyer/seller-oriented copy, “Continue with Google”, “Forgot your password?”, “Sign up”/“Join now”, reCAPTCHA. No “Renture” or explicit agent-role branding on the modal itself. |
| `https://www.real.ph/register` | Self-serve signup form. Role radio group `name="user_type"` with two options — see §3 for the surprising value mapping. |
| `https://www.real.ph/admin/login` | Back-office login. `
AdminLTE 2 | Log in`, plain email/password form (`name="email"`, `name="password"`, CSRF `_token`). This is the **verification/moderation admin panel** entry point (inferred from AdminLTE branding + the listing verification fields found in the JSON API, §6). Not probed beyond the login page. |
| `https://www.real.ph/dashboard` | **302 redirect → `https://www.real.ph/admin/login`** for an unauthenticated client — confirms `/dashboard` is a protected route gated behind the same admin login. |
| `https://www.real.ph/agent-tools` | Renture product marketing page (Website Builder, Listing Presentation Builder, Digital Open House) |
| `https://www.real.ph/find-an-agent` | Public agent directory, “8486 Agents”, search box, CTA: *“Interested in joining this list? Simply add at least your listings here on real.ph, then edit your profile to include your professional information and PRC license details.”* |
| `https://www.real.ph/partners` | Developer/brokerage partner logos (Megaworld, DMCI, Ortigas Land, Cityland, Moldex, RE/MAX Capital, Ortigas Real Estate, Presello, Loft, CRE, ADT, Atari, Berdea) |
| `https://www.real.ph/listing-filters/{slug}?page=N&addons=yes` | Open JSON API, Laravel-paginate envelope (`current_page`, `data`, `last_page`, `per_page`, `total`, …). Confirmed live at `/listing-filters/condos-for-sale?page=1&addons=yes` → 4,177 total condo-for-sale listings, 16/page, 262 pages. |
| `https://www.real.ph/public/administrator/lib/js/global-nav-links.js` | Public static asset served from an `/public/administrator/...` path — naming signal that the Laravel app's admin module is literally namespaced `administrator`. |
| Probed and **not found** (404, ruled out as real entry points): `/agent/dashboard`, `/renture`, `/register-user`, `/sign-up`, `/signup`, `/signup-as`, `/list-property`, `/join`, `/become-an-agent`, `/verification`, `/agent-tools/pricing` | |
`robots.txt` is maximally permissive (`User-agent: * / Allow: /`) and simply points to the sitemap index — no admin paths are disallowed, i.e. no robots.txt-based hardening.
---
## 3. Role & account model
Observed directly in the `/register` form HTML (`id="register-user"`, `action="https://www.real.ph/register"`):
```html
Looking to buy or rent a property
Looking to sell or rent out a property
```
**Notable finding:** the UI-facing “I'm a seller” option submits `user_type=agent`. REAL.ph's data model does **not** have a distinct “owner/seller” role separate from “agent” at the account level — anyone who wants to list a property (individual owner, salesperson, broker) is provisioned as an `agent` account. Differentiation between an individual owner and a licensed professional appears to happen later, per-listing, via the verification/PRC-license fields (§6), not at signup. `/find-an-agent`'s copy (“edit your profile to include your professional information and PRC license details”) confirms license/professional info is a profile-level enrichment step, not a registration gate.
No separate "broker" or "developer" self-serve role was observed at `/register`; developer/project listings (`developments_sitemap.xml`, `/partners` developer logos) appear to be managed as a distinct, presumably sales-onboarded, account type *(inferred — no public developer-signup path was found; `/become-an-agent` and similar guesses 404)*.
Buyer/seller vs. agent/admin surfaces:
- **Buyer** — browse, save favorites (JS reference `/r/g/call/save-to-favorites` found in the main bundle), contact agents.
- **Agent/seller** (`user_type=agent`) — create/manage listings, get a public profile at `/re/{slug}`, optionally subscribe to Renture.
- **Admin/moderator** — internal AdminLTE 2 back office at `/admin/login`, gated behind `/dashboard`'s 302 redirect; reviews and verifies listings (§6).
---
## 4. Admin feature inventory
| Area | Observed |
|---|---|
| **Listing management (create/edit)** | Per-listing record (from the live JSON API) carries `title`, `description`, `price`, `price_per_sqm`, `bedroom`, `bathroom`, `floor_area`, `lot_area`, `unit_amenities`/`house_amenities`/`outdoor_amenities` (coded arrays like `["UA1","UA2",...]`), `furnish_type`, `condition`, `parking_slot`, `pre_selling_option`, `availability_date`, `listing_unique_id` (e.g. `REAL-00007960`), `slug`, `stage` (observed value: `active`). No bulk-edit or CSV-feed endpoint was observed publicly (not observed). |
| **Media** | `flyer_id` field present on every listing (e.g. `"318530955300007960"`) — suggests an auto-generated marketing flyer/collateral artifact tied to each listing (inferred — not directly inspected, would require authenticated access). |
| **Renture (agent website/marketing SaaS)** | Marketed at `/agent-tools`, three sub-products, all CTA'd "Inquire Now" (sales-assisted, not self-serve checkout): **DIY Website Builder** ("Launch your own online presence" — template gallery), **Listing Presentation Builder** ("web-based listing presentation," real-time updates, custom branding), **Digital Open House** (collects photos/video/floor plans/Matterport 3D tours, lead capture, personal video greeting). Copy: *"Try it free for 30 days, or contact us so we can schedule a demo call."* CSS/markup namespace confirms the internal product name is literally `renture-builder` / `digital-open-house--builder`. A same-named third-party product `renture.com` ("Renture — The Best Real Estate Website Builder", US-market, with a PH-localized variant) exists publicly; whether it is the same underlying platform white-labeled to real.ph or a separate company is **not observed / not confirmed** from real.ph's own pages. |
| **Lead management** | Not observed publicly (would live behind the agent dashboard/`/admin` area). Renture's Digital Open House explicitly advertises "interactive lead capture," implying a lead inbox exists behind auth (inferred). |
| **Analytics / view counts** | Confirmed in the open JSON API: every listing carries `listing_visits_count` (e.g. `870`) — a per-listing view counter exposed even to unauthenticated API consumers. |
| **Promotion / boost management** | Confirmed: `featured_property` boolean flag (`1`/`0`) on every listing record, surfaced publicly at `/featured-properties`. Admin UI for toggling/purchasing this flag is not observed (behind auth). |
| **Billing / subscription** | Renture is described as a 30-day free trial → presumably paid subscription, but **no pricing page was found** (`/agent-tools/pricing` 404s); onboarding is demo-call/sales-assisted rather than self-serve billing (not observed: any in-product billing UI). |
| **Team / brokerage management** | Not observed. `/partners` lists brokerage-scale partners (RE/MAX Capital, Ortigas Real Estate) but no public brokerage/team-seat management surface was found (not observed). |
| **Developer / project management** | `developments_sitemap.xml` and developer logos on `/partners` confirm developer-tier project listings exist as a distinct content type from agent listings, but no public developer self-service portal was found (not observed). |
| **Verification / moderation workflow** | Rich field set observed directly in the JSON API — see §6 for full breakdown and workflow reconstruction. |
| **Hotsheets** | Confirmed as a distinct sitemap (`hotsheets_sitemap.xml`) containing 62 curated category/geography landing pages — see §6. |
| **Notifications** | Not observed (no public signal). |
---
## 5. Implementation & tech
- **Backend:** Laravel (Laravel-style `XSRF-TOKEN` cookie on every response, Laravel-paginate JSON envelope on `/listing-filters/{slug}`, `cache-control: no-cache, private` typical of Laravel session-bound responses, Cloudflare in front).
- **Admin panel:** **AdminLTE 2** — an open-source Bootstrap admin dashboard template commonly used for Laravel back offices — confirmed via `AdminLTE 2 | Log in` at `/admin/login`, and the public asset path `/public/administrator/...` (the app's admin module is namespaced `administrator`).
- **Front end:** Server-rendered Blade-style HTML + jQuery (`new-app.min.js`, `_auth.js`, `search-filter.js`, `custom-selector.class.js`, `slick` carousel, `lottie-player.js` for animations, Google reCAPTCHA v3, Google Sign-In via `google-register.js`).
- **Open API:** `/listing-filters/{slug}?page=N&addons=yes` is unauthenticated and returns full listing records including verification and analytics fields (see §6) — i.e. REAL.ph's internal admin/verification data model is directly inspectable through its own public search API, a notable data-exposure pattern (whether intentional or not, `admin_verified`, `approved_by`, `returned_by`, `returned_notes`, `verified_by` are all visible to anonymous API callers).
- **Group lineage:** REAL.ph is part of the August 99 / Agent Image group *(inferred from web search, not from real.ph's own public pages)*, which explains the "Renture"-branded product naming overlap with the third-party `renture.com` website-builder product.
---
## 6. The verification workflow + hotsheets — how they work publicly
### Verification workflow
The live JSON API (`/listing-filters/{slug}?addons=yes`) exposes the **entire moderation pipeline's data model** on every listing:
- `admin_verified` (0/1)
- `is_verified_seller` (0/1)
- `verified`, `verified_by`, `verified_date`
- `approved_by` (observed value: `"A-1"` — looks like an internal admin/staff user code)
- `returned_by`, `returned_notes` (fields for a moderator to bounce a listing back to the submitter with comments)
- `stage` (observed value: `"active"` — implying other stages exist, e.g. draft/pending/returned, not enumerated publicly)
- Supporting-document fields: `proof_of_ownership`, `authority_to_sell`, `contract_agreement` (all `null` in the sampled record, but present as schema fields — meaning REAL.ph's listing model supports uploading ownership/authority documents for verification)
**Reconstructed workflow (inferred from the schema, not observed in action):** an agent submits a listing → it enters a `stage` (submission/pending) → an internal reviewer (AdminLTE back office at `/admin/login`) checks supporting documents (`proof_of_ownership`/`authority_to_sell`/`contract_agreement`) → either approves (`approved_by` set, `admin_verified`→1, `stage`→`active`) or returns it (`returned_by` + `returned_notes` set, sent back to the agent for correction). The public-facing badge this produces is "Verified Seller" / "verified listings" (`is_verified_seller`, and homepage copy *"Verified Sellers... verified listings that an agent/broker has. This allows property..."*). Front end labels: homepage text explicitly states *"verified listings of residential and commercial properties"* and *"verified seller or licensed professional."*
### Hotsheets
`hotsheets_sitemap.xml` does **not** contain a distinct URL namespace called `/hotsheet/...` — instead it lists 62 URLs entirely under `/listing-report/{slug}`, e.g.:
- `/listing-report/all-luzon-properties`, `/listing-report/all-visayas-properties`, `/listing-report/all-mindanao-properties` (regional rollups)
- `/listing-report/condos-for-sale`, `/listing-report/houses-for-rent`, `/listing-report/apartments-for-rent`, `/listing-report/commercial-spaces-for-sale`, `/listing-report/foreclosed-properties`, `/listing-report/vacation-home-rentals` (property-type rollups)
- `/listing-report/bgc-properties`, `/listing-report/makati-properties`, `/listing-report/cebu-properties`, `/listing-report/tagaytay-properties`, etc. (city/area rollups, ~30 of the 62)
- `/listing-report/top-property-picks`
Fetching a sample (`/listing-report/condos-for-sale`) confirms this is a real, crawlable, filterable/sortable landing page (`
Condos for Sale In The Philippines
`, a "Sort By" control, "More Filters" panel) — i.e. **"hotsheets" is REAL.ph's internal/legacy name for these auto-generated, SEO-targeted category+geography landing pages** that aggregate the live listing feed by type/city/region. The term survives only in the sitemap filename; the public-facing URL/branding is `listing-report`, not `hotsheet`. This is consistent with the traditional real-estate-industry meaning of "hot sheet" (a report of the most recent/active listings in a market) repurposed as a programmatic-SEO content strategy.
---
## 7. Takeaways for property-portal's future admin/CMS
1. **Expose a lightweight, per-listing verification state machine early, even if manual at first.** REAL.ph's `stage` / `admin_verified` / `approved_by` / `returned_by` / `returned_notes` pattern is simple to implement (a handful of enum + nullable-actor fields) and buys a "Verified" trust badge that is REAL.ph's single most repeated marketing claim. For property-portal, model this as first-class schema now (status enum: `draft → pending_review → active` / `returned`, plus `verified_by`, `verified_at`, `rejection_notes`) so the admin CMS doesn't need a breaking migration later.
2. **Collapse "owner" and "agent" into one listing-capable role, gated by a verification flag rather than a separate account type.** REAL.ph's `user_type=agent` behind the "I'm a seller" label shows that splitting owner vs. agent at the *account* level adds complexity without buyer-facing value — the professional/PRC-license distinction is better handled as profile enrichment + a badge, not a separate signup flow.
3. **Ship a `featured`/boost flag and a per-listing view counter from day one, and expose both to admins as bulk-toggleable fields.** These are cheap (`featured_property` boolean, `listing_visits_count` integer) but directly support a promotion-revenue and engagement-analytics story — REAL.ph treats them as core schema, not an afterthought.
4. **Treat the public search/filter JSON API as a security boundary, not just a data-fetch convenience.** REAL.ph's `/listing-filters/...?addons=yes` unintentionally (or carelessly) exposes internal moderation actor fields (`approved_by`, `returned_by`, `verified_by`, `returned_notes`) to anonymous callers. property-portal's equivalent public listing API should have an explicit public-vs-internal field allowlist/DTO layer so admin-only columns can never leak through a "just add a field" change to the ORM model.
5. **Consider a "hotsheets"-style programmatic-SEO content layer, generated from the same admin-managed taxonomy (city, property type, region) that powers listing filters** — it is low-effort (62 pages, all deriving from existing filter dimensions) and is one of REAL.ph's clearest SEO/growth plays; the admin/CMS should let staff manage which taxonomy combinations get their own landing page + custom H1/meta, rather than hand-coding each one.
6. **Defer a full "Renture"-style agent-website/marketing-builder product** — it's the most resource-intensive feature observed (templated micro-site builder + presentation builder + virtual open house/Matterport), sales-assisted (no self-serve pricing was even found), and best treated as a v-next differentiator once core listing/verification/CMS plumbing (items 1–5) is solid, not a phase-1 requirement.
---
## Admin matrix row
| Roles | Admin entry points | Listing mgmt (bulk/feed?) | Lead CRM | Analytics | Promotion/boost admin | Billing/credits | Team/brokerage mgmt | Developer/project mgmt | Verification/moderation | White-label CRM product | Tech/implementation | Standout admin capability |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Buyer, Agent (`user_type=agent` covers both individual sellers & professionals) — Admin/moderator (separate AdminLTE back office) | `/register` (self-serve buyer/agent), `/login`, `/admin/login` (AdminLTE 2 back office, gated via `/dashboard` 302), `/agent-tools` (Renture, sales-assisted) | Per-listing CRUD confirmed via API schema (rich field set); no bulk-edit/feed-upload endpoint observed publicly — not observed | Not observed (implied by Renture "lead capture" marketing copy — inferred only) | `listing_visits_count` per-listing view counter, publicly exposed via JSON API | `featured_property` boolean flag confirmed in API; admin toggle UI not observed | Renture 30-day free trial → sales/demo-call onboarding; no public pricing page found — not observed | Not observed | `developments_sitemap.xml` + developer partner logos confirm distinct content type; no public developer self-service portal — not observed | Full pipeline schema observed: `stage`, `admin_verified`, `approved_by`, `returned_by`, `returned_notes`, `verified_by/date`, `proof_of_ownership`, `authority_to_sell`, `contract_agreement` | **Renture** — website builder + listing-presentation builder + digital open house, marketed at `/agent-tools`, 30-day trial | Laravel + AdminLTE 2 admin panel + jQuery front end, Cloudflare-fronted, open Laravel-paginate JSON search API | Verification-pipeline fields (incl. rejection notes and supporting-document slots) fully readable through REAL.ph's own public listing-search API — an unusually transparent (if leaky) verification data model |