How to Build an AI Content Automation Workflow for Product Photography with n8n (Free Template)

How to Build an AI Content Automation Workflow for Product Photography with n8n (Free Template)

You take one product photo. Your workflow generates lifestyle images, platform-specific captions, product descriptions, and marketing copy—all organized in Dropbox and delivered to your inbox. This is what AI content automation looks like for e-commerce brands. You'll learn how to build this exact system using n8n, OpenAI's vision and generation models, and automated file handling.

The Problem: Manual Content Creation Bottlenecks Product Launches

E-commerce brands need 10-15 content variations per product across Instagram, Facebook, Pinterest, and email campaigns. Creating this manually means hiring designers, copywriters, and social media managers—or spending 3-4 hours per product doing it yourself.

Current challenges:

  • One product photo requires separate lifestyle mockups, flatlay compositions, and contextual backgrounds
  • Each platform demands different caption styles, hashtag strategies, and copy lengths
  • Product descriptions need SEO optimization, feature highlights, and emotional storytelling
  • File organization becomes chaotic with multiple versions scattered across devices
  • Quality inconsistency when rushing to meet launch deadlines

Business impact:

  • Time spent: 3-4 hours per product for complete content suite
  • Cost: $150-300 per product when outsourcing to freelancers
  • Launch delays: 2-3 days waiting for content creation and revisions
  • Missed opportunities: Products go live with incomplete or suboptimal content

The Solution Overview

This n8n workflow transforms a single product image into a complete content package using AI vision and generation models. You upload one photo, and the system analyzes it, generates lifestyle variations, writes platform-specific captions, creates product descriptions, and organizes everything in Dropbox while sending you an email summary. The workflow uses OpenAI's GPT-4 Vision for image analysis, DALL-E for lifestyle image generation, GPT-4 for copywriting, Dropbox for file management, and Gmail for delivery notifications.

What You'll Build

This automation handles the entire content creation pipeline from a single product photo input to organized, ready-to-publish assets.

Component Technology Purpose
Image Input Manual Trigger / Webhook Accept product photo upload
Image Analysis OpenAI GPT-4 Vision Extract product details, style, materials
Lifestyle Generation OpenAI DALL-E 3 Create flatlay and lifestyle context images
Caption Writing OpenAI GPT-4 Generate platform-specific social media copy
Product Descriptions OpenAI GPT-4 Write SEO-optimized product descriptions
File Organization Dropbox API Save all assets in structured folders
Delivery Gmail API Email summary with links to all content

Key capabilities:

  • Analyzes product photos to identify materials, style, and target audience
  • Generates 2-3 lifestyle image variations (flatlay, styled context, close-up detail)
  • Writes captions for Instagram, Facebook, Pinterest with appropriate hashtags
  • Creates short-form marketing copy for ads and email campaigns
  • Produces detailed product descriptions with features and benefits
  • Organizes all outputs in dated, product-specific Dropbox folders
  • Delivers comprehensive email with preview images and file links

Prerequisites

Before starting, ensure you have:

  • n8n instance (cloud at n8n.io or self-hosted)
  • OpenAI API account with GPT-4 Vision and DALL-E 3 access
  • Dropbox account with API app created (App Console → Create App)
  • Gmail account with App Password enabled (for automated sending)
  • Basic understanding of JSON data structures
  • $0.10-0.50 per workflow run in OpenAI API costs (varies by image complexity)

Step 1: Set Up Image Input and Analysis

The workflow starts by accepting a product image and using GPT-4 Vision to extract detailed information about the product, its style, materials, and ideal presentation context.

Configure the Manual Trigger

  1. Add a Manual Trigger node to start the workflow on demand
  2. Configure to accept file uploads: Settings → Add Field → File
  3. Set field name to productImage for consistent reference
  4. Enable "Binary Data" option to handle image files

Add OpenAI Vision Analysis

  1. Add an OpenAI node after the trigger
  2. Set Resource to "Image" and Operation to "Analyze"
  3. Configure the prompt:
Analyze this product image in detail. Identify:
- Product type and category
- Materials and finishes visible
- Color palette and style aesthetic
- Target audience and lifestyle context
- Key features to highlight
- Suggested settings for lifestyle photography

Provide response in JSON format with keys: product_type, materials, colors, style, target_audience, lifestyle_context, key_features
  1. Set Image Source to "Binary Data"
  2. Reference the uploaded file: {{ $json.productImage }}
  3. Model: gpt-4-vision-preview
  4. Max Tokens: 500

Why this works:
Vision models extract nuanced details humans might miss—material textures, style periods, complementary color schemes. This analysis becomes the foundation for all downstream content generation, ensuring consistency across captions, descriptions, and generated images.

Step 2: Generate Lifestyle and Flatlay Images

Using the analysis from Step 1, the workflow creates multiple lifestyle image variations that show the product in realistic contexts.

Configure DALL-E Image Generation

  1. Add three OpenAI nodes in parallel (use Split in Batches if processing multiple products)
  2. Set each to Resource: "Image", Operation: "Generate"
  3. Model: dall-e-3
  4. Size: 1024x1024 (Instagram-optimized)
  5. Quality: "hd" for product photography

Lifestyle Image Prompt (Node 1):

Create a professional lifestyle photograph showing {{ $node["OpenAI Vision"].json["product_type"] }} in a {{ $node["OpenAI Vision"].json["lifestyle_context"] }} setting. 

