Real estate listing optimization from property inspection reports
A system that generates professional listing descriptions and hero images from inspection reports, then tracks performance metrics.
- Time saved
- Saves 10-20 hrs/week
- Monthly cost
- ~~£75/mo/mo
- Published
Most real estate agents spend their Thursday nights writing listings. They've already taken 200 photos, scheduled inspections, and collated notes. Now they stare at a blank listing template, wrestling with how to make a three-bedroom semi in Croydon sound appealing. They write something generic, upload ten hero images, and hope for clicks. Two weeks later, they have no idea which listing description actually moved the needle, and which photos made viewers scroll past. This workflow exists to stop that. Instead of manually crafting descriptions and selecting images, you'll feed inspection reports directly into a system that generates compelling listing copy and matching hero images, then feeds everything into a tracking dashboard so you can see exactly which listings perform best. The whole thing runs on a schedule or webhook trigger. No human copy-paste. No choosing between 200 photos by hand. No guessing whether your listing voice actually works.
What You'll Build - A workflow triggered by uploading a property inspection report (or API call with inspection data)
- ChatGPT generates a professional listing description tailored to the property type and market segment
- Midjourney creates a hero image based on the property's key features extracted from the inspection
- The listing and image are automatically pushed to TruConversion for tracking
- Performance metrics (click-through rate, dwell time on listing) flow back into a spreadsheet so you can optimise future listings based on what actually converts
- Time savings: approximately 45 minutes per property (eliminates manual writing and image selection; replaces 2-3 hours of photo curation with 10 seconds of generation)
Prerequisites - ChatGPT account (free tier works, but Pro or Plus recommended for faster response times); API key from https://platform.openai.com/account/api-keys
- Midjourney account with active subscription (at least Basic plan for consistent image generation); requires Discord account for API access via midjourney.com
- TruConversion account (paid plan required; free trial available at https://appsumo.com/products/truconversion/); account API key from settings
- Orchestration tool of your choice: Zapier (free tier has limits), n8n (open-source, self-hosted or cloud), Make (freemium), or direct API calls via curl or your preferred language
- Basic knowledge of JSON payloads, REST APIs, and webhook configuration
- A property inspection report format (PDF or JSON; this workflow assumes structured data, not scanned PDFs)
- Estimated setup time: 50 minutes (15 minutes for API key gathering and accounts, 20 minutes for workflow configuration, 15 minutes for testing and tweaks)
The Automated Workflow
Step 1:
Trigger from Inspection Report Upload Your workflow starts when a new inspection report lands in a designated folder, email inbox, or webhook endpoint. For this example, we'll assume you're using n8n with a webhook trigger. Create a webhook trigger in n8n that listens for POST requests containing inspection report data. Your real estate software (or a form submission) sends a JSON payload to this endpoint.
POST https://your-n8n-instance.com/webhook/property-inspection
Content-Type: application/json { "property_id": "PROP-2025-00147", "address": "42 Willow Lane, Cambridge CB1 2QL", "property_type": "semi-detached", "bedrooms": 3, "bathrooms": 2, "key_features": "Original fireplaces, south-facing garden, period coving, recently rewired", "condition": "good", "location_highlights": "Walking distance to station, near award-winning schools", "inspection_notes": "Roof in excellent condition. Central heating replaced 2019. Minor damp in basement detected but treated.", "market_segment": "first-time buyer"
}
This data becomes the input for the next steps. Store the property_id and address in your workflow context; you'll use them later to track performance metrics back to the original listing. Error handling: If the webhook receives malformed JSON, n8n returns a 400 error. Configure a fallback notification (email or Slack) to alert you. If the property_id is missing, pause the workflow and log it.
Step 2:
Generate Listing Description with ChatGPT Pass the inspection data to ChatGPT to generate a professional, market-appropriate listing description. Use the GPT-4o model for speed and cost efficiency; GPT-4.1 if you need slightly sharper description quality.
POST https://api.openai.com/v1/chat/completions
Content-Type: application/json
Authorization: Bearer sk-YOUR_OPENAI_API_KEY { "model": "GPT-4o", "messages": [ { "role": "system", "content": "You are a professional real estate copywriter specialising in UK residential properties. Write compelling, accurate listing descriptions that appeal to the target market segment. Use vivid language, highlight unique features, and address common buyer concerns for the property type and location. Keep descriptions between 200–300 words. Use British English spelling and conventions." }, { "role": "user", "content": "Write a listing description for this property: 3-bed semi-detached house at 42 Willow Lane, Cambridge CB1 2QL. Key features: Original fireplaces, south-facing garden, period coving, recently rewired. Condition: good. Location highlights: Walking distance to station, near award-winning schools. Target market: first-time buyer. Inspection notes: Roof excellent, central heating replaced 2019, minor treated damp in basement." } ], "max_tokens": 500, "temperature": 0.7
}
ChatGPT returns a polished listing description like this:
"Discover charm and potential in this well-maintained three-bedroom semi-detached home. Willow Lane offers a quiet, accessible location just minutes from Cambridge station and excellent local schools, ideal for families and first-time buyers. Inside, you'll find original fireplaces that add character to the reception rooms, complemented by period coving and freshly rewired electrics for peace of mind. The south-facing rear garden provides a sunny retreat for summer entertaining. The roof is in excellent condition, and the central heating system was replaced in 2019. A minor basement damp issue was professionally treated and is no longer a concern. This home blends period character with modern practicality."
Store this output in a variable called listing_description. Error handling: If ChatGPT rate limits you (HTTP 429), n8n should retry after 30 seconds with exponential backoff. If the API key is invalid (401), your workflow stops and logs a credential error. Set up a Slack alert for this.
Step 3:
Extract Key Visual Features for Image Generation Before generating an image, pull the most visual, marketable features from the inspection data to create a focused Midjourney prompt. This keeps image generation tight and ensures the output matches the listing description. Use a second ChatGPT call (or a simple template in n8n) to create a concise visual brief:
POST https://api.openai.com/v1/chat/completions
Content-Type: application/json
Authorization: Bearer sk-YOUR_OPENAI_API_KEY { "model": "GPT-4o mini", "messages": [ { "role": "system", "content": "Extract 3–5 key visual elements from a property inspection that would make a compelling estate agent photo. Return only a comma-separated list of visual elements suitable for a Midjourney image prompt. Focus on architectural features, garden, light, and period details." }, { "role": "user", "content": "Property: 3-bed semi-detached, Cambridge. Key features: Original fireplaces, south-facing garden, period coving, recently rewired. Condition: good." } ], "max_tokens": 100, "temperature": 0.5
}
Output might be: "Period fireplace with original surround, south-facing garden with mature shrubs, period coving in reception room, afternoon sunlight streaming through sash windows, well-maintained Victorian exterior." Store this as visual_brief. Error handling: Timeout after 10 seconds; if no response, use a fallback brief based on property type and market segment.
Step 4:
Generate Hero Image with Midjourney Create a Midjourney image prompt and send it via the Midjourney API (accessed through n8n's built-in Midjourney connector or direct API calls). Midjourney's API accepts prompts and returns job IDs; you'll poll for completion.
POST https://api.midjourney.com/v1/imagine
Content-Type: application/json
Authorization: Bearer YOUR_MIDJOURNEY_API_KEY { "prompt": "Professional estate agent photography of a charming 3-bed Victorian semi-detached house exterior, UK architecture style, afternoon golden-hour sunlight, south-facing garden with mature landscaping visible, period fireplace details visible through window, well-maintained Victorian brickwork, warm inviting front entrance, 4K, high-quality, real estate photography style, shot from street level, clear blue sky", "aspect_ratio": "16:9", "quality": "hd"
}
Midjourney returns a job ID:
{ "job_id": "mj-job-abc123xyz", "status": "pending"
}
Poll this job ID every 5 seconds (with n8n's Wait node or a timed loop) until status is "completed":
GET https://api.midjourney.com/v1/jobs/mj-job-abc123xyz
Authorization: Bearer YOUR_MIDJOURNEY_API_KEY
Once complete, the response includes a URL to the generated image:
{ "job_id": "mj-job-abc123xyz", "status": "completed", "image_url": "https://midjourney-images.s3.amazonaws.com/hero-42willow.jpg", "created_at": "2025-03-10T14:22:00Z"
}
Store image_url for use in Step 5. Error handling: If Midjourney returns "failed" status, log it and trigger a fallback (use a stock image or send a manual alert). If polling times out after 120 seconds, assume failure and retry once.
Step 5:
Push Listing and Image to TruConversion TruConversion tracks how users interact with your listings. Send the listing description and hero image URL to TruConversion as a new funnel entry, then link performance metrics back to your original property data. First, create a new page in TruConversion via API:
POST https://api.truconversion.com/v1/pages
Content-Type: application/json
Authorization: Bearer YOUR_TRUCONVERSION_API_KEY { "page_name": "Listing: 42 Willow Lane, Cambridge", "page_url": "https://your-listing-site.com/property/PROP-2025-00147", "page_type": "listing", "tracking_enabled": true, "custom_fields": { "property_id": "PROP-2025-00147", "address": "42 Willow Lane, Cambridge CB1 2QL", "bedrooms": 3, "market_segment": "first-time buyer" }
}
TruConversion responds with a page ID:
{ "page_id": "page-xyz789", "tracking_code": "<!-- Insert this tracking snippet -->", "created_at": "2025-03-10T14:30:00Z"
}
Next, store metadata about the listing in TruConversion's custom events so you can correlate performance later:
POST https://api.truconversion.com/v1/events
Content-Type: application/json
Authorization: Bearer YOUR_TRUCONVERSION_API_KEY { "page_id": "page-xyz789", "event_type": "listing_created", "event_data": { "listing_description": "Discover charm and potential...", "hero_image_url": "https://midjourney-images.s3.amazonaws.com/hero-42willow.jpg", "generated_at": "2025-03-10T14:22:00Z", "ai_model_used": "GPT-4o for copy, Midjourney v6.1 for image" }
}
Error handling: If TruConversion API returns 403 (invalid API key), stop and alert. If the page creation times out, retry up to 2 times with 5-second delays. Store the page_id and page_url in your database so you can track them later.
Step 6:
Store Listing and Performance Tracking References Create a record in a spreadsheet (Google Sheets, Airtable, or your own database) that links the property to the generated listing, the image, and the TruConversion tracking page. This becomes your single source of truth for correlation analysis later.
POST https://sheets.googleapis.com/v4/spreadsheets/SHEET_ID/values/Listings!A:I/append
Content-Type: application/json
Authorization: Bearer YOUR_GOOGLE_SHEETS_API_KEY { "values": [ [ "PROP-2025-00147", "42 Willow Lane, Cambridge CB1 2QL", "semi-detached", "3", "2025-03-10T14:00:00Z", "https://your-listing-site.com/property/PROP-2025-00147", "https://midjourney-images.s3.amazonaws.com/hero-42willow.jpg", "GPT-4o | Midjourney v6.1", "page-xyz789" ] ]
}
Spreadsheet columns: Property ID
| Address | Type | Bedrooms | Date Generated | Listing URL | Image URL | AI Models Used | TruConversion Page ID Error handling: If the Google Sheets API call fails (403 permissions, quota exceeded), log it and send a Slack message. The workflow doesn't stop; it's a "nice to have" for analysis, not critical path. ---
The Manual Alternative
If you're not ready to automate the full pipeline, you can run it partially by hand. Write your listing description in ChatGPT yourself, using the same system prompt and inspection data. Then feed the visual brief you create directly into Midjourney via Discord. Finally, manually add the image and description to your listing site. This approach takes about 90 minutes per property: 45 minutes to craft the description (ChatGPT speeds this up, but you're still reviewing and editing), 20 minutes to generate images and pick the best one, 15 minutes to upload and configure tracking in TruConversion, and 10 minutes to add tracking metadata. If you're testing the workflow's output quality before automating, this is a solid middle ground. Run 5–10 properties manually, compare the automated results to your hand-crafted versions, and only then commit to full automation. You'll likely find that ChatGPT's listings are competitive with your own, though slightly more generic; Midjourney images are reliable but sometimes miss the intended mood on the first try (plan for a 20–30% remix rate). The other reason to do it manually first: you'll catch issues in the inspection data format that your automated workflow doesn't handle well. Real inspection reports often have typos, missing fields, or odd phrasing. If you've done it once by hand, you'll know which edge cases to handle in your workflow logic. ---
Pro Tips -
Batch API calls to reduce token usage.
Instead of calling ChatGPT separately for listing description and visual brief, combine them into one prompt with two distinct output sections.
Save roughly 200 tokens per property; over 100 properties a month, that's a 15–20% cost reduction on ChatGPT spend. Use structured output (JSON mode) to parse the response cleanly.
Use GPT-4o mini for the visual brief extraction.
It's 10x cheaper than GPT-4.1 and performs equally well on this focused, low-risk task. Reserve the bigger model for the main listing description where nuance matters. Estimated saving: £0.02–0.05 per property.
Implement exponential backoff for rate limits.
Midjourney and OpenAI both rate-limit aggressively. When you hit a 429 error, wait 2 seconds before retry one; 4 seconds before retry two; 8 seconds before retry three. Most orchestration tools (n8n, Make, Zapier) have built-in retry logic; configure it explicitly rather than relying on defaults. Avoid hammering the API in a tight loop.
Monitor TruConversion tracking code deployment.
After step 5, verify that the tracking snippet is actually present on your listing page. Use a scheduled check (daily) that fetches the page HTML and confirms the TruConversion script tag is there. Missing tracking code silently breaks the entire metric pipeline; you won't know for weeks. Set a Slack alert if the code is absent.
Cache Midjourney hero images.
If you generate a hero image for a property type that shows up regularly (e.g. "Victorian semi-detached in Cambridge"), store the image URL and prompt. Reuse it for similar properties instead of regenerating. Saves time and cost; also keeps your listings visually consistent. Add a "use cached image" flag to your workflow logic.
Implement a manual review gate for the first 10 listings.
Don't publish automated listings directly to your site. Insert a workflow pause after step 5 where a human (you or a colleague) reviews the ChatGPT description and Midjourney image, then clicks "approve" to push to TruConversion. After 10 properties, disable the gate and run fully automated. This catches any systematic errors in your prompts or data format early. ---
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | What You Get |
|---|---|---|---|
| ChatGPT | Pro (£17/month via OpenAI API) | £2–5 (API usage) | Unlimited API calls, GPT-4o model access, priority queuing |
| Midjourney | Basic plan (£8/month) | £8 | 200 image generations/month; covers 10–15 properties comfortably |
| TruConversion | Pro (£20/month based on AppSumo link) | £20 | Unlimited heatmaps, session recording, form analytics, custom events, API access |
| n8n (if self-hosted) | Free tier (on your server) | £0 | Unlimited workflows, basic monitoring; or £10/month (n8n Cloud) for hosted version |
| n8n (if using Make/Zapier) | Zapier Pro (£20/month) or Make Team (£9/month) | £9–20 | Multi-step workflows, API integrations, scheduling |
| TOTAL | £39–53/month | End-to-end listing generation and performance tracking for 10–20 properties |
Tool Pipeline Overview
How each tool connects in this workflow
ChatGPT
AI-powered conversational assistant by OpenAI
Midjourney
AI image generation from text prompts
TruConversion
Easy funnel tracking and optimization with heatmaps, session recording, and form analytics
More Recipes
Automated Podcast Production Workflow
Automated Podcast Production Workflow: From Raw Audio to Published Episode
Build an Automated YouTube Channel with AI
Build an Automated YouTube Channel with AI
Medical device regulatory documentation from technical specifications
Medtech companies spend significant resources translating technical specs into regulatory-compliant documentation.