How to Create AI-Generated Shorts with GPT Image and n8n

30 September 2026 (updated) | 18 min read
Laura van Sinderen

Learn how to build an n8n workflow that creates faceless Shorts with GPT Image and Creatomate, complete with a voiceover and animated subtitles.

AI image generators can produce original visuals for almost any story, but turning those separate images into a finished video still takes work. They need to be generated in the right style, placed in sequence, timed to the narration, and combined with subtitles.

In this step-by-step tutorial, we'll automate that process with n8n. The workflow starts with four ready-made image prompts and matching voiceover files. Creatomate sends each prompt to GPT Image through its native OpenAI integration, places each generated visual in the corresponding scene, transcribes the voiceovers into animated subtitles, and renders everything as a vertical video.

By the end of this tutorial, you'll have a four-scene MP4 like the example above, ready to download and publish as a YouTube Short, TikTok video, or Instagram Reel.

Want to make the video design your own? Creatomate's online template editor gives you full control over how the generated visuals are presented, including their animations and the transitions between scenes. You can also design the subtitles exactly the way you want, from fonts and colors to placement and animation.

Tip: We've provided the voiceover files for this tutorial so we can focus on generating the visuals with GPT Image. If you'd like Creatomate to generate the narration from text with ElevenLabs instead, check out our tutorial on creating AI voiceover videos with n8n.

Prerequisites

These are the tools we'll use:

  • Creatomate: to customize the video template and render the video.
  • OpenAI: to generate the visuals with GPT Image.
  • n8n: to build the automated workflow.

You'll need an OpenAI API account with billing enabled to generate the images. We'll set this up in step 1.

How to automate video creation with GPT Image

We'll begin by setting up OpenAI API access and connecting it to Creatomate. Then we'll import a ready-made video template containing four scenes, each with its own image, voiceover, and animated subtitles.

Next, we'll build the n8n workflow. A Manual Trigger starts the workflow, while an Edit Fields node provides four pairs of sample voiceover URLs and image prompts. n8n sends these values to Creatomate, which generates the four visuals, places each one in the corresponding scene, uses the voiceovers to determine the scene durations, and transcribes the audio into animated subtitles.

The Creatomate node generates the complete video and returns its public URL once it is ready. An HTTP Request node named Download Video then downloads the finished MP4 into n8n.

Once the MP4 has been downloaded, you can save it to Google Drive for review, upload it to YouTube as a Short, send it to another social platform, or pass it to any other app supported by n8n. We'll end this tutorial with the downloaded video file so you can adapt the final part of the workflow to your own publishing process.

n8n workflow that maps four voiceover URLs and four GPT Image prompts to a Creatomate template and downloads the finished Short.

Why generate the images in Creatomate instead of n8n

n8n includes an OpenAI integration with a "Generate an Image" action that lets you create visuals with GPT Image. However, this action returns each generated image as file data, while the source property of a standard Creatomate image element expects a publicly accessible URL. To use those files in a video template, you would typically upload them to a storage service such as Cloudinary or Amazon S3 first, then map the resulting URLs to Creatomate.

When a Creatomate image element is configured to use OpenAI, its source property works differently: instead of a file URL, it accepts an image prompt. This allows us to send the prompts directly to the dynamic image elements in the template. During rendering, Creatomate sends each prompt to OpenAI, receives the generated image, and inserts it into the corresponding scene.

Generating images in n8n can still be useful if you need the files for other steps in your workflow. In this tutorial, however, every image is created specifically for one scene in the final video. Sending the prompts directly to Creatomate avoids extra nodes and storage while keeping image generation and video rendering in one streamlined process.

Let's get started!

1. Set up OpenAI for GPT Image

Creatomate uses OpenAI's API to generate the four visuals during rendering. In this step, we'll make sure API billing is active, create an OpenAI API key, and connect it to the Creatomate project.

Set up OpenAI API access

Sign in to the OpenAI Platform or create an account.

OpenAI API usage is billed separately from ChatGPT. A ChatGPT subscription does not include API credits. Open the OpenAI API billing settings and add a payment method or purchase API credits if billing is not active yet. The available options may differ depending on how your API account is configured:

OpenAI API billing page showing where to add a payment method or purchase API credits for GPT Image.

Next, open the API Keys page and click Create new secret key. Give the key a descriptive name, such as Creatomate GPT Image:

Creating an OpenAI API key named Creatomate GPT Image for use with the Creatomate integration.

Create the key, copy it, and keep it somewhere secure for the moment. OpenAI may only show the complete key once. We'll add it to Creatomate next.