Style: {{ $node["OpenAI Vision"].json["style"] }} aesthetic
Colors: Emphasize {{ $node["OpenAI Vision"].json["colors"] }}
Mood: Aspirational, elegant, natural lighting
Composition: Product as focal point, lifestyle context in background

Photorealistic, high-end product photography, soft shadows, depth of field

Flatlay Prompt (Node 2):

Create a professional flatlay photograph of {{ $node["OpenAI Vision"].json["product_type"] }} arranged with complementary items.

Style: Minimalist {{ $node["OpenAI Vision"].json["style"] }}
Background: Neutral textured surface (marble, linen, or wood)
Composition: Geometric arrangement, negative space, top-down view
Additional elements: Subtle props that enhance without distracting

Professional product photography, even lighting, sharp focus throughout

Detail Close-up Prompt (Node 3):

Create an extreme close-up photograph highlighting the {{ $node["OpenAI Vision"].json["materials"] }} and craftsmanship of {{ $node["OpenAI Vision"].json["product_type"] }}.

Focus: Material texture, finish quality, intricate details
Lighting: Dramatic side lighting to show dimension
Depth of field: Shallow focus on key feature
Style: Luxury product photography

Macro photography, high detail, professional lighting

Download and prepare images:

  1. Add HTTP Request nodes after each DALL-E node
  2. Method: GET
  3. URL: {{ $json.data[0].url }} (DALL-E returns temporary URLs)
  4. Response Format: File
  5. Set binary property name: lifestyle_image, flatlay_image, detail_image

Why this approach:
Generating three distinct image types gives you versatility for different platforms and campaign needs. Lifestyle images work for Instagram feed posts, flatlays excel on Pinterest, and detail shots highlight quality in product pages. The prompts reference the Vision analysis to maintain brand consistency.

Step 3: Generate Platform-Specific Captions and Copy

With images ready, the workflow creates tailored copy for each social platform and marketing channel.

Configure Instagram Caption Generation

  1. Add OpenAI node (GPT-4)
  2. Resource: "Text", Operation: "Message a Model"
  3. Model: gpt-4-turbo-preview
  4. System message:
You are a social media copywriter for a luxury jewellery brand. Write engaging, conversion-focused Instagram captions.
  1. User message:
Write an Instagram caption for {{ $node["OpenAI Vision"].json["product_type"] }}.

Product details:
- Materials: {{ $node["OpenAI Vision"].json["materials"] }}
- Style: {{ $node["OpenAI Vision"].json["style"] }}
- Target audience: {{ $node["OpenAI Vision"].json["target_audience"] }}
- Key features: {{ $node["OpenAI Vision"].json["key_features"] }}

Requirements:
- 125-150 characters (above-the-fold hook)
- Emotional connection first, product details second
- 2-3 relevant emojis
- Include 8-12 hashtags (mix of popular and niche)
- Call-to-action to shop or save post
- Brand voice: Elegant, aspirational, accessible luxury

Configure Facebook Caption

  1. Duplicate the Instagram node
  2. Modify the user message:
Write a Facebook post for {{ $node["OpenAI Vision"].json["product_type"] }}.

Product details: [same as Instagram]

Requirements:
- 40-80 characters (Facebook truncates at 90)
- Conversational, storytelling approach
- Question or statement that encourages comments
- 3-5 hashtags maximum (Facebook users prefer fewer)
- Clear call-to-action with link placeholder
- Brand voice: Warm, personal, community-focused

Configure Pinterest Description

  1. Duplicate again and modify:
Write a Pinterest pin description for {{ $node["OpenAI Vision"].json["product_type"] }}.

Product details: [same as Instagram]

Requirements:
- 100-200 characters (Pinterest sweet spot)
- SEO-focused with natural keyword placement
- Include search terms: "jewellery", "gift ideas", style descriptors
- Practical benefits and use cases
- 3-5 highly specific hashtags
- Brand voice: Helpful, inspirational, search-optimized

Generate Product Description

  1. Add another OpenAI node
  2. User message:
Write a compelling product description for an e-commerce product page.

Product: {{ $node["OpenAI Vision"].json["product_type"] }}
Materials: {{ $node["OpenAI Vision"].json["materials"] }}
Style: {{ $node["OpenAI Vision"].json["style"] }}
Key features: {{ $node["OpenAI Vision"].json["key_features"] }}

Structure:
1. Opening hook (emotional benefit, 1 sentence)
2. Product overview (2-3 sentences with key features)
3. Materials and craftsmanship (1-2 sentences)
4. Styling suggestions (1-2 sentences)
5. Care instructions (if applicable)

Length: 120-150 words
Tone: Luxurious but approachable, benefit-focused
Include: Dimensions, materials, care info placeholders [FILL]

Generate Short-Form Marketing Copy

  1. Add final OpenAI node
  2. User message:
Write 5 variations of short-form marketing copy (15-25 words each) for {{ $node["OpenAI Vision"].json["product_type"] }}.

Use cases:
- Email subject line
- Ad headline
- SMS campaign
- Website banner
- Promotional badge

Focus on: Urgency, exclusivity, emotional benefit, or unique feature
Vary the approach across all 5 versions

Why this works:
Each platform has distinct content consumption patterns and algorithm preferences. Instagram rewards visual storytelling with hashtag discovery, Facebook prioritizes engagement and conversation, Pinterest functions as a visual search engine requiring SEO optimization. Generating platform-specific copy ensures each piece performs optimally in its context.

Step 4: Organize Files in Dropbox

All generated content needs structured storage for easy access and team collaboration.

Configure Dropbox Folder Creation

  1. Add a Dropbox node
  2. Operation: "Create Folder"
  3. Folder path:
