Pular para o conteúdo

Como montar um SaaS com Laravel: autenticação, cobrança e filas

Quem começa um SaaS costuma gastar as primeiras semanas em login, banco e cobrança recorrente, que não são o produto. O Laravel traz parte disso pronta. Este guia diz o que usar para cada coisa e o que mudou nas versões recentes, conferido na documentação oficial.

Qual versão usar

Segundo as notas de versão, o Laravel 13 saiu em 17 de março de 2026 e exige PHP 8.3 ou mais novo. O Laravel 12 (24 de fevereiro de 2025) deixou de receber correções de bugs em 13 de agosto de 2026 e recebe correções de segurança até 24 de fevereiro de 2027. Para um projeto novo, a versão atual é a 13. O que este guia descreve de autenticação, Cashier e filas vale para as duas, mas confira a documentação da versão que você instalar.

Autenticação: starter kits e Fortify

Aqui há uma mudança que muito tutorial antigo ignora. Com o Laravel 12, o time lançou novos starter kits para React, Svelte, Vue e Livewire, e informou que o Laravel Breeze e o Jetstream deixam de receber atualizações. Os kits usam o Laravel Fortify, que registra rotas e controllers de login, cadastro, reset de senha, verificação de e-mail e autenticação em dois fatores (TOTP).

Existe também uma variante de cada kit com WorkOS AuthKit, que oferece login social, passkeys, “Magic Auth” por e-mail e SSO. Segundo a documentação, o WorkOS é gratuito até 1 milhão de usuários ativos por mês. A criação de um projeto é laravel new meu-app, e o instalador pergunta qual kit você quer.

Se o seu front-end é separado (uma SPA ou um app mobile consumindo uma API), o pacote para isso é o Sanctum, com autenticação por cookie para SPAs e tokens para outros clientes. Confira a página do Sanctum na documentação para os detalhes da versão que usar.

Cobrança recorrente: Cashier

O Cashier Stripe trata do que a documentação chama de quase todo o código repetitivo de assinatura: gerenciar assinaturas, cupons e códigos promocionais, troca de plano, quantidades, período de carência no cancelamento, faturas em PDF, múltiplas assinaturas, períodos de teste e cobrança por uso com medidores do Stripe. A documentação cita que o Cashier 16 usa a versão de API 2025-06-30.basil do Stripe.

Verificar se um usuário tem assinatura ativa é uma chamada só:

if ($user->subscribed('default')) {
    // libera o recurso pago
}

O método retorna true também enquanto o cliente está no período de teste.

Filas

Tarefas lentas, como chamar uma API externa ou gerar um relatório, não devem travar a resposta ao usuário. No Laravel você cria um job que implementa ShouldQueue e o despacha com MeuJob::dispatch($dados). A novidade do Laravel 13 é a rota de fila por classe: Queue::route(ProcessPodcast::class, connection: 'redis', queue: 'podcasts') define em um lugar só para onde cada job vai.

Multi-tenancy

Se vários clientes não podem ver os dados uns dos outros, o framework não resolve isso sozinho. A comunidade usa pacotes como o stancl/tenancy. Eu não conferi a documentação desses pacotes para este texto, então avalie a que se encaixa no seu caso antes de decidir entre banco único com coluna de tenant ou um banco por cliente.

Ambiente local

O Laravel Sail é a camada Docker oficial. Ele sobe o projeto com os serviços necessários em contêineres, sem você configurar PHP e banco na máquina. Para colocar em produção, a Laravel mantém produtos próprios como o Forge e o Cloud, listados no site do framework.