Write property listing copy that sells without inventing facts: build a verified fact sheet first, draft headline options plus full and short versions for a confirmed portal limit, run the bundled fact and character-count checker, and work disclosure prompts by property type. Use when writing or rewriting a house, flat, rental or new-build listing, a portal summary, or listing headlines.
./install.sh property-listing-copyname: "property_listing_copy" description: "Write property listing copy that sells without inventing facts: build a verified fact sheet first, draft headline options plus full and short versions for a confirmed portal limit, run the bundled fact and character-count checker, and work disclosure prompts by property type. Use when writing or rewriting a house, flat, rental or new-build listing, a portal summary, or listing headlines."
Write listing copy where every claim can be pointed to a source. The job has two halves that must not swap order: first lock the verified facts, then write copy that is only allowed to use those facts. A listing that reads well and contains one invented amenity, one wrong size or one unsupported neighbourhood claim has failed, however good the prose is.
This skill ships a checker, not just advice. scripts/check_listing.py compares a draft against the fact sheet, counts characters against a confirmed limit, and flags numbers, features, person phrases and comparative claims that have no source behind them.
Create a fact sheet file for the property, JSON, Markdown or plain text. For each fact, write the value and its source next to it.
Include at minimum:
references/disclosure-prompts.md for this property typeIf a fact has no source, it is not a fact yet. Mark it unknown and list it as a gap. Do not carry it into the copy in softer wording. "Spacious" in place of an unmeasured size is still a size claim.
Ask which portal, MLS or feed the copy is for, and confirm the character limit for that specific field before drafting.
Do not assume a universal portal cap. No single verified cap covers full descriptions across Zillow, Rightmove and Zoopla. Limits live in the MLS rules, the feed spec and the field itself. One verified example: a Rightmove summary field documented by Expert Agent is sent at a maximum of 300 characters, and the portal truncates it at the last full stop inside those 300 characters if the copy runs over. Photo caption limits are a different thing again, at 20 characters for Zoopla and OnTheMarket and 50 for Rightmove in Dezrez documentation.
Record the confirmed limit and its source in the output. If nobody can confirm a limit, write the full version, write a 300 character short version, and label both limits as unconfirmed.
Write three to five headlines, each built from a different verified fact, so the seller or agent picks a lead fact rather than a tone.
Rules for headlines:
Patterns that work from facts alone:
Order the copy the way a viewing runs, and put the strongest verified facts first:
Keep each sentence tied to a fact sheet line. If a sentence cannot be traced, cut it or rewrite it from a fact that can. Avoid filler praise that implies a fact, such as "finished to a high standard", unless the fact sheet names the standard, the work and the date.
Length guidance cited as Zillow guidance is to keep descriptions around 250 words or less and lead with the strongest features. Treat that as a writing target, then fit the confirmed hard limit from step 2.
Build the short version from the full version by dropping whole claims in reverse order of importance. Never truncate mid-sentence and never compress a fact into a stronger one.
Worked example, from the fictional fact sheet in examples/facts.json. Every number in both versions is in that fact sheet.
Full version, 311 characters, for a confirmed 1000 character field:
"Three-bedroom semi-detached house with an open-plan kitchen and dining room. The kitchen was renovated in 2021 and has quartz counters. There are 2 bathrooms, a utility room, and 1420 sq ft of internal space. Outside there is a 60 ft south-facing garden, a garage, and a driveway. The station is 0.4 miles away."
Short version, 194 characters, under a 300 character limit:
"3 bed semi-detached, 1420 sq ft. Open-plan kitchen renovated in 2021 with quartz counters. 2 bathrooms and a utility room. 60 ft south-facing garden, garage and driveway. Station 0.4 miles away."
Note what the short version kept: size, room counts, the dated renovation, outside space and the measured distance. Note what it dropped: dining room detail and sentence padding. It invented nothing to fill space.
Run the checker separately on the full version and on each short version:
python3 scripts/check_listing.py --facts facts.json --listing listing-full.txt --limit 1000 --limit-name "MLS description"
python3 scripts/check_listing.py --facts facts.json --listing listing-short.txt --limit 300 --limit-name "portal summary"
The checker counts characters and words, flags any digit based number that is not in the fact sheet, flags lexicon features such as pool, garage or quartz that appear in the copy but not in the facts, flags person phrases such as "perfect for" and "adults only", and flags superlatives and neighbourhood claims with no matching source. Exit code 0 means no flags. Exit code 1 means flags. Exit code 2 means bad input.
Work every flag one of three ways: add the real source to the fact sheet, rewrite the line from a verified fact, or cut the line. Never silence a flag by adding the phrase to the fact sheet without a source behind it. The checker only sees digit based numbers, so check spelled out numbers, such as "four bedrooms", by eye against the fact sheet.
A bad draft shows what the checker catches. The fictional bad example in examples/listing-bad.txt raises 8 flags: an unsourced 5 minute claim, a pool and marble counters that are not in the facts, a "perfect for families" person phrase, and "largest", "safest" and "top schools" claims with no source.
Work references/disclosure-prompts.md for the property type: leasehold, flat, new build, rental, flood or land, as they apply. Then read references/claims-and-compliance.md and check:
Return all of the following:
If no limit could be confirmed, say so plainly and label the short version as written to an unconfirmed 300 character example limit.
examples/: facts.json, listing-full.txt, listing-short-300.txt and listing-bad.txt, used to test the checker.publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.