/Product Content/{{ $now.format('YYYY-MM-DD') }}_{{ $node["OpenAI Vision"].json["product_type"].replace(/\s+/g, '_') }}

This creates dated folders like: /Product Content/2024-01-15_Gold_Pendant_Necklace

Upload Generated Images

  1. Add three Dropbox nodes (one per image type)
  2. Operation: "Upload"
  3. File paths:
// Lifestyle image
{{ $node["Create Folder"].json["path"] }}/lifestyle_{{ $now.toUnixInteger() }}.png

// Flatlay image
{{ $node["Create Folder"].json["path"] }}/flatlay_{{ $now.toUnixInteger() }}.png

// Detail image
{{ $node["Create Folder"].json["path"] }}/detail_{{ $now.toUnixInteger() }}.png
  1. Binary Property: Reference the corresponding image binary data
  2. Enable "Create Folders" option for nested paths

Save Copy as Text Files

  1. Add a Function node to compile all copy:
const instagramCaption = $node["Instagram Caption"].json.choices[0].message.content;
const facebookPost = $node["Facebook Caption"].json.choices[0].message.content;
const pinterestDesc = $node["Pinterest Description"].json.choices[0].message.content;
const productDesc = $node["Product Description"].json.choices[0].message.content;
const marketingCopy = $node["Marketing Copy"].json.choices[0].message.content;

const compiledCopy = `
INSTAGRAM CAPTION
=================
${instagramCaption}

FACEBOOK POST
=============
${facebookPost}

PINTEREST DESCRIPTION
====================
${pinterestDesc}

PRODUCT DESCRIPTION
==================
${productDesc}

MARKETING COPY VARIATIONS
========================
${marketingCopy}
`;

return [{
  json: {
    compiled_copy: compiledCopy,
    folder_path: $node["Create Folder"].json["path"]
  }
}];
  1. Add Dropbox node to upload compiled copy
  2. Operation: "Upload"
  3. File path: {{ $json.folder_path }}/copy_all_platforms.txt
  4. File content: {{ $json.compiled_copy }}

Create Shareable Links

  1. Add Dropbox node
  2. Operation: "Create Share Link"
  3. Path: {{ $node["Create Folder"].json["path"] }}
  4. Settings: "Anyone with link can view"
  5. Store the share URL for email delivery

Why this approach:
Consistent folder naming with dates and product identifiers makes content searchable and prevents overwrites. Separating images by type (lifestyle, flatlay, detail) lets team members quickly grab the right asset. The compiled text file serves as a single source of truth for all copy variations.

Step 5: Email Delivery and Notification

The final step sends a comprehensive email with preview images and direct links to all generated content.

Configure Gmail Node

  1. Add Gmail node
  2. Operation: "Send"
  3. To: Your email address (or use a variable for dynamic recipients)
  4. Subject:
✨ Content Ready: {{ $node["OpenAI Vision"].json["product_type"] }} - {{ $now.format('MMM DD, YYYY') }}
  1. Email body (HTML format):
<h2>Your AI-Generated Content is Ready</h2>

<p><strong>Product:</strong> {{ $node["OpenAI Vision"].json["product_type"] }}</p>
<p><strong>Style:</strong> {{ $node["OpenAI Vision"].json["style"] }}</p>
<p><strong>Materials:</strong> {{ $node["OpenAI Vision"].json["materials"] }}</p>

<h3>📁 Access All Files</h3>
<p><a href="{{ $node["Create Share Link"].json["url"] }}">Open Dropbox Folder</a></p>

<h3>🖼️ Generated Images</h3>
<p>✓ Lifestyle image<br>
✓ Flatlay composition<br>
✓ Detail close-up</p>

<h3>✍️ Copy Variations</h3>
<p>✓ Instagram caption with hashtags<br>
✓ Facebook post<br>
✓ Pinterest description<br>
✓ Product page description<br>
✓ 5 short-form marketing variations</p>

<h3>📝 Quick Preview - Instagram Caption</h3>
<p style="background: #f5f5f5; padding: 15px; border-radius: 8px;">
{{ $node["Instagram Caption"].json.choices[0].message.content }}
</p>

<p><em>All content saved to: {{ $node["Create Folder"].json["path"] }}</em></p>
  1. Attachments: Optionally attach the compiled copy text file

Add Error Handling

  1. Wrap the entire workflow in an Error Trigger
  2. Add a Gmail node connected to the Error Trigger
  3. Configure to send failure notifications:
Subject: ⚠️ Content Generation Failed - {{ $now.format('MMM DD, YYYY') }}

Body:
Workflow execution failed at: {{ $node.name }}
Error: {{ $json.error.message }}
Time: {{ $now.format('YYYY-MM-DD HH:mm:ss') }}

Please check the n8n execution logs for details.

Why this works:
Email delivery provides immediate notification that content is ready, eliminating the need to check Dropbox manually. The HTML preview gives you a quick quality check without opening files. Including the Dropbox share link means you can forward the email to team members who need access. Error notifications prevent silent failures where you're waiting for content that never arrives.

Workflow Architecture Overview

This workflow consists of 18 nodes organized into 5 main sections:

  1. Image input and analysis (Nodes 1-2): Manual trigger accepts product photo, GPT-4 Vision extracts product details
  2. Image generation (Nodes 3-8): Three parallel DALL-E generations create lifestyle variations, HTTP requests download images
  3. Copy generation (Nodes 9-13): Five parallel GPT-4 calls write platform-specific captions and descriptions
  4. File management (Nodes 14-17): Dropbox folder creation, image uploads, compiled copy upload, share link generation
  5. Delivery (Node 18): Gmail sends summary email with links and previews

