Capture durable customer context in Mem0 after every Granola call

When a new Granola note lands, an agent stores the durable facts about your customer in Mem0, logs a recap in HubSpot, and briefs the deal channel in Slack.

Agentic Task
GranolaMem0HubSpotSlackSalesMeeting WorkflowsNotifications & Alerts

I want an agent workflow that captures the durable customer context from every Granola call into Mem0, so future agents and reps walk into the next conversation already knowing the customer. The trigger is a Granola poll trigger on new_note: whenever Granola finishes a new meeting note, the agent runs once.

When it runs, the agent should call Granola Get Note to pull the full note, including the summary, attendee list, calendar event, and the transcript. From the attendee list, identify the primary external attendee by their email address. If there is no external attendee (everyone shares my domain), stop immediately. Do not write anything to Mem0, HubSpot, or Slack.

Otherwise, reason carefully about what is genuinely worth remembering versus ephemeral chatter. Things worth remembering include: stated preferences ("they prefer async updates", "they only want one weekly sync"), named blockers ("legal review is gating procurement", "they need SOC2 before signing"), commitments we made ("we promised a sandbox by Friday"), decisions they agreed to ("they confirmed Q3 rollout"), and named tools or teams on their side ("their data team uses Snowflake", "Priya owns billing"). Things to skip: scheduling small talk, agenda housekeeping, summaries of what either side already said, and anything that will not still be true in a month.

Before writing anything, call Mem0 Search Memories scoped to user_id equal to the primary external attendee's email, with a semantic query built from the candidate facts. Drop any candidate that already exists in memory. For the remaining new facts, call Mem0 Add Memories scoped to the same user_id (the attendee's email) so all of this contact's memories accrue under one entity. Pass the facts as conversation messages so Mem0 extracts them cleanly.

After memories are saved, call HubSpot Get Contact using the attendee's email as the idProperty to look up the contact. If the contact exists, call HubSpot Create Note associated with that contact. The note body should be a tight recap of the meeting (under 200 words) followed by a short bulleted list of the durable facts you just stored in Mem0. If the contact does not exist in HubSpot, skip the HubSpot step rather than creating a new record.

Finally, send a Slack message to the deal's channel using Slack Send a Message. The message should be a four-bullet brief: who the meeting was with, the single most important decision or commitment, the most important blocker or open question, and the immediate next step we owe them. End with a link to the HubSpot contact record so anyone reading can jump straight there. If you cannot determine the right Slack channel for this deal, post to a default sales-recaps channel that I will configure.

Keep the whole thing tight. The HubSpot note recap stays under 200 words. The Slack brief is exactly four bullets plus the link. Mem0 only receives facts that pass the durable test and are not already on file. And the entire write path is skipped when no external attendees are present.

Additional information

What does this prompt do?
  • Watches Granola for new meeting notes and reads the full summary and transcript
  • Picks out the facts that are genuinely worth remembering, like stated preferences, named blockers, tools the customer uses, and commitments both sides made
  • Checks Mem0 first so it does not store something you already know about this contact, then saves the new facts under the customer's email
  • Files a tight recap on the HubSpot contact and posts a four-bullet brief to the deal's Slack channel with a link back to HubSpot
What do I need to use this?
  • A Granola account with meeting notes turned on
  • A Mem0 account where this agent can read and write memories
  • A HubSpot login with permission to view contacts and create notes
  • A Slack workspace and the channel each deal should post into
How can I customize it?
  • Tighten or loosen what counts as durable. The default keeps preferences, blockers, named tools and teams, and explicit commitments, and ignores small talk
  • Change which Slack channel each deal posts to, or route everything to one shared channel instead
  • Adjust the recap length. The default keeps the HubSpot note and the Slack brief short enough to scan in under a minute
  • Decide what to do when there is no matching HubSpot contact yet. The default skips the write rather than creating a stranger record

Frequently asked questions

What stops this from saving every throwaway comment from a call?
The agent reasons about what is durable before it writes anything. Preferences, blockers, named tools or teams on the customer side, and concrete commitments make the cut. Side chatter, agenda housekeeping, and one-off pleasantries do not.
Will it create duplicate memories if the same fact comes up across multiple calls?
No. Before saving anything, the agent searches the existing memories for that contact in Mem0 and skips facts that are already on file.
What happens if the meeting was internal only, with no customer on the call?
The agent detects that there is no external attendee and stops before writing anything to Mem0, HubSpot, or Slack.
Do I have to use HubSpot, or can this work with another CRM?
This prompt is built around HubSpot, but you can swap the CRM step for Salesforce, Attio, or Pipedrive and keep the Mem0 and Slack pieces exactly the same.
How does the next agent or rep actually see this context later?
Anything you store in Mem0 under the customer's email is available to any future agent or AI assistant that looks up that contact, so the next call starts with full continuity.

Give every customer call a memory your team never loses.

Connect Granola, Mem0, HubSpot, and Slack once, and Geni captures the durable context from every meeting automatically.