Field notes
Your meeting tool shouldn't own your transcripts
· 3 min read
Meeting Notes · Granola · AI Agents · Obsidian · Wispr Flow
You are probably using your AI tool to reference your meeting notes with a connector. Which works fine, until you switch meeting recorder tools.
"Hey Claude, pull my Granola notes from today's calls" only works as long as you keep paying for Granola.
There is a better way, and it only takes 5 minutes to set up.
The First Version
I used to keep my Granola notes on a Mac Studio that had to stay awake all night.
That machine ran a Codex automation. It pulled Wispr Flow and Gemini meeting notes into an Obsidian vault on GitHub, then mirrored them into Notion. This worked fine when the Studio was on but became completely useless when it wasn't. (like when my power went out)
Meeting tools are great at recording and summarizing. They are a terrible place to keep the only copy of your transcripts. Vendors change plans, bosses force you to switch apps, or you just might want to try a new tool. And if your sync lives on a laptop or a desk Mac, that device has to stay awake.
So I moved the Granola notes to a cloud agent with a webhook.
Granola never sends the transcript in the webhook
Granola fires three events: note.generated (first AI summary ready; there is no note.created), note.edited, and note.access_granted. The body is tiny: event id, event type, note id, timestamp. No transcript. No title. No attendees.
Your agent verifies the Standard Webhooks signature, answers 2xx within 15 seconds, then fetches the full note with:
GET https://public-api.granola.ai/v1/notes/{id}?include=transcript
Bearer token is your Granola API key (grn_…). Webhooks need Business or Enterprise. Personal plans can't create an endpoint.
What my cloud agent does with that ping
- Verify
GRANOLA_WEBHOOK_SECRET. Reject anything that fails. - Return 2xx fast. Do the work after.
- Skip if this
event_idalready ran. - Fetch by
note_idwithGRANOLA_API_KEY. Never trust the webhook body for content. - Hash the content. Same note id + same hash → skip. Same id + new hash → overwrite (an edit).
- Write markdown into the Obsidian vault on GitHub, update
state/source-index.jsonand the manifest, upsert the Notion row matched by Link.
Secrets stay in environment variables on the agent's computer. Never in the chat, never in a shared Page.
One real path on disk
After a note finishes, the file looks like this:
Agent-Memory/granola-meetings/raw/2026/10/30/not_XXXXXXXXXXXXXX-weekly-client-sync.md
Frontmatter the agent writes: type, source, granola_note_id, source_url, title, meeting_date, content_sha256.
My receiver is a Grok Bot webhook routine. Same pattern works with a Cursor cloud agent, a Cloudflare Worker, or a Claude / OpenAI agent that exposes HTTPS.
Same vault with other recorder apps
Granola is one meeting recorder I currently use. But this same system also files Wispr Flow meetings and Google Meet Notes by Gemini into sibling folders with the same markdown shape.
The daily automation is handled by a Cursor cloud agent at 7pm, and mirrors those into the same Notion database.
Credits that help pay for it
As of late October 2026, Anthropic and OpenAI both include monthly API credits on eligible chat subscriptions. If you already pay for those, API calls can burn against those credits.
Full walkthrough
I wrote the step-by-step, the copy-paste agent prompt, and the troubleshooting list as a Grok Bot Page.
Do not let your meeting recorder own the transcripts. Keep copies in your own database, and let a cloud agent do the work. If your meeting note app doesn't have webhooks, just set an automation in your cloud agent of choice to look for new transcripts 1x-3x per day.
The same goes for the rest of your AI work: Your AI app should not own your work.
I also posted this on X. Read the post on X if you want the replies too, and follow me @theaaron for the next one.