# Generate Ad Creative

> End-to-end ad creative generation for Clarido — from performance analysis to rendered video variants. Use when creating new ad creatives, video ads, or marketing content.

- Skill: `majiayu000/generate-ad-creative` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/generate-ad-creative`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/generate-ad-creative/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/generate-ad-creative

---


# Generate New Ad Creative

End-to-end workflow for generating new Clarido ad creatives. Invoked by the user with `/generate-ad-creative`.

This skill covers the full pipeline: analyzing existing ad performance, generating two creative concepts (explore vs exploit), producing multiple asset variants, composing in Remotion, rendering final outputs, and documenting everything for auditability.

## Workflow Overview

### Phase 1: Performance Analysis & Concept Generation
### Phase 2: User Selection
### Phase 3: Asset Generation (multiple variants)
### Phase 4: Remotion Composition & Rendering
### Phase 5: Output Packaging & Documentation

---

## Phase 1: Performance Analysis & Concept Generation

### Step 1.1 — Pull Current Ad Performance

Use the Meta Marketing API to pull performance data for all active and recent campaigns.

```python
# Key metrics to pull per ad:
# - CTR (click-through rate)
# - CPL (cost per lead) or CPA (cost per action)
# - ROAS (if applicable)
# - Video metrics: ThruPlay rate, video_p25/p50/p75/p100 (retention curve)
# - Spend, impressions, reach, frequency
# - Creative type (video, image, carousel)
# - Ad copy / headline
# - Audience targeting summary
# - Date range active
```

Use the Meta Marketing API credentials from `.env`:
- `META_ACCESS_TOKEN`, `META_AD_ACCOUNT_ID` (`act_217614761779242`)
- API version: v21.0
- Currency: CAD

Pull data at the **ad level** (not campaign or ad set) to evaluate individual creatives.

### Step 1.2 — Analyze & Identify Patterns

Analyze the data to identify:
- **Top performers**: Which creatives have the best CTR, lowest CPL, highest retention?
- **Creative patterns**: What emotional hooks, visual styles, lengths, and formats work?
- **Audience patterns**: Which targeting is working best?
- **Drop-off patterns**: Where do viewers stop watching? (use video percentile metrics)
- **Gaps**: What emotional angles or formats haven't been tested yet?

### Step 1.3 — Generate Two Creative Concepts

Present **two concepts** to the user:

#### Concept A: Exploration (new territory)
- A creative that tests a **new emotional angle, visual style, or format** not yet represented in the account
- Should be informed by what's working but deliberately different
- Higher risk, higher potential upside
- Include:
  - Creative brief (hook, narrative arc, CTA)
  - Visual style description
  - Recommended duration (justify with retention data)
  - Audience targeting recommendation
  - Test plan: what metric will determine success, what's the minimum spend to validate, what's the kill criteria

#### Concept B: Exploitation (iterate on what works)
- A creative that is a **close variant** of the best-performing existing ad
- Change ONE variable: different hook, different visual treatment, different CTA, different pacing
- Lower risk, reliable baseline
- Include:
  - What existing ad it's based on and what's being changed
  - Creative brief
  - Audience targeting (same as original or slight variation to test)
  - Test plan: A/B framework against the original, success criteria

**Present both concepts clearly with a recommendation**, then ask the user which to proceed with. Allow the user to modify the concept before proceeding.

---

## Phase 2: User Selection

Ask the user to choose Concept A or B (or provide modifications). Once confirmed, proceed to asset generation.

---

## Phase 3: Asset Generation (Multiple Variants)

### Step 3.1 — Generate Video Clips (up to 3 variants)

Use Fal AI to generate video clips. Generate **up to 3 variants** with different prompts or parameters to give the user options.

- Use Kling V3 Pro for best quality: `fal-ai/kling-video/v3/pro/text-to-video`
- Use the queue API (submit → poll → download) since video generation takes 2-5 minutes
- Generate all variants in parallel to minimize wait time
- Default: 5 seconds, 1:1 aspect ratio, no audio
- Save to `videos/public/` with descriptive names: `{concept-name}-clip-v1.mp4`, `-v2.mp4`, `-v3.mp4`

**Cost awareness**: Each 5s Kling V3 Pro clip costs ~$1.12 (no audio). 3 clips = ~$3.36.

### Step 3.2 — Generate Background Music (3-5 variants)

Use ElevenLabs Music API (`POST /v1/music`) to generate background music variants.

- Generate **3-5 variants** with different prompts exploring different moods/instruments
- Each should match the ad's emotional arc (e.g., tense → calm, energetic → resolved)
- Set `force_instrumental: true` and `music_length_ms` to match ad duration
- Save as `{concept-name}-music-v1.mp3`, `-v2.mp3`, etc.

If ElevenLabs music fails (402), fall back to Fal AI Beatoven (`beatoven/music-generation`).

### Step 3.3 — Generate Sound Effects

Use ElevenLabs Sound Generation (`POST /v1/sound-generation`) for any needed SFX:
- Transition sounds, pop-ins, whooshes, etc.
- Keep duration short (0.3-1.0 seconds)
- Save to `videos/public/`

---

## Phase 4: Remotion Composition & Rendering

### Step 4.1 — Name the Composition

**Naming is critical.** Every ad lives in `videos/src/` alongside all others and appears in the Remotion Studio sidebar. Names must be descriptive enough to identify the creative at a glance months later.

**Naming convention**: `{Scenario}{Style}` in PascalCase.

- **Scenario**: The specific situation or emotional hook (not a generic category)
- **Style**: The visual treatment or format

**Good names:**
- `OverwhelmedInBedRealistic` — person in bed, realistic AI video
- `FounderAtDinnerClay` — founder checking phone at dinner, clay animation style
- `MorningJournalWatercolor` — morning journaling scene, watercolor illustration
- `ThreeAmThoughtSpiral` — 3am anxiety thought cascade
- `TodoListAvalanche` — to-do list growing out of control
- `ParkBenchReflection` — calm reflection moment on a park bench

**Bad names (too vague):**
- `OverwhelmAd` — which overwhelm ad? What style?
- `NewAd` — meaningless
- `VideoV2` — no context
- `LeadsCampaign` — describes the objective, not the creative

The name flows through everything:
- Directory: `videos/src/OverwhelmedInBedRealistic/`
- Composition IDs: `OverwhelmedInBedRealistic-Square`, `OverwhelmedInBedRealistic-Vertical`
- Folder in Remotion Studio sidebar: `OverwhelmedInBedRealistic`
- Output directory: `videos/out/2026-02-16_10-30-00-000_OverwhelmedInBedRealistic/`
- Asset file prefixes: `overwhelmed-in-bed-realistic-clip-v1.mp4`

### Step 4.2 — Build the Composition

Create the directory under `videos/src/{AdName}/`.

Follow Remotion best practices (see `videos/.claude/skills/remotion/` rules):
- All animations via `useCurrentFrame()` + `interpolate()` / `spring()` — NO CSS animations
- Use `<Sequence>` with `premountFor` for timing
- Use `<Audio>` and `<Video>` from `@remotion/media`
- Use `staticFile()` for assets in `videos/public/`
- Brand style: black/white with yellow (`#FFD60A`) accent
- Font: system font stack (`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`)

