How to Auto-Create Dynamic Videos from Images using n8n

5 October 2026 (updated) | 16 min read
Laura van Sinderen

In this tutorial, you'll learn how to automatically turn a variable number of images into a slideshow video using Airtable, n8n, and Creatomate.

Have you ever tried creating videos from a collection of photos? When every video follows the same structure and uses the same number of images, it's usually quite simple. But what if each video needs a different number of photos – sometimes 5, another time 15, or even 50? Things can quickly get complicated. That's the exact challenge we'll solve in this tutorial.

I'll show you how to build an automation in n8n that generates professional-looking videos from a variable number of images. We'll use Airtable to organize the visuals and accompanying text for each video. The workflow will then pull in this content, apply custom logic to structure the video, and send everything to Creatomate for rendering.

The best part is that this workflow is highly flexible. Every scene and text element can be customized, so you can adapt it to different types of content. Whether you're creating marketing materials, social media posts, or personalized messages, this system can easily scale and adjust to your needs.

Note: If you only want to create videos with a fixed design and a consistent number of elements, you might prefer following this simpler n8n tutorial. This guide is intended for more advanced scenarios where the number and arrangement of scenes need to adapt to the supplied content.

Prerequisites

These are the tools we'll use:

  • Creatomate: to define the video scenes and generate the final video.
  • Airtable: to store the images and text for each video.
  • n8n: to automate the entire workflow.

How to automate video creation from images with n8n

We'll begin in Creatomate by importing a video template containing several reusable scene designs. The workflow can combine these scenes in different ways, depending on the number and orientation of the supplied images.

Next, we'll set up an Airtable base to store the content for each video. Each record represents one video and contains its images, accompanying text, a checkbox for starting the workflow, and an attachment field for the finished MP4.

In n8n, an Airtable Trigger starts the workflow when a record is marked as ready. A Code node then examines the supplied content and builds a Scenes.elements array containing the appropriate scene designs, images, and text.

After that, the Creatomate node uses the generated scene list to render the video from the reusable template.

Finally, we'll update the original Airtable record by saving the MP4 to its attachment field. Airtable downloads and stores its own copy, keeping the source content and finished video together in one place.

This is the workflow we'll build:

n8n workflow with Airtable Trigger, Code, Creatomate, and Airtable Update record nodes for generating and saving a dynamic video.
Copy this workflow and paste it into an empty n8n canvas with Ctrl+V.

Let's get started!

1. Create a video template in Creatomate

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

For this tutorial, we'll use the Tribute Compilation template. Click the banner below to add a copy directly to your Creatomate project:

Template used in this tutorial
Tribute Compilation
A copy lands in your project, ready to edit.
Import template

Click the play button to preview the template. It contains several reusable scene designs: some use text, some display one or more images, and others combine both. In the left-hand panel, you can see scenes such as Title-Scene, Intro-Text, Intro-Dedication, Single-Photo-With-Caption, and Multiple-Photos-Parallax:

Creatomate Tribute Compilation template showing reusable text and image scene designs in the left-hand panel.

Think of these scenes as reusable building blocks. Later, an n8n Code node will create a Scenes.elements array that selects which scene designs to use, fills them with content, and determines their order.

In a typical template-based workflow, n8n replaces a fixed set of dynamic elements. That isn't flexible enough here because each Airtable record can contain a different number and mix of images. Instead, the workflow replaces the contents of the Scenes composition with the generated array. This allows it to choose suitable layouts based on the number and orientation of the images while keeping the overall visual style consistent.

You don't need to modify the template; we'll use it as-is.

Next, let's prepare the content in Airtable.

2. Add the video content to Airtable

In this step, we'll set up an Airtable base to hold the content for the videos. It includes fields for uploading images, entering the text used in the template, starting the workflow, and storing the finished MP4.

Go to Airtable and create an account, or log in if you already have one.

Create a blank base and name it Dynamic Slideshow Videos.

Create the following fields:

  • Single line text: Name
  • Single line text: Full Name
  • Single line text: Date
  • Single line text: Caption Text
  • Long text: Farewell Message
  • Attachment: Images
  • Checkbox: Ready to Process
  • Last modified time: Last Modified
  • Attachment: Video

When configuring Last Modified, limit it to the Ready to Process field. This makes the Airtable Trigger respond to changes to that checkbox instead of every edit made to the record:

Airtable Last Modified field configured to track changes to the Ready to Process checkbox.

This lets you add and edit the content without starting the workflow prematurely. Once the record is complete, checking Ready to Process updates Last Modified and makes it available to the n8n trigger.

Your empty table should now look similar to this:

Empty Airtable base with fields for the video text, image attachments, processing checkbox, last modified time, and finished video attachment.