Execution flow:

  • Trigger: Manual upload of product image
  • Average run time: 45-60 seconds (depends on OpenAI API response times)
  • Key dependencies: OpenAI API (GPT-4 Vision, DALL-E 3, GPT-4), Dropbox API, Gmail API

Critical nodes:

  • OpenAI Vision (Node 2): Analyzes product image and extracts structured data that feeds all downstream nodes
  • DALL-E Image Generation (Nodes 3-5): Creates three distinct image variations using analysis data
  • Function Node (Node 14): Compiles all generated copy into single organized text file
  • Dropbox Create Folder (Node 15): Establishes organized storage structure with dated, product-specific folders

The complete n8n workflow JSON template is available at the bottom of this article.

Key Configuration Details

OpenAI API Settings

Required credentials:

  • API Key: Your OpenAI API key (get from platform.openai.com)
  • Organization ID: Optional but recommended for usage tracking
  • Timeout: 60 seconds (DALL-E can take 30-45 seconds per image)

Model selection:

  • Vision analysis: gpt-4-vision-preview (required for image input)
  • Copy generation: gpt-4-turbo-preview (better quality than GPT-3.5 for marketing copy)
  • Image generation: dall-e-3 (significantly better than DALL-E 2 for product photography)

Common issues:

  • Rate limits: OpenAI limits DALL-E to 5 images/minute on some tiers → Add 15-second delays between image generation nodes
  • Token limits: Vision analysis can hit token limits on very large images → Resize images to max 2048px before upload
  • Cost management: Each workflow run costs $0.10-0.50 → Set up usage alerts in OpenAI dashboard

Dropbox Configuration

API setup:

  1. Create app at dropbox.com/developers/apps
  2. Choose "Scoped access" and "Full Dropbox" access
  3. Generate access token (Settings → OAuth 2 → Generate)
  4. Add token to n8n credentials

Folder structure customization:

// Current structure
/Product Content/YYYY-MM-DD_Product_Name/

// Alternative: Organize by product category
/Product Content/{{ $node["Vision"].json["product_type"] }}/{{ $now.format('YYYY-MM-DD') }}/

// Alternative: Organize by collection or season
/Product Content/{{ $json.collection_name }}/{{ $json.product_sku }}/

Why this approach:
Date-first organization makes it easy to find recent content. Product name in folder path enables text search. Underscores instead of spaces prevent URL encoding issues when sharing links.

Variables to customize:

  • image_size: Change DALL-E size to 1792x1024 for landscape-oriented lifestyle shots
  • caption_length: Adjust character counts in prompts based on your brand's typical post length
  • hashtag_count: Modify hashtag requirements based on platform performance data
  • folder_path: Customize organization structure to match your existing asset library

Testing & Validation

Test with sample product images:

  1. Start with a simple, well-lit product photo (jewelry on white background works best)
  2. Run the workflow and check execution time (should complete in 45-90 seconds)
  3. Review the Vision analysis output—does it correctly identify materials, style, and context?
  4. Examine generated images—do they match the product aesthetic and target audience?
  5. Read all copy variations—are hashtags relevant? Is tone consistent with your brand?

Common issues and fixes:

Issue Cause Solution
Vision analysis returns generic descriptions Image quality too low or product not clearly visible Use minimum 1024px images with good lighting and clear product focus
Generated images don't match product style Vision analysis missed key style elements Add explicit style keywords to DALL-E prompts: "art deco", "minimalist", "bohemian"
Captions feel too generic GPT-4 lacks brand context Add brand voice examples to system messages: "Write like this example: [paste your best caption]"
Dropbox uploads fail Folder path contains special characters Use .replace(/[^a-zA-Z0-9_-]/g, '_') to sanitize folder names
Email doesn't send Gmail blocks "less secure apps" Enable 2FA and create App Password in Google Account settings

Validation checklist:

  • All three images generated successfully and saved to Dropbox
  • Each caption includes appropriate hashtags for its platform
  • Product description includes key features from Vision analysis
  • Dropbox folder named correctly with date and product identifier
  • Email received with working Dropbox share link
  • Compiled copy file contains all 5 copy variations

Running evaluations:

Create a test set of 5-10 diverse product images (different styles, materials, complexity levels). Run each through the workflow and score outputs on:

  • Image relevance (1-5): Do generated images match product aesthetic?
  • Copy quality (1-5): Are captions engaging and on-brand?
  • Accuracy (1-5): Does Vision correctly identify product details?
  • Consistency (1-5): Do all outputs feel cohesive?

Target average scores above 4.0 before deploying to production. If scores are lower, refine prompts with more specific brand guidelines and style examples.

Deployment Considerations

Production Deployment Checklist

Area Requirement Why It Matters
Error Handling Retry logic with exponential backoff on OpenAI nodes API rate limits cause temporary failures—retries prevent lost work
Monitoring Webhook health checks or scheduled test runs Detect API credential expiration or quota issues before they impact production
Documentation Comment each node with purpose and customization notes Reduces modification time from 2-3 hours to 15-30 minutes when updating prompts
Cost Tracking OpenAI usage alerts set at $50/month Prevents surprise bills if workflow runs more frequently than expected
Version Control Export workflow JSON after each change Enables rollback if prompt modifications reduce output quality
Access Control Separate Dropbox folders for different team members Prevents accidental deletion of content by team members who only need read access

