---
title: "Product photo to 360-degree turntable video"
kind: "Kit"
category: "Marketing & SEO"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/04c0fa45-c674-4ce3-a590-a63ed97a5c1b"
updated: "2026-11-09"
---

# Product photo to 360-degree turntable video

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow with a one-field upload form. Send a product photo, and OpenAI writes the prompts, Runware draws a square hero frame and Kling turns it into a 10-second 360-degree turntable video. Three model names need checking.

Product photo to 360-degree turntable video is an n8n workflow in the Marketing \& SEO category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-09. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow turns one product photo into a 10-second video of that product turning a full circle on a white studio turntable. OpenAI studies the photo and writes two prompts. Runware draws a square hero frame from the first, then animates it with a Kling model from the second. It adds no scene, story or presenter. The product should look as it does in the photo, only turning.

### Who it suits

Online shops and product marketers who want a turning view of each item for a product page, without a photo studio or a 3D model. It suits boxed and bottled goods better than clothes, which look best on a person. Three model names need checking first. Pick it if you can edit a JSON body in n8n.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Online retail | Shop owners | Upload each product’s photo once and add the clip to its page | A tea shop uploads a photo of a tin and puts the turning clip beside the product. |
| Cosmetics | Brand marketers | Make a turning view of a new product before the studio shoot | A skincare brand gets a spin of a new serum bottle for its launch email. |
| Agencies | Content producers | Send a client’s catalog through the form, one photo at a time | An agency turns a client’s six sauce bottles into six short clips for social posts. |

You need some n8n and three accounts: Dropbox, OpenAI and Runware. Its author puts setup at about 13 minutes. Allow longer, because the Dropbox app and the model checks come first.

### Where to use it

Any n8n, on n8n Cloud or a server of your own. The form runs inside n8n, so nothing else needs hosting.

- n8n Cloud: import the file, add the credentials and publish
- Your own n8n server: the same file, at an address the people who upload can open
- Dropbox: holds each photo, with a public link to it
- Runware: renders the frame and the video on its own servers

### How to set it up

