Field notes

Your meeting tool shouldn't own your transcripts

· 3 min read

Meeting Notes · Granola · AI Agents · Obsidian · Wispr Flow

Granola sends a webhook to a Grok Bot cloud agent, which saves the notes to your vault in Obsidian and Notion

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 posts a signed event to an HTTPS webhook, the cloud agent verifies the signature, gets the note from /v1/notes/{id}, and writes it to an Obsidian vault on GitHub and a Notion database
Granola webhook → cloud agent verifies → Get Note API → Obsidian vault + Notion

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

  1. Verify GRANOLA_WEBHOOK_SECRET. Reject anything that fails.
  2. Return 2xx fast. Do the work after.
  3. Skip if this event_id already ran.
  4. Fetch by note_id with GRANOLA_API_KEY. Never trust the webhook body for content.
  5. Hash the content. Same note id + same hash → skip. Same id + new hash → overwrite (an edit).
  6. Write markdown into the Obsidian vault on GitHub, update state/source-index.json and 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.

Granola goes to the Obsidian vault and Notion live by webhook, while a nightly 7pm MT sync carries Wispr Flow and Notes by Gemini meeting notes to the same vault and the same Notion database
How Wispr, Gemini, and Granola notes all sync daily

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.