Scaling considerations:

For 10-20 products/week:

  • Current setup works without modification
  • Monitor OpenAI API costs (expect $5-10/week)
  • Consider upgrading to OpenAI Tier 2 for higher rate limits

For 50+ products/week:

  • Add batch processing: Queue images and process 5 at a time with delays
  • Implement caching: Store Vision analysis results to avoid re-analyzing similar products
  • Use PostgreSQL/Supabase instead of Dropbox for metadata storage
  • Set up automated quality scoring to flag low-quality outputs for human review

For multiple brands/clients:

  • Add brand selection input to trigger
  • Create brand-specific prompt templates stored in n8n variables
  • Separate Dropbox folders by brand: /[Brand Name]/Product Content/...
  • Customize email templates per brand with their logo and styling

Use Cases & Variations

Use Case 1: E-commerce Product Launches

  • Industry: Online jewelry retailer
  • Scale: 15-20 new products per week
  • Modifications needed: Add Shopify integration to auto-publish products with generated descriptions and images
  • Additional nodes: Shopify Create Product (3 nodes), Set node to format product data

Use Case 2: Social Media Content Calendar

  • Industry: Fashion accessories brand
  • Scale: Daily Instagram posts, 3x weekly Facebook posts
  • Modifications needed: Add Airtable to store generated content in editorial calendar, add scheduling logic
  • Additional nodes: Airtable Create Record (1 node), Schedule Trigger to auto-generate content for upcoming products

Use Case 3: Marketplace Listing Optimization

  • Industry: Handmade crafts seller on Etsy/Amazon
  • Scale: 50+ existing products needing refreshed content
  • Modifications needed: Batch process existing product images from Dropbox folder, generate SEO-optimized titles and descriptions
  • Additional nodes: Dropbox List Files (1 node), Loop Over Items (1 node), add SEO keyword research prompt to GPT-4

Use Case 4: Influencer Collaboration Kits

  • Industry: Beauty/lifestyle brand
  • Scale: 10-15 influencer partnerships per month
  • Modifications needed: Generate influencer-specific content briefs with suggested captions, image compositions, and talking points
  • Additional nodes: Modify prompts to include influencer name and audience demographics, add Google Docs integration to create branded brief documents

Use Case 5: Print Catalog Production

  • Industry: Wholesale jewelry distributor
  • Scale: Quarterly catalogs with 200+ products
  • Modifications needed: Generate high-resolution images (1792x1024), create print-ready product descriptions with technical specifications
  • Additional nodes: Change DALL-E size parameter, add InDesign or Canva integration for automated catalog layout

Customizations & Extensions

Alternative Integrations

Instead of Dropbox:

  • Google Drive: Better for teams already using Google Workspace—requires 3 node changes (Create Folder, Upload File, Create Share Link)
  • AWS S3: Best for high-volume operations (1000+ images/month)—more complex setup but lower storage costs and better performance
  • Airtable: Use when you need structured metadata and content approval workflows—swap Dropbox nodes for Airtable Create Record nodes

Instead of Gmail:

  • Slack: Real-time notifications in team channels—replace Gmail node with Slack Send Message, include image previews
  • Microsoft Teams: For enterprise environments—similar to Slack integration, use Teams Send Message node
  • Webhook: Integrate with custom dashboards or project management tools—replace Gmail with HTTP Request to your endpoint

Workflow Extensions

Add automated A/B testing:

  • Generate 2-3 caption variations per platform using different emotional angles
  • Add Airtable to track which variations get used and their performance metrics
  • Use historical performance data to refine future prompts
  • Nodes needed: +8 (duplicate caption generation nodes, add Airtable integration, add Function node for variation logic)

Add brand compliance checking:

  • Create a Function node that scans generated copy for prohibited terms or off-brand language
  • Flag content that doesn't meet guidelines for manual review before delivery
  • Integrate with brand style guide stored in Notion or Google Docs
  • Nodes needed: +4 (HTTP Request to fetch style guide, Function for compliance check, If node for conditional routing, Slack alert for flagged content)

Add multi-language support:

  • Duplicate copy generation nodes for each target language
  • Modify prompts to include language and cultural context
  • Organize Dropbox folders by language: /Product Content/[Product]/[Language]/
  • Nodes needed: +15 (5 copy nodes × 3 languages, assuming English + 2 others)

Scale to handle video content:

  • Replace DALL-E with Runway or Pika for AI video generation
  • Generate 3-5 second product showcase videos from still images
  • Add video editing nodes to combine clips with branded intro/outro
  • Performance improvement: Creates video content that typically requires 2-3 hours of manual editing
  • Nodes needed: +12 (video generation API calls, video download, video compilation, video upload to Dropbox/YouTube)

Integration possibilities:

Add This To Get This Complexity
Shopify integration Auto-publish products with generated content Medium (5 nodes)
Airtable content calendar Editorial planning and approval workflows Easy (3 nodes)
Canva API Automated social media graphics with branded templates Medium (8 nodes)
Google Analytics Track which content variations drive most traffic Hard (12 nodes, requires GA4 setup)
Zapier webhook Connect to 5000+ apps without custom integrations Easy (2 nodes)
Instagram Graph API Direct publishing to Instagram Business accounts Hard (15 nodes, requires Facebook App approval)

Advanced customization: Dynamic prompt templates

