# B2B Outbound Engine — ICP to Ready-to-Send Sequences (AI) (`noniner/b2b-outbound-engine`) Actor

The whole outbound motion in one run: describe your ideal customer, get a prioritized list of in-market companies — each with an intent score, a pre-call brief and a ready-to-send multi-touch email sequence. Orchestrates the full fuze B2B suite.

- **URL**: https://apify.com/noniner/b2b-outbound-engine.md
- **Developed by:** [Fredrik Hansson](https://apify.com/noniner) (community)
- **Categories:** Lead generation, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$600.00 / 1,000 account packageds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## B2B Outbound Engine — ICP to Ready-to-Send Sequences (AI)

**The whole outbound motion in one run.** Describe your ideal customer (and/or paste a company list), say what you sell, and this Actor hands back a **prioritized set of account packages** — each company with a **buying-intent score**, a **one-page pre-call brief** and a **ready-to-send multi-touch email sequence**. It is the capstone of the fuze B2B suite: one call orchestrates discovery, intent scoring, account research and sequence writing, then assembles everything into an account package sorted highest-intent first.

You bring your ICP. It hands back a pipeline you can work today. It **never sends** — you review the sequences and send from your own tool, so you stay in control of consent, volume and deliverability.

***

### The flow

```
  ICP / domains / dataset
          │
          ▼
  ┌───────────────┐   discover   ┌──────────────┐   score    ┌───────────────┐
  │  RESOLVE      │ ───────────▶ │  INTENT      │ ─────────▶ │  filter by    │
  │  companies    │              │  RADAR       │            │  minIntent    │
  └───────────────┘              └──────────────┘            └───────┬───────┘
                                                                     │
                      ┌──────────────────────────────────────────────┤
                      ▼                                              ▼
              ┌──────────────┐                              ┌───────────────┐
              │  PRE-CALL    │                              │  EMAIL        │
              │  BRIEF       │                              │  SEQUENCE     │
              └──────┬───────┘                              └───────┬───────┘
                     └───────────────────┬──────────────────────────┘
                                         ▼
                        PRIORITIZED ACCOUNT PACKAGES
             (intent score · brief · talking points · sequence)
```

1. **Resolve companies.** Start from an `icp` (the engine discovers matching companies for you), a `domains` list, a chained `datasetId`, or any mix of the three.
2. **Score buying intent** for every company and keep only those at/above your `minIntentScore`.
3. **Write a pre-call brief** and a **ready-to-send email sequence** for the companies that pass.
4. **Assemble one account package per company**, sorted by intent — your prioritized call sheet.

***

### What you get per company

For every packaged company you get a complete **account package**:

1. **`intentScore`** (0–100), **`stage`** (cold / aware / warming / in-market) and a **`recommendation`** (prioritize / nurture / skip) — so you work the hottest accounts first.
2. **`keySignals`** — the concrete buying signals the engine observed, plus **`icpFitScore`** and **`topTechnologies`**.
3. **`outreachAngle`** and **`personalizedHook`** — the sharpest way in, grounded in real company data.
4. **`briefMarkdown`** — a clean one-page pre-call brief, plus **`talkingPoints`** and **`discoveryQuestions`** for the call.
5. **`sequence`** — a ready-to-send multi-touch cold email cadence (`touches[]` with step, day offset, subject, body and purpose) and **`sequencePlain`**, the whole cadence as copy-paste plain text.
6. **`executiveSummary`** — a two-sentence top-of-package summary tying intent + brief + why-now (OpenAI `gpt-4o-mini`).
7. **`sourcesUsed`** — exactly which organs fired for this company, so you can trust the data.

***

### Three ways people use it

- **Founders running outbound solo** — go from an ICP description to pipeline in one run: **ICP to pipeline**, **AI outbound automation**, no stitching five tools together. Describe who you want, get in-market companies with **buying intent**, briefs and **sales sequences** ready to send.
- **SDR / sales teams** — feed a target account list and get a prioritized call sheet: intent scores, pre-call research and **end-to-end prospecting** in one place, so reps spend time selling instead of researching and writing.
- **Agencies running outbound for clients** — point it at a client's ICP, get a full outbound motion per account (intent → brief → **sales sequences**) you can hand over or run on their behalf. One repeatable, billable workflow across every client.

***

### How the orchestration works

This is a **super-actor**: it runs each organ **once** across all companies and degrades gracefully if any organ returns nothing.

| Stage | Organ | What it contributes |
|---|---|---|
| Discovery | [`fuze/b2b-lead-list-builder`](https://apify.com/fuze/b2b-lead-list-builder) | Turns your ICP into a ranked list of matching company domains. |
| Intent | [`fuze/b2b-intent-radar`](https://apify.com/fuze/b2b-intent-radar) | Scores buying intent, surfaces signals, outreach angle and personalized hook (enriches internally). |
| Brief | [`fuze/b2b-account-brief`](https://apify.com/fuze/b2b-account-brief) | One-page pre-call brief, talking points, discovery questions, cold opener. |
| Sequence | [`fuze/b2b-cold-outreach-sequencer`](https://apify.com/fuze/b2b-cold-outreach-sequencer) | Ready-to-send multi-touch cold email cadence. |

Each organ toggle (`discover`, `scoreIntent`, `writeBrief`, `writeSequence`) defaults to **on**. Turn any of them off to run a lighter, cheaper motion.

***

### Input

| Field | Type | Notes |
|---|---|---|
| `icp` | string | Ideal customer description. With `discover` on, triggers company discovery. |
| `domains` | array | Known company domains / URLs / emails to start from (used with or instead of the ICP). |
| `offering` | string | **Required.** What you sell — drives discovery, intent, brief and sequence. |
| `senderName` | string | **Required.** Signs the email sequences. |
| `senderCompany` | string | **Required.** The company you reach out on behalf of. |
| `datasetId` | string | Optional. Read company domains from a prior run's dataset (no-code chaining). |
| `datasetField` | string | Which dataset field holds the domain/URL (auto-detects `domain`, `website`, `companyDomain`, `url`). |
| `maxCompanies` | integer | Max companies to package. Default `15`, max `100`. Keep modest — this is a heavy run. |
| `minIntentScore` | integer | Only package companies at/above this intent score (0–100). Default `0`. |
| `numberOfTouches` | integer | Emails per cadence (last is a breakup). Default `4`. |
| `discover` / `scoreIntent` / `writeBrief` / `writeSequence` | boolean | Organ toggles, all default `true`. |
| `model` | string | Model for the executive summary. Default `gpt-4o-mini`. |

Provide **at least one** of `icp` (with discovery on), `domains`, or `datasetId`.

#### Minimal input — from an ICP

```json
{
  "icp": "Mid-sized Shopify skincare brands in the US",
  "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
  "senderName": "Fredrik Hansson",
  "senderCompany": "Fuze",
  "maxCompanies": 10
}
```

#### Minimal input — from a company list

```json
{
  "domains": ["stripe.com", "notion.so"],
  "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
  "senderName": "Fredrik Hansson",
  "senderCompany": "Fuze",
  "maxCompanies": 2
}
```

***

### Output example

One record per packaged company (sorted highest intent first):

```json
{
  "domain": "notion.so",
  "companyName": "Notion",
  "executiveSummary": "Notion is a fast-scaling productivity SaaS whose recent enterprise push and new security hires signal active SOC2 and compliance pressure. Lead with how your platform automates SOC2 evidence collection so their lean security team ships audits without slowing product.",
  "intentScore": 78,
  "stage": "in-market",
  "recommendation": "prioritize",
  "icpFitScore": 85,
  "keySignals": [
    "Hiring for a security/compliance role",
    "Expanding into enterprise plans with security requirements"
  ],
  "outreachAngle": "Position SOC2 automation as the way their lean security team keeps up with enterprise demand.",
  "personalizedHook": "Saw Notion is leaning harder into enterprise — SOC2 evidence collection is usually the bottleneck there.",
  "topTechnologies": ["AWS", "Segment", "Cloudflare"],
  "talkingPoints": [
    "Enterprise expansion raises the bar on security proof",
    "Automating evidence collection frees the security team"
  ],
  "discoveryQuestions": [
    "How are you handling SOC2 evidence collection today?",
    "Who owns compliance as you move upmarket?"
  ],
  "oneLineOpener": "Saw Notion is leaning harder into enterprise — SOC2 evidence collection is usually the bottleneck there.",
  "briefMarkdown": "# Account Brief — Notion\n**Domain:** notion.so  ·  **Industry:** Productivity software ...",
  "sequence": [
    { "step": 1, "dayOffset": 0, "channel": "email", "subject": "SOC2 without the fire drill", "body": "Hi — saw Notion ...", "purpose": "intro + value" }
  ],
  "sequencePlain": "— Email 1 (Day 0) —\nSubject: SOC2 without the fire drill\n\nHi — saw Notion is moving upmarket...\n\n— Email 2 (Day 3) —\n...",
  "sourcesUsed": ["b2b-intent-radar", "b2b-account-brief", "b2b-cold-outreach-sequencer"]
}
```

***

### Pay-per-event pricing

| Event | Price | Charged when |
|---|---|---|
| `account-packaged` | **$0.60** | Once per company turned into a complete outbound package (intent + brief + sequence). |

One `account-packaged` charge **bundles four orchestrated sub-actor runs** (discovery, intent, brief, sequence), so it is cheaper than buying each separately. The run logs its OpenAI token usage and estimated cost at the end, so the event price always stays safely above model cost.

***

### Compliance

This Actor **generates drafts only — it never sends anything**. You review each sequence and send it from your own email tool, so consent, volume and deliverability stay entirely in your hands. The sequences and briefs are grounded only in data the organs actually gathered; the AI is instructed never to invent facts, customers or news.

***

### Setup

The engine orchestrates fuze-owned sub-actors (no extra credentials needed) and makes one short OpenAI call per company for the executive summary. Set the environment variable / secret **`OPENAI_API_KEY`** on the Actor. Without it, every organ still runs and every package still ships — only `executiveSummary` is left empty.

***

### Use it from an AI agent (Apify MCP server)

This Actor is available through the [Apify MCP server](https://mcp.apify.com), so AI agents (Claude, ChatGPT, or anything that speaks MCP) can call it as a tool — hand it an `icp` or `domains` plus your `offering`, `senderName` and `senderCompany`, and read back ready-to-run account packages — with no custom integration code.

***

### Run it locally

```bash
npm install
## put your input in storage/key_value_stores/default/INPUT.json
export OPENAI_API_KEY=sk-...   # optional, enables the executive summary
apify run -p
```

***

### Chain it

This is the **capstone that runs the whole suite** — one call fans out to discovery, intent, brief and sequence organs and assembles the result. You can also run any organ on its own, or chain them manually via each Actor's `datasetId` field. Point the engine at a prior run's dataset (`datasetId`) to start from companies another Actor found.

### Related actors

- [B2B Lead List Builder](https://apify.com/fuze/b2b-lead-list-builder) — Describe your ideal customer; get a ranked list of matching companies with domains.
- [B2B Intent Radar](https://apify.com/fuze/b2b-intent-radar) — Score buying intent per company and surface the signals, angle and timing.
- [B2B Cold Email Sequence Writer](https://apify.com/fuze/b2b-cold-outreach-sequencer) — Turn domains into a ready-to-send multi-touch cold email cadence.
- [AI Prospecting Pipeline](https://apify.com/fuze/ai-prospecting-pipeline) — Turn target companies into ICP-scored leads, verified emails and personalized cold-email drafts.

# Actor input Schema

## `icp` (type: `string`):

Describe your ideal customer: industry, company size, geography and keywords. If set (and discovery is on) the engine finds matching companies for you. Example: "Mid-sized Shopify skincare brands in the US".

## `domains` (type: `array`):

Company domains, website URLs or emails (the domain is extracted). Use instead of — or together with — the ICP. One per line.

## `offering` (type: `string`):

Describe what your company sells. This drives discovery, intent scoring, the brief and the email sequence. Required.

## `senderName` (type: `string`):

Your name — used to sign the email sequences. Required.

## `senderCompany` (type: `string`):

The company you are reaching out on behalf of — used in the sequences. Required.

## `datasetId` (type: `string`):

Optional. Read the company domains from a previous Actor run's dataset — for no-code chaining via the Integrations tab.

## `datasetField` (type: `string`):

Which dataset field holds the domain/URL. Leave blank to auto-detect (domain, website, companyDomain, url).

## `maxCompanies` (type: `integer`):

Maximum companies to turn into full outbound packages. This is a heavy run (it chains intent + brief + sequence) — keep it modest. One pay-per-event charge per packaged company.

## `minIntentScore` (type: `integer`):

Only build full packages (brief + sequence) for companies at or above this buying-intent score (0-100). Leave at 0 to package everyone.

## `numberOfTouches` (type: `integer`):

How many emails in each company's cadence (last one is a breakup).

## `discover` (type: `boolean`):

When an ICP is given, use fuze/b2b-lead-list-builder to find matching companies. Turn off to only use the domains/dataset you provide.

## `scoreIntent` (type: `boolean`):

Run fuze/b2b-intent-radar to score each company's buying intent and surface signals, and filter by minimum intent score.

## `writeBrief` (type: `boolean`):

Run fuze/b2b-account-brief for a one-page pre-call brief, talking points and discovery questions per company.

## `writeSequence` (type: `boolean`):

Run fuze/b2b-cold-outreach-sequencer for a ready-to-send multi-touch cold email cadence per company.

## `model` (type: `string`):

Model for the short per-company executive summary (default gpt-4o-mini).

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "notion.so"
  ],
  "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
  "senderName": "Fredrik Hansson",
  "senderCompany": "Fuze",
  "maxCompanies": 15,
  "minIntentScore": 0,
  "numberOfTouches": 4,
  "discover": true,
  "scoreIntent": true,
  "writeBrief": true,
  "writeSequence": true
}
```

# Actor output Schema

## `accounts` (type: `string`):

All packaged accounts (intent + brief + sequence) in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "stripe.com",
        "notion.so"
    ],
    "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
    "senderName": "Fredrik Hansson",
    "senderCompany": "Fuze"
};

// Run the Actor and wait for it to finish
const run = await client.actor("noniner/b2b-outbound-engine").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "domains": [
        "stripe.com",
        "notion.so",
    ],
    "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
    "senderName": "Fredrik Hansson",
    "senderCompany": "Fuze",
}

# Run the Actor and wait for it to finish
run = client.actor("noniner/b2b-outbound-engine").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "stripe.com",
    "notion.so"
  ],
  "offering": "We sell a SOC2 compliance automation platform for SaaS companies.",
  "senderName": "Fredrik Hansson",
  "senderCompany": "Fuze"
}' |
apify call noniner/b2b-outbound-engine --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,noniner/b2b-outbound-engine"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LhVSzDsqQIndKEbiQ/builds/NmFKXGVyRmyYsSGC6/openapi.json
