RatioReady
n8n Automation

n8n + Ratio Ready: automate Etsy image processing

Drop a design file into a watched folder. n8n calls the Ratio Ready API, waits for processing, downloads print-ready assets, and creates a draft Etsy listing — no manual file prep required.

MA By Mac · 11 min read · · Updated

No free n8n workflow is provided

Ratio Ready's official automation is a free Make.com blueprint (digital downloads + poster POD). This guide is for developers already running n8n who want to integrate via the REST API. If you don't have a strong reason to use n8n, the Make.com blueprint gets you running in 30 minutes with no setup.

If you run n8n for your Etsy shop workflow, Ratio Ready's REST API slots in as an HTTP Request node. You POST a design image, poll for the batch to complete, download the output ZIP or individual files, and hand the results to an Etsy draft node. This guide walks the full workflow with specific node names, real endpoint paths, and example JSON so you can build it in one session.

What the n8n workflow does

The automation handles the file-prep stage that normally costs 15–30 minutes per design: uploading to the right dimensions, generating mockups, and filling in listing metadata. The n8n workflow links five stages:

Stage n8n node What happens
1 — Trigger Local File Trigger / Webhook New design file detected in a watched folder, or a webhook fires from your design tool
2 — Submit batch HTTP Request POST the image to /v1/batch/wallart or /v1/batch/clipart with your API key; get back a batchId
3 — Poll for completion Wait + HTTP Request (loop) GET /v1/batch/:id every 2 seconds until status === "completed"
4 — Download assets HTTP Request Download the ZIP from the presigned R2 URL, or fetch individual print/preview/mockup files
5 — Create Etsy draft Etsy node / HTTP Request Upload listing images from the batch result and create a draft listing using the generated title, description, and tags from the batch result

The wall art endpoint produces 5 print-ready crops (portrait and landscape ratios), mockup images, an optional listing video, and an optional Etsy listing PDF with pre-filled title, description, and tags. The clipart endpoint produces a transparent PNG at print resolution plus listing previews. Both return download URLs in the same polling response, so your download node reads directly from the batch status JSON.

Processing is asynchronous

The POST endpoints return 202 Accepted immediately with a batchId. Processing (upscaling, cropping, mockup compositing) happens in the background. Your workflow must poll /v1/batch/:id and wait for status: "completed" before accessing files.

Related guides: Etsy mockup generator, wall art converter, pricing.

Before you start

You need four things in place before building the workflow:

n8n instance

Self-hosted n8n (Docker or npm install) or n8n Cloud. The workflow uses core n8n nodes — HTTP Request, Wait, Code, and either the built-in Etsy node or a custom HTTP Request to the Etsy v3 API. No community plugins required.

Ratio Ready API key

Sign in to app.ratioready.com → Account → API to generate a pk_ prefixed key. Store it in n8n as an HTTP Header Auth credential (header: Authorization, value: Bearer pk_your_key_here). Never paste the key directly into node fields — use the credential reference.

Etsy developer account

Register an app at etsy.com/developers to get an API key and OAuth access token. The Etsy v3 API requires OAuth 2.0 with the listings_w scope to create draft listings and listings_d to attach digital files. n8n's built-in Etsy node handles the OAuth flow if you configure it; for the HTTP Request approach you need a pre-authorised Bearer token.

Design files accessible to n8n

For the Local File Trigger to work, files need to be on the same filesystem as your n8n instance (or a mounted volume in Docker). Alternatively, use a Webhook trigger from your design tool (Figma, Photoshop, Canva export) or a Google Drive / Dropbox trigger via the respective n8n nodes — read the file as binary data and pass it to the HTTP Request node.

Credits: Wall art costs 40 credits per image (includes 5 ratio crops, mockups, listing video, and PDF). Clipart costs from 10 credits per image. You start with 75 free credits on signup — enough to test the workflow on a few images before subscribing.

Build the n8n workflow

Add nodes in this order. The instructions below use wall art as the example; swap /v1/batch/wallart for /v1/batch/clipart if you are processing clipart.

Node 1 — Trigger

Local File Trigger (or Webhook)

Add a Local File Trigger node. Set Watch to the folder where you drop design files. Set Events to added. Enable Read File Content so the binary data flows into the next node automatically.

