TC Track — Real Estate Transaction Management Platform
A multi-tenant SaaS platform built for real estate transaction coordinators to manage the full lifecycle of transactions and listings from contract to close. This is a live, revenue-generating product — not a side project.
The engineering challenge: Real estate transaction coordination involves deeply interconnected workflows — transactions have contacts, checklists, documents, and emails that all reference each other, with dates that cascade when anything changes. The checklist engine alone handles hierarchical task dependencies, multiple date drivers (closing date, effective date, task completion), automatic due date recalculation factoring in business days and custom holidays, and circular dependency detection.
Architecture decisions that mattered:
- Multi-tenancy via Doctrine filters — account-level data isolation enforced at the ORM layer, not just in application code. Every query is automatically scoped. This means tenant isolation bugs are structurally impossible, not just “unlikely.”
- Single-action controllers across 150+ REST endpoints — keeps each endpoint focused and testable. Combined with NelmioApiDoc for auto-generated OpenAPI specs.
- 57 Doctrine entities with 67 migrations — a domain model complex enough that the schema evolution story matters. Migrations are tested in CI alongside the application.
- 22-shard parallel Playwright E2E tests — full browser tests covering settings, task operations, listings, and cascading date updates. Sharding was necessary because the test suite grew past the point where serial execution was practical.
- Async message handling via Symfony Messenger — email sending, Slack notifications, GitHub issue creation, and error reporting all happen off the request cycle. Separate web and worker ECS containers.
- Stripe billing with real edge cases — trial management, automatic plan switching based on seat count, dunning with retry logging, and a suspension flow that restricts the UI without destroying data.
Frontend: React 19 with TypeScript, TanStack Query with @normy normalization for cache consistency, 426 components (132 UI + 294 feature), code-split routes, and optimistic UI updates via mutation cache.
CI/CD: GitHub Actions running PHPUnit (unit + integration), Vitest + React Testing Library + MSW, and the 22-shard Playwright suite on every push.