Connect OpenAI to Creatomate

Log in to your Creatomate account or sign up for free if you don't have one yet.

Click your project in the top-left corner and choose Project Settings. Open the Integration tab, switch OpenAI on, paste the API key you just created, and click Confirm:

Creatomate can now send image prompts to GPT Image whenever this project renders a template that uses OpenAI as its image provider. The API key stays in the Creatomate project and does not need to be added to n8n.

Now let's import the video template.

2. Import the video template

For this tutorial, we'll use the Faceless Shorts - GPT Image template. Click the banner below to add it directly to your Creatomate project:

Template used in this tutorial
Faceless Shorts - GPT Image
A copy lands in your project, ready to edit.
Import template

After importing it, Creatomate opens the template in the editor. The template defines the design and scene structure, while the n8n workflow supplies the variable content for each render. The canvas may initially look mostly empty because the images and voiceovers are added, and the subtitle text is generated when the workflow runs.

Creatomate editor showing four sequential scenes, each containing an image, voiceover, and subtitle element.

The template consists of four scenes arranged one after another on the timeline. Each scene contains the same three types of elements:

  • Image-1 to Image-4: dynamic image elements. These will receive image prompts from n8n, which Creatomate uses to generate the visual for the corresponding scene.
  • Voiceover-1 to Voiceover-4: dynamic audio elements. These will receive voiceover URLs from n8n.
  • Subtitles-1 to Subtitles-4: subtitle elements. These are linked to the corresponding voiceovers. During rendering, Creatomate transcribes the audio and displays the narration as animated captions. You can fully customize their appearance in the editor, including the font, colors, placement, and animation.

Each scene automatically adapts to the duration of its voiceover, so the four scenes don't need to be equally long. This keeps every generated image on screen for the part of the narration it was designed to illustrate.

To see the image-generation settings, select Image-1 in the element panel. You'll see that it uses OpenAI as the Provider, GPT Image 2 as the Model, 1024 × 1536 (portrait) as the Size, and Medium as the Quality. Its Source property is marked as dynamic, allowing the workflow to supply a different prompt for each render:

Creatomate image element configured with OpenAI, GPT Image 2, a 1024 × 1536 portrait size, Medium quality, and a dynamic source.

The video template itself uses a vertical 1080 × 1920 (9:16) format. Because the generated images have a slightly wider aspect ratio and the image elements are set to Cover, Creatomate crops them on both sides to fill the scene. Keep the main subject near the center and leave some space around it to prevent important details from being cut off. The output dimensions are controlled by the template, so you don't need to include an aspect ratio in every prompt.

No changes are required for this tutorial, but any design changes you make in the editor will be reflected in future videos generated from the template. Next, we'll build the n8n workflow and add the image prompts and voiceover URLs for the four scenes.

3. Add the voiceovers and image prompts in n8n

For this tutorial, we'll use a Manual Trigger and an Edit Fields (Set) node to provide four voiceover URLs and four image prompts. In a production workflow, you can replace the Manual Trigger with a schedule or another trigger, and pull the eight fields from a spreadsheet, form, content management system, or another data source.

In your n8n dashboard, click Create workflow.

Click Add first step…, search for Trigger manually, and add it to the workflow:

Next, click the + on the right side of the trigger, search for Edit Fields (Set), and add it to the workflow.

Set Mode to JSON. Select the example content in the JSON field and replace it with the following:

{
  "Voiceover-1": "https://cdn.creatomate.com/demo/voiceover-1.mp3",
  "Voiceover-2": "https://cdn.creatomate.com/demo/voiceover-2.mp3",
  "Voiceover-3": "https://cdn.creatomate.com/demo/voiceover-3.mp3",
  "Voiceover-4": "https://cdn.creatomate.com/demo/voiceover-4.mp3",
  "Image-1": "A 30-year-old man with medium-brown skin, short curly black hair, and a neatly trimmed beard, wearing navy-blue pajamas and sleeping peacefully on his side in a neatly made bed, his head resting comfortably on a pillow, eyes gently closed, relaxed and content expression, cozy modern bedroom with warm wood furniture, beige bedding, and subtle navy accents, a tidy nightstand with no drinks, cups, phones, or other distracting objects, warm bedside lighting, soft moonlight through the window, calm and reassuring nighttime atmosphere, cinematic photorealistic lifestyle photography, natural skin tones, eye-level medium-wide shot, shallow depth of field, face and upper body positioned near the center with enough space for cropping, clean uncluttered lower third for subtitles, no text, no logos",
  "Image-2": "A relaxed 30-year-old man with medium-brown skin, short curly black hair, and a neatly trimmed beard, wearing navy-blue pajamas and sitting comfortably on a beige sofa in a cozy modern living room with warm wood furniture and subtle navy accents, reading a book, a warm cup of tea on the side table, soft ambient lamp lighting, peaceful evening atmosphere, cinematic photorealistic lifestyle photography, natural skin tones, eye-level medium-wide shot, shallow depth of field, balanced centered composition, clean uncluttered lower third for subtitles, no text, no logos",
  "Image-3": "A refreshed 30-year-old man with medium-brown skin, short curly black hair, and a neatly trimmed beard, wearing navy-blue pajamas and opening the curtains in a cozy modern bedroom with warm wood furniture, beige bedding, and subtle navy accents, soft morning sunlight filling the room, calm and organized morning atmosphere, looking well rested, cinematic photorealistic lifestyle photography, natural skin tones, eye-level medium-wide shot, shallow depth of field, balanced centered composition, clean uncluttered lower third for subtitles, no text, no logos",
  "Image-4": "An energetic 30-year-old man with medium-brown skin, short curly black hair, and a neatly trimmed beard, wearing a dark-blue athletic shirt and black running pants, jogging along a peaceful park path surrounded by green trees, natural running stride, relaxed expression, bright daylight, healthy active lifestyle, cinematic photorealistic lifestyle photography, natural skin tones, eye-level medium-wide shot, shallow depth of field, dynamic sense of movement, subject centered in the frame, clean uncluttered lower third for subtitles, no text, no logos"
}

The Voiceover-1 through Voiceover-4 fields contain the public URLs of the four audio files, while Image-1 through Image-4 contain the image prompts.

GPT Image generates each visual independently, so write every prompt as a self-contained description. When writing your own prompts:

  • Describe one clear scene that reflects what is said in the corresponding voiceover.
  • Repeat important character, setting, and visual-style details in every prompt.
  • Keep the main subject near the center and the lower part of the image relatively uncluttered so the subtitles remain easy to read.
  • Focus each prompt on one main action and use a consistent camera style across the scenes.
  • Avoid written text and logos, as Creatomate adds the subtitles separately.

Keep the field names Voiceover-1 through Voiceover-4 and Image-1 through Image-4 unchanged, as we'll refer to them when mapping the content to the video template.

Edit Fields node in JSON mode containing four voiceover URLs and four GPT Image prompts.

Click Execute step. The output panel should display all eight fields: four voiceover URLs and four image prompts:

Edit Fields output showing eight fields: four voiceover URLs and four GPT Image prompts.

The input data is now ready. Next, we'll map these fields to the Creatomate template and start the render.

4. Generate the GPT Image video with the Creatomate node

Click the + after the Edit Fields node and search for Creatomate.

If you haven't used the node before, open its details and click Install node. n8n installs the verified Creatomate node into your workspace:

Creatomate node details in n8n showing the Install node button.

After installation, choose Create a render under Render actions:

Create a render action available after installing the Creatomate node.

Connect your Creatomate account

Under Credential, click Connect to Creatomate:

Creatomate node settings showing the Connect to Creatomate credential button.

In a separate browser tab, return to Creatomate. Click your project in the top-left corner and choose Project Settings. Open the API section and copy the API key for this project:

Back in n8n, paste the key into the Creatomate credential and click Save:

Creatomate API credential configured in n8n.

An API key belongs to one Creatomate project. If you use multiple projects, create a separate n8n credential for each one.

Select the GPT Image template

Return to the Creatomate node. Under Template, leave From list selected and choose the Faceless Shorts - GPT Image template imported in step 2.

The node loads the template's dynamic elements under Values to Send:

Faceless Shorts - GPT Image template selected in the Creatomate n8n node with its dynamic fields loaded.

Map the voiceovers and image prompts

Under Mapping Column Mode, leave Map Each Column Manually selected. Map every template field to the matching item from the Edit Fields node:

  • Image-1 → {{ $json['Image-1'] }}
  • Voiceover-1 → {{ $json['Voiceover-1'] }}
  • Image-2 → {{ $json['Image-2'] }}
  • Voiceover-2 → {{ $json['Voiceover-2'] }}
  • Image-3 → {{ $json['Image-3'] }}
  • Voiceover-3 → {{ $json['Voiceover-3'] }}
  • Image-4 → {{ $json['Image-4'] }}
  • Voiceover-4 → {{ $json['Voiceover-4'] }}