Get it saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Make the Dropbox app first, since three nodes need its token.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or a server of your own |
| Dropbox | An app from Dropbox’s App Console with \`files.content.write\`, \`sharing.read\` and \`sharing.write\`, and an access token |
| OpenAI | An API key for a model that reads images |
| Runware | An account with credit, and its API key |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add a Dropbox credential with the app’s token and select it in `Upload a file`. Put the same token in place of `<YOUR_DROPBOX_TOKEN>` in `HTTP Request` and `HTTP Request6`.
3. Add an OpenAI credential and select it in `Analyze image`, `OpenAI Chat Model1` and `OpenAI Chat Model2`.
4. In `Analyze image` and `OpenAI Chat Model1`, swap `chatgpt-4o-latest` for a current model such as `gpt-4.1-mini`.
5. Replace `<YOUR_RUNWARE_KEY>` in `Flux Image `, `kling image to video post1` and `kling imag to video get status1`. The brackets go too, so each header reads Bearer, a space and the key.
6. In `kling image to video post1`, check `klingai:5@1` against Runware’s model list.
7. Save, open the form’s test address and upload a photo.
8. Read `finalVideoURL` in `Edit Fields3` about four minutes later, then press Publish.

OpenAI’s deprecations page, read on 2 November 2026, lists `chatgpt-4o-latest` as shut down on 17 February 2026. That is why step 4 is there. The same day, `klingai:5@1` was missing from Runware’s model list, which offered `klingai:6@0`, KlingAI 2.5 Turbo Standard, for clips of 5 or 10 seconds.

### How to use it

Open the form, choose one clear photo of the product on a plain background and send it. The form says thanks at once. The video takes about four minutes. Then open the run under Executions and copy the address from `Edit Fields3`.

What to change for a different result

| To change | Where |
| --- | --- |
| The turntable, backdrop and light | The rotation context at the end of the system message in \`Basic LLM Chain\` |
| The camera move | The prompt in \`AI Agent1\` |
| The video’s length and size | \`duration\`, \`width\` and \`height\` in \`kling image to video post1\`, 10 seconds and 1280 by 720 in the file |
| The frame | \`model\`, \`width\` and \`height\` in \`Flux Image \`, FLUX.1 Kontext \[pro\] at 1024 by 1024 in the file |
| How long it waits | \`Wait1\`, three and a half minutes before the one check on the video |

### Example

A candle maker uploads a photo of an amber glass jar candle with a black lid and a paper label. `Analyze image` might note the glass, the lid and the label’s words. The render prompt could then read:

```text
Ultra-realistic 8K CGI render of an amber glass jar candle with a matte black metal lid and a cream paper label, centered on a glossy white turntable, soft studio light, --ar 1:1
```

Runware draws that frame. About four minutes after the upload, `Edit Fields3` holds the address of a 10-second clip of the jar turning on its base.

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. This one reads in four rows, each labelled by a sticky note: the upload, the prompt, the frame and the video. Run it once from the test address. Then open each node and see what it received.

**For experts.** The photo makes a round trip. It goes up to Dropbox and comes back down through the public link for OpenAI to read, and the same link is the reference image Runware reads. The render prompt ends in `--ar 1:1`, which is Midjourney syntax that FLUX reads as plain text, so the size fields are what make the frame square.

The calls to Runware

| Node | Task | What to know |
| --- | --- | --- |
| \`Flux Image \` | \`imageInference\` with \`bfl:3@1\` | Waits for the PNG and returns its address. The prompt goes in unescaped, so a quote mark breaks the JSON |
| \`kling image to video post1\` | \`videoInference\`, delivered later | Sends the frame as the first frame. Runware’s guide now puts it under \`inputs\` |
| \`kling imag to video get status1\` | \`getResponse\` | Runs once. A video still rendering leaves \`finalVideoURL\` empty |

### Good to know

Three things catch people out: a single status check, an open form and a public link.

- One check: if Runware is still rendering after three and a half minutes, \`finalVideoURL\` comes out empty. Add an If that loops back to \`Wait1\`
- Where the video goes: only into the run. Add a node that emails or saves the address
- Quotes: a quote mark or a line break in a prompt breaks the request. Wrap each prompt in \`JSON.stringify\` in place of its quotes
- Shape: the frame is square and the video 16:9, so the model may crop the frame or add space around it
- Open form: anyone with the production address spends your OpenAI and Runware credit. The form trigger can ask for a password with Basic Auth
- Public link: anyone who has the Dropbox link can open the photo. Remove it once the video is made
- Dropbox token: one made in the App Console is short lived. The setup notes show a credential that lasts
- Billing: three OpenAI calls, one Runware image and one Runware video for each photo
- Your keys: the Dropbox token and the Runware key sit in headers, so take them out before you share the workflow
- Credentials: the JSON holds none, and nothing from its author’s accounts

## README

```markdown
# Product photo to 360-degree turntable video

An n8n workflow behind a one-field upload form. Send it a photo of a product, and it makes a 10-second video of that
same product turning a full circle on a white studio turntable. OpenAI describes the product and writes the prompts.
Runware renders a square hero frame with FLUX.1 Kontext [pro], then animates it with a Kling model. Dropbox holds the
photo and gives Runware a link to it.

It adds no scene, story or presenter. The product should look as it does in the photo, only turning.

Read "Models to check first" below before the first run: three model names in the file need a look.

## What is inside

- `workflow.json`: the workflow as n8n exports it, 32 nodes, four of them sticky notes that label its four rows. It
  holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- Its five Authorization headers held `Bearer <API>`. The two that call Dropbox, in `HTTP Request` and `HTTP Request6`,
  now say `Bearer <YOUR_DROPBOX_TOKEN>`. The three that call Runware, in `Flux Image `, `kling image to video post1` and
  `kling imag to video get status1`, say `Bearer <YOUR_RUNWARE_KEY>`.
