Publish today's meeting notes to Confluence every evening
Every weekday at 6pm, an agent turns today's meetings into structured Confluence pages under the current month's Meeting Notes folder.
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.
Additional information
What does this prompt do?
- 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.
What do I need to use this?
- 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.
How can I customize it?
- 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.
Frequently asked questions
What happens to meetings that don't have Granola notes?
Will my 1:1s end up in the team wiki?
Do I need to create a new parent page every month?
Can it use a different meeting notes tool instead of Granola?
What if two meetings had the same title today?
Related templates
Stop letting decisions disappear the day they're made.
Get today's meetings into the team wiki tonight, without anyone writing it up by hand.