# Launch campaign image set

> Produce one coherent set of on-brand statics - resolve the product, prove one prompt, fan it out across every placement.

Source: https://advibly.com/docs/use-cases/launch-campaign-image-set



A campaign set is not five unrelated images. It is **one prompt system**
rendered at several aspect ratios, so the placements look like they came from
the same shoot.

The cost of getting this wrong is paid at the end, in a set you have to redo.
So render one **proof** first, and only fan out once the proof is right.

## Resolve the subject [#resolve-the-subject]

```
advibly_list_brands {
  context: "Finding the brand and its identifier before producing the requested launch campaign image set for the user."
}
  → brand_id, brand_type
```

`brand_type` decides where the subject comes from:

| `brand_type`              | The subject of the ad                                                   |
| ------------------------- | ----------------------------------------------------------------------- |
| `ecom_store`              | A catalog product. Call `advibly_get_products` and hold a `product_id`. |
| `website`                 | The offer itself. Describe the scene; there is no product photo.        |
| `app_ios` / `app_android` | App-store screenshots, already in `advibly_get_assets`.                 |

Passing `product_id` attaches that product's hero photo as a reference, so the
generated image features the real product rather than a plausible-looking
invention. On a store brand, use it.

## Open a project [#open-a-project]

A set is a pipeline, and a pipeline that skips this scatters a dozen loose
files across the user's library.

```
advibly_create_project {
  brand_id,
  name: "Spring launch statics",
  context: "Grouping every image of the requested launch campaign set under one project in the user's library."
}
  → project_id
```

Pass that `project_id` on every generation call below. Free.

## Write the prompt system once [#write-the-prompt-system-once]

Every image in the set shares a scene, a lighting setup, a palette behaviour
and a type treatment. Write that paragraph once and change only the framing
per placement.

```
advibly_generate_image {
  brand_id,
  project_id,
  product_id?,
  prompt: "Photorealistic overhead flat-lay on warm sand-coloured linen, soft
    late-afternoon window light from the left, real fabric texture and visible
    grain. The product sits centre-right, label facing camera. Headline
    \"Made for mornings\" in the brand display face, upper-left, generous
    margin. No watermark, no stray text, no unrelated logos.",
  quality: "medium",
  context: "Rendering one proof image for the requested launch set before committing the full set of placements."
}
```

Three rules that decide whether the set is usable:

* **Put on-image text in quotes, exactly as it should read**, spell the brand
  name out, and say where it sits. Anything described loosely comes back
  loosely.
* **Leave hex codes and font names out when `on_brand` is on.** The brand kit
  is attached as a reference automatically, and restating it in the prompt
  fights the reference. Describe the scene instead.
* **Ask for real texture and candid framing** rather than quality words like
  `8K` or `cinematic`, which push the model toward stock-photo gloss.

<Callout>
  `brand_id` decides where the generation is **filed**. `on_brand` (default
  true) decides whether brand **styling** is applied. They are separate
  arguments, and a set that came back off-brand is usually `on_brand: false`.
</Callout>

## Check the proof [#check-the-proof]

The proof is good when the product is the real product, the headline reads
character-for-character as written, and the composition has room for the text
at every ratio you are about to request.

If the text came back wrong, fix the prompt rather than the model. If the
product came back wrong, you are missing `product_id`.

## Vary the argument, not the aesthetics [#vary-the-argument-not-the-aesthetics]

A set is five **angles**, not twelve variations of one. The look stays fixed;
the line it makes changes:

| Angle      | The line it makes                |
| ---------- | -------------------------------- |
| Problem    | The thing that is annoying today |
| Product    | What it is, plainly              |
| Offer      | The launch price or the deadline |
| Proof      | A number, a review, a result     |
| Comparison | Against the obvious alternative  |

Change the headline and the staging per angle. Keep the scene, the light and
the type treatment from the proof.

## Fan out the placements [#fan-out-the-placements]

Generate each placement rather than cropping one image. A 9:16 built as 9:16
puts the headline where it belongs; a 1:1 cropped to 9:16 puts it off-screen.

One call per placement, changing `aspect_ratio` and nothing else:

| `aspect_ratio` | Placement                      |
| -------------- | ------------------------------ |
| `1:1`          | Feed square, marketplace       |
| `4:5`          | Instagram and Facebook feed    |
| `9:16`         | Stories, Reels, TikTok, Shorts |
| `16:9`         | YouTube, display, website hero |
| `3:2` / `21:9` | Email header, wide banner      |

`num_images` renders up to four variants of the **same** call and bills for
each, which is the right tool for picking between takes at one ratio, and the
wrong one for covering several ratios.

## Raise quality for the finals [#raise-quality-for-the-finals]

Explore at `medium`. Raise only the placements that ship.

| `quality`       | When                                                  |
| --------------- | ----------------------------------------------------- |
| `low`           | Thumbnails and layout tests.                          |
| `medium`        | The default. Every proof, and most finals.            |
| `high`          | A hero placement. Roughly four times `medium`.        |
| `xhigh` / `max` | A print or billboard crop. Each step is another \~4x. |

`resolution` moves independently: `1K` for a proof, `2K` (the default) for
social, `4K` when the asset gets cropped or printed.

Story and Reels placements put platform UI over the top and bottom of the
frame. Ask for generous margins there, and check nothing that matters sits
under the chrome.

<Callout type="warn">
  `high` and above, with several brand references attached, occasionally runs
  past five minutes. Re-submitting does not cancel the first render and you pay
  for both - see [Generation statuses](/reference/generation-statuses).
</Callout>

## Collect the set [#collect-the-set]

Fast renders return `status: completed` with their URLs inline. Slower ones
return `status: pending` and a `generation_id`; call `advibly_get_generation`
for those, and only when you need the URL for a next step.

```
advibly_list_generations {
  brand_id,
  project_id,
  type: ["image"],
  limit: 24,
  context: "Collecting every completed image from the requested launch set so the user receives the finished placements together."
}
```

`type` is a list, and `limit` defaults to 4 - a six-placement set comes back
truncated without it.

Set the strongest placement as the project cover, so the library shows the
campaign rather than a cropped variant:

```
advibly_update_project {
  project_id,
  cover_generation_id,
  context: "Setting the hero placement as the project cover so the finished campaign set is identifiable in the library."
}
```

## Next [#next]

* Schedule the set: [Schedule a week of posts](/use-cases/schedule-a-campaign).
* Turn a still into motion: [UGC video ad, end to end](/use-cases/ugc-video-ad).
* Hand the whole job to an agent: the `static-ads`
  [skill](/agents/skills) runs this across fifteen proven layouts.
