Connettore Linear

Collega il tuo workspace Linear a Brevo per il tracciamento delle issue rivolte al cliente, le notifiche sugli aggiornamenti di prodotto e campagne sulle milestone di sviluppo tramite Tajo.

Panoramica

ProprietàValore
PiattaformaLinear
CategoriaCustom
Complessità di setupFacile
Integrazione ufficialeNo
Dati sincronizzatiIssue, Progetti, Utenti, Eventi
Tipo di APIGraphQL API
AutenticazioneOAuth 2.0 / Personal API Key
Base URLhttps://api.linear.app/graphql

Funzionalità

  • Sync eventi issue - Inoltra eventi di creazione, aggiornamento e completamento issue sulle timeline dei contatti Brevo
  • Tracciamento milestone di progetto - Attiva campagne Brevo quando i progetti raggiungono milestone chiave
  • Collegamento issue cliente - Associa le issue Linear ai contatti Brevo per la visibilità sul supporto
  • Segmentazione basata su label - Mappa le label Linear sugli attributi dei contatti Brevo
  • Analytics sui cycle - Sincronizza i dati di completamento sprint/cycle per il reporting sulle performance del team
  • Automazione via webhook - Inoltro eventi in real-time tramite webhook Linear

Prerequisiti

Prima di iniziare, assicurati di avere:

  1. Un workspace Linear con accesso admin
  2. Una Personal API key o un’applicazione OAuth configurata
  3. Un account Brevo con accesso API
  4. Un account Tajo con abbonamento attivo

Autenticazione

Linear supporta Personal API key e OAuth 2.0.

Opzione 1: Personal API Key

  1. Vai su Linear > Settings > API > Personal API keys
  2. Clicca su Create key
  3. Nominala “Tajo Integration”
  4. Copia la chiave generata (inizia con lin_api_)
Terminal window
curl -X POST https://api.linear.app/graphql \
-H "Authorization: $LINEAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "{ viewer { id name email } }"}'

Opzione 2: OAuth 2.0

Per integrazioni che servono più workspace:

  1. Crea un’applicazione OAuth su linear.app/settings/api/applications
  2. Configura la redirect URI: https://app.tajo.io/callbacks/linear
  3. Richiedi gli scope: read, write, issues:create, comments:create

GraphQL API

Linear usa esclusivamente un’API GraphQL. Tutte le query e le mutation passano da un singolo endpoint: https://api.linear.app/graphql. Tajo gestisce automaticamente tutta la costruzione delle query GraphQL.

Connessione a Tajo

Terminal window
# Usando Personal API Key
tajo connectors install linear \
--api-key $LINEAR_API_KEY
# Usando OAuth
tajo connectors install linear \
--client-id $LINEAR_CLIENT_ID \
--client-secret $LINEAR_CLIENT_SECRET

Configurazione

Setup di base

connectors:
linear:
enabled: true
sync:
issues: true
projects: true
cycles: true
users: true
teams:
- key: "ENG"
sync_to_list: 38
- key: "SUPPORT"
sync_to_list: 39
issue_states:
- Backlog
- Todo
- "In Progress"
- Done
- Canceled

Mapping dei campi

Mappa i dati utente e issue Linear sugli attributi Brevo:

field_mapping:
# Campi utente
id: LINEAR_USER_ID
email: email
name: FIRSTNAME
# Metriche issue mappate su eventi di contatto
last_issue_identifier: LAST_LINEAR_ISSUE
last_issue_state: LAST_ISSUE_STATUS
last_issue_priority: LAST_ISSUE_PRIORITY
total_issues: LINEAR_ISSUE_COUNT
# Dati progetto
current_project: ACTIVE_PROJECT
team_key: LINEAR_TEAM

Mapping degli eventi

event_mapping:
Issue.create: ISSUE_CREATED
Issue.update: ISSUE_UPDATED
Issue.remove: ISSUE_DELETED
Comment.create: COMMENT_ADDED
Project.update: PROJECT_UPDATED
Cycle.update: CYCLE_UPDATED

Endpoint API

Linear usa un singolo endpoint GraphQL. Query e mutation principali usate da Tajo:

OperazioneTipoScopo
issuesQueryElenca e filtra issue
issueQueryOttieni una singola issue per ID
projectsQueryElenca tutti i progetti
cyclesQueryElenca i cycle (sprint)
teamsQueryElenca i team del workspace
usersQueryElenca i membri del workspace
viewerQueryOttieni info sull’utente autenticato
issueCreateMutationCrea una nuova issue
issueUpdateMutationAggiorna una issue esistente
commentCreateMutationAggiungi un commento a una issue
webhookCreateMutationRegistra un webhook

Esempio di query GraphQL

