anfloy.AcademyBook a call

Sales · 03 · Pipeline ops & reportingLesson 2 of 4

Call notes -> CRM, automatically

45 min working time · Weeks 9-10

By the end of this lesson you can
  • Turn transcripts into structured CRM updates
  • Extract next steps and deal risks from every call

The CRM-update tax

You leave this lesson with your last three real call transcripts turned into structured CRM notes, dated tasks, and a drafted follow-up email - by a /call-extract skill that only writes what was actually said.

Every seller knows the ritual: the call ends, the next one starts in four minutes, and "I'll update the CRM later" becomes a half-remembered note on Friday - or nothing. The 2026 industry research puts numbers on it: sellers lose hours every week to data entry and admin, and users of agent-based tools are 1.7x overrepresented among top performers. The correlation isn't magic; it's reclaimed selling time and a CRM that actually reflects reality.

You already have the raw material. Whatever meeting recorder you use produces a transcript for every call - that's the only thing this lesson needs from it. This lesson builds the pipeline: transcript in, structured CRM update plus follow-up draft out, within minutes of the call ending.

Define the extraction schema first

The discipline that makes this reliable: decide the exact fields BEFORE any extraction. Free-form "summarize this call" output drifts; a pinned schema produces the same shape every time, which is what lets code route it into the CRM without a human re-reading everything.

call-schema.json - a MEDDIC-ish extraction shape
{
  "type": "object",
  "properties": {
    "summary": { "type": "string" },
    "pain_points": { "type": "array", "items": { "type": "string" } },
    "metrics_mentioned": { "type": "array", "items": { "type": "string" } },
    "decision_process": { "type": ["string", "null"] },
    "decision_makers": { "type": "array", "items": { "type": "string" } },
    "champion": { "type": ["string", "null"] },
    "competition": { "type": ["string", "null"] },
    "objections": { "type": "array", "items": { "type": "string" } },
    "risks": { "type": "array", "items": { "type": "string" } },
    "next_steps": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "action": { "type": "string" },
          "owner": { "type": "string" },
          "due": { "type": ["string", "null"] }
        },
        "required": ["action", "owner", "due"],
        "additionalProperties": false
      }
    },
    "stage_recommendation": { "type": ["string", "null"] }
  },
  "required": ["summary", "next_steps", "risks"],
  "additionalProperties": false
}

Build the pipeline

Six steps, all from parts you've used before: a drop folder, a skill, a headless structured call, and your CRM connection.

  1. Get transcripts landing in a folder: most recorders export via integration, webhook, or email - the simplest reliable start is a transcripts/inbox/ folder you (or a hook) drop files into.
  2. Write the extraction skill: /call-extract reads a transcript, applies call-schema.json, and includes your pipeline-stage definitions from the /crm-hygiene skill so stage_recommendation speaks house vocabulary.
  3. Run the structured extraction headless per file: claude -p with --output-format json and --json-schema "$(cat call-schema.json)" (the flag takes the schema text, not a file path) - the structured_output field goes to processed/{call_id}.json.
  4. Route to the CRM via your MCP or API: the summary becomes a timestamped note on the deal, next_steps become tasks with owners and due dates, risks append to the deal's risk field.
  5. Draft the follow-up email from the same JSON - recap, agreed next steps, owed materials - into the rep's drafts folder. Drafted, never auto-sent; the rep reads and sends.
  6. Process your last 3 real calls and compare the output to whatever notes you took by hand. The machine's notes are usually more complete; your judgment on stage and risk is usually better - which is why stage changes stay human-approved.
The headless extraction call
claude -p "/call-extract transcripts/inbox/acme-2026-09-26.txt" \
  --output-format json \
  --json-schema "$(cat call-schema.json)" \
  | jq '.structured_output' \
  > processed/acme-2026-09-26.json

# --json-schema takes the schema itself, not a path, and the
# typed result arrives in the structured_output field.
# No --bare here: bare mode skips skills and CLAUDE.md, so
# /call-extract would not exist. -p starts in Manual permission
# mode on every plan, so pass --allowedTools for anything the
# skill needs beyond reading the transcript.

Risks and next steps: the fields that pay rent

Summaries are nice; next_steps and risks are the fields that change outcomes. A deal where every call's commitments land as dated CRM tasks doesn't develop the "wait, who was sending that proposal?" gap. A deal where every mentioned risk accumulates in one field gives your pipeline review actual material instead of vibes.

  • Next steps with owners and dates become CRM tasks automatically - including the PROSPECT's commitments, which are the ones reps forget to track and the strongest signal of deal momentum.
  • Risks compound across calls: "budget owner not yet involved" appearing in three consecutive extractions is a forecast conversation waiting to happen.
  • stage_recommendation versus actual stage is your deal-drift detector - when they disagree for two calls running, the hygiene agent from lesson 4 flags it.

For teams: consent, consistency, and coaching

A solo seller's transcripts are their own business. A team's transcripts are shared pipeline data, coaching material, and a privacy surface - which means a few decisions need making once, out loud.

Do this now

Sources and further reading

We set it up with you

Want us to set it up with you, end to end?

Three one-on-one sessions. We train you on your real stack and build your first agents together, until you can run it yourself. You keep everything.