← Files Cargo CLIARCHIVED FILE

skills/cargo-gtm/guides/writing-outreach.md

7.18 KB · Oct 4, 2026 · 12:30 UTC

↓ Download file

# Writing outreach

How to use Cargo's LLM providers and AI agent surface to score, qualify, and personalize outreach. Covers provider routing, prompt patterns, and integration with sequencers.

> **Gate — run before any prompt on this page.** [`../references/acceptable-use.md`](../references/acceptable-use.md) §3: *basis* (which permission covers this audience), *suppression* (unsubscribe / DNC / hard-bounce filtered out first), *relevance* (why this message, for this recipient). All three are free; any failure is stop-and-ask. Nothing here sends — the output is variables for the user's own sequencer, under its limits and identities. Drafted copy carries an honest sender and subject, a working opt-out, and a postal address where required (§4).

## LLM provider routing

Cargo exposes five LLM providers as `kind: "connector"` actions with credits-based pricing. All expose a single `instruct` action that takes a prompt + model and returns text.

| Provider | Strengths | Cost (credits, cheapest model) |
|---|---|---|
| **anthropic** | High-quality reasoning, long context, structured output via JSON mode | Haiku: 0.2 / Sonnet: 0.2 / Opus: 2 |
| **openAi** | Broadest model selection (gpt-5 family, gpt-4o), native JSON-schema output | nano: 0.006 / gpt-5: 0.2 / 4o: 0.5 |
| **perplexity** | Web-grounded research with citations | Sonar: 0.3 / Sonar-pro: 1 |
| **gemini** | Cheapest large-context option | Flash: 0.01 |
| **deepSeek** | Lowest-cost reasoning when latency isn't critical | varies |

For most outreach tasks: **anthropic Haiku** (0.2) is the right default. For deep research with citations: **perplexity sonar-pro**. For batch personalization on a large list: **openAi gpt-5-nano** (0.006 — ~30× cheaper than Haiku). Costs are per 1,000-token package — full tier tables live in the [`anthropic`](../provider-playbooks/anthropic.md) / [`openAi`](../provider-playbooks/openAi.md) / [`gemini`](../provider-playbooks/gemini.md) / [`perplexity`](../provider-playbooks/perplexity.md) playbooks.

## Prompt patterns

### Lead scoring

```
You are an ICP fit scorer. Given a company profile, return a JSON object:
{
  "score": <integer 0-10>,
  "reasoning": "<one sentence>",
  "qualified": <true|false>
}

Company profile:
- Domain: {domain}
- Industry: {industry}
- Employee count: {employee_count}
- Tech stack: {technographics}
- Recent funding: {funding}

ICP criteria: {icp_description}
```

Use anthropic Haiku with `output: {"type": "jsonSchema", "jsonSchema": {...}}` to enforce structured output.

### Personalization (one-paragraph opener)

```
Write a single short paragraph (≤ 60 words) opening a first-touch email to
{first_name}, {title} at {company}. Reference the most relevant signal from the
company profile below — if none of the signals give a reason to write to this
person specifically, output exactly: NULL. Sound like a peer, not a vendor.
No "I hope this finds you well."

Company profile: {firmographics}
Recent signals: {signals}
ICP angle: {icp_angle}
```

Run with openAi gpt-5-nano for batch jobs (cheap, fast). Inputs come from earlier enrichment passes — keep the prompt short to amortize cost.

### Qualification rubric

```
Return PASS or FAIL with a one-sentence reason.

Criteria (ALL must hold):
1. Company has 50–500 employees.
2. Company is in {target_industries}.
3. Company has at least one {target_role} on the team.
4. Company shows recent intent: hiring for {target_intent_role} OR using {target_tech} OR raised funding in last 12 months.
```

## Multi-pass pipeline (research → score → personalize)

Run as three sequential `action execute-batch` calls, piping each step's output into the next:

```bash
# Pass 1 — Research (perplexity for fresh web context)
cargo-ai orchestration action execute-batch \
  --action '{"kind":"connector","integrationSlug":"perplexity","actionSlug":"instruct"}' \
  --records '[{"prompt":"What is <company> known for? 2-sentence summary.","model":"sonar"}, ...]' \
  --wait-until-finished > /tmp/research.json

# Pass 2 — Score (anthropic with structured output)
cargo-ai orchestration action execute-batch \
  --action '{"kind":"connector","integrationSlug":"anthropic","actionSlug":"instruct"}' \
  --records '<scoring inputs combining enrichment + research>' \
  --wait-until-finished > /tmp/scores.json

# Pass 3 — Personalize (openAi mini for cost)
cargo-ai orchestration action execute-batch \
  --action '{"kind":"connector","integrationSlug":"openAi","actionSlug":"instruct"}' \
  --records '<personalization inputs for high-scored leads only>' \
  --wait-until-finished > /tmp/openers.json
```

Filter between passes — only run pass 3 on leads that scored above your threshold in pass 2. Saves credits.

## Sequencer integration

Once leads are enriched, scored, and personalized, push to a sequencer:

| Provider | Action | Notes |
|---|---|---|
| **lemlist** | `upsertLead` | Maps name/email/company directly. Custom fields go in payload. Email finder + verifier built in. |
| **lgm** (LaGrowthMachine) | `createLead` | Audience-driven; create the lead and assign to an audience. |
| **instantly** | (CRUD) | Sequencing platform, use HTTP for direct API or check the `instantlyV2` integration. |
| **smartlead** | (CRUD) | Similar to instantly. |
| **outreach** / **salesloft** | (CRUD) | Enterprise sequencers. CRM-style integrations. |
| **heyReach** | (CRUD) | LinkedIn-focused outbound. |

These are mostly free CRUD operations (no credits) — push the personalized list with `action execute-batch` and the sequencer handles the campaign.

## CRM sync

If the user wants the enriched + scored data in their CRM:

| Provider | Action | Notes |
|---|---|---|
| **hubspot** | `upsertRecords` | Map cargo columns to HubSpot properties. `enrollToSequence` for sequence enrollment. |
| **salesforce** | (CRUD) | Lead / Contact / Account objects. |
| **pipedrive** | (CRUD) | Person / Organization / Deal objects. |
| **attio** | (CRUD) | Custom-object friendly. |

CRM CRUD is free (no credits). Compose ad hoc — find the action with `cargo-ai orchestration action list <keywords> --integration-slug <slug>`, then read its input schema via `cargo-ai connection integration get <slug>` and run via `orchestration action execute-batch`.

## When to use Cargo AI agents instead of raw LLM `instruct`

Cargo's `cargo-ai` skill (capability layer) lets you create persistent agents with system prompts, tools, and memory. Use those when:

- The agent needs RAG (upload a PDF for grounded answers).
- You want multi-turn chat with persistent context.
- The same prompt runs hundreds of times — define an agent once, invoke many.

For one-shot scoring or personalization across a batch, raw `instruct` is simpler and cheaper.

See [`../../cargo-ai/SKILL.md`](../../cargo-ai/SKILL.md) for the agent surface.

## Action shape rules

Same as everywhere else: `kind: "connector"` with `integrationSlug` + `actionSlug`, and **no `config`** — a top-level action carries none, and `connectorUuid` is never nested inside one.

For LLM `instruct` actions, the `model` field is in the per-record data, not in `config`:

```json
{
  "kind": "connector",
  "integrationSlug": "anthropic",
  "actionSlug": "instruct"
}
```

Per-record:
```json
{
  "prompt": "...",
  "model": "claude-3-5-haiku-latest",
  "maxTokens": 500
}
```

SHA-256: 26fd312857f8dc9c80abaff76d47a27a9c4d80d0224d74620590b63de5e901ca