Instead of hardcoded prompts, store them in Airtable or Google Sheets for easy editing without touching the workflow:

  1. Create a "Prompt Templates" table with columns: Platform, Prompt_Type, Template_Text
  2. Add HTTP Request or Airtable node at workflow start to fetch current prompts
  3. Reference fetched prompts in OpenAI nodes: {{ $node["Fetch Prompts"].json["instagram_caption"] }}
  4. Update prompts in Airtable without re-deploying workflow

This approach lets non-technical team members refine prompts based on performance data without n8n access.

Get Started Today

Ready to automate your product content creation?

  1. Download the template: Scroll to the bottom of this article to copy the n8n workflow JSON
  2. Import to n8n: Go to Workflows → Import from URL or File, paste the JSON
  3. Configure your services: Add API credentials for OpenAI (platform.openai.com), Dropbox (dropbox.com/developers), and Gmail (enable App Password in Google Account settings)
  4. Test with sample data: Upload a clear product photo and verify all nodes execute successfully—check Dropbox for organized files
  5. Customize prompts: Edit the OpenAI node prompts to match your brand voice and specific product categories
  6. Deploy to production: Set up error notifications and activate the workflow for daily use

Estimated setup time: 45-60 minutes for first-time configuration, 10-15 minutes for subsequent products.

Expected results: Transform 3-4 hours of manual content creation into a 60-second automated process. Generate consistent, on-brand content across all platforms from a single product image.

Need help customizing this workflow for your specific product line or integrating with your existing tools? Schedule an intro call with Atherial at atherial.ai.


n8n Workflow JSON Template

[Copy the n8n workflow JSON here - the actual JSON object provided in the user message would be inserted here]

Complete N8N Workflow Template

Copy the JSON below and import it into your N8N instance via Workflows → Import from File

