Enrich Google Calendar events with Granola notes and open Linear issues

When a Granola note lands, append the recap to the original Google Calendar event and file Linear issues for every action item with an owner.

Agentic Task
GranolaGoogle CalendarLinearOperationsEngineeringMeeting WorkflowsData Sync

Build me an agent workflow that runs every time a new Granola meeting note is created, enriches the original Google Calendar event with the recap, and opens Linear issues for the action items.

Trigger: poll Granola for the new_note event.

When a note arrives, do the following:

1. Call Granola Get Note with the note id to fetch the full payload: summary, decisions, action items (with assignee email when present), attendees, and meeting start and end time. If the note is empty (no decisions and no action items), stop. This skips informal or internal-only meetings so we do not spam Linear.

2. Find the original Google Calendar event. Prefer the calendar event reference returned by Granola when it is present. Otherwise call Google Calendar List Events on my primary calendar, filtered by a time window around the note's meeting start (a few minutes on either side), and pick the event whose attendee emails best match the note's attendees. If nothing matches, log it and skip the calendar update step but still continue to Linear.

3. Append a Meeting Notes section to the event description using Google Calendar Patch Event (partial update). Do not replace the description. Take whatever description already exists and append a clearly labelled section that contains the summary, the list of decisions, and the list of action items with their owners. Leave a divider above the section so it is easy to scan when someone reopens the calendar entry.

4. For each action item that has an assignee email, create a Linear issue. Use Linear List Users to map the email to a Linear user id; if there is no match, create the issue unassigned and include the email in the description so a human can reassign. Use Linear List Teams to resolve the team to file into: default to my main engineering team, but allow me to override per meeting (for example, route product-flavored meetings to the Product team). Set the issue title to the action item text, and the description to a short block that includes the meeting title, the meeting date, the assignee email, and a link back to the Google Calendar event. Use Linear Create Issue to file it.

5. Skip any action item without an assignee. Do not create catch-all tickets.

Notes on behavior: be idempotent. If the same Granola note fires twice, do not double-append to the calendar description and do not create duplicate Linear issues. Use the Granola note id as a dedupe key. If a Linear API call fails, retry once and then surface the error in the run log without blocking the rest of the action items.

Additional information

What does this prompt do?
  • Triggers on Granola's new_note event and pulls the full note (summary, decisions, action items) via Get Note.
  • Finds the original Google Calendar event by matching meeting time and attendees with List Events, then uses Patch Event to append a Meeting Notes section to the description without clobbering existing fields.
  • Creates a Linear issue for each action item that has an assignee, mapping the assignee email to a Linear user, picking the right team, and linking back to the calendar event for context.
  • Skips informal or internal-only notes that have no decisions and no action items so Linear stays clean.
What do I need to use this?
  • A Granola account connected so Geni can poll for new notes and call Get Note.
  • Google Calendar access with read and event.write scopes so Geni can list and patch events on your primary calendar.
  • A Linear account with permission to create issues in the teams you want action items routed to.
  • An email-to-team mapping convention or default Linear team for action items whose owner cannot be resolved.
How can I customize it?
  • Change the routing rule so action items go to a specific Linear team based on the meeting title, attendees, or assignee email domain.
  • Tweak the skip filter (for example, also skip 1:1 notes or recurring internal syncs) so only meaningful meetings produce Linear issues.
  • Customize the Meeting Notes block appended to the calendar event: include attendees, a transcript link, or just the decisions section.

Frequently asked questions

How does the agent find the right Google Calendar event for a Granola note?
It calls List Events filtered by the note's meeting start time (with a small window on either side) and matches on attendee emails. The Granola Get Note response also includes a calendar event reference, which Geni prefers when present.
Will it overwrite existing text in my calendar event description?
No. The workflow uses Google Calendar's Patch Event (partial update), which only modifies the description field and appends a Meeting Notes section below whatever was already there.
What happens to action items without an assignee?
By default they are skipped so Linear does not fill up with orphan tickets. You can change the prompt to route unassigned items to a triage team or include them as a checklist in the Linear issue description instead.
How does it map a Granola attendee email to a Linear user?
Geni calls Linear's List Users and matches on email. If no match is found, the issue is created unassigned in your default team and the original email is included in the description for manual reassignment.
Can it skip internal standups or 1:1s?
Yes. The default rule skips notes that have zero decisions and zero action items. You can extend the filter to also skip meetings whose attendees are all from your own domain, or whose title matches patterns like 1:1 or standup.

Stop letting meeting action items decay in your notes app.

Connect Granola, Google Calendar, and Linear once. Geni enriches the calendar record and files tracked issues every time a note lands.