If your files arrive via webhook (e.g. a Zapier trigger or a custom export script), use a Webhook node instead and set Response Mode to Immediately. You'll need to read the binary file separately via an Read Binary File node if the webhook only passes a URL.

Node 2 — Submit batch

HTTP Request → POST /v1/batch/wallart

Add an HTTP Request node.

Method: POST

URL: https://api.ratioready.com/v1/batch/wallart

Authentication: Predefined Credential Type → Header Auth → (your stored credential)

Send Body: Form-Data

Field 1 — Name: images  Type: Binary  Value: data (the binary from node 1) — batch endpoints use the plural images field name, even for a single file

Field 2 — Name: payload  Type: String  Value: {"{"}"generateListing": true, "generateMockups": true{"}"}

The response will be 202 Accepted with a JSON body containing batchId. Add a Set node after this to extract {"{{ $json.batchId }}"} into a workflow variable you can reference in later nodes.

For clipart batches, change the URL to /v1/batch/clipart and the payload to {"{"}"printSize": 4096, "generatePreview": true{"}"}. Clipart accepts up to 50 files in the same images field — the same plural field name every /v1/batch/* endpoint uses.

Node 3 — Poll for completion

Wait → HTTP Request (GET /v1/batch/:id) → IF loop

Add a Wait node. Set Resume to After time interval, value 2 seconds. This is the polling interval — 2 seconds is a reasonable starting point for wall art (which takes 10–60 seconds depending on image size).

After the Wait node, add another HTTP Request node:

Method: GET

URL: {"https://api.ratioready.com/v1/batch/{{ $('Set').item.json.batchId }}"}

Authentication: same Header Auth credential

Add an IF node after the poll request. Set the condition: {"{{ $json.status }}"} equals completed. The false branch loops back to the Wait node. The true branch continues to the download node.

Add a loop guard

Add a Code node before the IF check to increment an attempt counter. After 60 attempts (2 minutes) throw an error or route to an error branch. Without this, a stuck batch will loop forever.

Node 4 — Download assets

HTTP Request → download ZIP or individual files

The GET /v1/batch/:id response includes a downloadUrl (the master ZIP) and per-file children[n].printUrl, previewUrl, and mockupUrls[]. These are presigned Cloudflare R2 URLs that expire after 24 hours.

For an Etsy workflow, you typically want the preview images (2048px listing-ready JPGs) and the print files (300 DPI master). Add an HTTP Request node for each file you need:

Method: GET

URL: {"{{ $json.children[0].previewUrl }}"}

Response Format: Binary

For the full ZIP, use the downloadUrl field instead. Use a Split In Batches node if you want to process each ratio file from a wall art batch separately.

Node 5 — Create Etsy draft

Etsy node (or HTTP Request to Etsy v3 API)

n8n has a built-in Etsy node. Use the Create Listing operation. Map the fields from the batch result:

title: {"{{ $('Poll Batch').item.json.children[0].etsyTitle }}"}

description: {"{{ $('Poll Batch').item.json.children[0].etsyDescription }}"}

tags: {"{{ $('Poll Batch').item.json.children[0].etsyTags }}"}

type: download

who_made: i_did

when_made: 2020_2024

quantity: 999

After creating the listing (which returns a listing_id), upload the listing images via a separate HTTP Request to POST /v3/application/shops/:shop_id/listings/:listing_id/images — the built-in Etsy node does not handle image uploads directly. Pass the binary mockup image as image in a multipart form body (Etsy's own field name here is singular image).

For digital download listings, you also need to upload the print file as a listing file using Etsy's POST /v3/application/listings/:listing_id/files endpoint.

API reference for n8n integrators

The endpoints your workflow uses, with example responses.

Authentication

All requests need a Bearer token in the Authorization header:

Authorization: Bearer pk_your_api_key_here

API keys start with pk_. Generate one at app.ratioready.com → Account → API. Store in n8n as an HTTP Header Auth credential, not a hardcoded node value.

POST /v1/batch/wallart

Submit a wall art batch. Accepts multipart/form-data: images (binary, plural field name) + payload (JSON string).

// 202 Accepted
{
  "batchId": "batch_a1b2c3d4e5",
  "status": "processing",
  "imageCount": 1,
  "creditsCharged": 40
}

Payload options: generateListing (bool), generateMockups (bool), generateVideo (bool), userSetId (mockup set ID from your account).

POST /v1/batch/clipart

Submit a clipart batch. Accepts up to 50 images in the images field (not image). Payload options: printSize (2048 or 4096), generatePreview (bool), outputFormat ("jpg" or "png").

// 202 Accepted
{
  "batchId": "batch_f6g7h8i9j0",
  "status": "processing",
  "imageCount": 5,
  "creditsCharged": 20
}

GET /v1/batch/:id

Poll batch status. Returns status + download URLs when complete.

// 200 OK — status: completed
{
  "batchId": "batch_a1b2c3d4e5",
  "status": "completed",
  "downloadUrl": "https://r2.ratioready.com/batches/...zip?X-Amz-...",
  "children": [
    {
      "index": 0,
      "status": "completed",
      "printUrl": "https://r2.ratioready.com/...",
      "previewUrl": "https://r2.ratioready.com/...",
      "mockupUrls": ["https://r2.ratioready.com/..."],
      "etsyTitle": "Botanical Wall Art Print | ...",
      "etsyDescription": "...",
      "etsyTags": ["wall art", "botanical print", "..."]
    }
  ],
  "completedAt": "2026-05-30T10:23:45.123Z"
}

Status flow: processingassemblingcompleted | completed_partial | failed. Poll until you see completed or completed_partial (partial means some images failed but others succeeded). Download URLs expire after 24 hours.

Error responses

All errors follow the same shape. Handle these in your n8n error branch:

// 401 Unauthorized
{ "error": { "code": "UNAUTHORIZED", "message": "Invalid API key" } }

// 402 Payment Required
{ "error": { "code": "INSUFFICIENT_CREDITS", "message": "Not enough credits" } }

// 422 Unprocessable Entity
{ "error": { "code": "INVALID_INPUT", "message": "Image dimensions too small" } }

n8n-specific tips

Things that come up when running this workflow in production.

Don't poll faster than 2 seconds

The Ratio Ready API applies rate limits. Polling at sub-second intervals will get you rate-limited before the batch even has time to complete. A 2-second Wait interval is fine for interactive use; if you're running overnight batches, 5 seconds is more considerate to shared infrastructure.

Add error branches to every HTTP Request node

In n8n, enable Continue On Fail on your HTTP Request nodes and add an IF node that checks {"{{ $json.error }}"}. Route errors to a Send Email or Slack node so you know when something fails — a 402 (insufficient credits) or 401 (expired token) would otherwise silently stall your workflow.

For the polling loop specifically, add a counter in a Code node and break the loop after 60 attempts (2 minutes at 2s intervals) to avoid infinite loops on stuck batches.

Store the API key as an n8n credential, never inline

Go to n8n Settings → Credentials → Add Credential → HTTP Header Auth. Set Name to Authorization and Value to Bearer pk_your_key. Reference it in each HTTP Request node via Predefined Credential Type → Header Auth. This prevents the key from appearing in workflow JSON exports and keeps it out of logs.

Use Split In Batches for large design volumes

If you're processing many images at once (e.g. a folder of 20 new designs), don't submit them all as separate parallel HTTP Request calls simultaneously. Add a Split In Batches node before the submit step and set Batch Size to 3–5. This keeps your n8n instance responsive and avoids hitting the Ratio Ready processing queue limit. Each batch runs sequentially and the workflow handles them in order.

Wall art vs clipart: different field names

Wall art uses image (singular) in the form data. Clipart uses images (plural, accepts multiple files). Using the wrong field name silently sends no image and the API returns a validation error. If your POST keeps returning INVALID_INPUT, check the field name first.

Download URLs expire after 24 hours

The printUrl, previewUrl, mockupUrls, and downloadUrl values are presigned Cloudflare R2 URLs. They are only valid for 24 hours from batch completion. If your workflow involves manual review before uploading to Etsy, download the files to local storage or Google Drive immediately after the batch completes — don't rely on the R2 URLs still being valid the next day.

Frequently asked questions

Related guides

Get your API key — 75 free credits on signup

Connect n8n to Ratio Ready and process your first wall art batch in under an hour.