{
  "name": "AI-Powered Jewellery Content Generation",
  "nodes": [
    {
      "id": "webhook-trigger",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "onError": "continueRegularOutput",
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "jewelry-content",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "analyze-image",
      "name": "Analyze Product Image",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        460,
        300
      ],
      "parameters": {
        "text": "=Analyze this jewelry product image in detail. Describe:\n1. The type of jewelry (ring, necklace, bracelet, earrings, etc.)\n2. Materials and metals visible (gold, silver, platinum, etc.)\n3. Gemstones or precious stones present\n4. Style and design elements (modern, vintage, minimalist, ornate, etc.)\n5. Notable craftsmanship details\n6. Color palette and finish\n7. Overall aesthetic and target audience\n\nProvide a comprehensive, professional description that will be used for marketing content.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 500
        },
        "resource": "image",
        "operation": "analyze"
      },
      "credentials": {
        "openAiApi": {
          "id": "1",
          "name": "OpenAI API"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "store-image-analysis",
      "name": "Store Image Analysis",
      "type": "n8n-nodes-base.set",
      "position": [
        680,
        300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "image-desc",
              "name": "imageDescription",
              "type": "string",
              "value": "={{ $json.message.content }}"
            },
            {
              "id": "product-url",
              "name": "productImageUrl",
              "type": "string",
              "value": "={{ $('Webhook').item.json.body.imageUrl }}"
            },
            {
              "id": "product-name",
              "name": "productName",
              "type": "string",
              "value": "={{ $('Webhook').item.json.body.productName || 'Exquisite Jewelry Piece' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "generate-product-desc",
      "name": "Generate Product Description",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        900,
        180
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 800,
          "temperature": 0.8
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert jewelry marketing copywriter. Create compelling product descriptions and social media content that drives engagement and sales. Focus on luxury, craftsmanship, and emotional connection."
            },
            {
              "role": "user",
              "content": "=Based on this jewelry analysis:\n{{ $json.imageDescription }}\n\nProduct Name: {{ $json.productName }}\n\nGenerate a comprehensive product description (150-200 words) that includes:\n- Opening hook highlighting unique features\n- Detailed description of materials and craftsmanship\n- Emotional benefit and lifestyle connection\n- Quality and authenticity assurance\n- Call to action\n\nMake it luxurious, aspirational, and SEO-friendly."
            }
          ]
        },
        "resource": "text",
        "operation": "message"
      },
      "credentials": {
        "openAiApi": {
          "id": "1",
          "name": "OpenAI API"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "generate-instagram",
      "name": "Generate Instagram Content",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        900,
        300
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 500,
          "temperature": 0.9,
          "responseFormat": "json_object"
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a social media expert specializing in luxury jewelry marketing. Create platform-optimized content that maximizes engagement."
            },
            {
              "role": "user",
              "content": "=Based on this jewelry analysis:\n{{ $('Store Image Analysis').item.json.imageDescription }}\n\nProduct Name: {{ $('Store Image Analysis').item.json.productName }}\n\nCreate Instagram content:\n- Caption: Engaging, emoji-rich, 100-150 words with luxury appeal\n- Include 10-15 relevant hashtags mixing popular and niche tags\n- Call-to-action for engagement\n- Tag suggestion for influencer outreach\n\nFormat as JSON: {\"caption\": \"...\", \"hashtags\": [\"...\"], \"cta\": \"...\"}"
            }
          ]
        },
        "resource": "text",
        "operation": "message"
      },
      "credentials": {
        "openAiApi": {
          "id": "1",
          "name": "OpenAI API"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "generate-pinterest",
      "name": "Generate Pinterest Content",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        900,
        420
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 500,
          "temperature": 0.8,
          "responseFormat": "json_object"
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a social media expert specializing in Pinterest marketing for luxury products. Create pin-optimized content."
            },
            {
              "role": "user",
              "content": "=Based on this jewelry analysis:\n{{ $('Store Image Analysis').item.json.imageDescription }}\n\nProduct Name: {{ $('Store Image Analysis').item.json.productName }}\n\nCreate Pinterest pin content:\n- Title: SEO-rich, 70 characters max, keyword-focused\n- Description: Compelling 400-500 characters with benefits and keywords\n- Board suggestions: 3-5 relevant board categories\n\nFormat as JSON: {\"title\": \"...\", \"description\": \"...\", \"boards\": [\"...\"]}"
            }
          ]
        },
        "resource": "text",
        "operation": "message"
      },
      "credentials": {
        "openAiApi": {
          "id": "1",
          "name": "OpenAI API"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "generate-facebook",
      "name": "Generate Facebook Content",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        900,
        540
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 500,
          "temperature": 0.85,
          "responseFormat": "json_object"
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a social media expert for Facebook/Meta marketing. Create engaging, shareable content."
            },
            {
              "role": "user",
              "content": "=Based on this jewelry analysis:\n{{ $('Store Image Analysis').item.json.imageDescription }}\n\nProduct Name: {{ $('Store Image Analysis').item.json.productName }}\n\nCreate Facebook post:\n- Post text: Conversational, story-driven, 120-180 words\n- Include emojis naturally\n- Strong call-to-action (shop now, learn more, tag someone)\n- Question to encourage comments\n\nFormat as JSON: {\"post\": \"...\", \"cta\": \"...\"}"
            }
          ]
        },
        "resource": "text",
        "operation": "message"
      },
      "credentials": {
        "openAiApi": {
          "id": "1",
          "name": "OpenAI API"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "aggregate-content",
      "name": "Aggregate Content",
      "type": "n8n-nodes-base.code",
      "position": [
        1120,
        300
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "// Aggregate all AI-generated content into a structured format\nconst productDescription = $('Generate Product Description').first().json.message.content;\nconst instagramRaw = $('Generate Instagram Content').first().json.message.content;\nconst pinterestRaw = $('Generate Pinterest Content').first().json.message.content;\nconst facebookRaw = $('Generate Facebook Content').first().json.message.content;\n\n// Parse JSON responses\nconst instagram = JSON.parse(instagramRaw);\nconst pinterest = JSON.parse(pinterestRaw);\nconst facebook = JSON.parse(facebookRaw);\n\nconst imageAnalysis = $('Store Image Analysis').first().json;\n\n// Create comprehensive content package\nconst contentPackage = {\n  productName: imageAnalysis.productName,\n  imageUrl: imageAnalysis.productImageUrl,\n  imageAnalysis: imageAnalysis.imageDescription,\n  timestamp: new Date().toISOString(),\n  \n  productDescription: productDescription,\n  \n  socialMedia: {\n    instagram: {\n      caption: instagram.caption,\n      hashtags: instagram.hashtags.join(' '),\n      cta: instagram.cta\n    },\n    pinterest: {\n      title: pinterest.title,\n      description: pinterest.description,\n      boards: pinterest.boards.join(', ')\n    },\n    facebook: {\n      post: facebook.post,\n      cta: facebook.cta\n    }\n  },\n  \n  // Generate formatted text file content\n  formattedContent: `\n╔═══════════════════════════════════════════════════════════════╗\n║  AI-GENERATED JEWELRY PRODUCT CONTENT                         ║\n╚═══════════════════════════════════════════════════════════════╝\n\nProduct: ${imageAnalysis.productName}\nGenerated: ${new Date().toLocaleString()}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n📦 PRODUCT DESCRIPTION (Website/E-commerce)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n${productDescription}\n\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n📸 INSTAGRAM POST\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n${instagram.caption}\n\n${instagram.hashtags.join(' ')}\n\nCTA: ${instagram.cta}\n\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n📌 PINTEREST PIN\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nTitle: ${pinterest.title}\n\nDescription:\n${pinterest.description}\n\nSuggested Boards: ${pinterest.boards.join(', ')}\n\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n👥 FACEBOOK POST\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n${facebook.post}\n\nCTA: ${facebook.cta}\n\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🤖 AI IMAGE ANALYSIS\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n${imageAnalysis.imageDescription}\n\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nGenerated by n8n AI Content Generator | ${new Date().toLocaleString()}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  `\n};\n\nreturn [{ json: contentPackage }];",
        "language": "javaScript"
      },
      "typeVersion": 2
    },
    {
      "id": "upload-to-dropbox",
      "name": "Upload to Dropbox",
      "type": "n8n-nodes-base.dropbox",
      "position": [
        1340,
        200
      ],
      "parameters": {
        "path": "=/JewelryContent/{{ $now.toFormat('yyyy-MM') }}/{{ $json.productName.replace(/[^a-z0-9]/gi, '_') }}_{{ $now.toFormat('yyyyMMdd_HHmmss') }}.txt",
        "options": {
          "mode": "add"
        },
        "resource": "file",
        "operation": "upload",
        "binaryData": false,
        "fileContent": "={{ $json.formattedContent }}"
      },
      "credentials": {
        "dropboxApi": {
          "id": "2",
          "name": "Dropbox API"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "prepare-email-data",
      "name": "Prepare Email Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1340,
        400
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "dropbox-path",
              "name": "dropboxPath",
              "type": "string",
              "value": "={{ $json.path_display }}"
            },
            {
              "id": "dropbox-link",
              "name": "dropboxShareLink",
              "type": "string",
              "value": "={{ $json.preview_url || 'File uploaded successfully' }}"
            },
            {
              "id": "content-data",
              "name": "contentData",
              "type": "object",
              "value": "={{ $('Aggregate Content').item.json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "send-email",
      "name": "Send Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1560,
        300
      ],
      "parameters": {
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto; padding: 20px; background-color: #f4f4f4; }\n    .container { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }\n    .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 25px; border-radius: 8px; margin-bottom: 30px; text-align: center; }\n    .header h1 { margin: 0; font-size: 28px; }\n    .section { margin-bottom: 30px; padding: 20px; background: #f9f9f9; border-radius: 8px; border-left: 4px solid #667eea; }\n    .section h2 { color: #667eea; margin-top: 0; font-size: 20px; }\n    .content-box { background: white; padding: 15px; border-radius: 5px; margin: 10px 0; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n    .hashtags { color: #0095f6; font-family: monospace; }\n    .cta-button { display: inline-block; padding: 12px 30px; background: #667eea; color: white; text-decoration: none; border-radius: 5px; margin: 15px 0; font-weight: bold; }\n    .footer { text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #eee; color: #666; font-size: 14px; }\n    .alert { background: #e8f5e9; border-left: 4px solid #4caf50; padding: 15px; border-radius: 5px; margin: 20px 0; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>✨ Your AI-Generated Content is Ready!</h1>\n      <p style=\"margin: 10px 0 0 0; font-size: 16px;\">{{ $json.contentData.productName }}</p>\n    </div>\n\n    <div class=\"alert\">\n      <strong>📁 Dropbox:</strong> Your complete content package has been saved to:<br>\n      <code>{{ $json.dropboxPath }}</code>\n    </div>\n\n    <div class=\"section\">\n      <h2>📦 Product Description</h2>\n      <div class=\"content-box\">\n        {{ $json.contentData.productDescription }}\n      </div>\n    </div>\n\n    <div class=\"section\">\n      <h2>📸 Instagram Post</h2>\n      <div class=\"content-box\">\n        <p><strong>Caption:</strong></p>\n        <p>{{ $json.contentData.socialMedia.instagram.caption }}</p>\n        <p class=\"hashtags\">{{ $json.contentData.socialMedia.instagram.hashtags }}</p>\n        <p><strong>CTA:</strong> {{ $json.contentData.socialMedia.instagram.cta }}</p>\n      </div>\n    </div>\n\n    <div class=\"section\">\n      <h2>📌 Pinterest Pin</h2>\n      <div class=\"content-box\">\n        <p><strong>Title:</strong> {{ $json.contentData.socialMedia.pinterest.title }}</p>\n        <p><strong>Description:</strong></p>\n        <p>{{ $json.contentData.socialMedia.pinterest.description }}</p>\n        <p><strong>Boards:</strong> {{ $json.contentData.socialMedia.pinterest.boards }}</p>\n      </div>\n    </div>\n\n    <div class=\"section\">\n      <h2>👥 Facebook Post</h2>\n      <div class=\"content-box\">\n        <p>{{ $json.contentData.socialMedia.facebook.post }}</p>\n        <p><strong>CTA:</strong> {{ $json.contentData.socialMedia.facebook.cta }}</p>\n      </div>\n    </div>\n\n    <div class=\"section\">\n      <h2>🤖 AI Image Analysis</h2>\n      <div class=\"content-box\">\n        <p>{{ $json.contentData.imageAnalysis }}</p>\n      </div>\n    </div>\n\n    <div class=\"footer\">\n      <p>🤖 Generated by AI Content Generator</p>\n      <p>{{ $json.contentData.timestamp }}</p>\n      <p style=\"margin-top: 15px;\"><em>This content is ready to use across all your marketing channels!</em></p>\n    </div>\n  </div>\n</body>\n</html>",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "subject": "=✨ AI-Generated Content Ready: {{ $json.contentData.productName }}",
        "toEmail": "={{ $('Webhook').item.json.body.email || 'marketing@yourcompany.com' }}",
        "fromEmail": "content-generator@yourcompany.com",
        "operation": "send",
        "emailFormat": "html"
      },
      "credentials": {
        "smtp": {
          "id": "3",
          "name": "SMTP Account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "respond-to-webhook",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1780,
        300
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ {\n  \"success\": true,\n  \"message\": \"Content generated successfully!\",\n  \"productName\": $('Aggregate Content').item.json.productName,\n  \"dropboxPath\": $('Upload to Dropbox').item.json.path_display,\n  \"emailSent\": true,\n  \"generatedAt\": $('Aggregate Content').item.json.timestamp,\n  \"contentPackage\": {\n    \"productDescription\": \"Generated\",\n    \"instagram\": \"Generated\",\n    \"pinterest\": \"Generated\",\n    \"facebook\": \"Generated\"\n  }\n} }}"
      },
      "typeVersion": 1.4
    }
  ],
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Analyze Product Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Email": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Content": {
      "main": [
        [
          {
            "node": "Upload to Dropbox",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prepare Email Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload to Dropbox": {
      "main": [
        [
          {
            "node": "Prepare Email Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Email Data": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Image Analysis": {
      "main": [
        [
          {
            "node": "Generate Product Description",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Instagram Content",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Pinterest Content",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Facebook Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Product Image": {
      "main": [
        [
          {
            "node": "Store Image Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Facebook Content": {
      "main": [
        [
          {
            "node": "Aggregate Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Instagram Content": {
      "main": [
        [
          {
            "node": "Aggregate Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Pinterest Content": {
      "main": [
        [
          {
            "node": "Aggregate Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Product Description": {
      "main": [
        [
          {
            "node": "Aggregate Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}