Linear Integration

Connect Outpost to Linear for bidirectional issue synchronization. Tickets created in Outpost appear as Linear issues, and changes in Linear flow back to Outpost automatically.

Setup

1. Create a Linear API Key

  1. Go to Linear Settings → API
  2. Click Create key
  3. Give it a descriptive label (e.g., "Outpost Sync")
  4. Copy the generated key — this is your LINEAR_API_KEY

2. Configure a Webhook

  1. Go to Linear Settings → API → Webhooks
  2. Click Create webhook
  3. Set the URL to https://your-outpost-domain.com/api/linear/webhook
  4. Select the events to subscribe to:
    • Issues — create, update, remove
    • Comments — create, update, remove
    • Labels — create, update, remove
  5. Copy the Webhook secret shown after creation — this is your LINEAR_WEBHOOK_SECRET

3. Find Your Team ID

  1. In Linear, go to Settings → Teams
  2. Click on the team you want to sync with Outpost
  3. The team ID is in the URL: https://linear.app/your-org/settings/teams/TEAM_ID

Environment Variables

.env env
# Linear Integration
LINEAR_API_KEY=lin_api_your-api-key-here
LINEAR_WEBHOOK_SECRET=your-webhook-signing-secret
LINEAR_TEAM_ID=your-linear-team-id

Webhook URL: The Linear webhook endpoint must be publicly accessible. During local development, use a tunneling tool like ngrok to expose your local server. The webhook receiver runs on the same port as the Outpost web app (default 3000).

Status Mapping

Linear uses configurable workflow states per team. Outpost maps these to its own ticket statuses. The default mapping is:

Linear Workflow StateOutpost Status
Backlogopen
Todoopen
In Progressin_progress
In Reviewin_progress
Doneresolved
Canceledclosed

When an Outpost ticket status changes, the corresponding Linear issue is moved to the first matching workflow state. Custom status mappings can be configured in the admin dashboard under Settings → Sync → Linear.

Priority Mapping

Linear priorities (0–4) map to Outpost priorities as follows:

Linear PriorityLinear LabelOutpost Priority
0No prioritylow
1Urgentcritical
2Highhigh
3Mediummedium
4Lowlow

Identity Mapping

To sync assignees between Linear and Outpost, each Linear user must be linked to an Outpost TeamMember. This is configured in the admin dashboard under Settings → Team Members by adding each member's Linear user ID to their profile.

When a Linear issue is assigned to a user with a linked TeamMember, the corresponding Outpost ticket is automatically assigned to that team member (and vice versa). Unlinked users are ignored for assignment sync, but their names still appear in synced comments.

What Syncs

The following fields are synchronized bidirectionally between Outpost and Linear:

FieldDirectionDetails
StatusBidirectionalMapped via status mapping (see above)
PriorityBidirectionalMapped via priority mapping (see above)
AssigneeBidirectionalRequires identity mapping
LabelsBidirectionalLinear labels ↔ Outpost tags
CommentsBidirectionalMarkdown preserved, author attributed
TitleBidirectionalIssue title ↔ ticket title
DescriptionOutpost → LinearSet on initial creation only

Bulk Import

When you first connect Linear, you can import existing issues into Outpost as tickets. This is useful for migrating an existing workflow or catching up on issues created before the integration was enabled.

  1. Go to the admin dashboard: Settings → Sync → Linear
  2. Click Import existing issues
  3. Select which Linear statuses to import (e.g., skip "Done" and "Canceled" issues)
  4. The import runs as a background job — progress is shown in the dashboard

Duplicate prevention: The bulk import checks for existing linked tickets before creating new ones, so it is safe to run multiple times. Issues already linked to Outpost tickets are skipped.

Webhook Events

The Linear webhook endpoint at /api/linear/webhook handles the following events:

EventAction
Issue createCreates a new Outpost ticket linked to the Linear issue
Issue updateSyncs status, priority, assignee, and label changes
Issue removeCloses the linked Outpost ticket
Comment createAdds the comment as a message on the linked ticket
Comment updateUpdates the corresponding message in Outpost
Comment removeMarks the message as deleted in Outpost

All webhook payloads are verified using the LINEAR_WEBHOOK_SECRET to ensure authenticity. Invalid signatures are rejected with a 401 response.