---
name: create-campaign
description: Define the offer, ICP and targeting for a new CampaignStack campaign and create it in an existing workspace. Use when someone wants to start a campaign, go after a new audience, or turn a goal like "book calls with agency founders" into a scored campaign.
---

# Create a campaign

A campaign is a goal plus the people it is for. Leads score against its ICP and
anyone under the bar is never contacted, so the ICP deserves the time.

## 1. Read what exists

```
campaignstack_whoami
campaignstack_get_workspaces(include: {playbook: {}})
campaignstack_get_campaigns
```

Read `offerContext` back to the user: messages may promise what it says and
nothing else. If it is thin or wrong, fix it first with
`campaignstack_edit_workspace(settings: {offerContext})`. If a live campaign
already covers this audience, extend it instead.

## 2. Agree the brief

Before any write, get in plain words:

- the goal, in the user's own sentence (it seeds the campaign's intents);
- who: titles, seniority, industries, company size, locations;
- one fit statement: why this person needs the offer now;
- anything offered beyond the workspace offer (an audit, a sample). It goes in
  `offerAddendum` (max 1,500 chars) or messages cannot offer it.

## 3. Create it

```
campaignstack_edit_campaign(operations: [{op: "create", title, goal,
  offerAddendum?, connectionDegreeMode?}])
```

`connectionDegreeMode`: `discovery` favours 2nd-degree strangers,
`relationship` favours people already connected. Keep the `campaignId`.

## 4. Add the ICP and a persona

```
campaignstack_edit_campaign(operations: [
  {op: "icp", campaignId, data: {titles, seniorities, industries,
    companySizes, locations: [{country}], keywords, fitStatement},
    rescore: true},
  {op: "persona", campaignId, data: {name, description, painPoints, goals}}])
```

Three exact titles score better than ten loose ones. `rescore: true` scores
leads already in the pool and can spend credits: say so first.

## 5. Topics (optional)

`campaignstack_get_campaigns(ids: [campaignId], include: {topicVocabulary: {}})`
lists valid topics. `{op: "topic", campaignId, data: {name, weight}}` adds one;
a weight above 0.8 also runs a LinkedIn search watch that brings in people
posting on it (3 per campaign).

## 6. Check

```
campaignstack_get_campaigns(ids: [campaignId], include: {icp: {}, personas: {}})
```

Read the ICP back. After scoring, `include: {icpScores: {icpId}}` shows who
qualifies. Too few matches means the ICP is narrow or the pool is thin: add
sources, keep the bar.

Next: https://campaignstack.io/skills/launch-linkedin-outreach/SKILL.md
