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 |
|---|---|
| Piattaforma | Linear |
| Categoria | Custom |
| Complessità di setup | Facile |
| Integrazione ufficiale | No |
| Dati sincronizzati | Issue, Progetti, Utenti, Eventi |
| Tipo di API | GraphQL API |
| Autenticazione | OAuth 2.0 / Personal API Key |
| Base URL | https://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:
- Un workspace Linear con accesso admin
- Una Personal API key o un’applicazione OAuth configurata
- Un account Brevo con accesso API
- Un account Tajo con abbonamento attivo
Autenticazione
Linear supporta Personal API key e OAuth 2.0.
Opzione 1: Personal API Key
- Vai su Linear > Settings > API > Personal API keys
- Clicca su Create key
- Nominala “Tajo Integration”
- Copia la chiave generata (inizia con
lin_api_)
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:
- Crea un’applicazione OAuth su linear.app/settings/api/applications
- Configura la redirect URI:
https://app.tajo.io/callbacks/linear - 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
# Usando Personal API Keytajo connectors install linear \ --api-key $LINEAR_API_KEY
# Usando OAuthtajo connectors install linear \ --client-id $LINEAR_CLIENT_ID \ --client-secret $LINEAR_CLIENT_SECRETConfigurazione
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 - CanceledMapping 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_TEAMMapping 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_UPDATEDEndpoint API
Linear usa un singolo endpoint GraphQL. Query e mutation principali usate da Tajo:
| Operazione | Tipo | Scopo |
|---|---|---|
issues | Query | Elenca e filtra issue |
issue | Query | Ottieni una singola issue per ID |
projects | Query | Elenca tutti i progetti |
cycles | Query | Elenca i cycle (sprint) |
teams | Query | Elenca i team del workspace |
users | Query | Elenca i membri del workspace |
viewer | Query | Ottieni info sull’utente autenticato |
issueCreate | Mutation | Crea una nuova issue |
issueUpdate | Mutation | Aggiorna una issue esistente |
commentCreate | Mutation | Aggiungi un commento a una issue |
webhookCreate | Mutation | Registra 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 richiestatajo.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 limite | Valore |
|---|---|
| Rate di richieste | 1.500 richieste all’ora per API key |
| Complessità query | 10.000 punti di complessità per richiesta |
| Paginazione | Max 250 nodi per pagina (default 50) |
| Webhook | Eventi 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
| Problema | Causa | Soluzione |
|---|---|---|
| 401 Unauthorized | API key non valida o revocata | Genera una nuova API key nelle impostazioni Linear |
| Errori di query | Sintassi GraphQL non valida | Valida le query con l’API explorer di Linear |
| Issue mancanti | Accesso al team limitato | Assicurati che il proprietario dell’API key abbia accesso ai team target |
| Webhook non scatta | URL errato o disabilitato | Controlla lo stato del webhook in Linear Settings > API > Webhooks |
| Paginazione incompleta | Cursor after mancante | Assicurati che il loop di paginazione continui finché hasNextPage è false |
Modalità debug
connectors: linear: debug: true log_level: verbose log_queries: trueTestare la connessione
tajo connectors test linear# ✓ Connessione API GraphQL riuscita# ✓ Accesso al workspace verificato# ✓ Lista team leggibile# ✓ Query issue operativa# ✓ Registrazione webhook disponibileBest practice
- Usa i webhook per il real-time - Registra webhook invece di effettuare polling per i cambi sulle issue
- Filtra per team - Sincronizza solo le issue dei team rilevanti per ridurre l’uso dell’API
- Ottimizza le query GraphQL - Richiedi solo i campi necessari per restare entro i limiti di complessità
- Mappa le label sui segmenti - Usa le label Linear per guidare la segmentazione dei contatti Brevo
- Gestisci la paginazione - Controlla sempre
hasNextPagee usaendCursorper dati completi - 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