# Claude for Sales: Add LinkedIn to Call Prep and Follow-Up

How to use Claude for sales calls – research the person, the account and your LinkedIn thread before the call, and draft the follow-up for your approval.

Most "Claude for sales" guides start in the CRM. This one is about one call, and the part of preparing for it that lives on LinkedIn: who this person is now, who you already know at their company, and what you last said to each other.

> **The short version.** Claude is already good at the CRM half of a sales call: Anthropic's Sales plugin researches the account, preps the agenda and summarizes the call from your CRM, call recorder, data providers and public web search. What it does not have is your LinkedIn account – who at that company you are already connected to, what you two last said in your LinkedIn thread, and a way to reply there. Connect Claude to your own LinkedIn account and it can read the person's recent posts, your connections at the account and your thread before the call, then draft the LinkedIn follow-up after it: a reply in that thread, or a connection note for someone new on the call. You approve every message before it is sent.

## What Claude already does for sales – and what your LinkedIn account adds

Anthropic's [Claude for Sales](https://claude.com/solutions/sales) offer is a [Sales plugin](https://claude.com/plugins/sales) with "ready-made skills for account research, call prep, call summaries, competitive intelligence, pipeline review", and connectors to Salesforce, HubSpot, Gong, Fireflies, Clay, ZoomInfo, Apollo, Outreach, Docusign, email and calendar. Its own Cowork tutorial frames the job as "[research any account before the first call](https://academy.claude.com/tutorials/using-claude-cowork-for-sales-account-research)", then run `/call-summary` afterwards. The plugin's [account research](https://github.com/anthropics/knowledge-work-plugins/blob/main/sales/skills/account-research/SKILL.md) works "via enrichment (web search + any connected data providers)", and its [call prep](https://github.com/anthropics/knowledge-work-plugins/blob/main/sales/skills/call-prep/SKILL.md) describes attendees from their CRM title.

That covers a lot. What none of the connectors in those sales materials do is link your own LinkedIn account, so the parts of a call that only your account knows stay outside it:

| Moment | What Claude uses today | What your LinkedIn account adds |
|---|---|---|
| Before the call – the account | CRM records, data providers, web search | Who works there and at what connection degree to you; the company's recent posts |
| Before the call – the person | CRM title, public web search | Their profile and experience, recent posts and comments as your account sees them, and whether you are connected |
| Before the call – your history | Email threads, call recordings | Your LinkedIn message thread with them |
| After the call | An email draft and a CRM update | A reply in the LinkedIn thread, a connection note for a new attendee, a check for their reply |

Claude can search the public web, but it has no access to your LinkedIn account by itself. The account reads and the sends below come from a tool connected to your account.

## Give Claude access to your LinkedIn account

- **claude.ai, the Claude Desktop app or Cowork:** add Linked API as a custom connector. One connector covers all three ([step-by-step](/mcp/installation#claude)).
- **Claude Code:** use the same MCP server, the agent-friendly [CLI](/cli/getting-started) or the ready-made skill (`npx @linkedapi/skills`, see [the LinkedIn skill](/skills/linkedin)).
- **What it runs on:** a dedicated cloud browser on your own account, at a human pace, inside the [per-action limits](/docs/admin-limits) and [working hours](/docs/working-hours) you set. Linked API never stores your password.
- **Turn on inbox monitoring once.** Ask Claude to run `sync_inbox` once for the account. It makes new replies show up when Claude checks the inbox, and it is what fires inbox webhooks if you automate the reply check later. Loading one person's history (`sync_conversation`) does not do this.
- **Sales Navigator:** the Sales Navigator tools (`nv_`) need a Sales Navigator subscription on the account and a Linked API Plus seat.

The full tool list is in [available tools](/mcp/available-tools), and the options for [giving an agent access to your LinkedIn account](/guides/linkedin-ai-agent) – what each connector holds and where actions run – are compared in the AI-agent guide.

## Before the call: the brief Claude builds from LinkedIn

Give Claude the meeting, the attendees' LinkedIn URLs and the company page, and tell it what to read. An example prompt:

```text
Discovery call with Acme on Thursday.
Attendees: Jane Doe, VP Sales – https://www.linkedin.com/in/jane-doe-example
           Raj Patel, RevOps lead – https://www.linkedin.com/in/raj-patel-example
Company: https://www.linkedin.com/company/acme-example

Using my LinkedIn account:
1. For each attendee, fetch their profile with experience, plus their posts
   and comments from the last 90 days. Check my connection status with them.
2. Fetch the company with its employees in sales, revenue and RevOps roles –
   once filtered to my 1st-degree connections, once to my 2nd-degree ones.
3. For each attendee, load our message history once, then read our whole
   conversation.
4. Write a one-page brief: per attendee – role and tenure, the two topics they
   posted or commented on most recently, our connection status, our last
   exchange. For the account – who I am connected to there, and 2nd-degree
   people worth a look. End with three openers, each tied to a post or a
   message, and the questions you could not answer.
Do not send anything.
```

What comes back looks like this – the names and details below are invented for illustration:

> **Jane Doe – VP Sales, Acme (2 years 4 months; before that, sales director at a payments company).** Posted twice this month about ramping new reps faster; commented on a thread about forecast accuracy. 2nd-degree connection, no message history.
>
> **Raj Patel – RevOps lead (8 months).** Connected (1st). Last exchange in June: you sent him a webinar link, he replied "will pass to the team".
>
> **At Acme:** you are 1st-degree with Raj and one account executive. Four 2nd-degree people in sales roles to investigate before you ask for an introduction.
>
> **Openers:** Jane's ramp-time post; Raj's June reply about passing it to the team; the forecast-accuracy thread. **Open:** Jane's previous company size is not on her profile.

The tools behind each step:

| Step | Tool | What it returns |
|---|---|---|
| Person, experience and recent activity | `fetch_person` with experience, posts and comments since a date | Profile, roles, recent posts and comments |
| Connection status | `check_connection_status` | Connected, not connected, or an invitation pending either way |
| Who you know at the account | `fetch_company` with employees filtered by position and connection degree (1st, 2nd, 3rd+) | Matching employees with name, headline and profile URL |
| Your thread | `sync_conversation` once per person, then `get_inbox` with the person's URL | The whole known conversation with that person |

Two boundaries to keep in the brief. The 2nd-degree filter returns employees you are two steps from, not the mutual connection who could introduce you – those are people to investigate, not a ready path. And Claude reads what your account can see: a private or limited profile stays limited.

## After the call: the LinkedIn follow-up

Paste your call notes – from `/call-summary` or your own – and ask for the LinkedIn half:

```text
Here are my notes from the Acme call. Using my LinkedIn account:
1. Draft a reply to Raj in our existing LinkedIn thread that confirms what we
   agreed and the next step.
2. Jane and I are not connected: draft a connection note of 200 characters
   or less that references the call.
3. Show me both drafts and wait. Never send without my explicit approval.
```

When you approve, Claude sends them: the reply with `send_message` into the existing thread – by its thread ID when the conversation has one, or by the person's URL when it does not (history loaded from a profile can carry no thread ID) – and the invitation with `send_connection_request` and your note. Connection notes are limited on free LinkedIn accounts, which get only [a few personalized invitations a month](https://www.linkedin.com/help/linkedin/answer/a563153); the [connection request guide](/guides/how-to-automate-linkedin-connection-requests) covers the details.

A day later, ask "did Raj or Jane reply?" and Claude reads `get_inbox` for each attendee's URL. Two things to know about that answer: the inbox updates on a periodic sync, so a message from minutes ago may not be there yet, and an empty result means no reply has been captured yet – not that none was sent. Replies are captured only once inbox monitoring is on.

## Run the reply check in code instead

If you would rather not ask, let replies come to you. With inbox monitoring enabled, every new message reaches your endpoint as an `inbox.messageReceived` [webhook](/docs/webhooks); without that step it receives nothing. The handler below routes a reply from a call attendee to the deal owner. Keep the attendees keyed by the `hashedUrl` from their `fetch_person` result: that is the form the inbox reports on every message, while the public URL can be missing.

```typescript
import express from "express";
import LinkedApi, { parseWebhookEvent } from "@linkedapi/node";

const linkedapi = new LinkedApi({
  linkedApiToken: "your-linked-api-token",
  identificationToken: "your-identification-token",
});

// Once per account: turn on inbox monitoring so replies are captured and webhooks fire.
async function enableInboxMonitoring(): Promise<void> {
  const workflow = await linkedapi.syncInbox.execute({});
  const { errors } = await linkedapi.syncInbox.result(workflow.workflowId);
  if (errors.length > 0) {
    throw new Error(`Inbox monitoring was not enabled: ${errors.map((error) => error.message).join("; ")}`);
  }
}

// Call attendees by the hashedUrl from fetchPerson, with the owner of the deal.
const attendees = new Map<string, { name: string; dealOwner: string }>([
  ["https://www.linkedin.com/in/ACoAAB-example", { name: "Raj Patel", dealOwner: "maria" }],
]);

declare function notifyDealOwner(owner: string, text: string): void;

const app = express();
app.use(express.raw({ type: "application/json" }));

app.post("/hooks/linkedapi", (req, res) => {
  // If signing is on, verify the signature on the raw body first (see the webhooks docs).
  const event = parseWebhookEvent(req.body as Buffer);

  if (event.type === "inbox.messageReceived") {
    const attendee = attendees.get(event.data.personHashedUrl);
    if (attendee) {
      notifyDealOwner(attendee.dealOwner, `${attendee.name} replied on LinkedIn: ${event.data.text}`);
    }
  }

  res.sendStatus(200);
});
```

```python
from fastapi import FastAPI, Request, Response
from linkedapi import LinkedApi, LinkedApiConfig, MessageWebhookEvent, parse_webhook_event

linkedapi = LinkedApi(
    LinkedApiConfig(
        linked_api_token="your-linked-api-token",
        identification_token="your-identification-token",
    )
)


def enable_inbox_monitoring() -> None:
    """Once per account: turn on inbox monitoring so replies are captured and webhooks fire."""
    workflow = linkedapi.sync_inbox.execute()
    result = linkedapi.sync_inbox.result(workflow.workflow_id)
    if result.errors:
        raise RuntimeError("Inbox monitoring was not enabled: " + "; ".join(error.message for error in result.errors))


# Call attendees by the hashed_url from fetch_person, with the owner of the deal.
attendees = {
    "https://www.linkedin.com/in/ACoAAB-example": {"name": "Raj Patel", "deal_owner": "maria"},
}


def notify_deal_owner(owner: str, text: str) -> None:
    ...  # post to Slack, create a CRM task, send an email


app = FastAPI()


@app.post("/hooks/linkedapi")
async def receive(request: Request) -> Response:
    # If signing is on, verify the signature on the raw body first (see the webhooks docs).
    event = parse_webhook_event(await request.body())

    if isinstance(event, MessageWebhookEvent) and event.type == "inbox.messageReceived":
        attendee = attendees.get(event.data.person_hashed_url or "")
        if attendee:
            notify_deal_owner(attendee["deal_owner"], f"{attendee['name']} replied on LinkedIn: {event.data.text}")

    return Response(status_code=200)
```

Deliveries are at least once, so deduplicate on the event `id` if a duplicate notification would matter. Whole-inbox automation – every thread, not one call's attendees – is covered in [how to automate LinkedIn messages](/guides/how-to-automate-linkedin-messages).

## Guardrails

- **You approve every send.** The prompts above say so, and the workflow never needs an exception.
- **Pace is enforced, not suggested.** Per-action limits and working hours apply whatever Claude is asked to do.
- **One account, one rep.** Each rep connects their own account; sharing one account across a team mixes threads and sender identity.
- **Claude reads what your account can see.** Private profiles stay private, and nothing here returns emails or phone numbers.
- **The CRM stays the system of record.** The brief and the follow-up feed it; they do not replace your CRM or your call recorder.

## Frequently Asked Questions (FAQ)

#### Can Claude connect to LinkedIn?

Yes, in two ways. LinkedIn's own connector in Claude's directory, [LinkedIn Hiring Pro](https://claude.com/marketplace/connectors/linkedin-hiring-pro), drafts and posts one free job and does nothing else. To work in your own account – read profiles, see who you know at a company, read and send messages – connect a tool on your account, such as Linked API as a custom connector, its MCP server, its CLI or its skill. See the [LinkedIn MCP server overview](/mcp/overview).

#### Does the Claude Sales plugin read LinkedIn?

Public web research and connected data providers can supply some LinkedIn information. The plugin's account research uses web search and connected data providers, and its call prep uses CRM titles. None of the connectors in Anthropic's sales materials links your own LinkedIn account, so your connections, your message threads and replies on LinkedIn are outside it.

#### Can Claude connect to LinkedIn Sales Navigator?

Yes, when the connected account has a Sales Navigator subscription and a Linked API Plus seat. Claude can then read Sales Navigator profiles and companies and send Sales Navigator messages through the Sales Navigator tools listed in [available tools](/mcp/available-tools).

#### Will Claude send messages without asking?

Not with this workflow: the prompt requires your explicit approval before anything is sent. The per-action limits and working hours on your account apply either way.

#### Can I do this in Claude Code instead of claude.ai or Cowork?

Yes. The same steps run in Claude Code through the MCP server, the CLI or the LinkedIn skill. For a marketing workflow in Claude Code, see [Claude Code for LinkedIn marketing](/guides/claude-code-linkedin-marketing); for finding and qualifying new prospects before there is a call, see [AI for sales prospecting](/guides/ai-sales-prospecting-linkedin).

## Build it in, or hand it to an agent

Build the reply routing and the brief into your own tools with the REST API, the [Node and Python SDKs](/sdks) or the [CLI](/cli). Or have Claude run it out of the box through the [MCP server](/mcp/available-tools), the agent-friendly CLI or a ready-made [skill](/skills). To map everyone involved in a deal, see [mapping a B2B buying committee](/guides/b2b-buying-committee); to watch for activity between calls, [LinkedIn buying signals](/guides/linkedin-buying-signals). Plans start at $49 a seat a month billed annually – see [pricing](/pricing).

*Facts verified October 29, 2026 – Anthropic's sales page, Sales plugin and Claude connector directory checked on that date.*
