# 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.

- Workflow type: agent
- Services: Confluence, Google Calendar, Granola
- Categories: Operations, Personal Productivity
- Published: 2026-07-17

## 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.

## 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.

## Prompt

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.

## How to customize

- 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.

## FAQ

### What happens to meetings that don't have Granola notes?

They are skipped. The agent only publishes pages for meetings where Granola actually captured a summary, so you won't get stub pages for every calendar block.

### Will my 1:1s end up in the team wiki?

No. The agent filters out any event with fewer than three attendees and skips events on personal or non-work calendars, so private conversations stay private.

### Do I need to create a new parent page every month?

Yes — the workflow expects a parent page named for the current month, like "Meeting Notes / 2026-07". Some teams create the next month's page as part of their monthly review; others let the agent create it automatically as a customization.

### Can it use a different meeting notes tool instead of Granola?

This version is built around Granola specifically. If your team uses another notetaker, the same pattern works — just swap in whichever tool you already use to capture meeting summaries.

### What if two meetings had the same title today?

Each page title includes the meeting date and the calendar event, and each write-up links back to the specific calendar event, so two same-named meetings become two clearly separate pages.

Use this prompt in General Input: https://www.generalinput.com/prompts/publish-todays-meeting-notes-to-confluence-every-evening