Call notes → CRM and follow-up
Your call recorder posts the transcript when a call ends. Claude extracts the deal fields your team qualifies on as strict JSON, drafts the follow-up email with the agreed next steps, and waits for you. Approve and both are sent to your CRM; reject with a comment and the email is rewritten.
- Extract deal fields Claude API · Sonnet 5
- Draft follow-up Claude API · Sonnet 5
- Review follow-up You
- Update CRM Shell
What each step does
Extract deal fields
Claude API · Sonnet 5Pulls stage, pains, budget, decision makers, timeline and next steps out of the transcript as strict JSON.
Draft follow-up
Claude API · Sonnet 5Drafts the follow-up email with the recap and next steps.
Review follow-up
YouShows you the fields and the email. Reject with a comment and the email is rewritten.
Update CRM
ShellSends the fields and the email to your CRM through a webhook.
From copy to first run
- Copy the pipeline JSON with the button above.
- In Jimothy, open Pipelines → New pipeline, paste it under “Or import a pipeline JSON” and click Import.
- Fill in the variables below under Pipeline settings → Variables.
- Triggers → Add trigger → Webhook. Post the transcript from Gong, Fathom, Fireflies or Plaud (directly or through Zapier) with the fields below.
Send title (call name), description (the transcript), key (the call id) and the extra fields dealId, contactName and contactEmail.
What to fill in
The prompts and commands read these as {{vars.<name>}}. The examples are placeholders: replace them with your own.
| Variable | What to put in it | Example |
|---|---|---|
stages | Your pipeline stages, in order. The extracted stage is one of these. | Discovery, Evaluation, Proposal, Negotiation, Closed won, Closed lost |
signature | How the follow-up email is signed. | Sam at Acme |
crmWebhookUrl | Where the fields and email go, e.g. a Zapier hook that updates the HubSpot or Salesforce deal and creates the email draft. | — |
Show the pipeline JSON
{
"jimothyPipeline": 1,
"name": "Call notes → CRM and follow-up",
"description": "Extracts deal fields from a call transcript, drafts the follow-up email, and sends both to your CRM after you approve.",
"icon": "rocket",
"color": "#0ea5e9",
"repo": {
"mode": "scratch"
},
"concurrency": 3,
"variables": {
"stages": "Discovery, Evaluation, Proposal, Negotiation, Closed won, Closed lost",
"signature": "Sam at Acme",
"crmWebhookUrl": ""
},
"steps": [
{
"id": "extract",
"name": "Extract deal fields",
"type": "agent",
"description": "Pulls stage, pains, budget, decision makers, timeline and next steps out of the transcript as strict JSON.",
"harnessId": "anthropic-api",
"model": "claude-sonnet-5",
"timeoutMinutes": 5,
"retries": 1,
"passPattern": "^\\s*\\{[\\s\\S]*\\}\\s*$",
"failPattern": "```",
"prompt": "Transcript of \"{{issue.title}}\":\n\n{{issue.description | truncate:60000}}\n\nExtract what was actually said. Answer with one JSON object and nothing else (no code fences):\n{\n \"summary\": \"three sentences\",\n \"stage\": \"one of: {{vars.stages}}\",\n \"painPoints\": [\"...\"],\n \"budget\": \"what was said, or null\",\n \"decisionMakers\": [\"name and role\"],\n \"timeline\": \"what was said, or null\",\n \"competitors\": [\"...\"],\n \"objections\": [\"...\"],\n \"nextSteps\": [{\"owner\": \"us or them, with name\", \"action\": \"...\", \"due\": \"date or null\"}]\n}\nUse null or [] for anything not discussed. Don't infer budget or timeline from tone."
},
{
"id": "email",
"name": "Draft follow-up",
"type": "agent",
"description": "Drafts the follow-up email with the recap and next steps.",
"harnessId": "anthropic-api",
"model": "claude-sonnet-5",
"dependsOn": [
"extract"
],
"timeoutMinutes": 5,
"prompt": "Call fields:\n{{steps.extract.output}}\n\nWrite the follow-up email to {{issue.raw.contactName | default:\"the prospect\"}}. Thank them in one line, recap what we heard in their words (two or three bullets), list the next steps with owners and dates, and confirm the next meeting if one was agreed. Plain text, under 180 words, no subject line, signed \"{{vars.signature}}\".{{#if steps.approve.output}}\n\nYour previous draft was rejected with this feedback. Rewrite it:\n{{steps.approve.output}}{{/if}}"
},
{
"id": "approve",
"name": "Review follow-up",
"type": "approval",
"description": "Shows you the fields and the email. Reject with a comment and the email is rewritten.",
"dependsOn": [
"email"
],
"loopBackTo": "email",
"maxLoops": 3,
"approvalMessage": "Update the CRM and send this follow-up for **{{issue.title}}**?\n\n```json\n{{steps.extract.output}}\n```\n\n---\n\n{{steps.email.output}}"
},
{
"id": "send",
"name": "Update CRM",
"type": "shell",
"description": "Sends the fields and the email to your CRM through a webhook.",
"dependsOn": [
"approve"
],
"timeoutMinutes": 2,
"command": "printf '{\"call\":%s,\"dealId\":%s,\"contactEmail\":%s,\"fields\":%s,\"email\":%s}' {{issue.key | json}} {{issue.raw.dealId | default:\"\" | json}} {{issue.raw.contactEmail | default:\"\" | json}} {{steps.extract.output | trim}} {{steps.email.output | json}} | curl -fsS -X POST -H 'Content-Type: application/json' --data @- {{vars.crmWebhookUrl}}"
}
]
}More for sales, and beyond
Discovery call prep
When someone books a call, researches the company and the person and posts a one-page call brief to Slack before the meeting.
SalesSecurity questionnaire answers
Answers an RFP or security questionnaire from your library of past answers and policies, cites the source for each, and marks what needs an expert.
SalesClosed-lost debrief
When a deal is marked lost, works out why from the notes and emails, files the reason in your CRM and sets a date to try again.