Next, add sample data to the first record. You can follow this example or use your own content:

  • Name: Whiskers
  • Full Name: Whiskers McFluff
  • Date: 03.14.2017 ~ 04.10.2025
  • Caption Text: A gentle soul whose purrs brought peace and quiet joy...
  • Farewell Message: As moonlight dances on the windowsill, we feel the soft echo of our dear friend's love, gently reminding us they're never truly gone.
  • Images: upload around 12 images
  • Ready to Process: check the box
  • Last Modified: this updates automatically
  • Video: leave this empty; the workflow will add the completed MP4 in step 6

You can use photos from your device, find free ones on sites such as Pexels, or download these example images: tribute-1pa.jpg, tribute-1pc.jpg, tribute-2p-01.jpg, tribute-2p-02.jpg, tribute-3p-01.jpg, tribute-3p-02.jpg, tribute-3p-03.jpg, tribute-mpp-02.jpg, tribute-mpp-08.jpg, tribute-mpp-09.jpg, tribute-mpp-10.jpg, and tribute-spb.jpg.

Once the sample content has been added, the table should look like this:

Sample Airtable record containing tribute text, image attachments, a checked Ready to Process field, and an empty Video attachment field.

The Airtable base is ready. Let's connect it to n8n.

3. Trigger the n8n workflow from Airtable

Go to n8n and sign in. If you don't have an account yet, you can start a free trial.

From the dashboard, click Create workflow.

On the canvas, click the + button, search for Airtable, and select On new Airtable event as the trigger.

Connect Airtable to n8n

Under Credential, select an existing Airtable credential or create a new one. n8n supports Personal Access Token (PAT) and OAuth2 authentication and recommends using a personal access token. Follow the n8n Airtable credential documentation to set up the connection.

Under Poll Times, choose how often n8n should check Airtable for updated records. The appropriate interval depends on how quickly you want records to be processed.

For Base and Table, select the Airtable base and table you created in step 2. If you configure these fields by ID or URL, you can find the values in the Airtable page URL. The Base ID starts with app, and the Table ID starts with tbl:

Airtable URL with the Base ID and Table ID highlighted for configuring the n8n trigger.

The initial trigger configuration should look similar to this:

Airtable Trigger in n8n connected to the Dynamic Slideshow Videos base and table.

For Trigger Field, enter Last Modified. Leave Download Attachments disabled, as the workflow only needs the attachment URLs returned by Airtable.

Under Additional Fields, add View ID. You can find this value in the Airtable URL; it begins with viw.

Airtable Trigger configured with Last Modified as the trigger field, Download Attachments disabled, and a View ID.

Click Fetch Test Event. n8n should retrieve the sample record and display its fields and attachment URLs in the output panel:

Airtable Trigger output in n8n containing the sample record and its image attachments.

Confirm that the output contains the sample record and its Images data. During scheduled executions, the trigger can return multiple updated records, which the Code node processes as separate items.

Now we'll transform each Airtable record into a dynamic list of video scenes.

4. Build the dynamic scene list

The video needs to adapt to the number and orientation of the images in each Airtable record. A Code node will analyze the attachments, select suitable scene designs from the template, and create the Scenes.elements array that Creatomate needs.

Click the + after the Airtable Trigger, search for Code, and select Code in JavaScript.

The node opens with Language set to JavaScript. Leave Mode set to Run Once for All Items so the script can process every Airtable record received during the workflow execution:

n8n Code node configured to run JavaScript once for all incoming Airtable records.

Replace the example code with the following script: Click to view.

Click Execute step.

The output should contain a Scenes.elements array defining the scene sequence for the incoming Airtable record:

Code node output containing a Scenes.elements array generated from the Airtable images and text.

The code gives each video a consistent beginning and ending. It starts with Title-Scene, Intro-Text, and Intro-Dedication. When suitable content is available, Single-Photo-With-Caption is used as the first image scene.

The middle section is assembled from the remaining images. The code considers their orientation, chooses compatible scene designs, and avoids using the same design consecutively when alternatives are available. It then finishes with Farewell-Message and Final-Tribute.

Check that the generated scene list includes all images uploaded to Airtable. Depending on the selected layout, a scene can contain one or multiple image fields.

Note: Some scene designs are intended for vertical images, while others work best with horizontal images. Supplying a mix of orientations gives the code more options and helps produce greater visual variety. You can also modify the JavaScript to apply your own selection rules.

The dynamic scene list is ready. Next, we'll send it to the Creatomate template.

5. Render the video with Creatomate

Click the + after the Code node and search for Creatomate.

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

Verified Creatomate node in n8n with the option to install it.

After installation, select Create a render under Render actions:

Create a render action selected in the Creatomate node for n8n.

Connect your Creatomate account

