Log Granola sales calls to Salesforce opportunities and tasks
When a new Granola note lands, an agent finds the matching Salesforce opportunity, attaches a clean recap, and files a follow-up task for every next step.
Build an agent workflow that automatically logs Granola sales calls into Salesforce so reps stop copy-pasting recaps and follow-ups never slip.
Trigger: poll Granola for the new_note event. Each run handles exactly one new Granola meeting note.
When a new note arrives, do this:
1. Call Granola Get Note for the note id to pull the full summary, attendees, and calendar context. Include the markdown summary so the recap is clean.
2. Look at the attendee list. I will provide a list of internal email domains as a workflow input (for example acme.com, acme.io). If every attendee belongs to an internal domain, stop and log that this was skipped as internal-only.
3. From the remaining external attendees, pick the most likely prospect company. Prefer the most common external email domain across attendees, and use the attendee names plus the meeting title to infer a company name. Capture both the inferred company name and the primary external contact email.
4. Find the matching open opportunity in Salesforce. Call Salesforce Get Many Opportunities with a SOQL query that filters on open stages (IsClosed = false) and matches either the Account.Name (case-insensitive contains the inferred company name) or any Contact whose Email domain matches the prospect domain. Return the most recently modified opportunity. If multiple plausible matches come back, prefer the one whose CloseDate is soonest in the future.
5. If a matching opportunity is found, write a clean recap from the Granola summary using these sections: Context (one or two sentences on what the call was about and who attended), Decisions (bullets), Objections and risks (bullets), and Next steps (bullets with owner and due date when available). Then call Salesforce Add Note to Opportunity to attach the recap. The note title should be the meeting title and date.
6. For each next step in the recap that has both a clear owner and a date, call Salesforce Create Task. Link the task to the opportunity (WhatId = opportunity Id). Set Subject to the next step text, ActivityDate to the due date, OwnerId to the matching Salesforce user when the owner name maps to one (look them up with Get Many Users by Name or Email), and Status to Not Started. If the owner cannot be mapped to a Salesforce user, leave OwnerId unset and put the owner name in the task description.
7. Fallback path when no open opportunity is found. First try Salesforce Get Many Accounts filtered by Name matching the inferred company. If an account matches, call Salesforce Add Note to Account with the same recap. If no account matches, try Salesforce Get Many Leads filtered by Company name or by Email matching the primary external attendee. If a lead matches, call Salesforce Add Note to Lead. If nothing matches at all, log the skipped run with the inferred company name and primary email so the user can see what was missed.
Keep the recap factual and short. Do not invent decisions or commitments that are not in the Granola summary. Never overwrite or delete existing Salesforce notes or activities. Only create new notes and tasks.
Workflow inputs the user should configure: list of internal email domains to skip, optional list of opportunity stages to include (default: all open stages), and a toggle for whether to create tasks for next steps that are missing an owner (default: off).
Additional information
What does this prompt do?
- Watches Granola for new meeting notes and only acts on real customer or prospect calls.
- Finds the right Salesforce opportunity by matching the prospect's company name and the attendee email domain.
- Adds a clean recap to the opportunity covering decisions, objections, and next steps so reps stop copy-pasting from notes.
- Files a Salesforce task for each next step that has a clear owner and date, so follow-ups never slip through the cracks.
- Falls back to the matching account or lead when no open opportunity exists, and quietly skips internal-only meetings.
What do I need to use this?
- A Granola Business or Enterprise account with a personal API key from the desktop app.
- A Salesforce login with permission to read opportunities, accounts, leads, and contacts, and to create notes and tasks.
- A short list of your team's internal email domains so internal-only meetings get skipped.
How can I customize it?
- Change how matching works, for example weighting the attendee email domain over the company name, or only matching opportunities in certain stages.
- Adjust the recap format, like the headings used or whether objections get their own section.
- Tune the fallback behavior, such as creating a new lead instead of attaching to an account when nothing matches.
Frequently asked questions
Will this overwrite notes my reps already wrote in Salesforce?
What happens if it can't find a matching opportunity?
How does it know to skip internal meetings?
Does this work with Salesforce Essentials or only Enterprise?
Can I control which next steps become Salesforce tasks?
Stop copy-pasting Granola recaps into Salesforce.
Connect Granola and Salesforce once, and Geni logs every sales call to the right opportunity with follow-up tasks attached.