MBO Listing Sync
Beta — First ClientA Django-based automation platform that syncs commercial real estate listings across five platforms — with n8n workflow orchestration, browser automation, and an optimized manual transfer workflow for platforms that block it.
The Problem
MBO is a commercial real estate brokerage that lists properties on multiple platforms simultaneously — CoStar, LoopNet, Crexi, Catylist (Moody's CRE), and their own website. Each platform has its own UI, its own field names, its own quirks. Keeping listings in sync across five platforms was eating hours of manual data entry every week, with inevitable inconsistencies.
The broker needed one place to manage all listings and have changes flow to every platform — whether through automation, or through a highly efficient manual process for platforms that contractually prohibit it.
My Role
I designed the full system architecture and built every component: the Django web app, the n8n workflow suite, the Puppeteer browser automation scripts, and the deployment infrastructure. This is my first client for a new AI automation consulting practice — I'm building it for free during beta to prove the value before moving to a paid engagement. The system is end-to-end my work.
The Approach
The project started as a rapid prototype on Google Sheets + Google Apps Script to validate the concept quickly. When multi-tenant requirements and UX needs emerged, I moved everything to Django. The Google prototype is deprecated — all functionality now lives in the Django app.
The system has three layers:
Layer 1 — Django Application: The central hub. Manages listings, field maps, and platform configurations. Each CRE platform has a canonical JSON field map that serves as the single source of truth — defining field names, DOM selectors, input types, section structure, and how they map to the internal data model. The same field map drives both automated sync and the manual transfer workflow.
Layer 2 — n8n Browser Automation Pipeline: The first n8n workflow handles Puppeteer-based browser automation, orchestrating the listing sync for platforms that allow it. Additional n8n workflows for content generation, social media scheduling, and automated client reporting are planned future work — they'll be built once the core syndication workflow validates its value with the client.
Layer 3 — Browser Automation + Manual Transfer: Two paths to get data onto platforms:
- Automated (Puppeteer): For platforms that allow it, Puppeteer scripts handle data entry. These run inside n8n Code nodes using a thin-loader architecture — each node fetches the real script from a shared GitHub repo at runtime, caches it, and falls back to cache on failure. Fix a selector once, all client instances pick it up.
- Manual Transfer (for CoStar and others that block automation contractually): A highly optimized split-screen copy-paste workflow. The Django app displays the listing data on one side, the platform is open on the other. An auto-generated checklist tracks each field as it's transferred, with audit logging for accountability and completion tracking. This isn't a fallback — it's a first-class workflow designed for speed and accuracy when automation isn't an option.
What I Built
- Django listing management app — multi-tenant architecture, canonical JSON field maps as single source of truth, rollup computations, SpeedPy UI design system
- Manual transfer workflow — split-screen copy-paste with auto-generated checklists, field-by-field tracking, audit logging, completion status
- n8n browser automation pipeline — the first workflow, orchestrating Puppeteer-based listing sync with thin-loader architecture (runtime code-fetching from GitHub, caching, version pinning, 5-tier error taxonomy)
- Planned n8n workflows — content generation, social media scheduling, automated client reports (future work once core syndication is validated)
- n8n deployment infrastructure —
provision.pyspins up isolated n8n instances per client with PostgreSQL in ~2 minutes - n8n Workflow SDK usage — programmatic workflow authoring for the queue + webhook variant
The Result
The system is in beta with my first client. Listings are managed in one Django interface and flow to all platforms — automatically where possible, through an optimized manual workflow where contractual restrictions require it. The manual transfer workflow with checklist tracking turns what was a tedious, error-prone process into a fast, auditable one.
The thin-loader architecture means I can fix a broken selector for one platform and every client instance picks up the fix without redeployment. The provisioning script means onboarding a new client is a 2-minute automated process instead of 30–45 minutes of manual setup.
This is the first engagement for a new AI automation consulting practice. I'm building it for free to prove the value — the bet is that demonstrating real ROI earns a long-term paid relationship and referrals to other brokerages.
Tech Stack
- Backend: Django 6.0.3, PostgreSQL, Celery, Redis
- Frontend: Tailwind CSS, Alpine.js (SpeedPy UI design system)
- Orchestration: n8n (self-hosted on Appliku), n8n Workflow SDK
- Browser Automation: Puppeteer (thin-loader architecture via n8n Code nodes)
- Infrastructure: Docker, Appliku, GitHub (script hosting)
- Integrations: CoStar, Crexi, Catylist, LoopNet
- AI: LLM content generation for listing descriptions and social posts