To find the LinkedIn conversations about the problem you solve, search the week’s public posts for the phrases your buyers actually write (the pain in their words, the category term, competitor names), have an agent judge each post against your ICP, and read one digest of the few worth joining. Every Monday, Cargo’s social-listening cookbook runs one capped search, picks at most five posts and up to ten commenters who look like buyers, and posts the digest to a locked Slack channel. A human decides whether to join.
Keywords decide what you buy. Positioning copy returns vendors talking to each other; buyer language (“our lead routing broke again”) returns buyers.
Deploy it #
npm install -g @cargo-ai/cli
cargo-ai login --email you@company.com
cargo-ai cdk add cookbook/social-listening # inside a Cargo project
Before you keep the keywords, run the search once by hand and read ten results:
cargo-ai orchestration action execute \
--action '{"kind":"connector","integrationSlug":"linkedin","actionSlug":"searchPosts"}' \
--data '{"searchKeywords":"\"lead routing\" OR \"speed to lead\"","datePosted":"Past week"}' \
--wait-until-finished
Then set the keywords in infra/social-listening/models/linkedin-posts.ts and the Slack channel id in infra/social-listening/agents/listener.ts, and run cargo-ai cdk plan and cargo-ai cdk deploy.
How it works, end to end #
Monday 05:00 UTC linkedin_posts syncs one capped LinkedIn post search (fetchPosts, past week)
Monday 07:00 UTC social_listener agent:
reads the ICP, pains and competitors from your workspace context
drops every post already in the surfaced_posts ledger
picks at most five worth joining, each tied to a context line
reads comments on those five only (searchPostComments)
names up to ten commenters whose headline matches an ICP persona
posts one digest to the locked Slack channel
records the picked posts in surfaced_posts
The search is the purchase. linkedin_posts is a model on the LinkedIn fetchPosts extractor, with the query in its config: searchKeywords, sortBy: "Latest", datePosted: "Past week" and a limit. LinkedIn returns one capped page, so limit is 20 to 100 in steps of 20. The extractor is not incremental and each sync replaces the rows, which is why “already surfaced” lives in a separate ledger.
The ledger keeps posts, not people. surfaced_posts holds post_urn, post_url, surfaced_at, reason and slack_ts, one row per post put in front of the team plus one row per digest. The agent checks it before reading any comment and writes to it only after the digest posted, so a re-run the same day costs a fraction of a full run and posts nothing.
An evaluator checks the run. The agent carries a rubric: exactly one digest, no post already surfaced, every pick tied to a named line of the ICP or pains, every engager quoted from a comment that was read, and no engagement action.
When the cookbook was deploy-tested on 2026-10-04, a 20-post search landed 21 posts from the past week, the listener surfaced 3 in one digest, and a second run the same day found the digest row and posted nothing.
What comes back #
One Slack post a week, in this shape (a section with nothing true to say is omitted):
- What the market said this week: the theme across the picks, or “Quiet week”.
- Worth joining: at most five posts, each with the author, a one-line gist, the context line that decided it, the link and the comment count.
- Warm engagers: commenters only, at most three per post and ten in all, each with their headline as written and the first sentence of what they said.
- Searched: how many posts were read and how many were already surfaced, so a quiet week never reads as a broken run.
What it needs #
- A Cargo project on
@cargo-ai/cdk1.0.92 or later, with authorized LinkedIn, Slack and Anthropic connectors. - Your ICP, pains in the buyer’s words and competitors in the workspace context. The agent excludes your own company and people from picks.
- A Slack channel id, with the bot invited. The digest names people, so the channel is locked in the agent’s configuration.
What it costs #
| Step | Credits (list price) |
|---|---|
fetchPosts, the weekly search | 0.05 per post returned (2 credits a week at the default limit: 40) |
searchPostComments, on picked posts only | 0.05 per comment returned |
| The listener agent | LLM tokens on your Anthropic connector |
On the live test the agent run, not the search, was most of the bill, because it reads the ICP, personas, objections and insights before it judges a post. Read the run’s usage after the first week (cargo-ai ai message get <uuid>) before you raise limit. A daily variation exists (datePosted: "Past 24 hours", daily crons on the model and the agent): seven searches a week instead of one.
What it will not do #
- Engage on anyone’s behalf. No like, comment, connection request, message, follow or profile visit. Those actions exist on the same LinkedIn connector, none is wired, and the cookbook’s contract test fails if one is added.
- Store a list of people. Engagers appear in that week’s digest, quoted from a public comment, and are not kept anywhere.
- Look anyone up. An engager’s employer is what their own headline states, or nothing.
- Post anywhere but the locked channel, or read comments on posts it did not pick.
Deploy it from the social-listening cookbook. For a one-off check of named accounts, see monitor buying signals on a list of accounts.