Product case study · From the idea to the finished platform · 2026
From a shared Drive folder to an internal operating system for a real estate team
TeamBrissette2026 is a private, bilingual web application that runs a brokerage team's day-to-day: a searchable document library, a 360° property hub, Facebook ad campaigns audited and built inside the app, a lead pipeline wired to the CRM, accounting per property, AI photo strategy, a video training studio and a full admin back office.
I framed the problem with the team, designed the system, built every screen and every integration, and kept the whole thing coherent as it grew — organisation, web development, orchestration and lead / business development in one seat.
Counts measured directly from the project source and schema.
Context
The problem
Everything the team produced existed — but nowhere in particular. The cost was not missing information; it was the time spent locating it and the impossibility of connecting effort to outcome.
Knowledge trapped in a shared drive
Work split across disconnected tools
No shared view of effort vs. result
Design goal
One interface where a resource is at most two clicks away, where a property carries all of its own work, and where the drive can eventually be switched off — files are copied into the platform's own storage rather than deep-linked out to it.
Product tour
The product, screen by screen
Screenshots captured from the running application. The interface is bilingual — labels follow the signed-in user's language.




















Main workflow
One property, end to end
The spine of the product: every step writes into the same record, so the last step can report on the first.
- 01
Create the listing
Paste an MLS link. The record, description and photos are extracted and prefilled instead of typed by hand.
- 02
Analyse the photos
A vision pass grades every photo, proposes keep / remove, names the hero image and the top five, and explains why.
- 03
Brief the property site
The approved selection plus marketing inputs are sent, after human validation, to the property-website project over a signed request.
- 04
Build the ads
The brief and the approved photos feed the ad wizard, so creative starts from the same source of truth.
- 05
Match the spend
Campaigns are matched back to the listing by brief name first, then by address, so every dollar lands on the right property.
- 06
Work the leads
Leads arrive on the pipeline board, are pushed to the CRM with campaign, form and answers, and notify the team by email, push, in-app and messaging.
Paid acquisition
Facebook Ads: audited, created and attributed inside the platform
The ad account is not a separate world anymore. Campaign data is pulled in, audited, reconciled against the leads it produced, and every new campaign starts from a listing that already exists in the system.
Audit first
reviewReconciled numbers
data integrityCreated from the listing
wizardAttributed automatically
matching



Orchestration
Connecting the tools the team already lived in
The hard part was never one feature. It was making a drive, a CRM, an ad account, a photographer's portal, a spreadsheet and a second web project behave like one system — with a human validating each handoff.
CRM — two-way, without webhooks
- New leads are pushed automatically with campaign name, form name, listing address, submission date and every form answer as a structured note.
- The CRM plan exposed no webhooks, so the integration was rebuilt in pull mode with a scheduled recurring pull and a manual control.
- Contacts are retrieved with pagination and matched to platform leads by name, email and phone, on a dedicated comparison screen showing who was actually contacted.
- Pipeline stages on both sides are kept aligned, and every push is logged.
Task board — the Trello the team stopped needing
- A Kanban board with drag-and-drop columns, assignment and due dates, restricted to super admins.
- Dependencies between tasks, so blocking work is visible instead of remembered.
- Audio notes attached to a task, for instructions that are faster to say than to type.
- Assignment triggers a notification through the channel the assignee chose.
Drive — from dependency to archive
- Two approved sources only, enforced in code, with a purge tool that removes anything outside them.
- A spreadsheet index was imported to build the folder tree, then files were copied into the platform's own private storage.
- Documents are previewed and edited in the app — PDF, images, spreadsheets and rich text — instead of opening elsewhere.
- The goal was explicit from day one: the drive can be switched off without losing the team's knowledge.
Property website project — signed and validated
- A second web project receives a publication brief over an HMAC-signed, timestamped request.
- Photos are pre-selected from the AI analysis — hero, top five, keep / remove — and a human approves before sending.
- A signed callback returns publication status, which updates the listing and notifies the team.
- Explicit statuses: draft, ready to send, sent, received, needs information, in progress, published, failed.
Photographer portal — into the workflow
- Property photos are imported from the delivery link rather than downloaded and re-uploaded by hand.
- The same set feeds the AI analysis, the ad wizard, the property site brief and the printed feature sheet.
Notifications — four channels, one preference
- In-app realtime, browser push, email and messaging, chosen per user and per event type.
- New leads, task assignments and property status changes each notify the right people automatically.


