Introduction Estate agents waste significant time on repetitive, low-value tasks.
A single property listing requires editing 30 to 50 photos, writing a compelling description that highlights key features, creating a virtual tour, and coordinating viewings. The entire process typically takes three to four days per property, even with experience. Meanwhile, prospective buyers scroll past poorly presented listings in seconds. The real cost isn't the time itself; it's the opportunity cost. Agents could spend those hours viewing new properties, networking with clients, or closing deals. Instead, they're cropping images in Photoshop, wrestling with lighting corrections, and rewriting descriptions that fall flat. This workflow is manual, error-prone, and doesn't scale. What if you could generate a polished, photography-enhanced, SEO-ready listing with a walkthrough video in under an hour, with no human intervention between steps? This Alchemy workflow combines four tools that feed data automatically: property photos go in, a complete listing emerges with edited images, professional copy, and a virtual tour video.
The Automated Workflow Why n8n for this workflow We'll use n8n as the orchestration tool because it handles file uploads well, has solid integrations with both Copy.ai and Synthesia, and allows branching logic without vendor lock-in.
Zapier works here too, but n8n gives you finer control over image processing and webhook timing. The flow in brief 1. Estate agent uploads property photos to a shared folder (Google Drive or Dropbox).
-
n8n detects the upload, extracts metadata, and triggers Pixelcut AI to enhance and batch-edit the images.
-
Enhanced images feed into a prompt for Claude Opus 4.6 or GPT-4o mini, which generates the property description and listing copy.
-
The description and one hero image feed into Synthesia, which generates a 60-second virtual tour video with a realistic avatar narration.
-
All assets (edited images, copy, video link) are compiled into a Google Doc template, ready for the agent to publish. Setting up the n8n workflow Start a new workflow in n8n. You'll need API keys for Copy.ai and Synthesia. Pixelcut AI doesn't have a public API yet, so we'll use a workaround: export enhanced images to Cloudinary (free tier supports 25GB) or use Zapier's built-in Pixelcut integration as a sub-step. Here's the core n8n webhook trigger and first nodes:
Webhook trigger:
POST /property-listing
Content-Type: application/json { "property_id": "prop_12345", "agent_name": "Sarah Johnson", "property_address": "42 Oak Lane, Bristol", "folder_url": "https://drive.google.com/drive/folders/ABC123", "bedrooms": 3, "bathrooms": 2, "asking_price": 425000
}
Add a Google Drive node to fetch all images from the folder URL. Use a "Read Files from Folder" operation to list all JPGs and PNGs. Next, add a loop node to process each image through Pixelcut. Pixelcut doesn't expose a direct REST API, so use the workaround: integrate via Make (formerly Integromat) as an intermediate step, or manually batch-upload to Pixelcut's web app and export to Cloudinary. For automation, the simplest approach is Zapier's native Pixelcut connector (which watches for images in a folder and applies presets automatically). For this example, assume your enhanced images land in a Cloudinary folder. The n8n workflow fetches the URLs. Generating property descriptions with Claude or GPT-4o mini Once you have the image URLs, build a prompt that combines property metadata with image analysis. Here's the API call structure:
POST https://api.openai.com/v1/chat/completions { "model": "gpt-4o mini", "messages": [ { "role": "system", "content": "You are a professional property copywriter. Write a compelling, SEO-optimised property listing. Include a headline, key features, property description (150-200 words), and a closing call-to-action. Use British English." }, { "role": "user", "content": [ { "type": "text", "text": "Property address: 42 Oak Lane, Bristol. Bedrooms: 3. Bathrooms: 2. Asking price: £425,000. Property type: Semi-detached Victorian terrace. Key features: original fireplaces, recently refurbished kitchen, south-facing garden, off-street parking. Images attached." }, { "type": "image_url", "image_url": { "url": "https://cloudinary.com/example/property_hero.jpg" } } ] } ], "max_tokens": 600, "temperature": 0.7
}
Store the response in a variable, property_copy. You now have a headline and body text. Creating the virtual tour video with Synthesia Synthesia accepts text and generates video with a realistic avatar. Use the property description you just generated as the script. Here's the API call:
POST https://api.synthesia.io/v1/videos { "title": "Virtual Tour: 42 Oak Lane, Bristol", "description": "3-bedroom Victorian terrace in Bristol city centre", "visibility": "public", "script": { "type": "text", "input": "Welcome to 42 Oak Lane, Bristol. This beautiful three-bedroom Victorian terrace offers original period features combined with modern comforts. The ground floor features a newly refurbished kitchen, original fireplaces, and a spacious lounge with south-facing garden views. Upstairs, you'll find three generous bedrooms and a recently upgraded bathroom. The south-facing garden is ideal for entertaining, and off-street parking is available. This home is perfect for families or professionals seeking character and convenience. Contact us today to arrange a viewing." }, "avatar": { "preset": "lisa_business_formal" }, "background": { "type": "image", "url": "https://cloudinary.com/example/property_hero.jpg" }, "output_format": "mp4"
}
Synthesia will queue the video and return a video_id. You'll need to poll the status endpoint until the video is ready (usually 2-5 minutes). Polling for video completion and compiling the final asset Add a "Wait" node set for 3 minutes, then a loop that polls the Synthesia status endpoint:
GET https://api.synthesia.io/v1/videos/{video_id}
Authorization: Bearer YOUR_SYNTHESIA_API_KEY
Once status returns "COMPLETED", extract the download URL and store it. Now compile everything into a Google Doc using the Google Docs API or a simple template. Final assembly: Google Doc template Use the Google Docs API to create a document from a template. Replace placeholder text with: - Property address and price (from webhook input)
- Generated description (from GPT-4o mini)
- List of image URLs (from Pixelcut/Cloudinary)
- Virtual tour video URL (from Synthesia)
- Call-to-action button linking to the video and photo gallery Here's the basic structure:
POST https://docs.googleapis.com/v1/documents/TEMPLATE_DOC_ID/batchUpdate { "requests": [ { "replaceAllText": { "containsText": { "text": "{{PROPERTY_ADDRESS}}" }, "replaceText": "42 Oak Lane, Bristol" } }, { "replaceAllText": { "containsText": { "text": "{{ASKING_PRICE}}" }, "replaceText": "£425,000" } }, { "replaceAllText": { "containsText": { "text": "{{PROPERTY_DESCRIPTION}}" }, "replaceText": "[Generated copy from GPT-4o mini]" } } ]
}
The agent receives a notification with a link to the finished Google Doc. They review it (usually takes 5 minutes) and publish to Rightmove, Zoopla, or their own website.
The Manual Alternative If you prefer more hands-on control, here's the stripped-down approach: 1.
Upload photos to Pixelcut manually, apply "Real Estate" preset, download enhanced set.
-
Open Copy.ai, paste property details into the "Real Estate Listing" template, generate 3-5 variations, pick the best one.
-
Grab one hero image and the copy, paste both into Synthesia's web interface, generate the avatar video.
-
Copy the video link and images into your listing template. This takes about 40-50 minutes and gives you full editorial control at each step. The trade-off is obvious: you're not automating, so you can't scale to multiple properties weekly.
Pro Tips Handle rate limits gracefully. Synthesia's free tier allows 3 videos per month; paid plans start at £24/month for 50 videos.
If you're creating more than one listing per week, budget for the paid plan. Add exponential backoff retry logic in n8n: if Synthesia returns a 429 (rate limit), wait 60 seconds and try again. Validate image quality before processing. Add a check in n8n: reject images smaller than 1200x800px or with low contrast. Poor-quality input kills the entire workflow. Use Claude Opus 4.6 or GPT-4o to analyse the image before feeding it to Synthesia; discard blurry or poorly lit shots. Store generated copy for audit. Save all Claude/GPT outputs to a Google Sheet before publishing. This creates an audit trail and lets you spot templated language that slips through. You can then manually tweak the copy before it goes live. Use branches for multi-property batches. If an agent uploads 20 photos in a folder, n8n's loop handles it, but Synthesia will queue videos. Add a "limit concurrent videos to 3" rule to avoid overwhelming their API and keep costs predictable. Cache image URLs intelligently. Once Pixelcut processes an image, store its URL in a database (Airtable works) with a hash of the original file. If the agent re-uploads the same photo for a different property, skip re-processing and reuse the enhanced version. This saves time and Pixelcut credits.
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| n8n | Cloud Free or Self-Hosted Community | £0–£30 | Free tier: 200 executions; Pro: £30 for unlimited |
| Copy.ai | Pro | £49 | Includes 100,000 words/month and templates |
| Pixelcut AI | Pro | £8 | Batch editing, background removal, unlimited images |
| Synthesia | Creator (paid) | £24 | 50 videos/month; higher tiers for agencies |
| Cloudinary | Free tier | £0–£10 | 25GB storage free; overage costs scale |
| Claude API (optional) | Pay-as-you-go | £2–£5/month | If using for description instead of Copy.ai |
| GPT-4o mini (optional) | Pay-as-you-go | £1–£3/month | Cheaper than Claude for bulk descriptions |
| Google Workspace | Business Standard | £14/user/month | For Google Drive and Docs API access |