// case-study.md

Real-Estate Developer Portal
Operations & commission ops on Vue 3 + Laravel 11

A full-stack platform that runs a real-estate developer — projects, units, reservations, sales (equity + amortization), in-house financing, commission, collection, sales returns, assumed units — with a hierarchical seller force (Directors → Managers → Unit Managers → Team Leaders → Salespersons / Brokers) and OU-scoped role-based access.

client Confidential · under NDA
last touched
role Full-Stack Developer
period 2023 — Present
status In production · access-gated tenant portal
scope ~65 models · ~67 controllers · ~99 migrations
Vue 3 Laravel 11 JWT CASL RBAC AG Grid Enterprise Vuex Bootstrap Vue 3 MySQL REST
// receipts · tl;dr
domain models
~65
migrations
~99
UI views
~102
seller tiers
5
// outcome · what changed
BEFORE

Shared Excel files for inventory + email threads for leads + manual commission across a 5-tier sales hierarchy.

AFTER

One source of truth with role-aware access down to the salesperson level.

BEFORE

Excel-macro SOA generation; reminder notices typed by hand from templates.

AFTER

Programmatic SOA + reminder + notice generation; templates live in code.

BEFORE

No single management view across reservations, equity, amortization, and collections.

AFTER

~102 Vue views consolidated by domain; dashboards surface what’s overdue, expiring, or pending.

What it is

A web portal that runs the full developer lifecycle for a real-estate client — from reservation through sales, equity, amortization (including in-house financing), commission ledgers + receipts + releases, collection receipts, and final SOA generation — with a multi-tier seller hierarchy, project management with title + COO monitoring, and operations tooling for time logs, leaves, memos, payslips, and expenses.

Live in production behind an access-gated tenant portal (client under NDA). Vue 3 (Vue CLI) + Bootstrap Vue 3 + AG Grid Enterprise on the frontend, Laravel 11 + MySQL + JWT (tymon/jwt-auth) on the backend. ~65 Eloquent models, ~67 controllers, ~99 migrations, and ~102 Vue views organized by domain.

The bottleneck

Before the portal, the developer’s day-to-day ran on a tangle of:

The team needed one source of truth for every stage of the unit lifecycle, with role-aware access down to the salesperson level, and a way to generate reminders, notices, and SOAs programmatically instead of from Excel macros.

How I broke it down

What I built

Domain modules shipped:

Commission Releases dashboard — anonymized table with sale records, multi-tier commission shares, status badges, and approver assignments.
MOCKCommission Releases dashboard · 10 of 1,247 anonymized release records, multi-tier seller hierarchy chips, per-OU status & approver columns. Live portal is access-gated — this is a sanitized mock built to mirror the production layout.

Example: commission release on a sale — one of the harder pieces because the seller hierarchy means a single sale generates entries for every tier above the closing salesperson, each with its own percent and ledger destination:

~/app/Services/CommissionReleaseService.php
class CommissionReleaseService
{
    public function release(Sales $sale, CollectionReceipt $receipt): Collection
    {
        return $sale->sellerHierarchy()->withTiers()->get()
            ->map(fn (Seller $s) => CommissionReceipt::create([
                'sales_id'     => $sale->id,
                'receipt_id'   => $receipt->id,
                'seller_id'    => $s->id,
                'tier'         => $s->tier,      // director | manager | unit_mgr | team_leader | seller
                'percent'      => $s->commission_percent,
                'amount'       => round($receipt->amount * $s->commission_percent / 100, 2),
                'ou_id'        => $sale->ou_id,
                'released_at'  => null, // stamped by ReleaseController when approved
            ]));
    }
}
Reservation → sale → equity → release flow redacted captures coming on request

Tech

Results

domain models
~65
migrations
~99
UI views
~102
seller tiers
5

The platform replaced a tangle of spreadsheets and email threads with one auditable source of truth covering the entire developer lifecycle — from a reservation coming in to the final SOA going out, with commission, financing, and collection all living on the same ledger. Payment reminders and notices of cancellation now generate from the data instead of being typed up. The seller hierarchy means every sale automatically populates commission entries for the five tiers above the closing salesperson, with per-receipt release tracking.

Live in production behind an access-gated tenant portal. Specific business figures (volumes, days-saved, error reduction) stay with the client; happy to discuss specifics on request.

What I’d do again — and differently

Worked well:

Would tighten: