SudoMock
Mockups
DocsPricing
Request a demo
Get Started

Start rendering mockups in minutes

From PSD to product mockup in one API call.

Get Free API Key→Browse Templates
Public status pagePublished API pricingProduct mockup API500 one-time API credits

Site Navigation

SudoMock

Turn reusable PSD templates, artwork, and editable text into production-ready product images through REST API, no-code workflows, native storefront apps, or AI.

SudoMock is a registered DBA
1209 Mountain Rd Pl NE, Ste N
Albuquerque, NM 87110, USA

Product

  • Pricing
  • Dashboard
  • PSD Mockups
  • Changelog
  • Start Free

Developers

  • API Overview
  • MCP Server
  • Quick Start
  • Render API
  • Upload PSD
  • Authentication
  • Error Handling
  • PSD Preparation
  • Integrations

Mockups & Tools

  • All Mockups
  • Apparel Mockups
  • Drinkware Mockups
  • Wall Art Mockups
  • Home & Living
  • By Platform
  • Search Mockups
  • Background Remover
  • Free Tools

Resources

  • All Use Cases
  • T-Shirt Mockup Generator for Print on Demand
  • Tote Bag Mockup Generator for Sustainable Brands
  • Automate Mug at Scale with SudoMock
  • Blog
  • Roadmap
  • All Alternatives
  • vs Placeit
  • vs DynamicMockups
  • vs Adobe Photoshop API
  • vs Static Mockup Generators
  • vs AI Image Editors

Company

  • About
  • Contact
  • Brand Assets
  • System Status (opens in new tab)
  • Feature Requests (opens in new tab)
Blog

Latest Articles

View all →
  • 01Make.com Mockup Scenario: Render Each New Google Sheets Row on Your Own PSD or Product Photo
  • 02Virtual Samples for Promotional Products: One Client Logo on Every Quote Line
  • 03Packaging Mockups for Every SKU: One Bag Photo, One Label per Flavor
  • 04Photoshop Variables and Data Sets for Mockups, Run by API

© 2026 SudoMock. All rights reserved.

PrivacyTermsRefundsCookies[email protected]
  1. Blog
  2. /
  3. Tutorial

Make.com Mockup Scenario: Render Each New Google Sheets Row on Your Own PSD or Product Photo

A Make scenario renders a mockup for each new Google Sheets row with three modules: Watch New Rows, SudoMock Render a mockup with the row's template and design link mapped in, and Update a Row to write the image link back. Rows on a product photo use Render a photo mockup instead.

Published Oct 31, 2026·9 min read·Beck

Make scenario of Watch New Rows, Render a mockup and Update a Row beside a sheet whose rows 2 to 5 got mockup links, and four SudoMock renders: a tee and a mug with a sunset badge, a framed botanical print, and a canvas tote with a mushroom badge rendered with Render a photo mockup

Key takeaways

  • Template and smart object UUIDs in the sheet let one module render every product you sell.
  • Set Fit on purpose: Fit keeps the design whole, Fill stretches it to the smart object.
  • A Skip error handler keeps one broken design link from stopping the rows behind it.

On this page

  • One row, one mockup
  • Set up the sheet
  • Module 1: Watch New Rows
  • Module 2: Render a mockup
  • Module 3: Update a Row
  • Rows that use a product photo
  • When a row fails
  • Next step
  • Frequently asked questions
  • Sources

One row, one mockup

One row is one mockup, so a sheet holds exactly the products a customer picked. That answers a question a printing company put on the Adobe community on 16 January 2025: "Out of a total list of 10 items the customer wants to see mockups for items 1, 4, 5 and 7 and only those items." With this scenario those four items are four rows, and nothing else is rendered.

Set up the sheet

Give the sheet a header row and one row per mockup: which template, which design, and an empty cell for the result. The template and its smart object are named by UUID, so a single SudoMock module can render a tee on one row and a framed print on the next.

ColumnWhat goes in itExample
productYour own label for the rowT-shirt
mockup_uuidThe template's UUID in your SudoMock accounte532c503-fe20-4653-a301-af9f7a934609
smart_object_uuidThe UUID of the smart object that takes the design39865245-8d99-42e9-b1fc-3713fa4dbc94
design_urlA public link that returns the design file itself (PNG, JPEG or WebP)https://cdn.example.com/designs/sunset-waves.png
mockup_urlLeft empty; the scenario fills it

Run the SudoMock Search mockups module once to read both UUIDs: it lists your templates with their smart objects, and Get mockup details does the same for one template. Without a PSD of your own, open a template in the library, such as the t-shirt mockups, the mug mockups or a framed print, and press Use This Mockup: it lands in your account with the same kind of UUIDs. The PSD upload guide covers your own files.

Keep the rows together. Make's Google Sheets documentation says of Watch New Rows (read 31 October 2026): "If a sheet contains a blank row, Make doesn't process all subsequent rows."

Module 1: Watch New Rows

Watch New Rows starts each run with the rows added since the last one. Point it at the spreadsheet and the sheet, and set Table contains headers to Yes so the next modules see mockup_uuid and design_url by name instead of column letters.

FieldValue
ConnectionYour Google account
Spreadsheet IDThe sheet that holds the rows
Sheet NameThe tab with the rows
Table contains headersYes
LimitHow many rows one run takes

When Make opens the Choose where to start window, select All: per Make's setup guide, the module then processes the rows already in the sheet first and the rows added later after them. The scenario runs on the schedule you give it in Make, and each run passes every new row through modules 2 and 3 one after another.

Module 2: Render a mockup

Render a mockup sends the row to SudoMock and returns the finished image link. Map the three columns into the module and set Fit on purpose, because the right value depends on the design's shape.

FieldValue
ConnectionSudoMock, with an API key from API Keys
MockupMap mockup_uuid from module 1
Smart objects, Smart objectMap smart_object_uuid from module 1
Smart objects, Asset, Asset URLMap design_url from module 1
Smart objects, Asset, FitFit for a design of any shape; Fill only when the design already has the smart object's proportions
Export options, Image formatWebP, PNG or JPG
Export options, Image size1024
Export options, Export labelType row- and map Row number from module 1

Export options are advanced fields: switch on Advanced settings in the module to see them. The connection asks for the key once, checks it against your account and shows its email, and every SudoMock module reads that one connection, so one key serves every scenario in your Make team. Fit keeps the whole design visible inside the smart object, while Fill stretches it to the smart object's edges, which suits a print file made at that exact shape. The export label starts the file name, so row-2 in the name tells you which row an image came from.

The module sends one render request. This is the same request for row 2 as an API call, with your key and your UUIDs in place of ours:

curl -X POST https://api.sudomock.com/api/v1/renders \
-H "x-api-key: $SUDOMOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mockup_uuid": "e532c503-fe20-4653-a301-af9f7a934609",
"smart_objects": [
{
"uuid": "39865245-8d99-42e9-b1fc-3713fa4dbc94",
"asset": { "url": "https://cdn.example.com/designs/sunset-waves.png", "fit": "fit" }
}
],
"export_options": { "image_format": "webp", "image_size": 1024 },
"export_label": "row-2"
}'
const response = await fetch('https://api.sudomock.com/api/v1/renders', {
method: 'POST',
headers: {
'x-api-key': process.env.SUDOMOCK_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"mockup_uuid": "e532c503-fe20-4653-a301-af9f7a934609",
"smart_objects": [
{
"uuid": "39865245-8d99-42e9-b1fc-3713fa4dbc94",
"asset": {
"url": "https://cdn.example.com/designs/sunset-waves.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "webp",
"image_size": 1024
},
"export_label": "row-2"
}),
});
const data = await response.json();
console.log(data);
import os
import requests
response = requests.post(
"https://api.sudomock.com/api/v1/renders",
headers={
"x-api-key": os.environ["SUDOMOCK_API_KEY"],
"Content-Type": "application/json",
},
json={
"mockup_uuid": "e532c503-fe20-4653-a301-af9f7a934609",
"smart_objects": [
{
"uuid": "39865245-8d99-42e9-b1fc-3713fa4dbc94",
"asset": {
"url": "https://cdn.example.com/designs/sunset-waves.png",
"fit": "fit",
},
},
],
"export_options": {
"image_format": "webp",
"image_size": 1024,
},
"export_label": "row-2",
},
)
print(response.json())
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
payload := []byte(`{
"mockup_uuid": "e532c503-fe20-4653-a301-af9f7a934609",
"smart_objects": [
{
"uuid": "39865245-8d99-42e9-b1fc-3713fa4dbc94",
"asset": {
"url": "https://cdn.example.com/designs/sunset-waves.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "webp",
"image_size": 1024
},
"export_label": "row-2"
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/renders", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", os.Getenv("SUDOMOCK_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
<?php
$payload = <<<'JSON'
{
"mockup_uuid": "e532c503-fe20-4653-a301-af9f7a934609",
"smart_objects": [
{
"uuid": "39865245-8d99-42e9-b1fc-3713fa4dbc94",
"asset": {
"url": "https://cdn.example.com/designs/sunset-waves.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "webp",
"image_size": 1024
},
"export_label": "row-2"
}
JSON;
$ch = curl_init('https://api.sudomock.com/api/v1/renders');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . getenv('SUDOMOCK_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

The image link comes back at data.print_files[0].export_path, and the module puts it on its output as Rendered image URL. On 31 October 2026 we sent rows 2 to 4 this way: the sunset badge on a t-shirt template and on a mug template with Fit, and a botanical print made at 2:3 in a 2:3 framed print template with Fill. Each came back as a WebP named after its row. The average SudoMock render finishes in under a second.

White t-shirt on a model in a cafe, rendered by SudoMock with a round sunset badge of orange, teal and navy waves under a yellow sun centered on the chestRow 2: the sunset badge on a t-shirt template, Fit.

White ceramic mug on a wooden table, rendered by SudoMock with the same round sunset badge on the side facing the cameraRow 3: the same design link on a mug template.

Wooden frame leaning on a stone shelf, rendered by SudoMock with a deep blue botanical print of coral and white leaves under a yellow star filling the frameRow 4: a 2:3 print in a 2:3 framed print template, Fill.

Module 3: Update a Row

Update a Row writes the image link back into the row that asked for it. Map Row number from Watch New Rows so the link lands in the right row, and put Rendered image URL in the mockup_url column.

FieldValue
Spreadsheet ID and Sheet NameThe same sheet as module 1
Row numberMap Row number from module 1
Table contains headersYes
mockup_urlMap Rendered image URL from module 2

To keep the image file as well as the link, add the SudoMock Download a render module after module 2 with Render URL set to Rendered image URL. It returns the image as a file, which a Google Drive or Dropbox upload module stores in a folder of your choice.

Rows that use a product photo

A product with no PSD renders from a photo of the product saved as a photo mockup. Swap module 2 for Render a photo mockup, keep a photo_mockup_uuid and a print_area_uuid column in the sheet, and the rest of the scenario stays as it is. To keep PSD rows and photo rows in one sheet, add a Router after Watch New Rows with a filter on each route: rows with a photo_mockup_uuid go to Render a photo mockup, the others to Render a mockup, and each route ends in its own Update a Row.

FieldValue
Photo mockup UUIDMap photo_mockup_uuid from module 1
Render targets, Saved print area UUIDMap print_area_uuid from module 1
Render targets, Artwork URLMap design_url from module 1
Render targets, Placement, FitFit
Export options, Image size1024

The finished link is the Export path of the first entry in Print files, which goes into Update a Row the same way. You save a product photo as a photo mockup once, in the dashboard or with the Create a mockup from a photo module, and every later row reuses it; photo mockups shows how a print area is set. Get a photo mockup returns both values for the sheet: the Photo mockup ID, and the Print area ID of each area under Quads. For a bag, a ready tote bag template works too.

Natural canvas tote bag on a light grey background, rendered by SudoMock with a dark green round badge of three red and orange mushrooms under a moon on the front panelRow 5: Render a photo mockup placed the badge in the tote's saved Front area. The tote photo came from an image model; Photo Mockups kept the exact design on it.

When a row fails

A row whose design link does not open stops the run at the SudoMock module, and the rows behind it in that run are not rendered. Add an error handler to the SudoMock module so a bad row is skipped and the others still render.

When we sent a row whose design link returned a 404, SudoMock answered 422 with the code ASSET_UNREACHABLE and the message "The artwork could not be downloaded.", and the Make module shows it as [422] One or more artwork inputs are invalid. The link has to return the image file itself to anyone who opens it, so a share page or a link that needs a login fails the same way. In Make, open the context menu of the SudoMock module, choose Add error handler and pick Skip: per Make's help, it "skips the error or the failed bundle from the scenario flow" and the run "continues with the next bundle." The skipped row keeps an empty mockup_url, which shows you which rows to fix. Watch New Rows does not fetch a row it has already processed, so paste the fixed row as a new row at the end of the sheet and the next run renders it.

Next step

Build the three modules on a sheet with two rows, one template you already have and one design link, and run the scenario once with Run once. The Make integration page lists every module of the app, the render reference lists every field Render a mockup can send, and fit and blend modes shows the three fit values side by side. The SudoMock app is also listed on Make's integrations page. If your automations run on n8n, the SudoMock node for n8n renders the same rows.

Frequently asked questions

Is there a SudoMock app on Make?

Yes. Search for SudoMock in the module picker of any Make scenario and connect it with an API key from your SudoMock dashboard. The app renders PSD templates and photo mockups, renders short videos, downloads renders as files and can start a scenario when a job finishes.

How do I make mockups from a Google Sheet automatically?

Build a Make scenario with Google Sheets Watch New Rows, SudoMock Render a mockup and Google Sheets Update a Row. Each row names a template and a design link, the render module turns them into a finished mockup, and the image link is written back into the row.

Can one Make scenario render mockups for different products?

Yes. Put each template's mockup UUID and smart object UUID in the row and map both into Render a mockup instead of picking them from the list. A t-shirt row and a framed print row then run through the same module.

Do I need a PSD template to render mockups in Make?

No. You can add a ready template from the SudoMock template library to your account, or save a product photo as a photo mockup and render it with the Render a photo mockup module. Both are named by UUID in the sheet, the same way as a PSD template.

Why does a row fail with a 422 error in Make?

The design link in that row did not return an image file, so SudoMock could not download the artwork. Use a public link that opens the file itself in a private browser window. A Skip error handler on the SudoMock module lets the other rows render, and the fixed row renders once you add it again at the end of the sheet.

Sources

  1. Render mockups with Make and SudoMock (opens in new tab), SudoMock Docs
  2. Render a PSD mockup (opens in new tab), SudoMock Docs
  3. Fit and blend modes (opens in new tab), SudoMock Docs
  4. Photo mockups (opens in new tab), SudoMock Docs
  5. Google Sheets modules (opens in new tab), Make
  6. Skip error handler (opens in new tab), Make Help Center
  7. SudoMock integration | Workflow automation | Make (opens in new tab), Make
  8. Auto Populate Multiple Product Mockups From Google Sheet Data (opens in new tab), Adobe Community
  9. Step 5. Set up the trigger (opens in new tab), Make Help Center
B

Beck

CTO

View all posts

On this page

  • One row, one mockup
  • Set up the sheet
  • Module 1: Watch New Rows
  • Module 2: Render a mockup
  • Module 3: Update a Row
  • Rows that use a product photo
  • When a row fails
  • Next step
  • Frequently asked questions
  • Sources

Related articles

A render request for quote line 3 next to three virtual samples SudoMock rendered with one client logo: an 11 oz white mug, a natural canvas tote and a 20 oz tumbler recolored navy with the white logo
Tutorial

Virtual Samples for Promotional Products: One Client Logo on Every Quote Line

One client logo, one saved imprint area per supplier product and one render request per quote line, with real renders on a mug, a tote and a tumbler.

Oct 30, 2026 · 6 min read

n8n workflow where a new design file triggers POST /api/v1/renders and returns t-shirt, mug and framed poster mockups
Tutorial

Building a Print-on-Demand Pipeline with n8n

Build an automated print-on-demand pipeline with n8n and SudoMock API. Step-by-step guide from design upload to Etsy/Shopify listing creation from $0.002 per render.

Nov 28, 2025 · 2 min read

A plain canvas tote product photo turned into a mockup with POST /api/v1/photo-mockups, with mushroom, sunset and botanical designs rendered on the same bag
Tutorial

How to Make Your Own Mockup from Any Product Photo

One photo of your own product becomes a reusable mockup: the create call, the render call and real renders of four designs on a canvas tote.

Oct 2, 2026 · 7 min read

Explore by use case

See SudoMock in action for your specific product category

Print on Demand Mockup Automation for POD SellersAutomate Shopify Product Mockups at ScaleBulk Mockup Generation API for Enterprise ScaleT-Shirt Mockup Generator API for Print on DemandEtsy Mockup Generator API for Handmade Marketplace SellersAutomate Mug Mockups at Scale with SudoMock API

Your own PSD, rendered via API

Render your own PSD through the API. Start with 500 one-time credits, no card.

Start Free View Docs

Render your own PSD via API with 500 one-time credits.

Start Free · 500 credits, no card