# Campaign creative review board for Cloudinary artwork

> Approve or reject campaign artwork on one board instead of chasing sign off in email threads, with every decision recorded on the file.

- Workflow type: app
- Services: Cloudinary, Airtable, Slack Bot
- Categories: Marketing, Operations
- Published: 2026-08-16

## What it does

- Lists your campaigns down one side and loads every piece of artwork tagged to the campaign you pick, shown as review cards with a preview, dimensions, format and who uploaded it.
- Lets you approve or request changes on any card. Approving records your name and the date onto the file itself, and requesting changes makes you leave a note explaining what needs fixing.
- Rolls every decision up to the campaign record so the status and approved count stay current, with a progress bar showing how much of each campaign is signed off.
- Sends the designer who uploaded the file a Slack message with the verdict, your note and a link to the artwork, and lets a reviewer flip a decision back if they change their mind.

## What you'll need

- A Cloudinary account holding your campaign artwork
- An Airtable base with a table of campaigns, including a field that stores each campaign's tag name
- A shared tag on your assets that links artwork to a campaign, plus a tag that marks work as waiting on review
- A Slack workspace so designers hear about decisions

## Prompt

I want an app my marketing team uses to sign off on campaign artwork before it goes live, so approvals stop living in email threads. Reviewer identity comes from the logged in user, so every decision is attributed to a real person and the audit trail is genuine.

On first run, let me configure the app and save those settings: which Airtable base and table holds my campaigns, which field in that table holds the campaign's tag name, which field holds the campaign status, and which field holds the approved count. Do not hard code a schema. Read the table with Airtable List Records and let me map each field by picking from what the table actually contains. Let me also set the tag that means waiting on review (default needs-review) and the tag that means approved (default approved), plus an optional Slack channel to fall back to when a designer cannot be matched.

The main screen is a two pane board. Down the left, list every campaign from the configured Airtable table using List Records. Each campaign row shows its name, its current status, and a progress bar of approved assets against total assets for that campaign. Selecting a campaign loads its assets into the right pane.

For the selected campaign, read the campaign's tag from the mapped Airtable field and load every Cloudinary asset carrying that tag using List Resources by Tag, using Search Assets for filtering and sorting and List Resources by Asset IDs to refresh specific cards after a decision. Lay the assets out as review cards showing a preview image, the pixel dimensions, the file format and size, who uploaded it, and how long it has been waiting. Default the view to assets still carrying the review tag, oldest upload first. Let me switch the filter to approved, changes requested, or everything.

On each card give me an Approve button and a Request changes button. Approving uses Cloudinary Manage Tags to remove the review tag and add the approved tag, then uses Update Resource by Asset ID to write the reviewer's name, the decision and an ISO timestamp into the asset's context metadata, so the record of who approved what lives on the file itself.

Requesting changes opens a note box and will not submit until I type something. It records the note the same way, writing reviewer name, decision, timestamp and note text into context metadata with Update Resource by Asset ID, and tags the asset so it reads as changes requested rather than approved.

Let a reviewer flip a decision back if they change their mind. Reopening an approved asset swaps the approved tag back to the review tag with Manage Tags and appends the reversal to the asset's context metadata rather than erasing the earlier decision, so the full history stays intact.

After every decision, roll the result up to the campaign record in Airtable with Update Record so the status and the approved count stay current, and refresh the progress bar immediately. When every asset on a campaign is approved, set the campaign status to fully approved.

Also notify the designer who uploaded the asset. Take the uploader from the asset metadata, find their Slack account with Look Up User by Email, open a direct message with Open a Conversation, and send the verdict with Send a Message including the campaign name, the asset name, the decision, my note and a direct link to the file. If no matching Slack user is found, post to the fallback channel instead.

Handle Cloudinary pagination so campaigns with many assets load fully, keep the board responsive while decisions are saving, and show a clear empty state when a campaign has no tagged assets yet.

## How to customize

- Map your own Airtable fields for the campaign tag, status and approved count, and set which tag names mean waiting on review and approved
- Change the default view from waiting on review with the oldest first to show approved work, changes requested, or everything
- Send verdicts to a shared design channel instead of a direct message to the uploader

## FAQ

### Do designers need access to the review board?

No. Only reviewers open the board. The designer who uploaded a file gets a Slack message with the verdict, any note you left and a link to the artwork, so they never need a seat in the tool.

### Where does the approval actually get recorded?

In two places. The reviewer's name, the decision and the date are stamped onto the file itself in Cloudinary, and the campaign record in Airtable is updated with the current status and approved count. That means the audit trail survives even outside the app.

### Can I undo an approval if I change my mind?

Yes. Reopening an approved asset puts it back into the waiting on review state. The earlier decision is not erased, it is kept alongside the reversal so you can still see who approved what and when.

### Will this work with our existing Airtable setup?

Yes. You pick which of your fields holds the campaign tag, the status and the approved count when you set the app up, so there is no fixed structure to match and no need to rebuild your base.

### How does the board know which artwork belongs to which campaign?

The shared tag on your assets is the link. When you select a campaign, the app reads that campaign's tag name from your Airtable table and pulls in every asset carrying it, so anything tagged correctly shows up automatically.

Use this prompt in General Input: https://www.generalinput.com/prompts/campaign-creative-review-board-for-cloudinary-artwork