100 AI-generated static ads, brand-owner review hub, 46 launched live in Meta — built two different ways. Here's what actually happened, and what the prompt should have been.
Every step that actually ran, vs the version of the step that would have run if the brief had been airtight.
/v1/images/generations (text-only). AI invented its own bottle each time. $6.24 wasted./v1/images/edits with the real cutout. But the post-crop chopped headlines placed near the edges. Another $6.24 wasted.expires_in ≥ 59 days via debug_token before storing. Saved renewal one-liner. Re-ran launcher. 46/46 live.debug_token first. If expires_in < 5,000,000s, exchange to long-lived. Then proceed./v1/images/edits + real cutout + safe-zone prompt. Showed operator first. ~$0.06.Here's the prompt I sent in. It was good — conversational, scoped, time-boxed. It even named the constraint that ended up being the failure point.
i need you to review tiny shield's ad account and understand the type of content that is performing and isnt. review the headlines, hooks, messaging, angles, etc. then we need to turn the winning concepts into seriously good iterations. seriously outside the box thinking. there are 22 types of ads in the matrix so lets take every winning angle and make 22 statics using gpt image 2. you have the product cutouts for reference images. you know what works. its important that these look different. id like to see a maximum of 100 static ads. i'll be back in one hour to review. please have them in an html hub where i can easily approve and reject.
What went wrong: I told the agent "you have the product cutouts for reference images." It chose to describe the bottle in text instead of passing the cutout to the image API. Same words, two completely different actions. The agent took the easier path. I lost 2 batches and ~$13 finding out.
The instruction was there. The agent's discipline wasn't. The fix isn't to write a longer prompt — it's to make the prompt impossible to misinterpret.
Same conversational tone. Same scope. But the reference-image instruction is now load-bearing, not parenthetical — and the brand-owner step is explicit so the agent builds the right infrastructure on the first pass.
Build me a 100-ad review hub for my TinyShield account.
Pull my top 5 performing angles from the last 90 days and run each one through all 20 CDM formats. Use the bottle cutout as the reference image — don't describe it, pass it to gpt-image-2 directly. Show me 1 sample before generating the rest.
Deploy the hub to Cloudflare with a way for me to approve/reject each one. When I'm done, launch the approved set into my April Copy campaign as one new ad set going to homepage. UTM everything.
Budget: $25.
Four sentences. ~85 words. Still conversational. But every load-bearing constraint is unambiguous.
Brevity in the prompt requires depth in the system. Every piece of context the long prompt had to spell out is something a well-built operator already has installed. This is the work you do once so every future brief can be short.
brand-states/tinyshield.json.performance-decoder handles "pull top performers." creative-iteration-engine handles the matrix run. meta-ads-launcher handles the launch. Each skill enforces its own discipline.explicit-instructions-are-constraints. credentials-persistence. 1→approval→scale gate. The agent doesn't repeat your past failures because it remembers them.2 wasted batches. ~$13 in API spend I didn't need to spend. About 2 hours of clean-up across two sessions. And a 100-ad batch that came out perfect on the third try when it should have come out perfect on the first. Every prompt you write either has the constraint inside it, or you pay to find out. I paid. Don't.