The problem
Our Realtor association ran an annual award program recognizing exceptional client service, using an off-the-shelf third-party platform that cost $7,000 a year. It worked, but it wasn't built around how our MLS and association data actually flowed, which meant staff still handled a fair amount of manual lookup and cleanup during the nomination period.
The approach
I built a Django app that pulls listing data through our MLS's RESO Web API and member data from the Realtor association, so clients can look up their Realtor and the specific transaction directly instead of typing it all in by hand.
- Clients search for their Realtor by last name using an HTMX-powered lookup — type two letters, get a matching list, no page reload.
- After picking a transaction, they answer a few structured questions and write a short paragraph on what their Realtor did to go above and beyond.
- Submission triggers three emails: a thank-you to the client, a notification to the nominated Realtor, and an alert to the nominations admin.
- Not every transaction lives in the MLS — a "Don't see your transaction?" link lets clients manually enter property address and close date for off-MLS deals.
- For clients who aren't comfortable using the site themselves, the Realtor can submit on their behalf and upload a scanned handwritten nomination form instead.
- Admins review each nomination and can flag it as disqualified, duplicated, etc. A separate report flags likely duplicate nominations automatically. Nominated Realtors' names appear on a running public list for the current year.
- When the nomination period closes, admins bulk-print the nominations with the Realtor's name and company redacted for blind judging. Listing photos are converted to WebP with cwebp to keep things fast.
- Backend data processing runs on Python, Pandas, and SQLAlchemy against the MLS feed, on top of a Postgres database.
What I'd do differently
Right now, day-to-day admin work and the dashboard live on the front end, which means I'm maintaining custom admin UI for tasks Django's built-in admin could largely handle. I'm planning a redesign that moves administrative tasks into Django admin, likely paired with Django Unfold for a better interface — that would cut a meaningful amount of custom front-end code I currently have to maintain.
I'm also adding Realtor nickname data ahead of next year's program, so nicknames can be caught and redacted the same way full names are — a gap the first year surfaced.
Result
The platform replaced a $7,000/year third-party service with a system built around how our own data actually works. In its first year, it's collected 419 nominations, with the duplicate-detection report and redacted bulk-printing removing steps that used to be manual.