Your GTM belongs in gitRegister
Blog

Nudge Stalled Deals Every Week with a Drafted Follow-Up

16 Oct
5min read

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 #

  1. 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.
  2. It finds the stalled deals in SQL. Last activity is computed as the latest occurred_at among the deal’s rows in gtm_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.
  3. It drops deals already nudged this ISO week (for example 2026-W42), using the deal_nudges ledger. If nothing is left, it posts nothing. For each remaining deal it counts earlier weeks, so a deal flagged three Mondays running says so.
  4. 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.
  5. 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.
  6. 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 OWNERS map in the prompt; a deal whose owner is not in it is grouped under “Unassigned or unmapped owner” rather than guessed.
  7. 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_accounts and gtm_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 channelId set to the channel the digests may land in, and an Anthropic connector for the model.
  • Four values to set: channelId, the OWNERS map (owner ids to rep names), QUIET_DAYS, and the cron with the timezone named in the trigger text.
  • @cargo-ai/cdk 1.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 #

shellscript
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 #

AurelienOct 16, 2026

Give your agents a runtime

Bring the agents you have.Start free, deploy in one command.