---
name: first-run-setup
description: Take a brand-new CampaignStack workspace from empty to its first campaign. Use after someone signs up, connects an account, or asks how to get started.
---

# Set up a new CampaignStack workspace

The order matters. Each step is what makes the next one produce something
usable, and skipping the grounding is why a first campaign writes generic
messages.

## 1. Find out what you are holding

```
campaignstack_whoami
```

Returns the workspaces this connection reaches. Tools default to the only one;
with several, pass `workspaceId` on every later call.

## 2. Ground the workspace before anything writes

```
campaignstack_get_workspaces(include: {playbook: {}})
campaignstack_edit_workspace(settings: {offerContext, sections, outreachIntents})
```

- `offerContext` is the factual answer to "what do we sell, and to whom". Every
  message is allowed to promise exactly what is written here and nothing else,
  so a thin offer context produces vague messages, not short ones.
- `sections` is the playbook, five scoped fields. The tool's `sections`
  description lists each target and cap: a write over the cap is rejected, not
  truncated. Write to the target, not the cap.
- `outreachIntents` answers "why are we writing to these people". It is an
  unranked menu: each message picks the outcome that fits the person reading it.
  Without it, messages read as a compliment followed by an open question.

If the workspace has a website, `campaignstack_analyze_company_website` then
`campaignstack_refresh_workspace_playbook` produces a first draft of all of it to edit
rather than a blank page.

## 3. Connect an account

```
campaignstack_get_accounts(workspaceId)
```

An account is a person's LinkedIn or Google identity. Nothing sends without one,
and the voice every message is written in is learned from that person's own
messages: `campaignstack_refresh_identity_voice` once there is history.

## 4. Say who you do not contact

```
campaignstack_get_exclusions(workspaceId)
campaignstack_edit_exclusions
```

Your own company, your employer and your current clients. Onboarding seeds the
obvious ones; the gap is usually a colleague at a second company.

## 5. Build the first campaign

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

The goal is what the campaign wants, in the user's own words, and it seeds the
campaign's intents. If the goal promises something the offer does not mention (a
free audit, a sample), write that into `offerAddendum` on the campaign or the
messages will not be allowed to offer it.

Then give it an ICP (`{op: "icp", campaignId, data, rescore: true}`), a
workflow and a source. Skills `create-campaign` and `launch-linkedin-outreach`
walk through both:

```
campaignstack_edit_workflow(operations: [{op: "create", ...}])
```

The workflow is created paused.

## 6. Check what it will say BEFORE it says it

```
campaignstack_preview_craft_prompt(workflowId, nodeId, leadId)
```

Free, and it renders the exact prompt the first message will be written from.
Fix the grounding now rather than reading the first ten drafts.

## 7. Keep the first sends gated

Build the first workflow with a review step before every LinkedIn send, and
enable it (`op: "set_enabled"`) only on the person's yes. Then
`campaignstack_get_reviews` and `campaignstack_decide_review` to approve,
edit-and-approve, or reject (skill `clear-review-queue`). The rejections are
the signal: two or three tell you which setting is wrong.
