How to Build a CRM Integration That Logs Every Sales Call Automatically
Use Gregnote's webhook to automatically log call transcripts, duration, and participants into HubSpot, Salesforce, or any CRM after every sales meeting.
Gregnote Team
12 August 2026
The problem with manual CRM logging
Sales reps spend an average of 20–30% of their time on administrative work — logging calls, writing notes, updating contact records. Most of it is data entry that a machine could do better and faster.
If your product is in the sales or RevOps space, automatically logging meeting data to a CRM is one of the highest-leverage features you can ship.
The architecture
Three components:
- Gregnote — joins the meeting, transcribes, fires a webhook
- Your server — receives the webhook, extracts structured data, calls the CRM API
- Your CRM — HubSpot, Salesforce, Pipedrive, or any provider with a REST API
Step 1 — Send the bot to sales calls
Instrument your sales scheduling flow to send a bot whenever a call is booked:
// Called from your scheduling confirmation handler
async function attachBotToCall(meetingUrl, contactEmail, dealId) {
await fetch("https://api.gregnote.com/v1/bots", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.GREGNOTE_KEY}` },
body: JSON.stringify({
meeting_url: meetingUrl,
bot_name: "Sales Notetaker",
webhook_url: `https://api.yourproduct.com/hooks/call-ended`,
metadata: { contact_email: contactEmail, deal_id: dealId },
}),
});
}The metadata field passes context through to your webhook payload.
Step 2 — Parse the webhook and extract what matters
app.post("/hooks/call-ended", async (req, res) => {
const { event, transcript, metadata } = JSON.parse(req.body);
if (event !== "meeting.completed") return res.sendStatus(200);const callSummary = {
duration_minutes: Math.round(transcript.duration_seconds / 60),
participants: transcript.speakers.filter(s => !s.is_bot).map(s => s.display_name),
full_transcript: transcript.segments.map(s => ${s.speaker}: ${s.text}).join("\n"),
deal_id: metadata.deal_id,
contact_email: metadata.contact_email,
};
await logToCRM(callSummary); res.sendStatus(200); }); ```
Step 3 — Log to HubSpot
async function logToCRM(call) {
// Create a note on the contact
await hubspot.crm.objects.notes.basicApi.create({
properties: {
hs_note_body: call.full_transcript,
hs_timestamp: Date.now(),
},
associations: [{
to: { id: call.contact_id },
types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 202 }],
}],
});
}What you get
Every sales call your team takes now has a full transcript, duration, and participant list automatically attached to the right contact and deal record — the moment the meeting ends, with zero manual effort.
Try it yourself
API key in 30 seconds. Free credit on sign-up. No card required.