Back to Alchemy
Alchemy RecipeIntermediateautomation

Fashion brand weekly content calendar from mood boards to scheduled posts

25 March 2026

Introduction

Fashion brands live in a relentless cycle. You shoot mood boards on Monday, sketch concepts, refine them, write captions, design graphics, and somehow have everything scheduled by Friday. Most teams do this manually: downloading files, opening multiple tabs, copying content between tools, approving at every stage. By the time a post goes live, you've touched it fifteen times across five different applications.

This workflow kills momentum. Creative teams spend more time moving files around than actually creating. The approval chain breaks down when stakeholders are working across disconnected tools. Worst of all, posting schedules slip because there's no clear handoff between mood board creation and final publication.

What if your mood boards automatically generated sketch concepts, those concepts became social-ready graphics, captions wrote themselves, and everything landed in your social calendar pre-scheduled? That's not magic; that's just API calls and a sensible automation layer. This guide shows you how to build that pipeline using Mirra for mood board creation, nSketch AI for visual generation, and SocialBu for scheduling, all orchestrated through a single workflow.

The Automated Workflow

We'll construct this workflow using n8n as the orchestration platform. n8n sits between your tools and handles the data flow without manual intervention. Zapier and Make work too, but n8n gives you finer control over error handling and is more cost-effective at scale.

Architecture Overview

The workflow follows this sequence:

  1. You upload or create a mood board in Mirra
  2. nSketch AI receives the mood board details and generates sketch concepts
  3. Generated sketches feed into SocialBu as draft posts
  4. SocialBu schedules them automatically across your connected social accounts
  5. n8n logs everything and sends you a summary

Step 1:

Trigger on Mirra Mood Board Creation

Mirra doesn't have native webhooks, so we'll use polling. n8n checks the Mirra API every 15 minutes for new mood boards. Set up an n8n HTTP request node configured as follows:


GET https://api.mirra.ai/v1/boards?created_after={{$items[0].last_check_timestamp}}&limit=10
Headers:
  Authorization: Bearer YOUR_MIRRA_API_KEY
  Accept: application/json

In your n8n workflow, add an HTTP Request node with these settings:


Method: GET
URL: https://api.mirra.ai/v1/boards
Authentication: Generic Credential Type
Add query parameter: created_after
Add query parameter: limit = 10

Parse the response to extract mood board metadata: title, description, colour palette, and image URLs. nSketch AI needs this context to generate appropriate sketches.

Step 2:

Extract Mood Board Data

Use an Item Lists node in n8n to map the Mirra response. You need:

  • board_id: Unique identifier from Mirra
  • board_title: Name of the mood board
  • description: Creative brief text
  • primary_colours: Array of hex codes
  • image_urls: Array of board image URLs (usually 3-5 images)

Set up a mapping like this:

{
  "board_id": "{{ $json.id }}",
  "board_title": "{{ $json.name }}",
  "description": "{{ $json.brief }}",
  "primary_colours": "{{ $json.palette }}",
  "image_urls": "{{ $json.assets }}"
}

This standardises the Mirra data before it moves to nSketch AI.

Step 3:

Generate Sketches with nSketch AI

nSketch AI accepts a mood board description and generates multiple sketch variations. Its API endpoint is:


POST https://api.nsketch.ai/v2/generate

Configure your n8n node:


Method: POST
URL: https://api.nsketch.ai/v2/generate
Body (raw JSON):
{
  "brief": "{{ $json.description }}",
  "style_palette": {{ $json.primary_colours }},
  "variations": 3,
  "format": "png",
  "resolution": "1080x1350"
}
Headers:
  Authorization: Bearer YOUR_NSKETCH_API_KEY
  Content-Type: application/json

nSketch AI returns three sketch variations as PNG files. Store the URLs returned in the response. This takes 60-90 seconds per request, so set your HTTP timeout to 120 seconds in n8n node settings.

The response looks like:

{
  "request_id": "sketch_1234567890",
  "status": "completed",
  "sketches": [
    {
      "variation": 1,
      "url": "https://cdn.nsketch.ai/outputs/sketch_001.png",
      "prompt_used": "Modern minimal fashion with earthy tones"
    },
    {
      "variation": 2,
      "url": "https://cdn.nsketch.ai/outputs/sketch_002.png",
      "prompt_used": "Contemporary design with geometric elements"
    },
    {
      "variation": 3,
      "url": "https://cdn.nsketch.ai/outputs/sketch_003.png",
      "prompt_used": "Fashion-forward interpretation with bold accents"
    }
  ]
}

Store these URLs in a variable for the next step. Use the Set node in n8n to create a variable called sketch_urls.

Step 4:

Generate Captions with Claude

Before sending to SocialBu, you want smart social captions tied to your mood board and sketches. Use the Anthropic node in n8n (Claude API):


POST https://api.anthropic.com/v1/messages
Method: POST
Headers:
  x-api-key: YOUR_CLAUDE_API_KEY
  anthropic-version: 2023-06-01
Body:
{
  "model": "claude-3-5-sonnet-20241022",
  "max_tokens": 500,
  "messages": [
    {
      "role": "user",
      "content": "Create three Instagram captions for a fashion brand post inspired by this mood board: {{$json.description}}. The mood board features colours {{$json.primary_colours}}. Make them engaging, include 2-3 relevant hashtags, and keep each under 150 characters. Format as JSON array with keys: caption_1, caption_2, caption_3."
    }
  ]
}

Claude returns captions tailored to your mood board. Extract them:

{
  "caption_1": "Minimalist elegance meets modern geometry...",
  "caption_2": "Where earthy tones tell a story...",
  "caption_3": "New season, new perspective..."
}

Step 5:

Create Drafts in SocialBu

SocialBu's API endpoint for creating posts is:


POST https://api.socialbu.com/v1/posts/create

For each sketch variation and corresponding caption, create a draft:


Method: POST
URL: https://api.socialbu.com/v1/posts/create
Body (raw JSON):
{
  "content": {
    "text": "{{ $json.caption_text }}",
    "media": [
      {
        "type": "image",
        "url": "{{ $json.sketch_url }}"
      }
    ]
  },
  "scheduling": {
    "auto_schedule": true,
    "optimal_time": true
  },
  "accounts": ["instagram", "tiktok"],
  "status": "draft"
}
Headers:
  Authorization: Bearer YOUR_SOCIALBU_API_KEY
  Content-Type: application/json

Keep posts as drafts initially. This lets your creative team review before publication. SocialBu returns a post ID:

{
  "post_id": "post_67890",
  "status": "draft",
  "created_at": "2024-01-15T14:32:00Z",
  "scheduled_for": ["2024-01-18T09:00:00Z"]
}

Step 6:

Schedule Publications

Once drafts are approved (you can automate this with approval webhooks or do it manually in SocialBu), publish them on an optimal schedule. Modify the SocialBu call to use "status": "scheduled" and specify publish times:

{
  "scheduling": {
    "publish_at": "2024-01-18T09:00:00Z"
  }
}

SocialBu's algorithm suggests optimal posting times based on your audience engagement history. Use this by setting "optimal_time": true and letting it calculate automatically.

Step 7:

Logging and Notifications

Add a final Send Email node in n8n to summarise what happened:


Method: Send Email
To: your_email@brand.com
Subject: Fashion Content Workflow Complete: {{$json.board_title}}
Body:
Generated {{sketch_count}} sketches from mood board "{{$json.board_title}}"
Sketches: {{$json.sketch_urls}}
Posts created: {{$json.post_count}}
Scheduled for: {{$json.scheduled_dates}}

Also log everything to a Google Sheets node for archive and reporting:


