Granola ObservabilitySAFE
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Overview
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
4f83675ca38aOBSERVED · 2026-10-08Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: granola-observability description: 'Monitor Granola adoption, meeting analytics, and build custom dashboards. Use when tracking team meeting patterns, measuring adoption, building analytics pipelines, or creating executive reports. Trigger: "granola analytics", "granola metrics", "granola monitoring", "granola adoption", "meeting insights". ' allowed-tools: Read, Write, Edit, Bash(curl:*), Bash(python3:*) version: 1.13.0 license: MIT author: Jeremy Longshore <[email protected]> tags: - saas - granola - monitoring - analytics - observability compatibility: Designed for Claude Code --- # Granola Observability ## Overview Monitor Granola usage, track meeting patterns, and build analytics dashboards. Granola Enterprise includes a usage analytics dashboard. For deeper insights, build custom pipelines using Zapier to stream meeting metadata to BigQuery, Metabase, or other analytics platforms. ## Prerequisites - Granola Business or Enterprise plan - Admin access for organization-level analytics - Optional: BigQuery/Metabase for custom dashboards, Zapier for data pipeline ## Instructions ### Step 1 — Built-in Analytics (Enterprise) Access the analytics dashboard at Settings > **Analytics** (Enterprise plan): | Metric | What It Shows | |--------|--------------| | Total meetings captured | Meeting volume over time | | Active users | Users who recorded meetings this period | | Hours captured | Total meeting hours transcribed | | Notes shared | How often notes are distributed | | Action items created | Extracted action items across org | | Adoption rate | Active users / total licensed seats | ### Step 2 — Define Key Metrics Track these metrics to measure Granola's impact: | Category | Metric | Target | Formula | |----------|--------|--------|---------| | Adoption | Activation rate | >80% | Users with 1+ meeting / total seats | | Adoption | Weekly active users | >70% | Users recording this week / total seats | | Quality | Capture rate | >70% | Meetings captured / total calendar meetings | | Quality | Share rate | >50% | Notes shared / notes created | | Efficiency | Time saved | >10 min/meeting | Survey: manual notes time - Granola time | | Efficiency | Action completion | >80% | Actions completed / actions created | | Health | Processing success | >99% | Successful enhancements / total attempts | | Health | Integration uptime | >99% | Successful syncs / total sync attempts | ### Step 3 — Build a Custom Analytics Pipeline Stream meeting metadata from Granola to a data warehouse via Zapier: ```yaml # Zapier: Granola → BigQuery pipeline Trigger: Granola — Note Added to Folder ("All Meetings") Step 1 — Code by Zapier (extract metadata): const data = { meeting_id: inputData.title + '_' + inputData.calendar_event_datetime, title: inputData.title, date: inputData.calendar_event_datetime, creator: inputData.creator_email, attendee_count: JSON.parse(inputData.attendees || '[]').length, has_action_items: inputData.note_content.includes('- [ ]'), action_item_count: (inputData.note_content.match(/- \[ \]/g) || []).length, has_decisions: inputData.note_content.includes('## Decision') || inputData.note_content.includes('## Key Decision'), word_count: inputData.note_content.split(/\s+/).length, is_external: JSON.parse(inputData.attendees || '[]') .some(a => !a.email?.endsWith('@company.com')), workspace: inputData.folder || 'unknown', captured_at: new Date().toISOString(), }; output = [data]; Step 2 — BigQuery: Insert Row Dataset: meeting_analytics Table: granola_meetings Row: {{metadata from step 1}} ``` **BigQuery schema:** ```sql CREATE TABLE meeting_analytics.granola_meetings ( meeting_id STRING NOT NULL, title STRING, date TIMESTAMP, creator STRING, attendee_count INT64, has_action_items BOOL, action_item_count INT64, has_decisions BOOL, word_count INT64, is_external BOOL, workspace STRING, captured_at TIMESTAMP ); ``` ### Step 4 — Analytics Queries ```sql -- Weekly meeting volume by workspace SELECT workspace, DATE_TRUNC(date, WEEK) AS week, COUNT(*) AS meeting_count, SUM(action_item_count) AS total_actions, AVG(attendee_count) AS avg_attendees FROM meeting_analytics.granola_meetings WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 12 WEEK) GROUP BY workspace, week ORDER BY week DESC, workspace; -- Adoption: active users per week SELECT DATE_TRUNC(date, WEEK) AS week, COUNT(DISTINCT creator) AS active_users FROM meeting_analytics.granola_meetings WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 8 WEEK) GROUP BY week ORDER BY week DESC; -- Meeting efficiency score (has action items + decisions + < 8 attendees) SELECT title, date, CASE WHEN has_action_items AND has_decisions AND attendee_count <= 8 THEN 'Efficient' WHEN has_action_items OR has_decisions THEN 'Partially Efficient' ELSE 'Low Efficiency' END AS efficiency_rating FROM meeting_analytics.granola_meetings ORDER BY date DESC LIMIT 50; -- External vs internal meeting ratio SELECT DATE_TRUNC(date, MONTH) AS month, COUNTIF(is_external) AS external_meetings, COUNTIF(NOT is_external) AS internal_meetings, ROUND(COUNTIF(is_external) * 100.0 / COUNT(*), 1) AS external_pct FROM meeting_analytics.granola_meetings GROUP BY month ORDER BY month DESC; ``` ### Step 5 — Automated Reporting **Weekly Slack digest (via Zapier Schedule):** ```yaml Trigger: Schedule by Zapier — Every Friday at 5 PM Step 1 — BigQuery: Run Query Query: "SELECT COUNT(*) as meetings, SUM(action_item_count) as actions, COUNT(DISTINCT creator) as active_users FROM meeting_analytics.granola_meetings WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)" Step 2 — Slack: Send Message to #leadership Message: | :bar_chart: *Weekly Granola Report* *This Week:* - Meetings captured: {{meetings}} - Action items created: {{actions}} - Active
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
4f83675ca38afull audit observations/trust-audit/skill/jeremylongshore__granola-observability.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 4f83675ca38a | SAFE | B | 89 | first audit |
Questions
What does the Granola Observability skill do?
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Is Granola Observability safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Granola Observability access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Granola Observability work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (4f83675ca38a), read on 2026-10-08. The repository is watched, and a new audit runs when it changes — this is the first audit.