To nudge stalled deals every week, deploy Cargo’s stalled-deal-nudge cookbook: every Monday one agent posts a Slack digest per rep listing their open deals with no logged activity in 14 days or more, the line the last activity left off on, why each deal is worth a touch now, and a follow-up email drafted for the rep to send. It never sends anything to a prospect.
What the cookbook deploys, from its code in getcargohq/gtm-skills on 2026-10-16: 9 resources (one agent, three read-only deal models, one ledger model, two connectors, two folders), a Monday cron at 15:00 UTC, a quiet threshold of QUIET_DAYS = 14, and a ceiling of 80 steps per run.
The problem, and the answer #
An open deal rarely dies on a call. It dies in the weeks nobody logged anything, because no report puts the quiet ones in front of the rep with a reason to act. The answer is a weekly selection that computes the silence instead of trusting a property, and hands the rep a draft that picks up where the last conversation stopped.
How it works, end to end #
- The cron fires at 15:00 UTC on Mondays (
0 15 * * 1), 8am Pacific during daylight time, before the pipeline meeting. The agent reads the date with SQL, because it has no clock of its own. - It finds the stalled deals in SQL. Last activity is computed as the latest
occurred_atamong the deal’s rows ingtm_activities, never read off a property. A deal is stalled when it is open and its last activity is more than 14 days old. A deal with no activity at all is listed after the quiet ones as “never touched”, since the native deal model carries no creation date to age it by. - It drops deals already nudged this ISO week (for example
2026-W42), using thedeal_nudgesledger. If nothing is left, it posts nothing. For each remaining deal it counts earlier weeks, so a deal flagged three Mondays running says so. - It reads the last activity and your context. It quotes the line that matters from the most recent note, meeting or call, and reads your positioning, objections and competitors from the workspace context.
- It writes two things per deal. Why now: one sentence grounded in what it read, such as a close date about to slip or a next step nobody took. Draft: a follow-up of at most four sentences picking up from the quoted activity, with no bracketed placeholders.
- It posts one digest per owner to a locked Slack channel, deals ordered by amount, largest first, each with stage, amount, close date and days quiet. Owners are named from the
OWNERSmap in the prompt; a deal whose owner is not in it is grouped under “Unassigned or unmapped owner” rather than guessed. - It records each deal in the ledger after its digest posts, never before, so a failed post is retried next run.
What it needs and what it costs #
- Deals and activity. The example runs on Cargo native models,
gtm_opportunities,gtm_accountsandgtm_activities, with no CRM connector. With deals in HubSpot, Salesforce or Attio, swap those for connector-backed models and adapt the column names in the prompt’s SQL. - A Slack connector, with
channelIdset to the channel the digests may land in, and an Anthropic connector for the model. - Four values to set:
channelId, theOWNERSmap (owner ids to rep names),QUIET_DAYS, and the cron with the timezone named in the trigger text. @cargo-ai/cdk1.0.92 or later.
There is no enrichment provider and no per-record fan-out: the selection and the reads are SQL over the workspace’s own models. Slack postMessage carries no credit price in Cargo’s action catalog. The recurring cost is one agent run a week, billed as language model tokens through your Anthropic connector, growing with the number of stalled deals and capped by the step ceiling. A backlog bigger than one run posts what it has, and the ledger lets the next run pick up the rest. A CRM-backed setup adds the cost of the CRM extract.
What it will not do #
- Send a draft, or message a prospect. The draft is for the rep.
- Write to the deal, company or activity models. A nudge never moves, closes or reassigns a deal.
- Post anywhere but the locked channel, or post a deal twice in one week.
- Edit the workspace context.
- Read Slack history to decide what to post. The ledger is the only dedupe.
Deploy it #
npm install -g @cargo-ai/cli
cargo-ai login --email you@company.com
cargo-ai project add cookbook/stalled-deal-nudge
cargo-ai project plan
cargo-ai project deploy
Signing up from the CLI needs no browser and no card, and comes with 100 free credits. Fill OWNERS and QUIET_DAYS in infra/stalled-deal-nudge/agents/nudger.prompt.ts and channelId in nudger.ts before you plan. The stalled-deal-nudge cookbook page lists every resource and the CRM-backed variation.
The draft is only as specific as the last logged activity. Capture every sales call into your go-to-market repo, and track the next steps promised on those calls so a broken promise surfaces before the deal goes quiet.
Frequently asked questions #
It computes each open deal’s last activity in SQL, as the latest logged
email, meeting, call or note, and flags the deal when that is more than
QUIET_DAYS ago, 14 by default. A deal with no activity at all is listed as
never touched.
No. It drafts a follow-up and posts it to the rep in Slack. Sending is the rep’s call.
No. Every posted deal is recorded in the deal_nudges ledger with its ISO
week, and the next run in that week skips it.
Yes, by swapping the native deal and activity models for connector-backed ones and adapting the column names in the prompt’s SQL. The agent itself does not change.