Log every Granola meeting note to a Google Sheets spreadsheet
When a new Granola note lands, append a structured row to a Google Sheets meeting log so every call becomes a searchable record.
Build a code workflow that turns every new Granola meeting note into a structured row in a Google Sheets meeting log. The flow is fully deterministic: there is no judgement step, just fetch, normalize, and append.
Trigger: poll Granola for the new_note event. When a new note appears, pass the note id into the rest of the pipeline.
Step 1 — Fetch the note. Call Granola Get Note with the triggering note id. Pull the full note metadata: title, created/meeting date, attendees (emails and names), the linked Google Calendar event if present, summary_text, summary_markdown, and the public note URL. Transcript content is not needed for the row, but capture whether a transcript is available as a boolean.
Step 2 — Normalize into a fixed column schema. Produce one row with these columns in this order: meeting_date (ISO date), meeting_title, meeting_type (inferred from the title with simple keyword rules: 1:1, standup, interview, customer call, internal, other), attendee_count (integer), attendee_domains (comma-separated unique email domains, excluding the workspace owner's own domain), summary_excerpt (first 280 characters of summary_text, single line), action_item_count (count of bullet lines under any heading whose text contains "action" in summary_markdown; fall back to 0 if no such section exists), transcript_available (TRUE/FALSE), calendar_event_link (URL or empty), granola_note_url. Keep the parsing simple and forgiving: missing fields become empty strings, never nulls.
Step 3 — Append to Google Sheets. Call Google Sheets Append Values on a configurable spreadsheet id and tab name (default tab name: "Meeting Log"). Use USER_ENTERED so dates and links render natively. Insert a single row in the column order above.
Configuration the user should be able to edit: the target spreadsheet id, the target tab name, and an optional title-keyword denylist that skips logging (for example "personal", "therapy").
Error handling: if Get Note returns 404 (note deleted or not accessible), skip silently. On 429 from either service, back off and retry. Do not fail the run on a single bad note; log the error and continue.
Output: one appended row per meeting. No notifications, no side effects. The spreadsheet is the product.
Additional information
What does this prompt do?
- Watches Granola for every new meeting note your account can see.
- Pulls the meeting title, date, attendees, summary, and a link back to the note.
- Adds one tidy row per meeting to a Google Sheets log so you can search, filter, and pivot later.
- Counts action items from the summary and infers a meeting type from the title so the sheet is ready for analysis.
What do I need to use this?
- A Granola account on a Business or Enterprise plan with a personal API key.
- A Google account with access to the spreadsheet you want to use as your meeting log.
- A Google Sheet (existing or new) where rows should be appended.
How can I customize it?
- Change the columns the workflow writes, for example add deal name, customer segment, or meeting owner.
- Filter which notes get logged, like only meetings with external attendees or only certain calendar event titles.
- Point it at a different spreadsheet or tab, or split rows across tabs by meeting type.
Frequently asked questions
Will this capture every meeting in my Granola account?
Can I use this with a spreadsheet that already has data?
What happens if I edit a note in Granola after the row has been logged?
Do I need to know how to code to use this?
How fresh will the log be?
Stop losing meetings in a sea of notes.
Connect Granola and Google Sheets once, and Geni keeps a clean, searchable log of every call you take.