personal, public) as API keys, and its payloads carry no note content — fetch the note through the connection’s Granola API key once you receive an event.
How it works
- Granola sends a POST request to your Nango webhook URL when a subscribed note event occurs.
- Nango looks up the connection identified by the
nangoConnectionIdquery param on the webhook URL — Granola’s payload has no field that identifies a single Nango connection, so this param is required — verifies the delivery’s signature against that connection’s own Webhook secret, then routes the event to it. - Fetch the note referenced by the event from the Granola API using the
note_idfrom the payload — access checks apply at fetch time, so a delivery never exposes more than the API would.
Setup
1. Get your Nango webhook URL
In the Nango dashboard, open your Granola integration and copy the Webhook URL. Append?nangoConnectionId=<CONNECTION-ID> for the connection you’re registering this webhook for — Nango uses it to route incoming events, since Granola’s payload doesn’t identify a connection on its own.
2. Register the webhook in Granola
- Granola dashboard
- Granola API
To receive events for notes across your workspace:
- Go to Settings → Connectors → Webhooks and select Set up a webhook.
- Choose which notes and events to receive, then enter your Nango webhook URL with
?nangoConnectionId=<CONNECTION-ID>appended for the connection this webhook is for — not just the plain webhook URL, since Nango needs it to route the event. - Create the webhook and copy its signing secret — Granola generates this for you and only shows it once; there’s no way to set your own. The confirmation dialog also lets you send a test event and create a compatible API key.
3. Set the webhook secret in Nango
Granola generates a new, distinctsigning_secret every time you create a webhook endpoint — you can’t reuse one secret across multiple endpoints. Set each connection’s signing_secret as webhookSecret in that connection’s metadata — every connection needs its own, even if you only have one right now:
There’s no integration-level webhook secret for Granola — Standard Webhooks signatures don’t carry any binding to a specific destination, so a single secret shared across connections couldn’t stop a delivery meant for one connection from being replayed against another. Each connection must have its own
webhookSecret in its metadata; Nango rejects the delivery otherwise.4. Delete the webhook endpoint on connection deletion
If a connection is deleted in Nango but its Granola webhook endpoint remains active, Granola keeps sending deliveries to it — they’ll just have no connection to route to. Delete the webhook endpoint before the connection is removed. You can automate this with apre-connection-deletion lifecycle event, using the webhookEndpointId stored in metadata during creation (step 2):
Handle the webhook
Once routed, you have two options:- Forward it to your app — Nango forwards the event to your webhook URL with connection attribution. See External webhook forwarding.
- Process it in a sync — run a sync when the webhook arrives using
webhookSubscriptionsandonWebhookin a sync script. See Real-time syncs.
Supported events
Subscribe to both
note.generated and note.access_granted if you’re using webhooks to discover notes — an already-generated note that’s later shared with you triggers note.access_granted, not note.generated.
For the full payload schema, see Granola’s webhooks documentation.
Rollback strategy
To stop deliveries, delete the webhook endpoint using theid Granola returned when you created it:
webhookEndpointId and webhookSecret from the connection’s metadata so nothing references a deleted endpoint. Re-enable notifications by creating a new webhook endpoint with the steps above.