The problem
When Realtors need a listing change they can’t make themselves because of system restrictions, they submit a change request form to MLS staff. The form covers every possible change at once: price, status, expiration, remarks, and more. Every request includes every section, whether it applies or not.
That makes the form harder for everyone who touches it. The agent has to work out which parts apply. The client is asked to sign a document where the one change they agreed to is buried among sections that have nothing to do with them. MLS staff have to scan the whole page to find what actually needs to change.
The form has also taken on a second job. Agents use it to confirm changes with their clients, not just to request them from staff. One document was trying to speak to two audiences, and neither was served well.
The approach
I built a Django app that only shows what’s needed for the change being made. The agent picks the change types first, and only those sections appear on screen and in the final document.
- Alpine JS shows and hides sections instantly as change types are selected.
- An HTMX listing lookup fills in the address, sellers, current price, and expiration from a listing number.
- The server validates each section only when it’s selected and discards data from unselected sections, so hidden fields can never reach the signed document.
- WeasyPrint generates a consistent, print-ready PDF in two parts:
- Seller authorization: each change written in plain language, such as “Change the asking price from $549,000 to $529,000, a reduction of $20,000 (3.6%),” with signature lines for each seller and the agent.
- Staff processing request: a compact table of field, current value, and new value.
- The authorization lists which sections were left out, so a missing section on a signed document doesn’t raise questions later.
- Both parts share a reference code and a footer with the form version, listing number, and page count, so pages can’t be mixed up.
- Change types are defined in one place, so adding a new one only takes a few fields and one entry.
- Nothing is stored. Form data becomes a PDF in memory and is sent straight back as a download.
What I'd do differently
I’d talk to a few agents and the staff who process these requests before building, to confirm which changes come up most and which fields staff actually rely on. The listing lookup uses sample data. In a real version I’d connect it to the RESO Web API, as I did on the Awards Management Tool. I’d also look at sending the seller authorization directly to an e-signature service, since many agents no longer collect wet signatures.
Result
A working demo that turns a one-size-fits-all form into a short document for each change. A single price reduction produces a one-page seller authorization and a one-page staff request instead of a full multi-section form. The MLS name, listings, and people in the demo are fictional, and every generated PDF is watermarked as a sample.