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
- Create a source in WebhookLane
Go to Sources → Create source, name it "Linear", and copy the ingest URL. - 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
- Create an API key in Linear
Go to Settings → API → Personal API keys and create a new key. - 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>
- URL:
- 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
actionfield with every event — use it in filters to target specific actions (create,update,delete). - The
typefield indicates the resource:Issue,Comment,Project,Cycle,IssueLabel, etc. - Nested data like
data.state.nameordata.assignee.namecan 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.