Scope
Every module in the platform
Nine functional areas across 76 route files — each one shipped, used and reachable from the same shell.
Library
- Folder-first browsing with breadcrumbs and per-folder counts
- Fuzzy search across titles, categories and extracted content
- In-app viewers: PDF, image, CSV, HTML — no redirect to the drive
- Rich-text editor for native documents
- Favourites, recent views, pinned items, drag-and-drop ordering
- Report-a-document flow for outdated or broken files
Collections & Gallery
- Thematic collections spanning multiple folders
- Photo and video gallery with event filters and lightbox
- Virtualised grids for hundreds of assets
- Batch import and per-item deletion
Listings — property hub
- Kanban across Coming Soon, Active, Conditional, Sold, Leased, Terminated
- Create from an MLS link with automatic extraction
- Website status and owner tracked per property
- Linked ad briefs, spend and leads on the same sheet
- Photographer photo import and AI analysis
- Signed handoff to the property-website project
Advertising
- Live campaign metrics with today → lifetime ranges and deltas
- Campaign, status and objective filters
- Ad creation wizard with photo review and approval
- AI audit of campaign setup
- Leads board with editable, team-shared column labels
- Platform connections management
Accounting
- Manual expenses plus automatically synced ad spend
- KPI cards and cumulative spend charts
- Investment, leads and return per property
- Monthly budgets with pacing and variance alerts
Tools hub
- Fifteen calculators and workflows for the Canadian market
- Shared constants module so a rate change is one edit
- Related library documents surfaced inside each tool
- Copyable briefs and PDF export where relevant
Studio & training
- Video library with multi-provider playback
- Transcript panel and AI Q&A over the transcript
- Playlists, watch progress and campaign stages
- Personal send links with tokenised public viewing
Leadership
- Role-gated route, not a hidden link
- Sales volume and pipeline distribution
- Days on market and marketing return
- Property progress table for team follow-up
Admin back office
- KPI dashboard and document management
- Imports and syncs restricted to two approved sources
- Brand hub, credentials vault, editorial calendar
- Super-admin task board with dependencies and audio notes
- Team management and invitations
- Security, application and translation audits
- Self-generating system documentation (human PDF + AI prompt)
Detail
The fifteen internal tools
Each replaces an external calculator, a PDF or a message to someone who knows the answer.
Mortgage calculator
Payment, amortisation, frequency and term.
Land transfer tax
Provincial and municipal brackets, first-time buyer rebates.
Mortgage insurance
Premium by down-payment band on the insured amount.
Property tax
Municipal rate applied to assessed value.
Affordability
Debt-service ratios turned into a maximum price.
Closing costs
Itemised estimate with editable defaults.
RRSP / HBP
Home Buyers' Plan withdrawal and repayment schedule.
Rates
Reference rate board for client conversations.
Home evaluation
Structured evaluation request and summary.
Contacts finder
Internal rolodex with synonym-aware scoring and CSV import.
SOLD post order
Turns a procedure document into a guided request.
Lockbox order
Supplier ordering workflow as a form, not a PDF.
Ads targeting brief
Forces the four targeting essentials before a launch.
Foldable feature sheet
Photo-to-panel builder with PDF export.
Partners directory
Vetted suppliers with detail sheets and search.
Intelligence
Where AI earns its place
AI is used where a human would otherwise spend an hour on judgement work — always with a person approving the output before it leaves the platform.
Listing photo strategist
visionLibrary assistant
semantic searchLanding page analysis
vision + textVideo Q&A
transcriptMLS extraction
structured outputCampaign audit
reviewIntegrations
Four external systems, all two-way where it matters
Ad platform
pull + reconcileCRM
push + pullProperty website project
signed, two-wayDocument source
read-only, fencedArchitecture
How it is built
Front end
Back end
Cross-cutting
Data model — 48 tables
documents · document_content · document_reports · collections · collection_documents · folder_settings · favorites · recent_views · listings · listing_budgets · listing_photo_analyses · listing_spotlight_briefs · spotlight_settings · ad_campaigns · ad_sets · ad_creatives · ad_briefs · ad_daily_insights · ad_leads · ad_lead_calls · ad_platform_connections · lead_status_labels · fub_sync_log · expenses · videos · video_playlists · video_playlist_items · video_campaigns · video_campaign_stages · video_campaign_clients · video_personal_sends · video_watch_progress · tasks · task_dependencies · task_audio · editorial_posts · editorial_visuals · editorial_comments · brand_assets · brand_credentials · partners · contacts · profiles · user_roles · team_invitations · notifications · notification_preferences · push_subscriptions · admin_audit_log
Engineering decisions
- Server functions are the only write path; the browser never holds a privileged key.
- Reads go through route loaders and suspense queries, so a page arrives with data rather than a spinner cascade.
- External calls are bounded — timeouts, caps and deadlines — because a third-party slowdown must not become an unusable screen.
- Every colour, shadow and radius is a semantic token, so both themes and the editorial light style stay consistent across 72 components.
Security
Access control taken seriously
Roles in their own table
user_roles table — never on the profile record — and are evaluated by a SECURITY DEFINER function so policies can call it without recursion or privilege escalation.RLS on every table
Protected server functions
Signed webhooks
Built-in audits
The platform audits itself: an application audit page checks structural invariants, a security audit surfaces policy and grant gaps, a translation audit finds untranslated strings, and a purge tool removes any document that falls outside the approved source.
Details
The small things that make it feel finished
Most of the work is invisible until it is missing.
Editable pipeline labels
Admins rename lead columns inline; the change is stored and shared with the whole team instantly.
Bilingual by construction
414 keys, a language provider, a live DOM translator for legacy strings and an audit page listing what is still untranslated.
Automatic attribution
Campaigns are matched to properties by brief name, then address — with a manual override picker when the fuzzy match is wrong.
Bounded waits
Long syncs surface a clear pending state and keep existing data on screen, whatever the upstream platform is doing.
Realtime that scales
Notification channels are isolated per mount, so live updates stay reliable across navigation.
Deletion everywhere
Documents, collections, gallery items, videos, listings, partners and admin records all have guarded delete with confirmation.
Self-documenting
A generator reads the live schema and modules and emits both a human PDF and a prompt an AI can use to work on the codebase.
Empty and explained states
Dashboards explain what a metric means and why it may be unavailable, instead of showing a blank card.
Signed private files
The document bucket is not public; access is granted through short-lived signed URLs only.
My role
From the idea to the finished product
Organisation
Web development
Orchestration
Lead & business development
Method
Shipped iteratively against real usage — each module was validated in production before the next one started, and several were rebuilt after that feedback: the library navigation, the advertising overview and the listing sheet were each redesigned once.