Multi-tenant: arquitectura
O FIRO é multi-tenant nativo. Cada negócio é um Tenant com:
- Slug único — identificador legível por URL (ex.: "salao-maria").
- Domínio — usa
slug.firo.ptautomaticamente, oucustom_domainvia CNAME. - Settings JSON — atributos de configuração extensíveis sem migração.
Separação de dados
- Middleware
tenant.activeresolve o tenant a partir do domínio em cada request. - Global Scope
TenantScopefiltra automaticamente queries Eloquent por tenant_id. - Models como bookings, serviços, staff, transações são tenant-scoped.
- Customer e magic links são globais (por design — ver artigo de Clientes).
Subdomínio vs. domínio próprio
Cada tenant pode usar um de dois modos:
Subdomínio firo.pt (default)
Após criar a conta, o tenant fica imediatamente acessível em {slug}.firo.pt. Zero configuração técnica.
Custom domain (Pro+)
Com domínio próprio (ex.: marcacoes.salaomaria.pt):
- O tenant aponta um CNAME para o destino do FIRO.
- O FIRO regista o hostname em Cloudflare SaaS.
- SSL é emitido e renovado automaticamente.
- O estado é tracked em
cloudflare_hostname_idecloudflare_ssl_status.
Resultado: o link que o cliente vê é marcacoes.salaomaria.pt, não salaomaria.firo.pt. Para muitos negócios, é o detalhe que torna o produto vendável.
Branding e identidade
Cada tenant pode adaptar a aparência da página pública:
- Logo (
logo_path). - Imagem de cabeçalho (
header_image_path). - Cor primária e secundária com hex.
- Descrição pública em texto livre/markdown.
- Testemunhos em JSON (rotativos no público).
Localização e contactos
- Endereço com latitude/longitude para mostrar em mapa.
- Telefone de contacto.
- NIF para faturação interna.
O que vê o cliente final
A landing pública (LandingController) apresenta:
- Logo e foto de cabeçalho.
- Descrição do negócio.
- Lista de serviços por categoria com preços.
- Profissionais visíveis com fotos.
- Mapa Google da localização.
- Testemunhos.
- Botão "Marcar Agora" sempre acessível.
Fluxo de marcação público
- Selecciona serviço (filtrado por categoria).
- Selecciona profissional (se aplicável) ou recurso.
- Selecciona data e hora a partir dos slots disponíveis.
- Adiciona participantes/extras se relevantes.
- Insere dados pessoais (nome, contacto, NIF opcional).
- Aplica cupão se tiver.
- Vê o preview de preço.
- Confirma — marcação criada como pendente ou confirmada (consoante a configuração do tenant).
Widget embed (iframe)
Para tenants que já têm um website e querem manter o tráfego lá, o FIRO disponibiliza um widget embed:
- Rota dedicada
/embed/marcacoescom middlewareallow.embedque permite CORS para iframe. - Página de sucesso
/embed/booking/successisolada. - Visual mais limpo, sem header/footer da página pública completa.
O cliente final vê o widget directamente no site do tenant. As marcações ficam no FIRO.
Políticas legais customizáveis
Cada tenant tem três páginas de políticas customizáveis:
- Política de Privacidade (
privacy_policy_text). - Política de Cookies (
cookies_policy_text). - Política de Reservas (
booking_policy_text).
Servidas em /politicas/privacidade, /politicas/cookies e /politicas/reservas no domínio do tenant. Há valores default razoáveis se nada for preenchido.
Tracking de origem das marcações
BookingSource permite registar de onde vêm as marcações:
- Google Search.
- Instagram.
- WhatsApp.
- Recomendação de cliente.
- Walk-in.
Cada origem é editável e ordenável. Útil para perceber atribuição de marketing — qual canal está mesmo a trazer clientes vs. qual está só a custar dinheiro.
Backoffice do tenant
O backoffice é o painel onde a equipa do negócio opera tudo. Acesso por magic link em /backoffice/login. Inclui:
- Dashboard com estatísticas (marcações hoje, receita).
- Calendário com vista por staff/dia/semana, drag-and-drop, filtros.
- Marcações com CRUD completo, aprovação, check-in.
- Serviços, categorias, add-ons, recursos.
- Equipa com horários, ausências, permissões.
- Clientes com listagem, importação, exportação.
- Promoções e transações.
- Configurações de notificações, branding, IVA, políticas.
- Suporte com tickets de clientes.
O que dizer ao lead
Aqui é onde se demonstra "isto não é um software, é o teu site". Conduz a conversa para o que o cliente final vai ver.
- "Em 2 minutos tens um link" — slug.firo.pt funciona ao registar. Imediato. O Instagram bio fica pronto na hora.
- "Mais tarde, ligas o teu domínio" — marcacoes.teunegocio.pt com SSL automático. Para muitos clientes, é o detalhe que assina o contrato.
- "Ou metes no site que já tens" — embed em iframe. O tráfego mantém-se no site dele, as marcações entram no FIRO.
- "O cliente final vê o teu salão, não o FIRO" — logo, cores, fotos, testemunhos. White-label sem o esforço técnico.
Âmbito atual & roadmap
O produto evolui semana a semana. Aqui está o que existe hoje e o que está confirmado para chegar.
Hoje no produto
- Subdomínio slug.firo.pt automático
- Custom domain via CNAME + Cloudflare SaaS + SSL automático
- Branding completo (logo, cores, fotos, descrição)
- Frontoffice público com fluxo de marcação
- Widget embed em iframe
- Políticas legais editáveis (privacidade, cookies, reservas)
- Tracking de origem (BookingSource)
A caminho
- Multi-location (várias unidades sob o mesmo tenant)
- Editor visual de página pública (drag-and-drop)
- Versão multi-língua (PT / EN / ES)
- PWA mais completo com modo offline
Perguntas frequentes
Quanto tempo demora a configurar a página pública?
Menos de 10 minutos para o essencial. Após o signup, o link já existe. Branding e descrição completam-se gradualmente.
Posso usar o meu domínio próprio?
Sim, nos planos Pro e Business. Apontas um CNAME e o SSL é emitido automaticamente via Cloudflare.
Posso ter várias unidades (várias moradas)?
Hoje, cada tenant é uma unidade. Multi-location no mesmo tenant está no roadmap. Como workaround, ter dois tenants separados também funciona para casos simples.
O cliente final precisa de saber que isto é o FIRO?
Não. Vê o teu logo, as tuas cores, o teu domínio (se ligares). A marca FIRO fica nos rodapés discretos e na URL se usares slug.firo.pt.
O widget embed funciona em WordPress / Squarespace / Wix?
Sim. É um iframe standard que cabe em qualquer site capaz de embeber HTML.
Continua à conversa com a equipa comercial
Mostramos o produto a funcionar, respondemos a dúvidas específicas do teu negócio e ajudamos-te a escolher o plano certo.