Automate Real Estate Thumbnails with n8n
High quality, consistent property thumbnails are critical for modern real estate listings. This reference guide documents an end-to-end n8n workflow template, the Real Estate Property Thumbnail Pipeline, that automates thumbnail creation and distribution from Google Slides to your CMS and agents.
The workflow:
- Extracts slides from a Google Slides presentation
- Generates web-optimized thumbnails with a watermark
- Uploads processed images to Google Drive
- Updates Airtable property records with the image URLs and metadata
- Builds a CSV summary of processed slides
- Sends an email notification with the CSV attached
1. Workflow Overview
1.1 Use case and benefits
Manual thumbnail export and formatting is time consuming and error prone. This n8n workflow automates the full pipeline so that real estate teams can:
- Enforce consistent image dimensions and quality for all listings
- Apply on-brand watermarks or logos without manual editing
- Deliver thumbnails quickly to internal CMSs and listing agents
- Maintain traceability via CSV summaries and CMS status fields
1.2 High level process
At a high level, the workflow performs the following operations:
- Scheduled trigger via Cron
- Retrieve slides from a specified Google Slides presentation
- Request and download slide thumbnails as binary image data
- Process each image with sharp (resize, watermark, encode)
- Upload processed images to a Google Drive folder
- Update corresponding Airtable property records with Drive URLs and slide metadata
- Aggregate run results into a CSV summary
- Send an email notification to the agent with the CSV attached
2. Architecture & Data Flow
2.1 Node sequence
The template uses the following n8n nodes, in this order:
- Cron (
nightly-property-scan) - Google Slides (
get-property-slides) - Google Slides (
fetch-slide-thumbnails) - Function (
resize-watermark-images) usingsharp - Google Drive (
upload-to-google-drive) - Airtable (
update-property-cms) - Code (
prepare-csv-summary) - Email (
send-agent-notification)
2.2 Data transformations
The main data transformations across the workflow are:
- Slides metadata from Google Slides is converted into a list of slide items (each with an
objectId, index, and thumbnail URL or binary). - The second Google Slides node converts each slide into binary image data for downstream image processing.
- The Function node with
sharptransforms raw thumbnails into standardized, watermarked JPEGs and enriches each item with metadata such asfileNameandprocessedAt. - The Google Drive node returns a public or shareable link (
webViewLink) that is stored in Airtable. - The Code node aggregates individual items into a CSV string or file suitable for email attachment.
2.3 Triggering strategy
The workflow is designed to run on a schedule, typically nightly at 02:00, but can be adjusted to hourly or used on demand. The Cron node is the single entry point and can be extended to read contextual input (such as a specific presentation ID) if required.
3. Node-by-Node Breakdown
3.1 Cron trigger (nightly-property-scan)
Purpose
Automatically starts the pipeline on a defined schedule so that new or updated slides are processed without manual intervention.
Key configuration
- Mode: Time-based schedule
- Default schedule: Nightly at 2 AM
You can adjust the Cron expression to:
- Run more frequently for high volume portfolios
- Run less frequently for smaller sets of listings
- Trigger manually by disabling Cron and using the workflow’s “Execute Workflow” feature
3.2 Google Slides: get-property-slides (get-property-slides)
Purpose
Retrieves the list of slides from a Google Slides presentation that represents the property listing.
Key parameters
- presentationId:
- By default, set to a static Google Slides presentation ID.
- Can be overridden dynamically via expressions, for example if the Cron or a previous node provides the ID.
- Output:
- JSON data for each slide, including
objectId, slide index, and other metadata.
- JSON data for each slide, including
Behavior notes
- If the presentation ID is invalid or access is denied, the node will fail with a Google API error. Ensure the configured OAuth credentials have permission to read that presentation.
- All slides in the presentation are processed by default. If you want to limit to specific slides, you can filter items in a subsequent Function node.
3.3 Google Slides: fetch-slide-thumbnails (fetch-slide-thumbnails)
Purpose
Requests a thumbnail image for each slide retrieved in the previous step and downloads it as binary content for image processing.
Key parameters
- Mode: Fetch thumbnail for each slide
- Binary property: Typically set to something like
data, which is later used by the Function node.
Output
- Each item contains:
- JSON: slide metadata (e.g.
objectId,slideIndex) - Binary: base64-encoded image data under the configured binary property
- JSON: slide metadata (e.g.
Edge cases
- Missing binary data: If the node is not configured to download binary content, downstream image processing will fail. Ensure “Download” or equivalent is enabled and a binary property name is set.
- Rate limits: Large presentations can hit Google API quotas. If you see rate limit errors, add delay or retry logic between batches of slides.
3.4 Function: resize-watermark-images (resize-watermark-images)
Purpose
Uses the sharp library to standardize each thumbnail to web-friendly dimensions, apply a watermark overlay, and encode the result as a JPEG.
Core script
The template uses a Function node with the following core logic:
const sharp = require('sharp');
const items = [];
for (const item of $input.all()) { const imageBuffer = Buffer.from(item.binary.data.data, 'base64'); // Resize to standard web dimensions (1200x675) and overlay watermark const processedImage = await sharp(imageBuffer) .resize(1200, 675, { fit: 'cover' }) .composite([{ input: Buffer.from('<svg width="200" height="60"><text x="10" y="40" font-size="24" fill="white" opacity="0.7">AGENCY LOGO</text></svg>'), gravity: 'southeast' }]) .jpeg({ quality: 85 }) .toBuffer(); items.push({ json: { objectId: item.json.objectId, slideIndex: item.json.slideIndex, fileName: `property_slide_${item.json.objectId}.jpg`, processedAt: new Date().toISOString() }, binary: { data: { data: processedImage.toString('base64'), mimeType: 'image/jpeg', fileName: `property_slide_${item.json.objectId}.jpg` } } });
}
return items;
What this node does
- Reads the binary image from
item.binary.data.data(base64 encoded). - Decodes it to a
Bufferfor processing withsharp. - Resizes the image to 1200×675 pixels using
fit: 'cover'to maintain aspect ratio. - Applies a simple SVG watermark with the text “AGENCY LOGO” positioned at the southeast (bottom-right) corner.
- Encodes the result as a JPEG with quality 85.
- Returns a new item with:
- JSON metadata:
objectId,slideIndex,fileName,processedAt - Binary data: base64-encoded processed image, MIME type, and file name
- JSON metadata:
Customization points
- Dimensions: Change
.resize(1200, 675)to match your site’s preferred aspect ratio. - Watermark:
- Replace the inline SVG with your own SVG markup.
- Adjust text size, color, opacity, or position.
- Use a PNG watermark by loading a binary buffer instead of SVG.
- Format:
- Switch from JPEG to WebP by replacing
.jpeg({ quality: 85 })with.webp({ quality: 85 })if your delivery stack supports it.
- Switch from JPEG to WebP by replacing
Error handling considerations
- If
item.binary.datais missing or malformed,Buffer.fromwill fail. This typically indicates a misconfiguration in the thumbnail fetch node. - Large images or many slides may increase processing time. Monitor workflow execution duration and adjust schedule or concurrency as needed.
3.5 Google Drive: upload-to-google-drive (upload-to-google-drive)
Purpose
Uploads each processed thumbnail to a specific folder in Google Drive and provides a shareable link for use in Airtable and downstream systems.
Key parameters
- Operation: Upload file
- Binary property: Matches the binary property name used in the Function node (for example,
data). - Folder ID (
folderId): The target Drive folder where thumbnails will be stored. - File name: Typically taken from
fileNamein the item JSON (e.g.property_slide_[objectId].jpg).
Output
- Each item is enriched with Google Drive metadata, including:
webViewLink: the URL used in Airtable and potentially your CMS.
Notes
- Ensure your Google OAuth credentials have both Slides and Drive scopes, and access to the target folder.
- Use descriptive folder structures (for example, property IDs as subfolders) if you manage a large portfolio.
3.6 Airtable: update-property-cms (update-property-cms)
Purpose
Updates the property record in Airtable with the Drive URL and related slide metadata so that your CMS or internal tools can reference the new thumbnails.
Key parameters
- API key: Airtable personal access token or API key configured in n8n credentials.
- Base ID (
appId): The Airtable base that contains your property table. - Table name (
table): The table where property records live. - Record ID (
record id): The specific record to update for the property.
Typical fields updated
- Thumbnail URL: Set to the
webViewLinkreturned by Google Drive. - Slide object ID: Stores
objectIdfrom the slide for traceability. - Status: Optionally set to a value such as “Thumbnails Generated” or “Ready for Review”.
Behavior notes
- Ensure the Airtable field names in the node match your schema exactly.
- If you manage multiple slides per property, you may want to:
- Store an array of URLs, or
- Use a linked table for multi-image relationships.
3.7 Code: prepare-csv-summary (prepare-csv-summary)
Purpose
Builds a CSV summary of all processed slides in the current run, which is then attached to the notification email as a human-readable audit log.
Typical contents
- Columns may include:
objectIdslideIndexfileNameprocessedAtdriveUrl(fromwebViewLink)
The node aggregates all items from the previous steps and outputs either:
- A CSV string in JSON, or
- A CSV file in a binary property to be used as an attachment.
3.8 Email: send-agent-notification (send-agent-notification)
Purpose
Sends an email to the listing agent (or a distribution list) summarizing the processed thumbnails and attaching the CSV file.
Key parameters
- SMTP credentials: Configured in n8n to connect to your email server.
- Recipient: The agent’s email address or a team mailbox.
- Subject and body: Typically include:
- A brief summary of the run
- Links to the Drive folder or CMS
- Attachments: The CSV summary produced by the previous Code node.
Usage notes
- Use environment variables or n8n credentials to store SMTP details securely.
