AI Template Search
N8N Bazar

Find n8n Templates with AI Search

Search thousands of workflows using natural language. Find exactly what you need, instantly.

Start Searching Free
Oct 21, 2025

Automate Real Estate Thumbnails with n8n

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 […]

Automate Real Estate Thumbnails with n8n

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:

  1. Scheduled trigger via Cron
  2. Retrieve slides from a specified Google Slides presentation
  3. Request and download slide thumbnails as binary image data
  4. Process each image with sharp (resize, watermark, encode)
  5. Upload processed images to a Google Drive folder
  6. Update corresponding Airtable property records with Drive URLs and slide metadata
  7. Aggregate run results into a CSV summary
  8. 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) using sharp
  • 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 sharp transforms raw thumbnails into standardized, watermarked JPEGs and enriches each item with metadata such as fileName and processedAt.
  • 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.

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

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 Buffer for processing with sharp.
  • 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

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.

Error handling considerations

  • If item.binary.data is missing or malformed, Buffer.from will 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 fileName in 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 webViewLink returned by Google Drive.
  • Slide object ID: Stores objectId from 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:
    • objectId
    • slideIndex
    • fileName
    • processedAt
    • driveUrl (from webViewLink)

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.