An approval workflow for AI-made ads: what the reviewer has to see

By the Puncho team · Updated

An approval workflow for AI-made ads has one job: the person who says yes must have read every word that will appear. That sounds too obvious to write down. We wrote it down after an ad of ours carried six lines of copy that no reviewer had seen.

This page belongs to our guide to AI agents for Meta ads. It's about the creative half of approval. Money and activation are covered in the guardrails guide.

The ad that got past review

The concept had a headline, a body text and a call to action, each in its own field, each shown on the review screen. A person read them and approved.

The concept also had an image prompt. Inside it sat an instruction that ran roughly: three short lines exactly, followed by the lines themselves in quotes. Six lines of copy in all. The image model did as asked and drew them into the picture.

Nobody had hidden anything. The agent had written a prompt the way a person would. But the review screen showed the fields, and the prompt was a paragraph of art direction nobody reads word by word. The ban list checked the fields too. So six lines of ad copy in the client's language went through approval unread and unchecked, and into a finished image.

We found it by reading production data afterwards. That is a bad way to find it.

Every word on the image is a field

The fix was structural. A concept now carries a list of every string that appears in the rendered image: headline, captions, badges, small print. That list is what the approver reads, what the ban list and Meta's character limits are checked against, and what gets set as type.

Three rules follow from it, and each closes a gap.

No image model is ever asked for lettering. Words on an ad are set as text layers in the brand's font, the way a designer would set them. Generated parts are pictures only, and each one is read back for stray words when it arrives.

Art direction holds no quoted words. The brief for the picture says what the picture is. A linter looks for quoted copy inside prompts, across every concept.

Edits to the design write back to the list. When someone changes a headline on the canvas, the list changes in the same save. The design is the source of truth, and the fields can never describe an ad that no longer exists.

Finished ads made elsewhere get the same treatment in reverse. An export from Figma arrives with its words locked in pixels, so it can't be approved or launched until every word has been transcribed into fields, and the transcription is checked against the image before it's saved.

Approve the render, not the idea

There are two decisions in making an ad, and it's worth keeping them apart.

The first is cheap: is this idea worth building? Here the reviewer sees the concept as words and a short art brief. Most ideas should die at this point, and killing them costs nothing.

The second is the one that counts: is this finished ad fit to run? Here the reviewer sees the exported image at both sizes, feed and story, with the text that will sit around it in the feed. Approval attaches to that render.

Then any change withdraws it. A new headline, a swapped photo, a different colour palette: each produces a different ad, and the earlier approval was for the earlier one. We reset the decision automatically on every new export, because "I only changed one word" is how unapproved ads get out.

What a model can check, and what it can't

Run the mechanical checks before a person sees anything, so their attention goes where it's needed.

CheckWho does it
Banned words and phrasesCode
Meta's character limitsCode
Text inside the safe area at 9:16Code
Contrast, type sizes, headline lengthCode
The picture contains no stray wordsThe agent, reading blind
It sounds like the brandA person
The claim is true and the client would stand behind itA person
It should runA person

The "reading blind" row needs a word of explanation. After an ad is exported, the agent transcribes the words it can see in the image without being told what they should be. Code then compares the transcription with the list. The agent never grades its own work, and a mismatch is flagged before anyone approves.

Rejections are the most useful thing a reviewer produces

Most approval tools treat a rejection as a dead end. The ad is archived and the reason, if anyone typed one, is never seen again.

We kept rejected concepts from the start, on the theory that they were a signal for later. For a long time nothing read them. The data model described them as training signal and no part of the system used them, which is a polite way of saying we were throwing them away slowly.

Now a rejection takes a reason, and the next batch is written with the last fifteen rejected concepts and their reasons in front of the agent. It matters most for voice. A brand is defined as much by what it won't say as by what it says, and a rejection is a judgement on real creative, which beats any tone-of-voice note written in advance.

One thing to tell reviewers: reject the mechanism, and say so. "Too pushy" on a countdown-timer concept should stop the next three fake-urgency ideas as well. A reworded near-miss is the same concept and deserves the same answer.

Where the client fits

For an agency there are usually two approvals, and the order matters.

  1. Internal. The account lead reads the finished ad against the brief. Most problems end here, and the client never sees them.
  2. Client. The client sees finished ads only, at both sizes, with the feed text. They approve or reject with a reason.

Record who decided and when, on the ad itself. Three weeks later, when someone asks who signed off the one with the discount claim, the answer should take seconds.

Keep the client out of the idea stage unless they ask for it. Concepts with no picture invite feedback on things that aren't decided yet, and you end up revising an ad that doesn't exist.

A short checklist

  • Every word in the image is in a field the reviewer reads.
  • No words are drawn by an image model.
  • Approval is given to an exported render, at every size it will run.
  • Any change withdraws approval.
  • Mechanical checks run before a person looks.
  • A rejection carries a reason, and the next batch reads it.
  • Who approved, and when, is stored on the ad.

Approval decides what may run. What it may spend, and who switches it on, is a separate set of controls: see the guardrails for an AI agent running Meta ads.

Questions people ask

Who should approve an AI-generated ad?
A person who answers for the brand: the account lead at the agency, the client, or both in that order. Another model can check an ad against rules, such as banned words and character limits, and that is worth doing first. It cannot decide that the brand would say this.
Does a small edit after approval need a second approval?
Yes. A changed headline, a different picture or a different colour palette is a different ad, and the approval was given to the earlier one. Withdraw approval automatically on any change so nobody has to remember.
What should happen to rejected ads?
Keep them, with the reason. A rejection is a judgement about real creative, which makes it the best description of the brand's voice you will get, and the next batch should be written with the last rejections in front of the agent.

More in this series

Give your agent somewhere to work

Puncho is the canvas where an agent drafts, a person approves, and every ad starts paused.