Linear Integration

Linear can be used as both a source (receive Linear webhook events) and a destination (send data to the Linear GraphQL API via an HTTP destination).

Linear as a Source

Receive events when issues, comments, projects, or cycles change in Linear.

Prerequisites

  • Admin access to your Linear workspace

Setup

  1. Create a source in WebhookLane
    Go to Sources → Create source, name it "Linear", and copy the ingest URL.
  2. Add the webhook in Linear
    In Linear, go to Settings → API → Webhooks and click New webhook. Paste your WebhookLane ingest URL and select the resource types you want to receive (Issues, Comments, Projects, etc.).

Payload Structure

Linear webhook payloads include these key fields:

{
  "action": "create",    // create, update, delete
  "type": "Issue",       // Issue, Comment, Project, Cycle, etc.
  "data": {
    "id": "...",
    "title": "...",
    "state": { "name": "In Progress" },
    "assignee": { "name": "..." },
    ...
  }
}

Example Filter

To only process newly created issues, add a filter:

  • Field: action, Operator: equals, Value: create
  • Field: type, Operator: equals, Value: Issue

Linear as a Destination

Send data to Linear's GraphQL API to create issues, update statuses, or post comments.

Setup

  1. Create an API key in Linear
    Go to Settings → API → Personal API keys and create a new key.
  2. Create an HTTP destination in WebhookLane
    Go to Destinations → Create destination, choose type Webhook, and configure:
    • URL: https://api.linear.app/graphql
    • Headers: Authorization: <your-api-key>
  3. Create a route with a GraphQL transform
    Write a Handlebars template that outputs a GraphQL mutation as JSON.

Example Transform

Create a Linear issue from an incoming webhook event:

{
  "query": "mutation($input: IssueCreateInput!) { issueCreate(input: $input) { success } }",
  "variables": {
    "input": {
      "teamId": "YOUR_TEAM_ID",
      "title": "{{slackEscape title}}",
      "description": "{{slackEscape description}}"
    }
  }
}

Tips

  • Linear sends a action field with every event — use it in filters to target specific actions (create, update, delete).
  • The type field indicates the resource: Issue, Comment, Project, Cycle, IssueLabel, etc.
  • Nested data like data.state.name or data.assignee.name can be accessed using dot notation in filters.
  • The HTTP destination has a 10-second timeout. GraphQL mutations to Linear are typically fast, but keep payloads concise.