Introduction
Interior designers often find themselves trapped in a tedious cycle: generate concept images in one tool, manually download them, switch to another application, upload the files, arrange them into a presentation, add notes, and send it off to the client. Each handoff is a friction point where things go wrong. Files get mislabelled. Versions diverge. Hours disappear.
The fundamental issue is that most design tools operate in isolation. They do one job well but don't talk to each other. A designer working with a client in 2024 shouldn't need to spend thirty minutes moving files around just to show three concept variations and a mood board. That's where automation changes the game.
This workflow combines Cactus Interior AI (which generates concept images from room descriptions and style preferences) with Preswald AI (which turns those images into polished, client-ready presentations). Orchestrated properly, you can go from a client brief to a finished presentation with zero manual work in between.
The Automated Workflow
Why This Approach Works
The workflow requires minimal setup because both tools have straightforward APIs and your orchestration layer handles all the glue work. You define the flow once, and every subsequent brief follows the same path automatically. For a designer handling multiple clients weekly, this typically saves between three and four hours per project.
Choosing Your Orchestration Tool
For this particular workflow, I'd recommend Zapier if you want the simplest possible setup with the least technical knowledge required. Zapier has native integrations for both tools and a visual builder that requires no coding.
If you're comfortable with JSON and want more control, n8n gives you better visibility into what's happening at each step. It runs on your own infrastructure or can be self-hosted, which some design studios prefer.
Make (Integromat) sits somewhere in the middle; it's more powerful than Zapier but friendlier than n8n for non-developers.
Claude Code is overkill here unless you're building a complete design system that needs custom logic; it adds unnecessary complexity for this straightforward workflow.
For this guide, I'll walk through the Zapier approach as the recommended path.
The Step-By-Step Flow
Your automation should work like this:
- Client submits a brief (via a form, email, or webhook).
- The orchestration tool sends the brief details to Cactus Interior AI.
- Cactus generates concept images based on style, room type, and colour preferences.
- Those images are collected and passed to Preswald AI.
- Preswald arranges them into a presentation template with client details and project notes.
- The finished presentation is delivered (via email, saved to a shared folder, or sent to a client portal).
Setting Up the Zapier Workflow
Step 1: Create the Trigger
Start in Zapier by creating a new Zap. Set the trigger to Google Forms or Typeform (whichever you use for client briefs). Alternatively, use a Zapier webhook if you want to trigger this manually or from another source.
Trigger: Typeform Response
Event: New Form Response
Form: Interior Design Brief Form
Your form should collect:
- Client name
- Room type (living room, bedroom, kitchen, etc.)
- Preferred style (modern, traditional, eclectic, minimalist, etc.)
- Colour palette (warm neutrals, cool tones, etc.)
- Room dimensions (optional but helpful for Cactus)
- Any specific requirements or inspiration
Step 2: Call Cactus Interior AI
Add an action in Zapier to make an HTTP POST request to the Cactus Interior AI API. You'll need your API key from Cactus.
POST https://api.cactus-interior.ai/v1/generate
Content-Type: application/json
Authorization: Bearer YOUR_CACTUS_API_KEY
{
"room_type": "{{triggerData.room_type}}",
"style": "{{triggerData.preferred_style}}",
"colours": ["{{triggerData.primary_colour}}", "{{triggerData.secondary_colour}}"],
"room_dimensions": "{{triggerData.dimensions}}",
"concept_count": 3,
"image_resolution": "1920x1440"
}
The API returns a JSON response with image URLs:
{
"status": "success",
"request_id": "req_abc123xyz",
"concepts": [
{
"id": "concept_001",
"url": "https://storage.cactus-interior.ai/concepts/abc123_1.png",
"style": "modern",
"description": "Contemporary design with neutral palette and geometric accents"
},
{
"id": "concept_002",
"url": "https://storage.cactus-interior.ai/concepts/abc123_2.png",
"style": "modern",
"description": "Warm minimalist approach with natural textures"
},
{
"id": "concept_003",
"url": "https://storage.cactus-interior.ai/concepts/abc123_3.png",
"style": "transitional",
"description": "Blend of modern and classic elements with layered lighting"
}
],
"expires_at": "2025-02-28T23:59:59Z"
}
Store these image URLs in Zapier by adding a "Set Variable" step. Call it "concept_images".
Step 3: Prepare Data for Preswald
Before sending to Preswald, you need to format the data correctly. Use a Zapier Code step (requires Zapier Premium) to prepare the payload.
const conceptImages = inputData.conceptImages; // from previous step
const clientName = inputData.clientName;
const projectType = inputData.roomType;
const presewaldPayload = {
title: `Interior Design Concepts - ${clientName}`,
client_name: clientName,
project_type: projectType,
slides: [
{
type: "title",
content: {
heading: `Design Concepts for ${clientName}`,
subheading: projectType.charAt(0).toUpperCase() + projectType.slice(1) + " Redesign",
date: new Date().toISOString().split('T')[0]
}
},
{
type: "content",
heading: "Concept 1",
body: conceptImages[0].description,
image: conceptImages[0].url
},
{
type: "content",
heading: "Concept 2",
body: conceptImages[1].description,
image: conceptImages[1].url
},
{
type: "content",
heading: "Concept 3",
body: conceptImages[2].description,
image: conceptImages[2].url
},
{
type: "content",
heading: "Next Steps",
body: "Please review these concepts and let us know which direction resonates with you. We can refine any of these directions further or create additional variations."
}
]
};
return presewaldPayload;
Step 4: Generate the Presentation in Preswald
Add another HTTP POST action to call Preswald AI:
POST https://api.preswald-ai.com/v1/presentations
Content-Type: application/json
Authorization: Bearer YOUR_PRESWALD_API_KEY
{
"title": "{{step3.title}}",
"client_name": "{{step3.client_name}}",
"project_type": "{{step3.project_type}}",
"slides": {{step3.slides}},
"theme": "professional",
"output_format": "pdf",
"include_branding": true,
"branding_logo_url": "https://yourdesignstudio.com/logo.png"
}
Preswald returns a response like this:
{
"status": "processing",
"presentation_id": "pres_xyz789",
"download_url": "https://presentations.preswald-ai.com/pres_xyz789/download",
"estimated_ready_at": "2025-02-20T14:32:00Z",
"webhook_url": "https://your-domain.com/webhook/preswald-complete"
}
Save the presentation_id and download_url to variables.
Step 5: Deliver the Presentation
You have several options for delivery:
Option A: Email Delivery
Use Zapier's built-in Gmail or SendGrid integration to email the presentation to the client:
To: {{triggerData.client_email}}
Subject: Your Interior Design Concepts - {{triggerData.client_name}}
Body: Dear {{triggerData.client_name}},
Please find attached your three interior design concepts. We're excited to share these directions with you.
Each concept reflects your style preferences and the overall vision we discussed. Please review at your convenience and let us know which direction resonates most strongly.
Best regards,
[Your Studio Name]
Attachment: {{step4.download_url}}
Option B: Save to Cloud Storage
If you use Google Drive or Dropbox, add an action to save the presentation file to a client folder:
Service: Google Drive
Action: Upload File
File Name: {{triggerData.client_name}}_Concepts_{{now.format("YYYY-MM-DD")}}
File Content URL: {{step4.download_url}}
Folder: /Client Projects/{{triggerData.client_name}}/
Option C: Post to a Client Portal
If you have a custom client portal or use a tool like Dropbox Sign or PandaDoc, use their API to create a shareable link:
POST https://api.yourclientportal.com/v1/projects/{{triggerData.project_id}}/presentations
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"title": "Design Concepts",
"file_url": "{{step4.download_url}}",
"client_email": "{{triggerData.client_email}}",
"share_permissions": "view_only"
}
Step 6: Log Everything
Add a final step to record what happened. Use Google Sheets or Airtable to create an audit trail:
Service: Google Sheets
Action: Add Spreadsheet Row
Spreadsheet: Design Workflow Log
Row:
- Client Name: {{triggerData.client_name}}
- Project Type: {{triggerData.room_type}}
- Brief Submitted: {{triggerData.timestamp}}
- Concepts Generated: {{step2.request_id}}
- Presentation ID: {{step4.presentation_id}}
- Status: Complete
- Presentation URL: {{step4.download_url}}
This log is invaluable for tracking projects and troubleshooting if something goes wrong.
Complete Zapier Configuration Summary
Your final Zap should have these steps in order:
- Typeform: New Form Response (trigger)
- Zapier Code: Format data for Cactus
- Webhooks: POST to Cactus Interior AI
- Zapier Code: Parse Cactus response and format for Preswald
- Webhooks: POST to Preswald AI
- Zapier Code: Wait for Preswald completion (optional; use polling)
- Gmail: Send email with presentation link
- Google Sheets: Log the workflow completion
Turn on the Zap, and you're done.
The Manual Alternative
Some designers prefer to retain manual checkpoints in the workflow. This is valid if you want to review each set of concepts before presentation generation or if you need to cherry-pick specific images.
Replace Step 2 in the above workflow with a manual review step:
- Cactus generates concepts.
- Zapier sends you a Slack notification with the concept images and a link to approve or reject.
- You click "Approve in Slack" (using a Zapier Action Block).
- Only then does the workflow proceed to Preswald.
This adds perhaps five minutes per project but gives you a quality gate. Use this approach if you're new to automation or if your design process truly benefits from human curation at each stage.
To implement this, use Zapier's "Slack" action with interactive buttons:
Service: Slack
Message:
"Concepts generated for {{client_name}}. Review below:
{{concept_image_1_url}}
{{concept_image_2_url}}
{{concept_image_3_url}}
Ready to proceed? [Approve] [Request Changes]"
Use this as a branching condition for the next step.
Pro Tips
Rate Limiting and Throttling
Both Cactus and Preswald have API rate limits. Cactus allows 10 requests per minute on the free tier; Preswald allows 5 presentations per hour. If you're handling high volume, you'll need the paid tiers. More importantly, add a deliberate delay between steps in Zapier to avoid hitting limits:
After Cactus API call, add a "Delay" step for 6 seconds.
After Preswald API call, add a "Delay" step for 10 seconds.
This is boring but essential for reliability.
Image Expiration
Cactus images expire after seven days. If you're not generating the presentation immediately, store the images yourself or implement a longer-term storage solution. Download images to your own server:
Use a Zapier Code step with node-fetch to download each image:
const fetch = require('node-fetch');
const fs = require('fs');
const imageUrl = inputData.imageUrl;
const clientName = inputData.clientName;
const response = await fetch(imageUrl);
const buffer = await response.buffer();
// Save to your storage (you'd need additional setup for S3, etc.)
// For now, just ensure you have a copy before 7 days pass
Alternatively, set a calendar reminder to generate presentations within 48 hours of brief submission.
Error Handling
Add catch steps in Zapier for when either API fails. Send yourself an alert and hold the workflow:
On Cactus API Error:
- Send Slack message: "Concept generation failed for {{client_name}}. Review manually."
- Pause workflow
- Notify via email
On Preswald API Error:
- Attempt retry after 30 seconds
- If retry fails, send alert and store raw data for manual recovery
Cost Optimization
Run batch workflows during off-peak hours if your plan offers discounted rates. If Cactus charges per API call, batch briefs together rather than triggering individual workflows. Set a daily batch window (e.g., 9 AM) and run all morning briefs together.
Fallback Presentation Template
If Preswald fails for any reason, have a backup: a pre-designed Google Slides or PowerPoint template that Zapier can populate automatically. Store the template in Google Drive and use the Google Slides API as a fallback:
POST https://slides.googleapis.com/v1/presentations/{{templateId}}/batchUpdate
Content-Type: application/json
Authorization: Bearer YOUR_GOOGLE_API_KEY
{
"requests": [
{
"replaceAllText": {
"containsText": {
"text": "{{CLIENT_NAME}}"
},
"replaceText": "{{triggerData.client_name}}"
}
}
]
}
This ensures you can always deliver something professional even if the primary workflow has issues.
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| Cactus Interior AI | Pro | £45 | Includes 500 concept generations; overages at £0.10 each |
| Preswald AI | Professional | £35 | Includes 100 presentations; overages at £0.50 each |
| Zapier | Premium | £20 | Required for Code steps and higher task limits |
| Google Sheets | Free | £0 | Free tier sufficient for logging |
| Gmail | Free | £0 | Free tier sufficient for email delivery |
| Total | £100 | For 500 projects annually |
Per-project cost: roughly £0.20, assuming moderate usage. If you're only handling five to ten projects monthly, Cactus and Preswald free tiers may suffice, bringing the total to just the £20 Zapier subscription.
The return on investment appears on your very first project when you realise you've saved three hours of manual work. Scale that to ten projects per month, and you're recovering £2,400 in labour annually at modest freelance rates.
Start with a 30-day trial of both design tools to confirm the output quality matches your standards before committing to paid plans. Some design studios find that Cactus output needs significant refinement; others use it directly. Test first.