Structure:
```
videos/src/{AdName}/
├── config.ts          # Timing, constants, text content
├── index.tsx          # Main composition (layers video, overlays, audio)
├── [Components].tsx   # Scene-specific components
```

Register in `videos/src/Root.tsx`:
- Square format: `{AdName}-Square` (1080x1080)
- Vertical format: `{AdName}-Vertical` (1080x1920)
- Group in a `<Folder>` using the same `{AdName}`

### Step 4.2 — Render All Combinations

For the user-selected video clip and music track, render both formats:

```bash
cd videos
npx remotion render {AdName}-Square out/{output-dir}/square.mp4
npx remotion render {AdName}-Vertical out/{output-dir}/vertical.mp4
```

If the user wants to compare multiple video/music combos, render the preferred combinations.

---

## Phase 5: Output Packaging & Documentation

### Output Directory Structure

Every generation run produces a timestamped directory:

```
videos/out/{YYYY-MM-DD_HH-MM-SS-mmm}_{ad-name}/
├── square.mp4                    # 1080x1080 render
├── vertical.mp4                  # 1080x1920 render
├── assets/
│   ├── clip-v1.mp4               # Video variant 1
│   ├── clip-v2.mp4               # Video variant 2
│   ├── clip-v3.mp4               # Video variant 3
│   ├── music-v1.mp3              # Music variant 1
│   ├── music-v2.mp3              # Music variant 2
│   ├── music-v3.mp3              # Music variant 3
│   └── sfx/                      # Sound effects used
│       └── pop.mp3
├── BRIEF.md                      # Creative brief & documentation
└── performance-snapshot.json     # Ad performance data at time of generation
```

### BRIEF.md Contents

The brief must document:

```markdown
# {Ad Name} — Creative Brief

**Generated**: {timestamp}
**Concept type**: Exploration / Exploitation
**Based on**: {if exploitation, which existing ad and what was changed}

## Performance Context
- Top performing ad at time of generation: {name}, {CTR}%, {CPL}
- Account-wide averages: {CTR}%, {CPL}
- Key insight that informed this creative: {insight}

## Creative Concept
- **Hook** (0-3s): {description}
- **Narrative** (3-Xs): {description}
- **Resolution/CTA** (X-end): {description}
- **Duration**: {X}s (rationale: {why this length})
- **Format**: Video with text overlays, no voiceover / with voiceover

## Visual Style
{Description of the visual approach}

## Audio
- **Background music**: {description of selected track}
- **SFX**: {what sounds are used and when}

## Ad Copy (for Meta)
- **Primary text**: {suggested ad copy}
- **Headline**: {headline}
- **CTA button**: {Learn More / Sign Up / Download / etc.}

## Audience Targeting
- **Interests**: {list}
- **Demographics**: {age, gender, location}
- **Lookalike**: {if applicable}
- **Exclusions**: {existing customers, etc.}

## Test Plan
- **Objective**: {Leads / App Installs / Link Clicks}
- **Budget**: ${X}/day for {Y} days
- **Success metric**: {CTR > X% / CPL < $Y}
- **Kill criteria**: {If CPL > $Z after ${A} spend, pause}
- **What we're testing**: {the specific hypothesis}

## Asset Variants Generated
- Video clips: {count} variants
- Music tracks: {count} variants
- Selected combination: clip-v{X} + music-v{Y}

## Rendering
- Square (1080x1080): square.mp4
- Vertical (1080x1920): vertical.mp4
- Codec: H.264
- FPS: 30
```

### performance-snapshot.json

Save the raw ad performance data pulled in Phase 1 as JSON for future reference.

---

## Important Guidelines

- **Always run end-to-end**: Don't stop at code — generate assets, render videos, produce the output directory
- **Parallel generation**: Submit all video clip requests and music requests in parallel to minimize total wait time
- **Cost transparency**: Before generating, tell the user the estimated cost (video clips + music)
- **Brand consistency**: Yellow accent (#FFD60A), black/white palette, system fonts
- **Duration**: Default to 13-15 seconds based on retention data. Justify any different length
- **Muted-first design**: Ads should work with sound off (text overlays carry the message). Audio enhances but isn't required
- **User approval gates**: Get user approval at concept selection AND before final render (show asset options first)

