---
name: launch-linkedin-outreach
description: Take a CampaignStack campaign to a running LinkedIn workflow with every send behind review. Use when a campaign exists and outreach should start, or when someone asks how sourcing, pacing and safety limits work.
---

# Launch LinkedIn outreach

CampaignStack sends; you set it up. Nothing starts without the user's yes.

## 1. Sender

`campaignstack_get_accounts`: pick a LinkedIn account with a live session.
Its `safety` block shows daily budgets, warm-up and any risk pause, all set
in the app. A new account warms up: low volume, rising over weeks. Say what
that means for pace.

## 2. Source

Campaign pool: leads scored against the ICP, above `scoreMin`. Or a list:
`campaignstack_edit_lead_list(op: "create", name, campaignId)`, then
`campaignstack_import_leads(rows, leadListId)` (100 rows a call).

## 3. Build

`campaignstack_get_workflow_node_types` lists nodes, configs and exits.
Review-first sequence:
0 `ai:craft_note` 1 `review:content` 2 `linkedin:connection_request`
`{noteMode: "static"}` 3 `linkedin:reactive {eventType:
"connection_accepted", timeoutDuration: 336}` 4 `ai:craft_message`
5 `review:content` 6 `linkedin:send_message` 7 `linkedin:conversation
{responseMode: "draft_and_review"}`. Chain them; label `approved` out of
each review and `accepted` out of 3. Config `{}` where none is given.

```
campaignstack_edit_workflow(operations: [{op: "create", name,
  campaignId, sourceConfig, graph: {nodes, edges}}])
```

Pool `sourceConfig`: `{providers: [{id: "pool", type: "campaign_pool",
priority: 0, enabled: true, config: {scoreMin: 60, rules: [], logic:
"and"}, state: {leadsSourced: 0, exhausted: false, dailyCapSourced: 0}}],
processingOrder: "cascade", globalDailyCap: 20, exclusions: []}`.
For a list: `type: "lead_list", config: {leadListId}`. `globalDailyCap`
is leads admitted per day.

It starts paused. Attach the sender with op `set_linkedin_accounts`
`{workflowId, accountIds}`.

## 4. Preview

`campaignstack_preview_craft_prompt(workflowId, nodeId, leadId)` per craft
node, on one fitting lead. Free. Fix grounding now (`audit-craft-config`).

## 5. Start

Tell the user the account, source and daily cap, that every note and
message waits for review, and that pacing spreads sends over business
hours. On an explicit yes:
`campaignstack_edit_workflow(operations: [{op: "set_enabled", workflowId,
enabled: true}])`. A list can be pushed now with
`campaignstack_trigger_workflow(workflowId, confirmed: true)`.

## 6. After

Drafts land in `campaignstack_get_reviews` (skill `clear-review-queue`).
A deferred send is the safety system pacing the account: report it.
`campaignstack_get_workflows(ids, include: {stats: {}})` shows where leads
sit; `campaignstack_diagnose_workflow_sourcing(workflowId, leadId)` says why
a lead did or did not enter.
