---
name: meta-ads-campaign-launch
description: "Create or update Meta Ads campaigns for paid demand probes: discover accounts/pages/pixels, create campaign/ad set/creative/ad, attach UTMs, activate safely, and return verified IDs."
version: 1.0.0
author: Hermes Agent
---

# Meta Ads Campaign Launch

Use this when launching or materially updating a Meta Ads campaign for a Consumer AI paid probe.

This is an execution skill. For strategy and probe design, load `paid-ads-probe-planning` first unless Antoine already provided the brief.

## Input

Required:

- Meta access token source, never pasted into logs if avoidable
- Ad account ID, e.g. `act_...`
- Facebook Page ID or Instagram actor where relevant
- Pixel/dataset ID and conversion event
- Campaign brief: venture, objective, budget, geo, age, audience constraints
- Landing URL with UTM plan
- Creative assets: image/video paths or existing creative IDs
- Primary text, headline, description, CTA

Optional:

- Existing campaign/ad set IDs to reuse
- Custom audiences/lookalikes
- Placement constraints
- App/lead form config

## Output

Return a verified launch report:

- Ad account ID/name
- Page/IG actor used
- Pixel/dataset ID/name
- Campaign ID, status, effective status
- Ad set ID, status, effective status, budget, optimization goal
- Creative IDs
- Ad IDs, status, effective status/review state
- Destination URLs/UTMs
- Any warnings or review/delivery blockers

Never print access tokens.

## Meta Graph API flow

Use the current Graph API version available in prior scripts unless a newer version is required.

### 1. Verify identity and access

Call:

```text
GET /me?fields=id,name
GET /{ad_account_id}?fields=id,name,account_status,currency,timezone_name
GET /{page_id}?fields=id,name
GET /{pixel_id}?fields=id,name,last_fired_time
```

If any fail, stop and report the exact missing permission/scope without dumping secrets.

### 2. Create campaign

For lead/conversion probes, typical objective:

```text
objective=OUTCOME_LEADS
status=PAUSED
special_ad_categories=[]
```

Create paused first. Activate only after ads exist and verification passes.

### 3. Create ad set

Typical website lead settings:

```text
campaign_id={campaign_id}
daily_budget={budget_cents}
billing_event=IMPRESSIONS
optimization_goal=OFFSITE_CONVERSIONS
promoted_object={"pixel_id":"...","custom_event_type":"LEAD"}
targeting={...}
status=PAUSED
```

Keep early targeting simple unless prior data justifies complexity.

### 4. Upload creatives

Images:

```text
POST /{ad_account_id}/adimages
multipart field: filename=@path
```

Videos use the video upload endpoint and require polling/processing checks before creative creation.

### 5. Create ad creative

For link ads:

```json
{
  "object_story_spec": {
    "page_id": "PAGE_ID",
    "link_data": {
      "link": "LANDING_URL_WITH_UTMS",
      "message": "PRIMARY_TEXT",
      "name": "HEADLINE",
      "description": "DESCRIPTION",
      "image_hash": "HASH",
      "call_to_action": {"type": "SIGN_UP", "value": {"link": "LANDING_URL_WITH_UTMS"}}
    }
  }
}
```

### 6. Create ads

Create one ad per creative unless running a specific dynamic creative test:

```text
POST /{ad_account_id}/ads
adset_id={ad_set_id}
creative={"creative_id":"..."}
status=ACTIVE or PAUSED
```

### 7. Activate safely

Preferred sequence:

1. Create campaign paused.
2. Create ad set paused.
3. Create creatives.
4. Create ads active or paused depending on approval gate.
5. Activate campaign and ad set only after all objects exist.
6. Fetch final statuses.

## Safety rules

- Never print, save to memory, or include access tokens in final replies.
- Pause rather than delete unless Antoine explicitly asks to delete.
- Stop before changing billing/payment methods.
- Do not make regulated/guaranteed claims.
- For recruiting/sports, avoid `get signed`, `guaranteed trial`, or agent-like promises.
- Use explicit daily budget in cents and report it back in currency.

## Verification

Before claiming launch:

1. Fetch campaign/ad set/ad objects by ID.
2. Confirm configured status and effective status.
3. Confirm destination URLs include UTMs.
4. Confirm pixel exists and has recent or expected firing status.
5. If effective status is `IN_PROCESS`, say it is under Meta processing/review, not fully delivering yet.

## Related skills

- `paid-ads-probe-planning`
- `meta-ads-performance-readout`
- `posthog-venture-telemetry`
