Campaign variant studio for every market and format
Upload one master creative, fill a grid of market and format variations, and send only the versions you approve to a dated Drive folder.
I want a campaign variant studio where my marketing team turns one master creative concept into the full matrix of market and format variations a campaign actually needs, and nothing ships until a human approves it. Build it as an app using fal.ai for generation, Google Drive for delivery of approved assets, and Slack Bot for the announcement.
The app opens on a list of campaigns, each row showing the campaign name, the master reference thumbnail, the size of its matrix, and how many cells are approved out of the total. Creating a campaign takes me into a campaign workspace where I upload the master reference image and write the brand prompt describing the creative concept, the product, and the visual rules every variant has to hold. Persist the campaign, its brief, the master image, and every cell with its state so the grid survives a reload and the whole team works from the same board.
When I upload the master reference, put it on the fal.ai CDN with the Upload Input File operation and keep the returned access_url on the campaign record. Every model run that needs to hold the master composition passes that URL into the image_url input, so the upload happens once per campaign rather than once per cell.
Below the brief I define the matrix axes. Rows are markets and languages, columns are aspect ratios or placements. I can add, rename, and remove rows and columns, and the grid re-renders as a table of tiles where each tile is one market and format combination. Each cell holds its own prompt text, its generated image, a status of empty, queued, running, ready, approved or failed, and a short note if the agent flagged it as weak.
Before any batch runs, show me what the grid will cost. Call Estimate Pricing for the models and cell count the run would use, and render the total in a confirmation step with a per-model breakdown. The generate button never starts a batch directly. It always opens this estimate first and waits for me to confirm.
Confirming fills the grid. Submit each cell as its own run with Submit Queue Request (Async) so the batch goes out in parallel, and use Stream Queue Request Status to drive live per-tile progress. Keep the request_id, status_url and response_url that each submit returns on the cell record, and use those returned URLs directly when checking status or fetching the result rather than rebuilding the path, because a model sub-path collapses to its base app id. Use Generate or Edit Image with Nano Banana for cells that adapt the master composition, and Generate Image with FLUX1.1 [pro] or Generate Image with Recraft V3 for style-controlled variants where a cell is better built fresh than edited from the master.
Clicking a tile opens it large with its prompt, its market and format, and the model that produced it. From there I can approve the cell, or edit the prompt and regenerate just that cell. A regenerate submits one new run for that one cell and replaces only that tile when it returns. It must never re-queue the rest of the grid, and approved cells elsewhere stay approved and untouched.
A Build the matrix button starts a background agent. It reads the campaign brief, the master reference and the market list, then writes a localized and culturally adjusted prompt for every cell instead of mechanically translating one prompt, accounting for language, local context, and what reads as native in each market. It runs the batch through the same queue path, then reviews the returned images and reports back into the app with the per-cell prompts it used and a short list of the cells that came out weak. Show the agent progress and its final report inside the campaign workspace, and flag the weak cells visually on their tiles so I know where to look first.
A publish step takes only the approved cells. Create a dated campaign folder in Google Drive with Create Folder named for the campaign and the run date, copy each approved image into it with Upload File (Multipart) using a filename that carries the market and the format, and produce a share link with Create Permission. Copy the approved assets into Drive rather than passing along the fal.ai output URLs, since generated files are served from a media host and should not be treated as their long-term home. Then announce the finished pack to a channel I pick using the Slack Bot Send a Message operation, including the campaign name, how many cells shipped, and the Drive link.
Three rules matter most and should be enforced in the handlers, not just the UI. The approval gate is the whole point, so a cell that is not approved never reaches Drive and never appears in the Slack announcement. The cost estimate always appears before a batch runs. And per-cell regeneration must never force a rerun of the entire grid. Show the approved count against the total at the top of the workspace, and keep publish disabled until at least one cell is approved.
What does this prompt do?
- Upload one master creative and a brand brief, then lay out a grid with your markets and languages down one side and your ad sizes or placements across the top.
- Fill the whole grid in one run, with every cell written for its own market instead of stretched from a single version.
- Review each tile up close, regenerate any single cell with a tweaked prompt, and approve the ones that work.
- Only approved versions get copied into a dated campaign folder in Google Drive with a share link, and your team gets a Slack message when the pack is ready.
What do I need to use this?
- A fal.ai account with credit on it, since every image run is billed to your balance
- A Google Drive account to hold the approved campaign folders
- A Slack workspace where the finished pack can be announced
- A master reference image and a short brand brief covering the concept, the product, and the visual rules every variant has to hold
- Your list of target markets and languages, and the sizes or placements the campaign needs
How can I customize it?
- Change the axes to suit the campaign: markets and languages down one side, aspect ratios, placements or channels across the top.
- Pick which model runs each cell, holding the master composition for close adaptations or generating fresh for style-led variants.
- Choose the Slack channel for the announcement and set how the Drive folder and the exported filenames are named.
FAQs
Can anything reach Google Drive before I approve it?
Will I know what a run costs before it happens?
If one cell comes out wrong, do I have to regenerate the whole grid?
Does it just translate one prompt into every language?
How big can the grid get?
How will I know which cells need attention?
Related templates
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.
A personal queue of every overdue Guru card, sorted by how late it is, with one-click verify, reassign, comment, and an agent that drafts the refresh for you.
Stop rebuilding the same campaign for every market.
Expand one master creative into every market and format the campaign needs, approve what works, and ship only that.