LB
SaaSEm Produção2025

Petzara

SaaS full-stack de gestão para petshops — agendamentos, financeiro, equipe e assinatura Stripe

React 19Vite 6Tailwind CSS v4Node.js 22Express 5

01

Visão Geral

O Petzara é um SaaS construído do zero com dois repositórios separados: front-end React 19/Vite e back-end Node.js/Express/MongoDB. O sistema é multi-tenant — cada petshop tem seus dados isolados, podendo adicionar colaboradores que compartilham o contexto em tempo real via Socket.io. Possui autenticação JWT com refresh automático via cookie httpOnly, sistema de assinatura completo com Stripe (planos mensal e anual, trial, webhooks e bloqueio de acesso ao expirar), cron jobs para atualização automática de status de agendamentos e envio de e-mails transacionais via Resend.

Meu papel

Desenvolvedor full-stack solo — arquitetura, back-end Node.js/Express/MongoDB, front-end React 19/Vite, Socket.io, integração Stripe completa, deploy Railway e manutenção em produção.


Categoria

SaaS

Ano

2025

Status

Em Produção

02

O Problema

Petshops crescem pelo boca-a-boca mas travam na operação: agenda no caderno, histórico de clientes perdido no WhatsApp, equipe sem visibilidade do dia e financeiro em planilhas. Com o crescimento, esse processo manual se torna um gargalo que limita a capacidade operacional.

03 — Solução

SaaS multi-tenant com front-end React PWA e back-end Node.js/MongoDB: agenda de agendamentos com atualização automática de status, cadastro de clientes/pets/serviços, financeiro integrado, gestão de colaboradores com permissões e assinatura Stripe com trial — acessível como app instalável no celular.


04

Funcionalidades Principais

01

Agenda em Tempo Real

Agendamentos com transição automática de status (confirmado → em andamento → concluído) via cron job, com updates instantâneos para toda a equipe via Socket.io.

02

Gestão de Clientes e Pets

Cadastro completo de tutores e pets com histórico de serviços, observações e preferências de atendimento.

03

Controle Financeiro

Dashboard de receitas, transações e métricas do negócio com exportação de dados por período.

04

Gestão de Colaboradores

Cadastro de equipe com permissões escalonadas — colaboradores acessam apenas o necessário para o atendimento diário.

05

Assinatura Stripe

Planos mensal e anual com checkout Stripe, trial gratuito, webhook de pagamento e bloqueio automático de acesso ao expirar a assinatura.

06

PWA + Link Público de Agendamento

Instalável como app no celular via PWA. Link público permite clientes marcarem horário sem criar conta no sistema.


05

Tecnologias

Front-end

React 19Vite 6Tailwind CSS v4

Back-end

Node.js 22Express 5

Banco de Dados

MongoDBMongoose

Deploy

Railway

Integrações

StripeSocket.ioResendGoogle OAuthSentry

Bibliotecas

React Hook FormRechartsReact Router 7node-cronvite-plugin-pwa

06

Demonstração

Petzara — screenshot 1
Petzara — screenshot 2
Petzara — screenshot 3

07

Decisões de Design

Quatro temas de cor trocáveis em runtime via CSS custom properties (terracotta, forest, ocean, ochre). Interface dividida em dois contextos: admin com gestão completa e colaborador com visão focada no atendimento do dia. Tour guiado integrado via GuidedTourContext para onboarding de novos usuários.


08

Desafios Técnicos

O webhook do Stripe exige o body cru (Buffer) para validar a assinatura via secret, mas o express.json() consome o body antes. Solução: montar a rota do webhook antes de qualquer middleware de body parsing. Segundo desafio: o refresh token inline no authMiddleware que regenera o access token sem rejeitar a requisição — o novo token é retornado no header X-Access-Token e capturado pelo interceptor axios do front-end de forma transparente.


09

Resultados

  • SaaS em produção com agendamentos e assinaturas Stripe ativas
  • Multi-tenancy funcional: admin e colaboradores compartilham dados em tempo real via Socket.io
  • PWA instalável no celular com link público de agendamento para clientes sem conta

10

Aprendizados

  • JWT com dupla camada: access token 15 min + refresh token 30 dias em cookie httpOnly, renovado automaticamente via interceptor axios sem redirecionar o usuário
  • Multi-tenancy em MongoDB: isolar recursos por owner ObjectId, com colaboradores herdando o contexto do admin via campo owner
  • Integração Stripe completa: a rota do webhook precisa ser montada antes do express.json() para receber o body cru e validar a assinatura — detalhe que quebra a integração se ignorado
  • Socket.io com salas por owner: todos os eventos (agendamentos, clientes, pets, financeiro) disparam updates em tempo real para admin e colaboradores simultaneamente
  • Cron jobs em produção: atualização automática de status de agendamentos, alertas de trial expirando em 3 dias e expiração automática de trials vencidos

Gostou desse projeto?

Tem uma ideia parecida ou quer construir algo diferente? Vamos conversar.