- The original copy's `Upload a file` path had lost a backslash. Its `/s+/g` turned every letter s in the file name into
  an underscore. It reads `/\s+/g` again, which turns spaces into underscores.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- A Dropbox account, and an app made in Dropbox's App Console (below).
- An OpenAI API key for a model that reads images.
- A Runware account with credit, and its API key.

## Models to check first

`Analyze image` and `OpenAI Chat Model1` name `chatgpt-4o-latest`. OpenAI's deprecations page, read on 2 November 2026,
lists it as shut down on 17 February 2026. Pick a current model in both, such as `gpt-4.1-mini`, which reads images too.

`kling image to video post1` asks Runware for `klingai:5@1`. That ID was not in Runware's model list when we checked the
same day. Its Kling models then included `klingai:6@0`, KlingAI 2.5 Turbo Standard, which makes clips of 5 or 10
seconds at up to 720p. Runware's image-to-video guide also puts the start frame under `inputs.frameImages` now. It says
many models refuse `width` and `height` when a frame is given. If the call fails, move `frameImages` under `inputs` as
the guide shows, and take the two sizes out.

## A Dropbox token

`Upload a file` is n8n's Dropbox node, set to take an access token. `HTTP Request` and `HTTP Request6` call Dropbox's API
with a token in their headers. The quickest setup uses one token in all three:

1. In Dropbox's App Console, create an app with scoped access. App folder access is enough, and the photos then land in
   the app's own folder.
2. On its Permissions tab, tick `files.content.write`, `sharing.read` and `sharing.write`, and submit.
3. On its Settings tab, generate an access token.

Dropbox's OAuth guide says its access tokens are short lived, and that a token made in the App Console is for testing
with your own account. Expect to paste in a new one after a few hours.

For a setup that lasts, switch `Upload a file` to OAuth2 and give it n8n's Dropbox OAuth2 credential. That credential
asks Dropbox for `files.content.write`, `files.content.read`, `sharing.read` and `account_info.read`, which cannot make
the link in `HTTP Request6`. So give the two HTTP Request nodes a generic OAuth2 API credential for your app instead:

- Authorization URL `https://www.dropbox.com/oauth2/authorize` and Access Token URL
  `https://api.dropboxapi.com/oauth2/token`, with your app's key and secret
- Scope `sharing.read sharing.write`, and `token_access_type=offline` in the auth URI query parameters
- n8n's OAuth redirect URL added to the app's Redirect URIs in the App Console

Then delete their Authorization headers.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Make the Dropbox app and its token (above). Add a Dropbox credential with the token and select it in `Upload a file`.
3. In `HTTP Request` and `HTTP Request6`, replace `<YOUR_DROPBOX_TOKEN>` with the same token. The brackets go too, so the
   header reads Bearer, a space and the token.
4. Add an OpenAI credential and select it in `Analyze image`, `OpenAI Chat Model1` and `OpenAI Chat Model2`. Change the
   model in the first two (above).
5. In `Flux Image `, `kling image to video post1` and `kling imag to video get status1`, replace `<YOUR_RUNWARE_KEY>`
   with your Runware key, brackets included. The first of those names ends in a space.
6. Check the model in `kling image to video post1` against Runware's list (above).
7. Save. Open `On form submission`, use its test address and upload a product photo. Wait about four minutes, then open
   the run and read `finalVideoURL` in `Edit Fields3`.
8. Press Publish when the video looks right. The form then has a production address you can share.

## How a run goes

1. `On form submission` serves the Image trigger form, which has one file field. `Code2` names each file it receives
   `product_image`, one item for each.
2. `Upload a file` saves the photo at the top of your Dropbox, or of the app's folder, with spaces in its name turned
   into underscores.
3. `HTTP Request` asks Dropbox for a link to that file. When `If` finds one, `Code7` takes it. Otherwise
   `HTTP Request6` makes a public link first. `Code7` swaps `dl=0` for `raw=1`, so the address serves the file itself.
