Guide · Linear → Grok Bot · Verified November 1, 2026

Linear to Grok Bot webhook guide

Short answer: One Linear endpoint verifies each delivery, a destination filter keeps the events in this guide, and every match is delivered to Grok Bot with its own retry schedule and delivery log.

Because Linear labels arrive as plain names, a filter can select bug issues from one team without any lookup. The agent then receives the issue title, description, and link, and the delivery log records the rendered task so an empty prompt is visible immediately.

At a glance

1. Configure the Linear webhook

  1. In Linear, open Settings → API → Webhooks → New webhook.
  2. Paste the endpoint's ingestion URL and choose the resources to subscribe to (Issue, Comment).
  3. Copy the Signing Secret into the Hooks endpoint secret.
  4. Create an issue in a subscribed team to send the first delivery.

HMAC-SHA256 over the raw request body, hex encoded. webhookTimestamp (milliseconds) must be within 60 seconds of now.

2. Filter to the events that matter

Filters run per destination before rendering, so a non-matching event is stored with no delivery and no agent call. The rules below are the difference between a useful pairing and a noisy one.

Filter: `bug` issues in team APP

{
  "allow": [
    { "field": "event.type", "op": "equals", "value": "issue.create" },
    { "field": "event.subject.labels", "op": "contains", "value": "bug" }
  ],
  "deny": [
    { "field": "event.subject.labels", "op": "contains", "value": "no-agent" }
  ],
  "ignoreBots": true
}

3. Configure the Grok Bot destination

A Hooks destination POSTs one JSON task to your Grok Bot routine URL with a Bearer key; a 2xx means the task was queued. Configure the routine URL and key once, then map event fields into the task template.

Destination: Grok Bot routine

{
  "routineUrl": "https://grok.example.com/routines/abc123",
  "key": "{{secret.GROKBOT_KEY}}",
  "task": "Triage Linear {{event.project}}: {{event.subject.title}}\n\n{{event.subject.body | truncate:2000}}\n{{event.subject.url}}"
}

Secrets enter configs only as {{secret.NAME}} references; literal credentials are rejected. Full Grok Bot target guide

4. Verify the delivery and its retries

Send one real event from the source, then open Deliveries. A 2xx from the target means accepted, not finished. 408, 425, 429 and 5xx retry with backoff honoring Retry-After; other 4xx fail permanently with a named code. The rendered request is stored per attempt, so a bad field path is visible without re-sending.

Hooks delivery detail: attempt timeline, request payload, and the destination response for one delivery
Delivery detail: the attempt timeline, the rendered request the target received, and its response — the same record an event keeps for every destination.

The pitfall this pairing hits

An empty rendered task fails before it is sent. If the issue has no title or body, EMPTY_TARGET_TASK fails the delivery and nothing reaches Grok Bot. Add literal fallback text to the template instead of relying on every issue being complete.

Frequently asked questions

Do I need one endpoint per source or one per destination?

One endpoint per source. Each destination under that endpoint carries its own filter, template, retry schedule, and delivery log, so the same event can feed several targets without duplicate ingress URLs.

What happens while the target is down?

Retryable failures back off and retry within the destination's window; permanent 4xx failures stop immediately. Either way, the original event stays stored, so after fixing the target you replay the event instead of asking the source to send it again.

An empty rendered task fails before it is sent

If the issue has no title or body, EMPTY_TARGET_TASK fails the delivery and nothing reaches Grok Bot. Add literal fallback text to the template instead of relying on every issue being complete.

More Linear guides

Other ways into Grok Bot