- AI Fire
- Posts
- One Product Photo, Five Social Assets: A Step-by-Step Nano Banana 2 Workflow (With Exact Prompts and Costs)
One Product Photo, Five Social Assets: A Step-by-Step Nano Banana 2 Workflow (With Exact Prompts and Costs)
Turn one product photo into five marketing assets with Nano Banana 2. Follow the prompts, see real costs, and learn how to fix common image editing mistakes.

Table of Contents

The input photo and four of the five assets this workflow produced. The fifth, a wide banner, is shown in Step 3.
Small brands rarely lack product photos. They lack the variations: a clean store image, a feed post, a story with a headline, a website banner, and a version in the new colour. This tutorial builds all five from a single photo with Nano Banana 2 (Google's Gemini 3.1 Flash Image), and shows the prompts, timings, costs and one failure we hit along the way.
The brand is fictional: Kestrel, a 750 ml insulated bottle in deep blue with "KESTREL" printed down the side. Because the product does not exist, we generated a stand-in "phone photo" on a kitchen counter as our input. In your own workflow, you would start from a real photo. The whole run took eight API calls and cost $0.0909.
The setup
Nano Banana 2 runs as an asynchronous job: you POST a request, get a task ID, and poll until the image is ready. We used the per-image route, model ID gemini-3.1-flash-image-preview. Adding image_urls turns a request into an edit of the images you pass. One helper covers every step below:
import os, time, requests
BASE = os.environ["IMAGE_API_BASE"] # your provider's /v1 URL
H = {"Authorization": f"Bearer {os.environ['IMAGE_API_KEY']}"}
def edit(prompt, refs, size, resolution="1K"):
body = {"model": "gemini-3.1-flash-image-preview", "prompt": prompt,
"n": 1, "size": size, "resolution": resolution, "image_urls": refs}
tid = requests.post(f"{BASE}/images/generations", headers=H,
json=body).json()["data"][0]["task_id"]
while True:
time.sleep(4)
d = requests.get(f"{BASE}/tasks/{tid}", headers=H).json()["data"]
if d["status"] in ("completed", "failed"):
return dEvery prompt that changes the scene starts with the same "lock" sentence. It tells the model what must not change:
Keep the bottle from image 1 exactly the same: same shape, same deep blue colour, same cap and loop, and the word KESTREL printed vertically in white.
Step 1: turn the photo into a clean store hero
The input photo has a kettle, wooden spoons, crumbs and a few scuffs on the bottle. A product page needs none of that.
Prompt: "Product hero shot. [lock sentence] Place it alone on a seamless warm sand-coloured studio background with soft top light and a gentle shadow. No other objects, no extra text." Size 1:1, 1K.

The input photo and the studio hero. The lettering, cap and loop match; the scuffs are gone.
Result: 1024×1024 in 13 seconds for $0.0108. The bottle kept its proportions, cap, black loop and lettering. The model also removed the small scuffs on the shoulder, which is what you want on a store page. If your brand rules say "show the product as it is", add "keep surface marks" to the prompt.
Step 2: a feed post and a story with a headline
For the 4:5 feed post we asked for an outdoor scene: "[lock sentence] The bottle stands on a flat granite rock beside a calm mountain lake at sunrise, a hiking backpack slightly out of focus behind it. Natural light, no extra text."
The 9:16 story added text, which is where image models usually slip:
Vertical social story ad. [lock sentence] The bottle stands on a snowy wooden
bench, cold blue morning light. At the top, a large bold white headline that
reads exactly "Cold for 24 hours. Hot for 12." At the bottom, a small white
line that reads exactly "New colour: Fjord Blue". No other text.
The feed post, a story draft at the lowest resolution setting, and the 2K final story.
Result: the feed post (928×1152, 13 s, $0.0108) needed no fixes. In both story versions every word of the headline and the bottom line was correct, including the full stops and the number. The draft set "New colour: Fjord Blue" in a serif typeface; the 2K final matched it to the headline's sans-serif. The "reads exactly" wording plus quotation marks is the habit to copy.
Midway through a workflow like this, the obvious question is whether to call the model directly or through an aggregator. We used the Nano Banana 2 API on a per-image route, which kept billing predictable: every 1K call cost the same $0.0108.
Website banners are wide. Nano Banana 2 supports ratios up to 8:1, so we asked for 4:1: "[lock sentence] The bottle stands on the right third, pine needles and a trail map beneath it, warm late-afternoon light. On the left, bold dark text that reads exactly "Built for the long trail" on a pale sand background."

Top: edited from the original photo, the kitchen survived. Bottom: edited from the clean hero, the trail scene appeared.
What failed: the first attempt, edited from the original kitchen photo, kept the window, kettle and counter, and simply scattered pine needles on the worktop. The text was correct and the size was right (2064×512), but the scene was wrong. The model treated "keep the bottle the same" as "keep the photo the same".
The fix: we used the Step 1 hero as the input instead, and added "Replace the studio background completely with an outdoor forest trail scene." The second attempt (12 s, $0.0108) put the bottle on a forest path with the map beside it, and set the headline on one line. The lesson: once you have a clean hero, use it as the input for every later step. A busy source photo leaks into edits.
Step 4: a new colourway in one sentence
Launching a second colour usually means a second photo shoot. Here it was one edit of the hero: "Change only the colour of the bottle's powder-coat finish from deep blue to burnt orange. Keep the background, lighting, shadow, cap, loop and the white KESTREL lettering exactly the same."

The blue hero and the burnt orange edit. Only the finish changed.
Result: 12 seconds, $0.0108. The background, shadow, steel cap and lettering stayed put, and the two images line up closely enough to use as a colour switcher on a product page. Treat it as a visualisation until the real product exists; the generated orange may not match your manufacturer's swatch.
Step 5: is a cheap draft worth it?
A common tip is to draft at low resolution and render the final at high resolution. We tested it on the story. The draft at the lowest setting took 40 seconds and cost $0.0135. The 2K final took 21 seconds and cost $0.0126, and came back at 1536×2752.

Time and cost for all eight calls.
On this route the draft saved neither time nor money. Per-image billing changes the advice: iterate on the prompt at the resolution you will publish, and save the draft habit for routes billed by resolution.
What to copy into your own workflow
Start every edit with a lock sentence that names the shape, colour and lettering to keep.
Make a clean hero first, then use it, not the original photo, as the input for every later asset.
Put on-image text in quotes after "reads exactly". All headline words in our run were correct.
Say "replace the background completely" when the scene must change.
Check per-image pricing before drafting low-res. Here it saved nothing.
Five campaign assets, one failure and its fix, eight calls, just over two minutes of total generation time, and nine cents. The work that remains is the human kind: checking each image against the real product and your brand rules before it goes out. To try the same workflow with other image models under one key, see APIMart.
Reply