Drag each item from the input panel into its matching field. n8n creates the expression automatically. Check the preview below every expression to make sure it resolves to the expected image prompt or voiceover URL rather than displaying the expression as plain text:

Four GPT Image prompts and four voiceover URLs mapped to the Faceless Shorts template in the Creatomate n8n node.

Tip: Because the incoming field names exactly match the template's dynamic element names, you can also use Map Automatically. Field names are case-sensitive. We used manual mapping here so you can see how every input is connected to the template.

Generate the video

Before running the node, leave Wait for Completion enabled. This ensures that the workflow continues only after the video is ready, so Download Video can immediately use the finished MP4 URL.

Click Execute step. Creatomate sends the four image prompts to GPT Image, places the generated visuals in their corresponding scenes, adapts each scene to its voiceover, creates synchronized animated subtitles, and renders the complete video.

Because this render includes four GPT Image generation requests, it may take longer than a render that uses existing images. Processing time depends on the image generation, voiceover durations, video resolution, and template complexity.

The output should then show a successful render and include a public url for the finished MP4:

Successful GPT Image video render returned by the Creatomate node with the finished MP4 URL.

Open the URL to watch the video. It should contain four GPT Image visuals with matching voiceovers and animated subtitles:

Unmute the video to hear the audio.

You can also find the render on the API Log page in Creatomate. It shows whether the render succeeded, how long it took, the Creatomate credit usage, and any returned error details:

Creatomate API Log showing a successful GPT Image video render and its processing details.

The credit usage shown in the API Log only covers the Creatomate render. Generating the four images is billed separately to the OpenAI API account connected to the project and does not appear in the Creatomate API Log.

The video is ready. Let's download the finished MP4 into n8n.

5. Download the finished video

The Creatomate node returns a public URL for the completed video. If the next node in your workflow accepts a file URL, you can use {{ $json.url }} directly and skip the download.

For this tutorial, we'll download the MP4 so it can be previewed in n8n, saved manually, or passed to another node that requires the actual video file.

Click the + after the Creatomate node and add an HTTP Request node. Rename it Download Video, then configure it as follows:

  • Method: GET
  • URL: {{ $json.url }}
  • Under Options, add Response
  • Set Response Format to File
  • Leave Put Output in Field set to data

No authentication is required because the completed video is served from its public output URL:

HTTP Request node configured to download the finished GPT Image video from its Creatomate URL.

Before running the node, check that the URL preview resolves to the actual MP4 URL returned by Creatomate.

Click Execute step. The output now contains the finished video in a binary field named data. Open the file preview or use n8n's download option to save the MP4:

Finished GPT Image video downloaded as an MP4 file in n8n.

That's it! Your workflow has turned four voiceover files and four image prompts into a complete faceless Short with GPT Image visuals and animated subtitles.

From here, you can store the video, send it through an approval process, or pass the data file to any n8n node that accepts video files. If you want to publish it automatically, add the metadata required by your destination. For YouTube, for example, you could add Title and Description fields to the Edit Fields node or generate them in an earlier step with ChatGPT. You can then map those fields, together with the downloaded video, to the YouTube node.

For a complete upload example, follow our tutorial on automatically creating and uploading YouTube Shorts with n8n.

What’s next for GPT Image videos with n8n

This workflow uses four fixed voiceover URLs and four image prompts, making it easy to test. GPT Image may still produce different visuals each time you run it, even when the prompts stay the same.

To turn it into a reusable automation, replace the Manual Trigger with a schedule or another trigger, and replace the Edit Fields node with a data source that provides four voiceover URLs and four matching image prompts. You could pull this content from Google Sheets, Airtable, a form, a content management system, or another n8n workflow. Keep the same field names, or update the template mappings accordingly.

Once your input source and preferred destination are configured, activate the workflow to let it run automatically.

Here are a few ways to expand it:

👉 Generate the voiceovers: Instead of providing audio URLs, configure the template to turn supplied text into narration with ElevenLabs. Follow our tutorial on creating AI voiceover videos with n8n.
👉 Review or store the result: Save each generated video to Google Drive or route it through an approval step before publication.
👉 Publish it automatically: Continue the workflow with YouTube, a social media management platform, or any other destination supported by n8n.
👉 Start with a single topic: For a different approach, follow our tutorial on creating faceless Shorts with ChatGPT and n8n. In that workflow, ChatGPT writes the narration, title, and description, while you provide the visuals.

Related articles

Whether you prefer code or no-code, we have a wide range of guides on video automation.

Start automating today

Start with a full-featured trial with 50 credits, no credit card required.

Get started for free →