granola-ci-integration
Build automated pipelines to transform meeting notes into actionable tickets and notifications via Zapier.
Install
mkdir -p .claude/skills/granola-ci-integration && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/2390" && unzip -o skill.zip -d .claude/skills/granola-ci-integration && rm skill.zipInstalls to .claude/skills/granola-ci-integration
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Build automated pipelines from Granola meeting notes to GitHub Issues,Key capabilities
- →Build automated pipelines from Granola meeting notes
- →Extract action items and decisions from meeting notes using Zapier Code
- →Create GitHub Issues from extracted action items
- →Update a meeting log in a GitHub repository via GitHub Actions
- →Create Linear tasks from action items with team routing
- →Send Slack notifications with meeting summaries
How it works
This skill uses Zapier to trigger on new Granola meeting notes, extracts structured data like action items and decisions, and then orchestrates actions across GitHub, Linear, and Slack.
Inputs & outputs
When to use granola-ci-integration
- →Creating GitHub issues from meeting notes
- →Syncing action items to Linear
- →Sending meeting summaries to Slack
- →Automating developer workflows from transcripts
About this skill
Granola CI Integration
Overview
Build automated pipelines that process Granola meeting notes into development artifacts: GitHub Issues from action items, Linear tasks with team routing, Slack digests for stakeholders, and meeting logs in your repository. Uses Zapier as the middleware between Granola and dev tools.
Prerequisites
- Granola Business plan (for Zapier access)
- Zapier account (Free for basic, Paid for multi-step Zaps)
- GitHub repository with Actions enabled
- Optional: Linear account, Slack workspace
Instructions
Step 1 — Set Up the Zapier Pipeline
# Pipeline: Granola → Zapier → GitHub + Slack + Linear
Trigger:
App: Granola
Event: Note Added to Granola Folder
Folder: "Engineering" # Only process engineering meetings
Step 2 — Parse Action Items with Zapier Code
Add a Code by Zapier step (JavaScript) to extract action items:
// Zapier Code Step — Extract action items from Granola note
const noteContent = inputData.note_content || '';
const meetingTitle = inputData.title || 'Untitled Meeting';
const meetingDate = inputData.calendar_event_datetime || new Date().toISOString();
// Extract action items: matches "- [ ] @person: task" or "- [ ] task"
const actionRegex = /- \[ \] @?(\w+):?\s+(.+)/g;
const actions = [];
let match;
while ((match = actionRegex.exec(noteContent)) !== null) {
actions.push({
assignee: match[1],
task: match[2].trim(),
meeting: meetingTitle,
date: meetingDate.split('T')[0],
});
}
// Extract decisions: lines starting with "- " under "## Decisions" or "## Key Decisions"
const decisionSection = noteContent.match(/## (?:Key )?Decisions\n([\s\S]*?)(?=\n##|$)/);
const decisions = decisionSection
? decisionSection[1].split('\n').filter(l => l.startsWith('- ')).map(l => l.replace('- ', ''))
: [];
output = [{
action_count: actions.length,
actions: JSON.stringify(actions),
decisions: decisions.join('; '),
meeting_title: meetingTitle,
meeting_date: meetingDate,
}];
Step 3 — Create GitHub Issues from Action Items
# For each action item, create a GitHub issue
Action:
App: GitHub
Event: Create Issue
Repository: "your-org/your-repo"
Title: "Meeting Action: {{task}} [{{date}}]"
Body: |
## Context
From meeting: **{{meeting}}** on {{date}}
## Task
{{task}}
## Assigned To
@{{assignee}}
---
*Auto-created from Granola meeting notes*
Labels: "meeting-action"
Assignee: "{{assignee}}" # Must match GitHub username
Step 4 — GitHub Actions Workflow for Meeting Logs
Create a workflow triggered by Zapier via repository_dispatch:
# .github/workflows/meeting-log.yml
name: Update Meeting Log
on:
repository_dispatch:
types: [granola-meeting]
jobs:
update-log:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Append to meeting log
run: |
MEETING_TITLE="${{ github.event.client_payload.title }}"
MEETING_DATE="${{ github.event.client_payload.date }}"
DECISIONS="${{ github.event.client_payload.decisions }}"
ACTION_COUNT="${{ github.event.client_payload.action_count }}"
mkdir -p docs/meetings
cat >> docs/meetings/log.md << EOF
## ${MEETING_DATE} — ${MEETING_TITLE}
- **Decisions:** ${DECISIONS}
- **Action items created:** ${ACTION_COUNT}
- **Source:** Granola AI
EOF
- name: Commit and push
run: |
git config user.name "Granola Bot"
git config user.email "[email protected]"
git add docs/meetings/log.md
git commit -m "docs: meeting log — ${MEETING_DATE}" || echo "No changes"
git push
Trigger from Zapier using the Webhooks action:
Action:
App: Webhooks by Zapier
Event: POST
URL: https://api.github.com/repos/your-org/your-repo/dispatches
Headers:
Authorization: "Bearer {{github_pat}}"
Accept: "application/vnd.github.v3+json"
Body:
event_type: "granola-meeting"
client_payload:
title: "{{meeting_title}}"
date: "{{meeting_date}}"
decisions: "{{decisions}}"
action_count: "{{action_count}}"
Step 5 — Linear Task Creation
Action:
App: Linear
Event: Create Issue
Team: Engineering
Title: "{{task}}"
Description: "From meeting: {{meeting}} ({{date}})\n\nAssigned: @{{assignee}}"
Label: "meeting-action"
Priority: "Medium"
Step 6 — Slack Notification
Action:
App: Slack
Event: Send Channel Message
Channel: "#engineering-meetings"
Message: |
:memo: *Meeting Notes Ready:* {{meeting_title}}
:calendar: {{meeting_date}}
*Decisions:*
{{decisions}}
*Action Items Created:* {{action_count}}
:point_right: Check Linear/GitHub for assigned tasks
[View full notes in Granola]
Complete Pipeline Flow
Meeting ends → Granola enhances notes
→ Note added to "Engineering" folder
→ Zapier triggers
├→ Parse action items (Code step)
├→ Create GitHub Issues (per action item)
├→ Trigger GitHub Actions (update meeting log)
├→ Create Linear tasks (per action item)
└→ Post Slack summary (#engineering-meetings)
Output
- Action items automatically created as GitHub Issues and Linear tasks
- Meeting log updated in repository via GitHub Actions
- Slack summary posted to team channel
- Full audit trail from meeting to task completion
Error Handling
| Error | Cause | Fix |
|---|---|---|
| Zapier trigger not firing | Note not in the configured folder | Verify folder name matches exactly |
| GitHub issue creation fails | PAT expired or insufficient scope | Regenerate PAT with repo scope |
| Action items not parsed | Note format doesn't match regex | Adjust regex for your template's action item format |
| Linear API error | Team name mismatch | Use Linear team ID instead of name |
| Slack message empty | Note still processing | Add 2-minute delay as first Zap step |
Testing Checklist
- Schedule a test meeting with explicit action items
- Verify note lands in the correct Granola folder
- Confirm Zapier trigger fires (check Zap history)
- Verify GitHub issues created with correct labels and assignees
- Confirm meeting log committed to repository
- Check Slack message formatting in target channel
- Verify Linear tasks appear in correct team
Resources
Next Steps
Proceed to granola-deploy-integration for native app integration setup.
When not to use it
- →When Granola notes are not in the configured folder
- →When note format does not match the action item regex
Prerequisites
Limitations
- →Zapier trigger requires notes to be in a configured folder
- →GitHub issue creation requires a PAT with `repo` scope
- →Action item parsing depends on a specific regex format
How it compares
This skill automates the distribution and tracking of meeting outcomes across multiple platforms, eliminating manual data entry and communication.
Compared to similar skills
granola-ci-integration side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| granola-ci-integration (this skill) | 1 | 27d | Review | Intermediate |
| hooks-automation | 3 | 4mo | Review | Intermediate |
| workflow-automation | 3 | 6mo | Review | Intermediate |
| n8n-node-configuration | 7 | 2mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
hooks-automation
ruvnet
Automated coordination, formatting, and learning from Claude Code operations using intelligent hooks with MCP integration. Includes pre$post task hooks, session management, Git integration, memory coordination, and neural pattern training for enhanced development workflows.
workflow-automation
ruvnet
Workflow creation, execution, and template management. Automates complex multi-step processes with agent coordination. Use when: automating processes, creating reusable workflows, orchestrating multi-step tasks. Skip when: simple single-step tasks, ad-hoc operations.
n8n-node-configuration
czlonkowski
Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node_essentials and get_node_info, or learning common configuration patterns by node type.
n8n-mcp-orchestrator
manutej
Expert MCP (Model Context Protocol) orchestration with n8n workflow automation. Master bidirectional MCP integration, expose n8n workflows as AI agent tools, consume MCP servers in workflows, build agentic systems, orchestrate multi-agent workflows, and create production-ready AI-powered automation pipelines with Claude Code integration.
n8n-conventions
n8n-io
Quick reference for n8n patterns. Full docs /AGENTS.md
superpowers-rest-automation
anthonylee991
Builds reliable automations that integrate with REST APIs: auth, pagination, retries, rate limits, idempotency, webhooks, data mapping, and safe error handling. Use when calling external APIs, syncing systems, or building ETL-style workflows.