Schedule Trigger
Schedule Trigger
O Schedule Trigger é uma ferramenta essencial do n8n para automação baseada em tempo. Ele permite executar workflows automaticamente em horários específicos, criando automações verdadeiramente independentes de intervenção humana.
O que é o Schedule Trigger?
O Schedule Trigger permite:
- Executar workflows automaticamente em horários específicos
- Agendar tarefas recorrentes (diárias, semanais, mensais)
- Criar automações baseadas em tempo
- Sincronizar dados periodicamente
- Gerar relatórios automáticos
- Manter sistemas atualizados
Quando usar o Schedule Trigger
- Backup automático de dados
- Sincronização periódica entre sistemas
- Relatórios diários, semanais ou mensais
- Limpeza automática de dados antigos
- Monitoramento contínuo de sistemas
- Processamento em lotes programados
Configuração Básica
Estrutura do Schedule Trigger
// Schedule Trigger - Estrutura básica
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
},
{
"field": "hour",
"value": 9
}
]
},
"options": {
"timezone": "America/Sao_Paulo"
}
}
Tipos de Agendamento
Agendamento Simples
Executar todos os dias às 9h:
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
},
{
"field": "hour",
"value": 9
}
]
}
}
// Executar a cada 30 minutos
{
"rule": {
"interval": [
{
"field": "minute",
"value": "*/30"
}
]
}
}
Agendamento com Cron
// Executar às 8h, 12h e 18h todos os dias
{
"rule": {
"cronExpression": "0 8,12,18 * * *"
}
}
// Executar às 9h de segunda a sexta
{
"rule": {
"cronExpression": "0 9 * * 1-5"
}
}
// Executar no primeiro dia do mês às 6h
{
"rule": {
"cronExpression": "0 6 1 * *"
}
}
Agendamento Avançado
Executar a cada 2 horas durante horário comercial:
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
},
{
"field": "hour",
"value": "*/2"
}
]
},
"options": {
"timezone": "America/Sao_Paulo"
}
}
Exemplos Práticos
Backup Diário
// Schedule Trigger - Backup diário às 2h da manhã
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
},
{
"field": "hour",
"value": 2
}
]
},
"options": {
"timezone": "America/Sao_Paulo"
}
}
Workflow:
Schedule Trigger → Database (exportar dados) → Cloud Storage (salvar backup) → Email (notificar conclusão)
Sincronização de Dados
// Schedule Trigger - Sincronizar a cada 15 minutos
{
"rule": {
"interval": [
{
"field": "minute",
"value": "*/15"
}
]
}
}
Workflow:
Schedule Trigger → API Externa (buscar dados) → Database (atualizar) → Log (registrar mudanças)
Relatório Semanal
// Schedule Trigger - Relatório toda segunda às 8h
{
"rule": {
"cronExpression": "0 8 * * 1"
},
"options": {
"timezone": "America/Sao_Paulo"
}
}
Workflow:
Schedule Trigger → Database (consultar dados da semana) → Code (processar relatório) → Email (enviar relatório)
Limpeza Mensal
// Schedule Trigger - Limpeza no primeiro dia do mês às 3h
{
"rule": {
"cronExpression": "0 3 1 * *"
}
}
Workflow:
Schedule Trigger → Database (identificar dados antigos) → Delete (remover dados) → Log (registrar limpeza)
Monitoramento Contínuo
// Schedule Trigger - Monitorar a cada 5 minutos
{
"rule": {
"interval": [
{
"field": "minute",
"value": "*/5"
}
]
}
}
Workflow:
Schedule Trigger → HTTP Request (verificar status) → If (status ok?) → Slack (alertar se erro)
Casos de Uso Avançados
Agendamento Condicional
// Code Node - Verificar se deve executar
function verificarExecucao() {
const hora = new Date().getHours();
const diaSemana = new Date().getDay();
// Executar apenas em horário comercial
return hora >= 8 && hora <= 18 && diaSemana >= 1 && diaSemana <= 5;
}
// Schedule Trigger - A cada hora
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
}
]
}
}
// If Node - Verificar condições
{
"condition": "{{verificarExecucao()}}",
"true": "Executar Workflow",
"false": "Pular Execução"
}
Agendamento Dinâmico
// Code Node - Calcular próximo agendamento
function calcularProximaExecucao() {
const proximaExecucao = new Date();
const diaSemana = proximaExecucao.getDay();
if (diaSemana === 0) { // Domingo
proximaExecucao.setDate(proximaExecucao.getDate() + 1);
} else if (diaSemana === 6) { // Sábado
proximaExecucao.setDate(proximaExecucao.getDate() + 2);
}
return proximaExecucao.toISOString();
}
// Schedule Trigger - Diário às 9h
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
},
{
"field": "hour",
"value": 9
}
]
}
}
Agendamento com Retry
// Schedule Trigger - Executar a cada 30 minutos
{
"rule": {
"interval": [
{
"field": "minute",
"*/30"
}
]
}
}
// Code Node - Lógica com retry
async function executarComRetry() {
const maxTentativas = 3;
for (let tentativa = 1; tentativa <= maxTentativas; tentativa++) {
try {
const resultado = await executarTarefa();
return resultado;
} catch (error) {
console.error(`Tentativa ${tentativa} falhou:`, error.message);
if (tentativa === maxTentativas) {
throw new Error(`Falha após ${maxTentativas} tentativas`);
}
// Aguardar antes da próxima tentativa
await new Promise(resolve => setTimeout(resolve, 5000 * tentativa));
}
}
}
Agendamento com Dados Dinâmicos
// Schedule Trigger - Executar a cada hora
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
}
]
}
}
// Code Node - Gerar dados baseados no horário
function gerarConfiguracao() {
const hora = new Date().getHours();
if (hora >= 8 && hora <= 18) {
return {
tipo: "comercial",
frequencia: "alta",
timeout: 30000
};
} else {
return {
tipo: "noturno",
frequencia: "baixa",
timeout: 60000
};
}
}
Expressões Cron
Sintaxe Básica
Formato:
minuto hora dia mês dia_semana
"0 9 * * *" // Todos os dias às 9h
"0 */2 * * *" // A cada 2 horas
"0 8 * * 1-5" // Segunda a sexta às 8h
"0 0 1 * *" // Primeiro dia do mês à meia-noite
"0 12 * * 0" // Domingo ao meio-dia
Exemplos Comuns
// Backup diário às 2h
"0 2 * * *"
// Limpeza semanal no domingo às 3h
"0 3 * * 0"
// Relatório mensal no primeiro dia às 8h
"0 8 1 * *"
// Monitoramento a cada 15 minutos
"*/15 * * * *"
// Sincronização a cada 2 horas durante o dia
"0 8-18/2 * * 1-5"
// Backup trimestral (primeiro dia de janeiro, abril, julho, outubro)
"0 2 1 1,4,7,10 *"
Boas Práticas
Escolha de Horários
// ✅ Bom: Horários de baixo tráfego
{
"cronExpression": "0 2 * * *" // 2h da manhã
}
// ❌ Evitar: Horários de pico
{
"cronExpression": "0 9 * * *" // 9h da manhã (horário comercial)
}
Frequência Adequada
// ✅ Bom: Frequência baseada na necessidade
{
"cronExpression": "0 */6 * * *" // A cada 6 horas
}
// ❌ Evitar: Frequência muito alta
{
"cronExpression": "*/1 * * * *" // A cada minuto
}
Timezone Correto
// ✅ Bom: Especificar timezone
{
"rule": {
"cronExpression": "0 9 * * *"
},
"options": {
"timezone": "America/Sao_Paulo"
}
}
// ❌ Evitar: Usar timezone padrão
{
"rule": {
"cronExpression": "0 9 * * *"
}
}
Tratamento de Erros
// ✅ Bom: Implementar tratamento de erros
try {
const resultado = await executarTarefa();
return resultado;
} catch (error) {
console.error('Erro na execução:', error.message);
// Notificar erro
await notificarErro(error);
// Registrar para análise
await registrarErro(error);
throw error;
}
Troubleshooting
Problemas Comuns
Workflow não executa
Verifique se o Schedule Trigger está ativo:
- Confirme se o timezone está correto
- Teste com agendamento simples
- Verifique logs de execução
Execução em horário errado
Verifique configuração de timezone:
- Confirme sintaxe da expressão cron
- Teste com horário específico
- Use Debug Helper para verificar
Execução duplicada
Verifique se não há múltiplos Schedule Triggers:
- Confirme se o workflow não está sendo executado por outros meios
- Implemente controle de concorrência
- Use locks ou flags
Code Node - Debug de Schedule Trigger:
function debugSchedule() {
return {
timestamp: new Date().toISOString(),
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
workflow_id: $workflow.id,
proxima_execucao: calcularProximaExecucao()
};
}
// Usar no início do workflow
return { json: debugSchedule() };
Integração com Outros Nodes
Schedule Trigger + Set Node
// Schedule Trigger - Executar diariamente às 8h
{
"rule": {
"cronExpression": "0 8 * * *"
}
}
// Set Node - Adicionar metadados
{
"mode": "keepAllSet",
"values": {
"string": [
{
"name": "tipo_execucao",
"value": "agendada"
},
{
"name": "timestamp_execucao",
"value": "{{$now.toISOString()}}"
},
{
"name": "workflow_id",
"value": "{{$workflow.id}}"
}
]
}
}
Schedule Trigger + If Node
// Schedule Trigger - Executar a cada hora
{
"rule": {
"interval": [
{
"field": "minute",
"value": 0
}
]
}
}
// If Node - Verificar horário comercial
{
"condition": "{{new Date().getHours() >= 8 && new Date().getHours() <= 18}}",
"true": "Processamento Normal",
"false": "Processamento Reduzido"
}
Schedule Trigger + HTTP Request
// Schedule Trigger - Executar a cada 15 minutos
{
"rule": {
"interval": [
{
"field": "minute",
"value": "*/15"
}
]
}
}
// HTTP Request - Verificar status da API
{
"url": "https://api.exemplo.com/health",
"method": "GET",
"timeout": 10000
}
// If Node - Verificar resposta
{
"condition": "{{$json.status === 'ok'}}",
"true": "API Funcionando",
"false": "API com Problemas"
}
Próximos Passos
- Manual Trigger - Execução manual
- Webhook Trigger - Eventos externos
- If Node - Controle de fluxo
- Set Node - Manipulação de dados
- Monitoring - Monitorar execuções