Skip to main content

Zap: Maintain a Frame.io Asset Index in Airtable

Learn how to automatically log Frame.io assets to Airtable and mark deleted files using two connected Zapier workflows

A
Written by Aaron Burns

This guide covers two Zaps that work together to keep an Airtable Asset Index up to date. The first logs new assets to Airtable when they are uploaded to Frame.io. The second marks records as deleted in Airtable when the corresponding file is deleted in Frame.io.

What you'll need

A Frame.io V4 account with Account Admin permissions

A Zapier account

An Airtable account with an Asset Index table configured (see below)

How these Zaps work together

Every asset uploaded to Frame.io is assigned a unique asset ID. This ID never changes and stays with the file regardless of where it is moved or renamed. It is the key that links both Zaps together. The first Zap logs the Resource ID to Airtable when an asset is created, and the second Zap uses that same ID to find and update the matching record when the file is deleted. Without the Resource ID field in your Airtable table, the second Zap cannot find the record to update.

A note on filters

By default both Zaps run for every asset across your entire workspace. For larger teams or accounts with multiple active projects, adding a filter to scope each Zap to a specific projects is strongly recommended. See Add a Filter to Your Frame.io Zap for instructions.

Airtable Setup

This guide does not cover the setup of the Airtable. Both Zaps are preconfigured to work with an Airtable Asset Index table with the following fields. These fields can be adjusted to match your team's existing table structure.

For logging assets:

  • Name

  • Download Link

  • View Link

  • Asset Type

  • Date Uploaded

  • Project

  • Uploader

  • Thumbnail

  • File ID

For marking deleted assets:

  • Name

  • Deleted At

  • Deleted

  • File ID

Note: The File ID field is used by both Zaps to identify and match records. Make sure this field exists and is consistently named in your table.

Step 1: Open the template

Click the button below

When the template opens, the guided setup wizard will launch automatically. Before exiting, confirm the Zap has been given a name and saved to the desired folder location. Then click Cancel, then Close setup to exit. Your Zap is saved and you can continue in the Zap editor.

Step 2: Connect your accounts

Frame.io: Select the account associated with the workspace where your Action is configured.

Airtable: Select the account that contains your Asset Index table.

Step 3: Set up the webhook and test the event trigger

Copy the webhook URL from the Test tab of the Catch Hook trigger step in Zapier.

In Frame.io, go to next.frame.io/settings/webhooks and create a new webhook.

Paste the Zapier URL into the URL field and subscribe to the file.ready and file.copied events. See Set Up Webhooks in Frame.io for full instructions.

To fire a test trigger, upload a file to your workspace and wait for it to finish processing. Return to Zapier and confirm the Catch Hook step has received the payload.

Zapier needs to receive the webhook payload before the later steps can be configured. Without it, fields including account ID, workspace ID, project ID, and asset (resource) ID will show an error and cannot be mapped. Once the payload arrives and each step is configured, click Test step to confirm data is flowing correctly before moving on.

Step 4: Confirm dynamic (custom) field mapping in the Show File step

Confirm the following fields in the Show File step are mapped to dynamic (custom) values from the webhook payload:

  • Account: Account Id from the webhook payload

  • File: Resource Id from the webhook payload

Each field must use the dynamic (custom) value from the payload, not a static value. Static values lock the Zap to a single hardcoded asset and it will run on that asset every time, regardless of what triggered the action.

Click Test step to confirm data is flowing correctly before moving on.

Step 5: Confirm the Show Project step

The Show Project step retrieves the project name using the project ID from the webhook payload. Confirm the following fields are mapped dynamically:

  • Account: Account Id from the webhook payload

  • Workspace: Workspace Id from the webhook payload

  • Project: Project Id from the webhook payload

Click Test step to confirm data is flowing correctly before moving on.

Step 6: Configure the Airtable step

Select your Airtable Base and Table. The following fields are mapped dynamically from Frame.io and should not be changed:

  • Name: file name

  • Download Link: original download URL

  • View Link: Frame.io view URL

  • Asset Type: media type

  • Date Uploaded: file created date

  • Project: project name from the Show Project step

  • Uploader: creator name

  • Thumbnail: thumbnail URL

  • File ID: resource ID from the webhook payload

Click Test step to confirm data is flowing correctly before moving on.

Step 7: Publish the Zap

Click Publish. The Zap is now live.

Mark Deleted Frame.io Files in Airtable

When an Action is triggered on a file that has been deleted in Frame.io, this Zap finds the matching record in your Airtable Asset Index and marks it as deleted.

Step 1: Open the template

Click the button below

Step 2: Connect your Airtable account

Frame.io: Select the account and workspace you want to monitor for deleted files.

Airtable: Select the account that contains your Asset Index table. This must be the same table used in Part 1.

Step 3: Configure the Frame.io trigger and test

Select your Frame.io Account and Workspace. The trigger fires automatically when a file is deleted in the selected workspace.

To fire a test trigger, delete a file from your workspace. Return to Zapier and confirm the trigger step has received the event.

Click Test step to confirm data is flowing correctly before moving on.

Step 4: Confirm the Airtable search step

The search step finds the Airtable record that matches the deleted file using the File ID from the webhook payload. Confirm the following:

  • Base: your Airtable base

  • Table: your Asset Index table

  • Search field: File ID

  • Search value: mapped dynamically from the Resource Id in the webhook payload

Click Test step to confirm the correct record is being found before moving on. A record will need to exist for for this test to work.

Step 5: Confirm the Airtable update step

The update step marks the matched record as deleted. It is pre-configured to:

  • Prepend (deleted)_ to the file name

  • Set the Deleted At field to the current timestamp

  • Set the Deleted field to true

Confirm your Airtable Base and Table are correctly selected. The record ID is mapped dynamically from the search step and should not be changed.

Step 6: Publish the Zap

Click Publish. The Zap is now live. When a deleted file Action is triggered in Frame.io, the matching Airtable record will be updated automatically.

Troubleshooting

Catch Hook is not receiving the payload

Make sure the webhook URL in your Action matches the URL from the Catch Hook trigger step exactly. Confirm the Action is active at next.frame.io/settings/actions.

Frame.io fields are empty in the Show File or Show Project steps

The Catch Hook has not received a payload yet. Complete the test trigger step before configuring the downstream steps.

Airtable record is missing fields

Confirm your Airtable table has all required fields and that each field in the Zap is mapped to the correct dynamic (custom) value.

Project name is not appearing in the Airtable record

Confirm the Show Project step is mapped to dynamic (custom) values from the webhook payload. If the project ID is hardcoded, the step will always look up the same project.

Airtable search step is not finding the record

Confirm the File ID field name in your Airtable table matches exactly what is configured in the search step. Also confirm the record was originally created by the Part 1 Zap with the File ID field populated.

Deleted record is not being updated

Confirm the record ID in the update step is mapped dynamically from the search step, not hardcoded.

Did this answer your question?