Under Credential, select an existing Creatomate credential or click Connect to Creatomate:

Creatomate node settings showing the Connect to Creatomate credential button.

Go back to Creatomate. Click the project name in the top-left corner and choose Project Settings. Open the API section and copy the API key:

Back in n8n, paste the key into the 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 template

Configure the Creatomate node as follows:

  • Resource: Render
  • Operation: Create
  • Render From: Template
  • Template: Tribute Compilation
  • Mapping Column Mode: Map Each Column Manually

You can leave Values to Send empty. Instead of replacing individual dynamic elements, we'll replace the contents of the template's Scenes composition with the array created by the Code node.

Creatomate node configured to create a render from the Tribute Compilation template.

Map the dynamic scene list

Under Options, click Add option and select Additional Modifications. Add one modification and configure it as follows:

  • Selector: Scenes.elements
  • Value: {{ $json["Scenes.elements"] }}

Do not use JSON.stringify() here. The Creatomate node can pass the array directly. The preview under the expression should begin with [Array:, confirming that n8n is supplying an array rather than plain text:

Additional modification in the Creatomate node mapping the Scenes.elements array from the Code node.

Leave Wait for Completion enabled. This makes the node wait until Creatomate has finished rendering before returning its output.

Click Execute step. The render time depends on the number of images, selected scenes, video duration, and template complexity.

When the video is ready, the node output should show status as succeeded and include a public url for the completed MP4:

Successful Creatomate node output containing the completed dynamic slideshow render and its public MP4 URL.

You can also review the render on the API Log page in Creatomate. It shows the output, status, processing time, resolution, and Creatomate credit usage. If a render fails, the API Log displays the complete error message so you can correct the input before trying again:

Creatomate API Log showing the completed slideshow render, processing details, credit usage, and video preview.

The finished video is ready. In the final step, we'll save it to the matching Airtable record.

6. Save the finished video to Airtable

Click the + after the Creatomate node, add an Airtable node, and select the Update record action.

Under Credential, select the same Airtable connection used by the trigger.

Set Resource to Record and Operation to Update.

For Base and Table, select the same Airtable base and table you configured in the Airtable Trigger. This ensures that the workflow updates the record that originally started the execution:

Airtable Update record node connected to the Dynamic Slideshow Videos base and table.

Set Mapping Column Mode to Map Each Column Manually. Under Columns to match on, select id.

Under Values to Update, map the record id from the Airtable Trigger to id (using to match):

Airtable Update record node using the same base and table as the trigger, matching on the Airtable record ID, and mapping the ID from the trigger.

Set Ready to Process to enabled so the checkbox remains selected when the record is updated. Because its value doesn't change, Last Modified remains unchanged and the update won't trigger the workflow again.

For Video, switch the field to expression mode and enter:

{{ [
  {
    url: $json.url,
    filename: $('Airtable Trigger').item.json.fields.Name + '-slideshow.mp4'
  }
] }}

The expression creates the attachment array expected by Airtable. $json.url is the public URL returned by the preceding Creatomate node. The filename uses the Name from the Airtable record, resulting in a recognizable name such as Whiskers-slideshow.mp4. The preview should begin with [Array:

Airtable Video attachment field mapped to the Creatomate MP4 URL with a filename based on the Airtable record name.

Click Execute step. Airtable downloads the MP4 from the Creatomate URL and stores its own copy in the Video attachment field.

Open the Airtable base and confirm that the matching record now contains a playable video attachment:

Airtable record containing the completed slideshow as an MP4 attachment in the Video field.

This keeps the input content and finished video together in the same Airtable record, where the video can be previewed or downloaded when needed.

Tip: If Airtable is only being used to track renders and another step immediately publishes or stores the video elsewhere, you can use a URL field instead and map {{ $json.url }}. Creatomate-hosted render files are available for up to 30 days, so this URL is suitable for temporary access but not permanent storage.

Storage note: Video attachments count toward the Airtable storage allowance. For high-volume workflows, consider moving the finished files to dedicated cloud storage and saving that location in Airtable instead.

Here's the video generated from my sample record:

And that's it! Save and activate the workflow when you're ready to process future Airtable records automatically.

What's next for dynamic video creation with n8n

The completed workflow turns a variable number of images stored in Airtable into a dynamic video and saves the finished MP4 to the same record.

The JavaScript in step 4 uses the exact field and scene names from this tutorial. If you use another Airtable base or template, update the code to match your setup. You can also change the scene-selection logic, introduce your own ordering rules, or choose different layouts for particular image orientations.

Depending on your use case, the final step could instead upload the completed video to cloud storage, send it for review, add it to a content management system, or pass it to a publishing workflow.

To generate more of the content automatically or extend the finished videos with narration and subtitles, continue with these tutorials:

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 →