4. `HTTP Request3` downloads the photo from that link, and `Code6` labels it a PNG named `product.png`.
5. `Analyze image` has OpenAI describe the product in detail: its label, material, logo, colors, shape and size.
6. `Basic LLM Chain` turns that description into one render prompt. Its rules ask for an exact copy of the product,
   centered on a glossy white turntable in a studio light box, with no stylizing. The prompt has to open with
   "Ultra-realistic 8K CGI render of", and its last words are `--ar 1:1`. `Structured Output Parser1` holds the answer to one
   field, `Ad Concept 1`, and `Edit Fields` and `Code` pass it on as `prompt`.
7. `AI Agent1`, on `gpt-4o-mini`, writes the video prompt: one sentence of up to 40 words about a smooth 360-degree turn.
8. `Code3` makes a task ID. `Flux Image ` asks Runware for one 1024 by 1024 PNG from `bfl:3@1`, FLUX.1 Kontext [pro],
   with the Dropbox link as its reference image. `Split Out1` takes the result, and `Wait6` pauses 10 seconds.
9. `Edit Fields2` keeps the frame's address under the name `finalVideoURL`, though it is still the picture. `Code5`
   makes a second task ID, and `kling image to video post1` asks Runware for a 10-second, 1280 by 720 video with that
   frame first. Runware answers at once and renders in the background.
10. `Wait1` pauses three and a half minutes. Then `kling imag to video get status1` asks once for the result, and
    `Edit Fields3` sets `finalVideoURL` to the video's address.

## Change the look

- The turntable, backdrop and light: the rotation context at the end of the system message in `Basic LLM Chain`.
- The camera move: the prompt in `AI Agent1`.
- The video's length and size: `duration`, `width` and `height` in the body of `kling image to video post1`.
- The frame's size: `width` and `height` in `Flux Image `.
- The waits: `Wait6` after the frame, and `Wait1` before the one check on the video.

## Good to know

- The workflow checks on the video once. If Runware has not finished after three and a half minutes, `finalVideoURL`
  comes out empty. Run `kling imag to video get status1` again, or add an If that loops back to `Wait1` until a
  `videoURL` appears.
- The video's address stays in the run. The person who sends the form sees only n8n's confirmation. Add a node that
  emails it, saves it or posts it if anyone else needs the video.
- Both prompts go into the JSON bodies as they are. A quote mark or a line break in a model's answer breaks the request.
  Writing `{{ JSON.stringify($('Basic LLM Chain').item.json.output['Ad Concept 1']) }}` in place of the quoted text in
  `Flux Image ` fixes that, and the same works for the video prompt.
- The frame is square and the video request is 16:9, so the model may crop the frame or add space around it.
- `--ar 1:1` comes from Midjourney's prompt syntax. FLUX reads it as plain text. The frame is square because of the
  `width` and `height` in `Flux Image `.
- `Code6` labels the photo a PNG whatever it is. Upload a PNG or a JPEG.
- The Dropbox link is public, so anyone who has it can open the photo. Remove the link in Dropbox once the video is made.
- Anyone with the form's production address can start a run on your OpenAI and Runware credit. The form trigger can ask
  for a password with Basic Auth.
- Each photo costs three OpenAI calls, one Runware image and one Runware video. Runware prices each model on its own, so
  check before you choose one.
- The Dropbox token and the Runware key sit in headers, so take them out before you share the workflow.
```

## What is in it

2 files, 34 KB, downloaded as a zip.

```text
README.md  9 KB
workflow.json  25 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 25 steps, starting on a form
- AI: 3 steps call an AI model: Analyze image, Basic LLM Chain and AI Agent1
- Sign-ins: Signs in to: Dropbox, OpenAI and Runware
- API keys: No API key is left in the file; 2 blanks in it for your own key
- Step types: Mindket’s checker reads all 11 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/04c0fa45-c674-4ce3-a590-a63ed97a5c1b)
- [Its page on Mindket](https://mindket.com/p/04c0fa45-c674-4ce3-a590-a63ed97a5c1b)