query GetIssues($filter: IssueFilter, $first: Int, $after: String) {
issues(filter: $filter, first: $first, after: $after) {
nodes {
id
identifier
title
state { name }
priority
assignee { email name }
labels { nodes { name } }
createdAt
updatedAt
}
pageInfo {
hasNextPage
endCursor
}
}
}

Esempi di codice

Inizializzare il connettore

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('linear', {
apiKey: process.env.LINEAR_API_KEY
});

Sincronizzare le issue

await tajo.connectors.sync('linear', {
type: 'incremental',
resources: ['issues'],
teams: ['ENG', 'SUPPORT'],
since: '2024-01-01'
});
const status = await tajo.connectors.status('linear');
console.log(status);
// {
// connected: true,
// lastSync: '2024-03-15T18:00:00Z',
// issuesTracked: 3200,
// projectsMonitored: 8,
// usersLinked: 45
// }

Gestire i webhook Linear

app.post('/webhooks/linear', async (req, res) => {
const event = req.body;
// Verifica la firma del webhook
const signature = req.get('Linear-Signature');
if (!verifyLinearSignature(req.body, signature)) {
return res.status(401).send('Unauthorized');
}
await tajo.connectors.handleWebhook('linear', {
type: event.type,
action: event.action,
payload: {
issueId: event.data?.id,
identifier: event.data?.identifier,
title: event.data?.title,
state: event.data?.state?.name,
assigneeEmail: event.data?.assignee?.email
}
});
res.status(200).send('OK');
});

Creare una issue da un evento Brevo

// Crea una issue Linear quando un contatto Brevo invia una richiesta
tajo.events.on('contact.event', async (event) => {
if (event.name === 'FEATURE_REQUEST') {
await tajo.connectors.create('linear', {
teamId: 'ENG',
title: `Feature Request: ${event.data.subject}`,
description: event.data.description,
priority: 3,
labelIds: ['feature-request']
});
}
});

Limiti di rate

Linear applica limiti di rate sulla sua API GraphQL:

Tipo di limiteValore
Rate di richieste1.500 richieste all’ora per API key
Complessità query10.000 punti di complessità per richiesta
PaginazioneMax 250 nodi per pagina (default 50)
WebhookEventi in ingresso illimitati

Budget di complessità

Linear usa un sistema di rate limit basato sulla complessità. Le query semplici costano meno punti. Tajo ottimizza le query per minimizzare la complessità richiedendo solo i campi necessari e usando paginazione efficiente.

Linear restituisce 429 Too Many Requests con un header Retry-After quando i limiti vengono superati.

Risoluzione dei problemi

Problemi comuni

ProblemaCausaSoluzione
401 UnauthorizedAPI key non valida o revocataGenera una nuova API key nelle impostazioni Linear
Errori di querySintassi GraphQL non validaValida le query con l’API explorer di Linear
Issue mancantiAccesso al team limitatoAssicurati che il proprietario dell’API key abbia accesso ai team target
Webhook non scattaURL errato o disabilitatoControlla lo stato del webhook in Linear Settings > API > Webhooks
Paginazione incompletaCursor after mancanteAssicurati che il loop di paginazione continui finché hasNextPage è false

Modalità debug

connectors:
linear:
debug: true
log_level: verbose
log_queries: true

Testare la connessione

Terminal window
tajo connectors test linear
# ✓ Connessione API GraphQL riuscita
# ✓ Accesso al workspace verificato
# ✓ Lista team leggibile
# ✓ Query issue operativa
# ✓ Registrazione webhook disponibile

Best practice

  1. Usa i webhook per il real-time - Registra webhook invece di effettuare polling per i cambi sulle issue
  2. Filtra per team - Sincronizza solo le issue dei team rilevanti per ridurre l’uso dell’API
  3. Ottimizza le query GraphQL - Richiedi solo i campi necessari per restare entro i limiti di complessità
  4. Mappa le label sui segmenti - Usa le label Linear per guidare la segmentazione dei contatti Brevo
  5. Gestisci la paginazione - Controlla sempre hasNextPage e usa endCursor per dati completi
  6. Verifica le firme webhook - Valida sempre l’header Linear-Signature

Sicurezza

  • Autenticazione API Key - Chiavi personali limitate al workspace
  • OAuth 2.0 - Flusso di autorizzazione sicuro per integrazioni multi-workspace
  • Solo HTTPS - Tutte le comunicazioni API cifrate tramite TLS 1.2+
  • Firme webhook - Verifica firma basata su HMAC
  • Archiviazione cifrata - API key cifrate a riposo in Tajo
  • Conformità SOC 2 - La piattaforma Linear è certificata SOC 2 Type II

Risorse correlate

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Assistente AI

Ciao! Chiedimi qualsiasi cosa sulla documentazione.