Claude-code-plugins-plus granola-sdk-patterns
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/granola-pack/skills/granola-sdk-patterns" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-granola-sdk-patterns && rm -rf "$T"
plugins/saas-packs/granola-pack/skills/granola-sdk-patterns/SKILL.mdGranola SDK Patterns
Overview
Granola does not have a traditional SDK. Integration is achieved through three channels: Zapier (8,000+ app connections), the Enterprise API (REST, workspace-level read access), and native integrations (Slack, Notion, HubSpot, Attio, Affinity). This skill covers automation patterns for all three.
Prerequisites
- Granola Business plan ($14/user/month) for Zapier + native CRM
- Enterprise plan ($35+/user/month) for API access
- Zapier account for automation workflows
Instructions
Step 1 — Understand Zapier Triggers
Granola provides two Zapier triggers:
| Trigger | Fires When | Use Case |
|---|---|---|
| Note Added to Granola Folder | A note is placed in a specific folder | Auto-route by meeting type |
| Note Shared to Zapier | You manually share a note to Zapier | Selective sharing for important meetings |
Webhook payload data available:
— meeting title from calendartitle
/creator_name
— note creatorcreator_email
— array ofattendees[]
objects{name, email}
— original calendar event namecalendar_event_title
— meeting date/timecalendar_event_datetime
— the enhanced note content (Markdown)note_content
Step 2 — Build Common Zap Patterns
Pattern 1: Meeting Notes to Notion (auto-archive)
Trigger: Note Added to Granola Folder ("All Meetings") Action: Notion — Create Database Item Database: Meeting Archive Title: "{{title}}" Date: "{{calendar_event_datetime}}" Content: "{{note_content}}" Attendees: "{{attendees}}"
Pattern 2: Action Items to Asana/Linear
Trigger: Note Shared to Zapier Filter: note_content contains "Action Items" Code Step (JavaScript): const lines = inputData.note_content.split('\n'); const actions = lines .filter(l => l.match(/^- \[ \]/)) .map(l => l.replace('- [ ] ', '')); output = actions.map(a => ({task: a})); Action: Linear — Create Issue (for each action) Title: "{{task}}" Team: Engineering Label: "meeting-action"
Pattern 3: Sales Call Summary to Slack + HubSpot
Trigger: Note Added to Granola Folder ("Sales Calls") Path A — Slack: Action: Post Message to #sales-updates Message: | *New Sales Call:* {{title}} *Attendees:* {{attendees}} {{note_content}} [View full notes in Granola] Path B — HubSpot (via Zapier if not using native): Action: Find Contact by Email ({{attendees[0].email}}) Action: Create Engagement Note Body: "{{note_content}}"
Pattern 4: Meeting Follow-Up Email
Trigger: Note Shared to Zapier Action: ChatGPT — Generate Follow-Up Email Prompt: "Write a professional follow-up email based on: {{note_content}}" Action: Gmail — Create Draft To: "{{attendees}}" Subject: "Follow-up: {{title}}" Body: "{{chatgpt_response}}" Action: Slack — Notify Message: "Follow-up draft ready for: {{title}}"
Step 3 — Use the Enterprise API
Available on Enterprise plan. API keys generated at Settings > API Keys (up to 5 per workspace).
# List all accessible notes (paginated) curl -s "https://api.granola.ai/v0/notes" \ -H "Authorization: Bearer $GRANOLA_API_KEY" \ -H "Content-Type: application/json" | jq '.notes[:3]' # Get a specific note with transcript curl -s "https://api.granola.ai/v0/notes/{note_id}" \ -H "Authorization: Bearer $GRANOLA_API_KEY" | jq '{title, summary, action_items}'
API characteristics:
- Bearer token authentication
- Read-only access to publicly shared notes within your workspace
- Rate limited per workspace (429 response when exceeded)
- Pagination for list endpoints
Reverse-engineered endpoints (unofficial, for reference):
POST https://api.granola.ai/v2/get-documents # List documents (paginated) POST https://api.granola.ai/v1/get-document-transcript # Get transcript POST https://api.granola.ai/v1/get-workspaces # List workspaces POST https://api.granola.ai/v1/get-documents-batch # Bulk fetch by IDs
Authentication uses WorkOS with refresh token rotation via
POST https://api.workos.com/user_management/authenticate.
Step 4 — Multi-Step Automation Chains
Name: Complete Meeting Follow-Up Pipeline Step 1 — Trigger: Granola: Note Added to Folder ("Client Meetings") Step 2 — Filter: Only continue if attendees contain external email domains Step 3 — Action: ChatGPT: Generate structured summary and follow-up email Step 4 — Action: Gmail: Create draft follow-up email to external attendees Step 5 — Action: Notion: Create page in Client Meeting Log database Step 6 — Action: Linear: Create issues from action items with "client" label Step 7 — Action: Slack: Post summary to #client-updates channel Step 8 — Action: HubSpot: Log meeting note on matched Contact/Deal
Step 5 — Folder-Based Routing
Organize Granola folders to drive different Zap behaviors:
| Folder | Zapier Trigger | Actions |
|---|---|---|
| Auto | Slack #sales + HubSpot + follow-up email |
| Auto | Linear tasks + Notion wiki |
| Auto | Slack #general + Google Drive archive |
| Manual share | Greenhouse scorecard + hiring panel Slack |
| None | Private, no automation |
Output
- Zapier workflows configured for automated note processing
- API access established for custom integrations
- Multi-step automation chains routing by meeting type
- Folder-based routing strategy implemented
Error Handling
| Error | Cause | Fix |
|---|---|---|
| Zapier trigger not firing | Folder trigger misconfigured | Verify the exact folder name in Zapier matches Granola |
| Missing note content | Note still processing | Add a 2-minute delay step at the start of the Zap |
| API 429 Too Many Requests | Rate limit exceeded | Add delays between requests, implement backoff |
| API 401 Unauthorized | Invalid or expired API key | Regenerate key at Settings > API Keys |
| Attendee data empty | Calendar event has no attendee list | Add attendees to the calendar event |
Resources
Next Steps
Proceed to
granola-common-errors for troubleshooting.