Action: Append Row
Spreadsheet: Content Workflow Log
Sheet: Main
Values:
  Date: {{ now() }}
  Mood Board ID: {{ $json.board_id }}
  Mood Board Title: {{ $json.board_title }}
  Sketch Count: {{ $json.sketch_count }}
  Posts Created: {{ $json.post_count }}
  Status: {{ $json.workflow_status }}

This creates an audit trail of everything generated.

Complete n8n Workflow JSON

Here's a simplified overview of how your n8n workflow orchestrates this:

{
  "nodes": [
    {
      "name": "Trigger - Check Mirra API",
      "type": "n8n-nodes-base.http",
      "typeVersion": 4,
      "position": [250, 300],
      "parameters": {
        "method": "GET",
        "url": "https://api.mirra.ai/v1/boards?created_after={{$items[0].last_check}}",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpBasicAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{ $secrets.MIRRA_API_KEY }}"
            }
          ]
        }
      }
    },
    {
      "name": "Map Mirra Response",
      "type": "n8n-nodes-base.itemLists",
      "typeVersion": 3,
      "position": [450, 300],
      "parameters": {
        "operation": "splitOutItems"
      }
    },
    {
      "name": "Call nSketch AI",
      "type": "n8n-nodes-base.http",
      "typeVersion": 4,
      "position": [650, 300],
      "parameters": {
        "method": "POST",
        "url": "https://api.nsketch.ai/v2/generate",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "brief",
              "value": "={{ $json.description }}"
            },
            {
              "name": "variations",
              "value": "=3"
            },
            {
              "name": "format",
              "value": "=png"
            }
          ]
        }
      }
    },
    {
      "name": "Generate Captions - Claude",
      "type": "n8n-nodes-base.anthropic",
      "typeVersion": 1,
      "position": [850, 300],
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "maxTokens": 500,
        "messages": "={{ [{role: 'user', content: 'Create three Instagram captions for fashion brand post inspired by mood board: ' + $json.description}] }}"
      }
    },
    {
      "name": "Create SocialBu Drafts",
      "type": "n8n-nodes-base.http",
      "typeVersion": 4,
      "position": [1050, 300],
      "parameters": {
        "method": "POST",
        "url": "https://api.socialbu.com/v1/posts/create",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "content",
              "value": "={{ {text: $json.caption, media: [{type: 'image', url: $json.sketch_url}]} }}"
            },
            {
              "name": "status",
              "value": "=draft"
            }
          ]
        }
      }
    },
    {
      "name": "Log to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [1250, 300],
      "parameters": {
        "operation": "append",
        "spreadsheetId": "YOUR_SHEET_ID",
        "range": "Main!A:H",
        "values": "={{ [now(), $json.board_id, $json.board_title, $json.sketch_count, $json.post_count, 'success'] }}"
      }
    },
    {
      "name": "Send Summary Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [1450, 300],
      "parameters": {
        "toEmail": "team@fashion-brand.com",
        "subject": "Content Workflow Complete: {{ $json.board_title }}",
        "textContent": "Generated {{ $json.sketch_count }} sketches and created {{ $json.post_count }} social posts"
      }
    }
  ],
  "connections": {
    "Trigger - Check Mirra API": {
      "main": [["Map Mirra Response"]]
    },
    "Map Mirra Response": {
      "main": [["Call nSketch AI"]]
    },
    "Call nSketch AI": {
      "main": [["Generate Captions - Claude"]]
    },
    "Generate Captions - Claude": {
      "main": [["Create SocialBu Drafts"]]
    },
    "Create SocialBu Drafts": {
      "main": [["Log to Google Sheets"]]
    },
    "Log to Google Sheets": {
      "main": [["Send Summary Email"]]
    }
  }
}

Deploy this on n8n Cloud or self-hosted. Set the trigger to run every 15 minutes, and it will pick up new mood boards automatically.

The Manual Alternative

