O webhook trigger funciona como um trigger de evento: quando um evento acontece no seu sistema (ex: novo pedido criado), você chama o webhook do Triglit para iniciar o workflow.Opção 1: Por ID do TriggerQuando você conhece o ID do trigger:
Copy
import Triglit from 'triglit';// No seu backend, quando um pedido é criado (evento do seu sistema)async function onOrderCreated(order) { const trigger = await getTrigger('orders'); // Busque o trigger do banco const client = new Triglit({ apiKey: process.env.TRIGLIT_SECRET_KEY }); // Chama o webhook do Triglit quando o evento acontece await client.triggers.triggerWebhook(trigger.id, { eventData: { orderId: order.id, amount: order.amount, items: order.items, customerId: order.customerId } });}
Opção 2: Por Evento (Recomendado)Quando você usa eventos nos triggers, pode iniciar workflows sem precisar conhecer IDs:
Copy
import Triglit from 'triglit';// No seu backend, quando um pedido é criado (evento do seu sistema)async function onOrderCreated(order) { const client = new Triglit({ apiKey: process.env.TRIGLIT_SECRET_KEY }); // Inicia todos os triggers webhook do evento "order.created" // Não precisa conhecer IDs de triggers! const result = await client.triggers.triggerByEvent({ event: 'order.created', subTenantId: order.subTenantId, // Opcional: filtra por sub-tenant eventData: { orderId: order.id, amount: order.amount, items: order.items, customerId: order.customerId } }); console.log(`Iniciados ${result.total} workflows para o pedido ${order.id}`);}
Vantagens da Opção 2:
✅ Não precisa armazenar IDs de triggers no seu banco
✅ Inicia múltiplos workflows automaticamente se houver vários triggers para o mesmo evento
✅ Mais simples de manter e escalar
✅ Filtra automaticamente por sub-tenant quando necessário
Opção 3: Endpoint de Ingestion (Recomendado para CRMs e Sistemas de Mensagens)O endpoint de ingestion é ideal para casos onde você precisa gerenciar conversas ou interações que podem ter múltiplas mensagens para a mesma entidade (ex: contato, conversa, usuário). Ele automaticamente decide entre retomar execuções pausadas ou iniciar novas, simplificando muito a integração:
Copy
import Triglit from 'triglit';// No seu backend, quando uma mensagem é recebidaasync function onMessageReceived(message) { const client = new Triglit({ apiKey: process.env.TRIGLIT_SECRET_KEY }); // O endpoint de ingestion automaticamente: // 1. Retoma execuções pausadas para o mesmo entityId e evento (se houver) // 2. Inicia novas execuções se não houver pausadas const result = await client.triggers.ingest({ event: 'message.received', eventData: { entityId: message.conversationId, // ID da conversa/contato content: message.content, senderId: message.senderId, timestamp: message.timestamp }, subTenantId: message.subTenantId, // Opcional // Opções opcionais de retomada: resumeOptions: { resumeAll: true, // Por padrão retoma todas as execuções pausadas // runIds: ['run_123'], // Ou especifique IDs específicos // workflowVersionIds: ['wfv_456'] // Ou apenas workflows específicos } }); // Resultado mostra o que foi feito console.log(`Retomadas: ${result.resumed.length}`); console.log(`Iniciadas: ${result.triggered.length}`); console.log(`Ignoradas: ${result.skipped.length}`); // Exemplo de resposta: // { // resumed: [ // { // runId: 'run_abc123', // workflowVersionId: 'wfv_xyz789', // entityId: 'conversation_456' // } // ], // triggered: [], // skipped: [] // }}
Quando usar o endpoint de ingestion:
✅ CRMs baseados em mensagens (WhatsApp, Telegram, etc.)
✅ Sistemas de chat em tempo real
✅ Workflows que pausam esperando input do usuário
✅ Casos onde múltiplas mensagens do mesmo entityId devem continuar a mesma execução
Exemplo completo: CRM de Mensagens
Copy
import Triglit from 'triglit';import express from 'express';const app = express();app.use(express.json());const client = new Triglit({ apiKey: process.env.TRIGLIT_SECRET_KEY });// Endpoint do seu CRM para receber mensagensapp.post('/crm/messages', async (req, res) => { const { conversationId, content, senderId, metadata } = req.body; try { // Usar endpoint de ingestion - ele decide automaticamente o que fazer const result = await client.triggers.ingest({ event: 'message.received', eventData: { entityId: conversationId, // ID da conversa (usado para agrupar mensagens) content, senderId, metadata, timestamp: new Date().toISOString() } }); // Se retomou execuções, a mensagem foi enviada para continuar workflows pausados if (result.resumed.length > 0) { console.log(`Mensagem processada: ${result.resumed.length} execução(ões) retomada(s)`); } // Se iniciou novas execuções, novos workflows foram iniciados if (result.triggered.length > 0) { console.log(`Novos workflows iniciados: ${result.triggered.length}`); } // Execuções ignoradas (ex: expiradas) aparecem em skipped if (result.skipped.length > 0) { console.log(`Execuções ignoradas: ${result.skipped.length}`); result.skipped.forEach(skip => { console.log(` - ${skip.reason}: ${skip.runId || 'N/A'}`); }); } res.json({ success: true, resumed: result.resumed.length, triggered: result.triggered.length, skipped: result.skipped.length }); } catch (error) { console.error('Erro ao processar mensagem:', error); res.status(500).json({ success: false, error: error.message }); }});app.listen(3000);
Controlando quais execuções retomar:
Copy
// Retomar apenas execuções específicasconst result = await client.triggers.ingest({ event: 'message.received', eventData: { entityId: 'conversation_123', content: 'Olá' }, resumeOptions: { resumeAll: false, runIds: ['run_abc123', 'run_def456'] // Apenas estes IDs }});// Retomar apenas de workflows específicosconst result = await client.triggers.ingest({ event: 'message.received', eventData: { entityId: 'conversation_123', content: 'Olá' }, resumeOptions: { workflowVersionIds: ['wfv_xyz789'] // Apenas deste workflow }});// Não retomar nenhuma (sempre iniciar nova)const result = await client.triggers.ingest({ event: 'message.received', eventData: { entityId: 'conversation_123', content: 'Olá' }, resumeOptions: { resumeAll: false // Não retoma nenhuma, sempre inicia nova }});
Segunda mensagem → Endpoint de ingestion detecta execução pausada → Retoma automaticamente com a nova mensagem → Workflow continua
Terceira mensagem → Se ainda houver execução pausada, retoma novamente; caso contrário, inicia nova execução
O endpoint de ingestion elimina a necessidade de gerenciar estado local de execuções pausadas. O Triglit gerencia tudo internamente, simplificando muito a integração.