What it does
- Runs every weekday evening and looks at today's meetings on your primary Google Calendar.
- Matches each meeting to the Granola note that captured its summary, attendees, and transcript.
- Uses AI to draft a structured page for every meeting that actually had notes, with context, decisions, action items with owners, and open questions.
- Files each write-up in Confluence under a monthly Meeting Notes parent page, with the meeting date in the title and a link back to the calendar event.
- Skips 1:1s and personal appointments so private conversations never land in the shared wiki.
The prompt
Paste it into a new chat in General Input, and a specialist builds it with you.
Every weekday at 6pm, turn today's meetings into structured Confluence pages so the team's knowledge base captures decisions the same day they're made.
Trigger: cron on a weekday-only schedule at 6pm in my local timezone.
Step 1 — Fetch today's meetings. Call the Google Calendar List Events operation on calendar "primary", with timeMin set to today at 00:00 local time and timeMax set to today at 23:59 local time, singleEvents=true so recurring events are expanded, and orderBy=startTime. Ignore all-day events, events with eventType other than "default", and events on any calendar other than my primary.
Step 2 — Filter out 1:1s and personal-calendar noise before doing any more work. Skip an event if any of the following are true: it has fewer than three attendees (so 1:1s and solo blocks are dropped), it is marked private (visibility="private" or transparency="opaque" with only one attendee), it has no attendees list at all, or the summary looks like a personal appointment ("gym", "lunch", "focus time", "dentist", etc.). The goal is that private conversations never leak into the shared wiki.
Step 3 — Pull today's Granola notes. Call the Granola List Notes operation with created_after set to today at 00:00 local time (or updated_after if that better matches how Granola timestamps notes). Page through with the cursor until hasMore is false. This gives you a list of note IDs and lightweight metadata for today.
Step 4 — For each surviving calendar event, find its matching Granola note. Match on Granola's calendar_event field when available, otherwise fall back to matching by start time within a 30-minute window plus overlapping title tokens. For each match, call the Granola Get Note operation with include=transcript to fetch the full summary_markdown, attendees, and transcript. If a calendar event has no matching Granola note, skip it — do not publish stub pages.
Step 5 — For every meeting that actually had a Granola note, draft a structured Confluence page. The body must be Confluence storage format (body-format=storage), not markdown, since Confluence Create Page expects storage-format XHTML. Sections, in this order:
Context — 2-3 sentences on why the meeting happened, who was there, and what the goal was. Pull this from the Granola summary plus the calendar event description.
Key decisions — a bulleted list of concrete decisions made in the meeting. If nothing was decided, write "No decisions recorded." rather than inventing filler.
Action items — a bulleted list of "Owner: action (due date if mentioned)" entries. Owner should be a real attendee name from the note, never "team" or "we".
Open questions — anything left unresolved or explicitly flagged for follow-up. Empty is fine.
Step 6 — Publish each page with the Confluence Create Page operation. Set spaceId to the configured team space. Set parentId to the current month's "Meeting Notes / {YYYY-MM}" page (compute the current YYYY-MM from today's date and look up its page ID — assume the caller has created that parent page in advance). Title should be "{Meeting title} — {YYYY-MM-DD}" so two meetings with the same name on different days do not collide. At the very top of the body, include a one-line "Calendar event" link back to the original Google Calendar event using the htmlLink returned from List Events. Publish as status="current", not draft.
Do not send any Slack pings, emails, or other notifications — the Confluence page is the only output. If Granola is rate-limited (429), back off and retry a few times before giving up on that meeting. If Confluence returns a 409 version conflict on a same-title page, append a short disambiguator like the meeting start time to the title and retry.
What you'll need
- A Google account with the calendar you use for work meetings.
- A Granola account on a Business or Enterprise plan (personal API keys are only available on those tiers).
- A Confluence space where the team wants the notes to live, plus an existing parent page like "Meeting Notes / 2026-07" for the current month.
- Comfort with the agent skipping meetings that don't have Granola notes yet.
Make it yours
- Change the schedule — some teams prefer end of day at 5pm, others at 7pm or once a week on Fridays.
- Adjust the skip rules — for example, require three or more attendees, or exclude any event marked private on the calendar.
- Tune the structure of the page — add sections like "Risks" or "Customer quotes", or point to a different Confluence space entirely.