You don't need full automation. Some brands prefer human oversight at specific gates. Here's a hybrid approach:

  1. Let nSketch AI generate sketches automatically.
  2. Have your creative director approve sketches manually in nSketch AI's interface.
  3. Only approved sketches proceed to caption generation and SocialBu.
  4. A designer optionally tweaks captions in SocialBu's editor.
  5. Final publish requires one click in SocialBu.

To implement this hybrid workflow in n8n, add a Wait node after sketch generation that pauses until a webhook is triggered. Your design tool or a simple approval form (Google Form integrated via Zapier) can fire that webhook once approved. This keeps humans in the loop for quality control without breaking the automation chain.

Pro Tips

1. Handle Rate Limits Gracefully

nSketch AI enforces 10 requests per minute. If you're generating sketches for multiple mood boards simultaneously, you'll hit that limit. In n8n, add a Delay node between sketch requests set to 6 seconds:


Node Type: Delay
Wait Time: 6
Unit: seconds

Also implement exponential backoff for failed requests. Use n8n's native retry logic:


Retry on failure: enabled
Max retries: 3
Backoff type: exponential
Initial delay: 1000ms
Max delay: 30000ms

SocialBu allows 100 posts per hour, so you won't hit their limit unless you're a massive operation.

2. Cost Optimisation: Sketch Variations

Generating three sketch variations per mood board multiplies API costs. If your budget is tight, request only one variation initially, then generate alternatives only for top-performing designs. Track engagement in SocialBu and use a second n8n workflow that re-generates variants for posts with high saves or comments.

3. Error Handling and Fallbacks

nSketch AI occasionally times out or returns low-quality results. Add conditional logic in n8n:


If sketch generation fails:
  1. Retry once after 30 seconds
  2. If retry fails, use a fallback template (pre-approved design)
  3. Alert the creative team via Slack
  4. Continue workflow with fallback so posts still publish

Configure this with n8n's IF node checking the response status.

4. Timezone Awareness for Scheduling

SocialBu's scheduling works best when you respect your audience's timezones. If you operate across regions, set up separate SocialBu accounts or use channel-level scheduling. In n8n, calculate optimal times based on account timezone:

// Add this in a Function node
const timezone = $json.account_timezone; // e.g., "Europe/London"
const now = new Date();
const tomorrow9am = new Date(now);
tomorrow9am.setDate(tomorrow9am.getDate() + 1);
tomorrow9am.setHours(9, 0, 0);

// Convert to account timezone
const scheduledTime = new Intl.DateTimeFormat('en-CA', {
  timeZone: timezone,
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit'
}).format(tomorrow9am);

return { scheduled_for: scheduledTime };

5. Monitor Costs with Google Sheets

Create a separate Google Sheet to log API costs:


Date | Tool | Request Type | Status | Cost
2024-01-15 | nSketch AI | sketch_generation | success | $0.08
2024-01-15 | Claude | caption_generation | success | $0.02
2024-01-15 | SocialBu | post_creation | success | $0.00

Total your daily spend and set up a Google Sheets alert that notifies you if daily costs exceed your budget. This prevents surprise bills as your workflow scales.

Cost Breakdown

ToolPlan NeededMonthly CostNotes
MirraPro£79Mood board creation; unlimited boards
nSketch AICreator£391,000 sketches per month; additional at £0.08 per sketch
Claude APIPay-as-you-go~£5-15Caption generation; 3 requests per mood board cycle
SocialBuTeam£99Unlimited posts; 5 connected accounts
n8nCloud Pro£40Automation host; 10,000 executions per month included
Total£262-272Supports 100-150 mood board cycles monthly

At scale (500+ posts per month), costs per post drop to roughly £0.40-0.50 including all tools. Manual content creation typically costs £5-10 per post when accounting for designer and social manager time.

This workflow eliminates that handoff tax. Your creative team stays in flow, ideas move from inspiration to publication in hours instead of days, and you keep an audit trail of everything created. Start with a single mood board to test the workflow, refine error handling, then scale to your full production cycle.