EN
Tecnologia02 de Agosto de 2026

Descobri que o GitHub Actions roda cron de graça (e resolveu um problema que eu nem sabia que tinha solução)

Como usar o agendador do GitHub Actions como um cron job gratuito e confiável, depois de descobrir que o cron nativo do Vercel simplesmente não estava disparando no plano gratuito.

Eu estava configurando lembretes diários no Haven — uma notificação push que dispara num horário específico, todo dia. O Vercel tem um recurso pronto pra isso, os "Cron Jobs": você registra uma rota da API e um horário, e ele chama essa rota sozinho, todo dia. Configurei, testei, parecia certo.

Só que, olhando os logs alguns dias depois, percebi que a rota simplesmente nunca tinha sido chamada. Zero execuções reais em mais de três dias, mesmo com o cron registrado certinho. Fui pesquisar e descobri que isso não é incomum no plano gratuito do Vercel — a confiabilidade dos Cron Jobs pode variar, e não dá pra depender cegamente disso pra algo que precisa disparar todo santo dia.

A solução que eu não esperava: GitHub Actions

Eu já usava GitHub Actions pra outras coisas — rodar testes automaticamente a cada push, por exemplo. O que eu não sabia é que ele também tem um gatilho de agendamento ("schedule"), igualzinho a um cron de servidor de verdade, e que roda de graça em repositórios do GitHub.

A ideia é simples: em vez de o Vercel chamar minha própria rota, eu crio um workflow do GitHub Actions que, num horário definido, faz uma requisição HTTP pra essa rota. A rota nem precisa saber a diferença — ela só está esperando ser chamada com a permissão certa, não importa de onde a chamada vem.

Como fica na prática

  • Um arquivo dentro de .github/workflows/ no seu repositório, por exemplo send-reminders.yml.
  • Um gatilho "schedule" com uma expressão cron (o mesmo formato de sempre: minuto, hora, dia do mês, mês, dia da semana) — por exemplo "0 9 * * *" roda todo dia às 9h UTC.
  • Um segundo gatilho "workflow_dispatch", que adiciona um botão "Run workflow" manual na aba Actions — ótimo pra testar sem esperar o horário agendado chegar.
  • Um passo que só faz um curl autenticado pra sua própria rota da API, passando um segredo (guardado nos GitHub Secrets do repositório) como token de autorização.

A própria rota da API continua responsável por validar esse segredo antes de fazer qualquer coisa — o GitHub Actions só está avisando "está na hora", quem decide se essa chamada é legítima é o seu próprio backend, do jeito que já era antes.

Por que isso me surpreendeu

Eu sempre pensei no GitHub Actions como uma ferramenta de CI/CD — rodar testes, fazer deploy, checar lint. Não tinha me ocorrido que o mesmo agendador que dispara esses workflows a cada push também pode ser configurado pra disparar sozinho, num horário fixo, sem nenhum push acontecendo. E o melhor: nos limites de uso gratuito do GitHub, isso cobre tranquilamente uma chamada por dia — é uma execução de poucos segundos, não um servidor rodando o tempo todo.

Não é uma solução exclusiva pra lembretes push. Qualquer coisa que precise "acontecer sozinha, todo dia, sem alguém clicar em nada" — limpar dados antigos, mandar um resumo por e-mail, sincronizar algo com um serviço externo — pode usar exatamente esse mesmo padrão, sem precisar de infraestrutura extra ou de um provedor de cron pago.