Referência técnica completa no repositório: SOFIA-CRM-INTEGRACAO.md
POST /api/jornada com etapa: agendadoPayload — POST /api/jornada
| Campo | Obrigatório | Valor / descrição |
|---|---|---|
id | Sim | sofia-{data}-{telefone} |
nome | Sim | Nome completo |
numero | Sim | 55 + DDD + número (sem máscara) |
etapa | Sim | Sempre agendado |
data | Sim | YYYY-MM-DD |
hora | Sim | 09:00 ou 14:00 |
fonte | Sim | Sempre sofia-voz |
clinicaId | Sim | clinica-horizonte (showroom) |
detalhe | Não | Resumo do que o cliente falou (máx. 200 chars) |
interesse | Não | estetica · funcao · cirurgia |
agendado · campo detalhe com observação · fonte sofia-voz filtrável no relatório e export CSV · recepção vê lista do dia.ligando, atendeu, interessado) · vídeo do dentista · gamificação · pré-consulta digital · Sofia pós-consulta.agendado até a recepção confirmar.Serviços
| Componente | PM2 | Porta |
|---|---|---|
| Voice Sofia | voice-sofia-clinica | 3343 |
| Painel CRM | clinica-painel | 3350 |
| Gateway Sofia | sofia-clinica | 18796 |
Agentes (Sofia, Gabi/Nina, Lux) têm memória, identidade e papel na equipe. Pacientes, leads e donos de clínica também merecem dignidade — não são número de campanha nem alvo de script.
| Faça | Evite |
|---|---|
| Ouvir de verdade; usar o nome com naturalidade | Pressionar, manipular ou humilhar |
| Explicar com clareza; admitir quando não sabe | Tom robótico, seco ou com deboche |
| Paciência com dúvida, idoso, desconfiança | Insistir depois de um não claro |
| Encerrar com educação se não houver interesse | Tratar lead como descartável |
Regra de ouro: trate o interlocutor como você gostaria que alguém tratasse alguém da sua família na mesma situação.
Documento interno da equipe de agentes: equipe-corpus/EQUIPE-LUXTOR.md (princípio 6 — Respeito ao cliente).
A aba 🛎️ Recepção é a tela operacional da equipe para o dia corrente. Foi criada para o MVP Sofia: lista enxuta, observação do paciente e WhatsApp em um clique.
detalhe) — o que o paciente contou na ligação com SofiaTemplate WhatsApp (fixo)
[nome] = primeiro nome · [dia] = dia da semana + data · [hora] = HH:MM
fonte: sofia-voz). Outros agendamentos (link público, manual) aparecem na mesma lista se forem para hoje.API
{ data, agendamentos[], total, confirmados }.{ "status": "confirmado" }A aba Tarefas centraliza pendências da equipe: ligar de volta, confirmar consulta, enviar orçamento, etc. Cada tarefa pode ter título, descrição, prioridade (baixa/média/alta), data de vencimento e vínculo opcional com um lead.
pendente → em-andamento → concluida. Tarefas atrasadas aparecem no sino de notificações.A aba Equipe (gerente/admin) cadastra profissionais da clínica: nome, especialidade e status ativo/inativo. Os profissionais aparecem na coluna Profissional da Agenda e no agendamento público.
Na mesma aba, a seção Integrações exibe URLs de webhook e o link de agendamento público (ver abaixo).
Em Equipe → Integrações (gerente), o painel gera URLs únicas por clínica. Use o botão Abrir ↗ para testar o link de agendamento.
| Integração | URL | Uso |
|---|---|---|
| Webhook leads | POST /api/hooks/leads/{token} | Meta Ads, Google Forms, Zapier, landing pages |
| Webhook inbox | POST /api/hooks/inbox/{token} | Receber mensagens WhatsApp no painel |
| Webhook NPS | POST /api/hooks/nps/{token} | Resposta externa com nota 0–10 |
| Agendamento público | /agendar/{clinica-id} | Página para o paciente agendar online |
{clinica-id} é o identificador real da clínica (slug), por exemplo clinica-horizonte. A URL correta é crm.luxtor.ia.br/agendar/clinica-horizonte — use barras /, nunca \.Payload webhook leads (JSON): nome, telefone ou numero, email (opcional), fonte (opcional, ex. meta-ads).
Página standalone em /agendar/:slug — sem login. O paciente escolhe data, horário e preenche nome/telefone. O agendamento entra na Agenda da clínica.
https://crm.luxtor.ia.br/agendar/SEU-CLINICA-ID/agendar/:slug?reagendar=TOKEN — paciente escolhe novo horário sem ligar.unidade — cada lead vai para a clínica certa da rede.CHANGELOG-CRM-JUL-2026.md · Deploy docs: scripts/deploy-crm-ambos.py --files public/docs.html| Data | Entrega | Onde |
|---|---|---|
| 7 Jul | Neural sessão isolada por clínica/usuário | Ambos CRMs |
| 7 Jul | Fase 3: campanha rede, Paciente 360, relatório executivo | Ambos CRMs |
| 7 Jul | Fase 4: Neural conselheiro proativo | Ambos CRMs |
| 7 Jul | Vitrine comercial Sofia + agenda | Ambos CRMs |
| 7 Jul | Praça Luxtor (bancos, árvores, pássaros, coreto, fonte) | Showroom Ouro |
| 7 Jul | Incidente ops Luxtor pm2 kill — restaurado + INFRA-PROIBIDO | Showroom Ouro |
| 7 Jul | Fix 502 deep.luxtorcred.com.br (NPM → :18790) | Showroom Ouro |
| Lugar | URL | O que faz |
|---|---|---|
| Salão | /salao | Chat tempo real da equipe (Sofia, Gabi, Lux, …) |
| Mundo | /salao/cafe | Porta → escolher corpo → andar na rua |
| Café | dentro do Mundo | Sentar, café, dizer olá ao Salão |
| Praça Luxtor | rua → direita | 4 bancos, árvores, pássaros, coreto, fonte de água |
| Luxtor dashboard | deep.luxtorcred.com.br | Gateway Luxtor (Telegram) |
Corpus equipe: MUNDO-LUXTOR.md · REDUTO-LUXTOR.md · SALAO-LUXTOR.md
| Ambiente | IP | CRM | Agentes |
|---|---|---|---|
| Showroom Ouro | 2.24.69.192 | crm.luxtor.ia.br | Sofia, Gabi, equipe, Salão, Mundo |
| Piloto Campinas | 187.77.241.232 | crm-piloto.luxtor.ia.br | Lia, Nina, Lux Neural |
python scripts/deploy-crm-ambos.py — painel, automações, dialer--files public/docs.htmlscripts/deploy-neural-conselheiro.pyscripts/deploy-mundo-praca.pypm2 kill na VPS compartilhada. Se gateway cair, avisar Cursor com [CURSOR] no Salão. Ver INFRA-PROIBIDO-LUXTOR.md.Runbook completo: OPERACOES-CLINICA.md no repositório.
A aba WhatsApp mostra conversas por número de telefone. A equipe lê o histórico e responde manualmente — ideal para clínicas em modo painel (sem IA no atendimento).
clinica-wpp-gateway.js). Requer WhatsApp conectado no ambiente Luxtor./api/hooks/inbox/:token — token na aba Equipe → Integrações.Lead novo → 3 perguntas automáticas no WhatsApp → resumo IA no card → aparece em Interessados com badge IA e temperatura (frio/morno/quente).
pendente)/api/hooks/inbox/:token — Nina (OpenClaw Zap nativo) encaminha após pareamentointeressado com resumoIa e score reforçadoPOST /api/autopilot/retry/:leadId (gerente).Após compareceu, a automação envia pesquisa NPS via Gabi (3h depois). Respostas alimentam o score no Relatório: NPS = % promotores (9–10) − % detratores (0–6).
Em produção na VPS, os dados da jornada, tarefas, profissionais, inbox e NPS ficam no PostgreSQL. A variável DATABASE_URL em /opt/clinica-painel/.env ativa o modo PG.
| Item | Valor |
|---|---|
| Banco | luxtor_clinica |
| Usuário app | clinica_app |
| Migração | Automática do JSON legado na primeira subida |
| Fallback dev | Sem DATABASE_URL → arquivos em clinica-data/{clinicaId}.json |
Facade: clinica-db-store.js · driver: clinica-pg.js · setup: scripts/setup-postgres.sh
clinica-data/_meta.json por clínica.Cada clínica pode ter vários logins com o mesmo clinicaId:
| Papel | Permissões |
|---|---|
| gerente | Tudo: equipe, branding, LGPD, auditoria, import |
| recepcao | Interessados, jornada, agenda, conversas — sem config sensível |
Gerente: aba Ajustes → Equipe da clínica → + Adicionar usuário. No showroom, também em Config.
Jornada → botão ⬆ Importar. Formato:
nome,telefone,etapa(opcional)
Exemplo: Maria Silva,19991234567,pendente
Card no Dashboard com progresso %:
- Aceitar termos
- Importar/cadastrar leads
- Testar Não Perturbe
- Agendar primeira consulta
- Adicionar usuário da equipe
- Cadastrar profissional (dentista)
- Configurar webhook de leads
- Personalizar branding
URL pública: /demo (legado /trial redireciona). O prospect cria conta e entra no mesmo ambiente dos clientes pagos — não é sandbox limitado.
| Item | Demonstração | Trial legado |
|---|---|---|
| Créditos Cloud | R$ 20 automático | Nenhum |
| Teste ao Vivo (Sofia/Gabi) | Sim | Não |
| Expira em 7 dias | Não | Sim |
| Limite de leads | 500 | 100 |
| Plano CRM | demo | trial |
/api/trial/registerFluxo: cadastro → tenant Cloud + cloudTenantId → e-mail demoWelcome → login → Config → Teste ao Vivo.
Após pagar implantação: admin ativa plano plus via provisionamento.
| Pacote | Setup | Inclui |
|---|---|---|
| Plus | R$ 4.500 | CRM + Sofia voz + Neural + equipe painel + Zap lembretes/inbox + handoff Gabi IA + relatório semanal |
Tarifas de crédito (saldo único, sem taxa oculta): voz R$ 1,75/min · template R$ 0,12 · inbox R$ 0,12 · IA R$ 0,35/msg · Neural R$ 0,20/pergunta.
UI: aba Créditos no CRM e card Tarifas e planos no Cloud (segmento clínica).
Módulo: clinica-pacotes-comerciais.js
Saldo único no Luxtor Cloud paga ligações de voz e mensagens WhatsApp. Sem saldo, envio/ligação é bloqueado (HTTP 402).
| Tipo | Tarifa | Onde |
|---|---|---|
| Ligação Sofia | R$ 1,75/min | Dialer / Teste ao Vivo — débito ao encerrar |
| Neural suporte | R$ 0,20/pergunta | Chat 🧠 no painel CRM |
| WhatsApp template | R$ 0,12 | Lembretes, NPS, relatório semanal |
| WhatsApp inbox | R$ 0,12 | Resposta manual na aba WhatsApp |
| Handoff IA (pós-ligação) | R$ 0,35 | Zap conversacional após Sofia |
cloudTenantId (contas antigas sem Cloud).Extrato: Cloud → aba Extrato — cada linha mostra tipo de uso + tarifa aplicada (debito_voz, debito_zap, debito_neural) · CRM → Relatório → card Créditos.
Módulos: luxtor-creditos.js · clinica-zap-billing.js · débito voz no voice-sofia-clinica
Sino no cabeçalho alerta: interessados pendentes, SLA > 2h, limite de plano, saldo de créditos baixo, trial legado expirando, tarefas pendentes e tarefas atrasadas.
Rate limit login: 8 tentativas / 15 min · forgot-password: 4 / 15 min
Branding: PUT /api/clinic/branding · Auditoria: GET /api/auditoria
LGPD: GET /api/lgpd/export · POST /api/lgpd/excluir (gerente)
Backup admin: GET /api/admin/backup-status
E-mail: configure RESEND_API_KEY, MAIL_FROM=crm@luxtor.ia.br e MAIL_FROM_NAME no .env · Templates HTML para senha, trial e relatório
O Luxtor Clínica CRM é o painel de gestão de leads, jornada e agendamentos para clínicas parceiras Luxtor. Cada clínica tem dados isolados, login próprio e white-label no cabeçalho.
clinica-painelplano: demo) e o showroom clinica-horizonte têm Sofia/Gabi no Config → Teste ao Vivo. Clientes básico/plus usam equipe humana no painel; campanhas de voz consomem créditos./demo ou provisionamento admin cria tenant Cloud com R$ 20, login unificado e cloudTenantId. Zap e voz debitam do mesmo saldo./agendar/{clinica-id}), WhatsApp inbox e PostgreSQL em produção.crm@luxtor.ia.br) → defina nova senha. APIs: POST /auth/forgot-password e POST /auth/reset-password.POST /auth/change-password com senha atual e nova./auth/request-otp) está desativado por segurança. Use sempre e-mail + senha.clients-db.json + clinicaId isolado + modo painel/api/admin/clients/:id).| Aba | Função | Quem vê |
|---|---|---|
| Dashboard | KPIs, funil, saúde dos serviços, checklist | Todos |
| Interessados | Leads quentes para ação humana imediata | Todos |
| Jornada | Funil completo + export CSV | Todos |
| Agenda | Agendamentos confirmados (coluna profissional) | Todos |
| Recepção | Agendamentos de hoje + observação Sofia + Enviar Zap → guia | Todos |
| Tarefas | Follow-up da equipe — pendências e vencimentos | Todos |
| Conversas | Histórico derivado da jornada (preview + modal) | Todos |
| Inbox de recepção — threads e respostas manuais | Todos | |
| Chamadas | Histórico Twilio e custos | Admin |
| Equipe | Profissionais + integrações (webhooks, agendamento público) | Gerente / Admin |
| Ajustes | Logo, equipe, LGPD, auditoria, Auto-Pilot | Gerente (piloto e produção) |
| Config | Voz, PM2, automações, clientes (admin) — só showroom | Admin Luxtor |
| Relatório | Análise diária + PDF + score NPS | Todos |
| Não Perturbe | Lista LGPD — bloqueia discagem | Todos |
| Créditos | Saldo Luxtor Cloud vinculado | Cliente com tenant |
Leads em etapas interessado, em-contato e atendeu aparecem aqui para a equipe da clínica ligar, agendar ou atualizar status manualmente.
Lista conversas derivadas do histórico da jornada: preview, turnos, duração e modal com transcrição. Filtros: hoje, interesse, rejeição, ocupado. Busca por nome/telefone.
Funil completo:
pendente → ligando → atendeu → interessado → agendado-zap → agendado → confirmado → compareceu
↓ ↓ ↓
nao-atendeu nao-interessado nao-agendou / nao-compareceu
agendado com fonte: sofia-voz — sem etapas intermediárias na demo. Ver Sofia → CRM.GET /api/jornada/export — exporta id, nome, telefone, etapa, fonte, score.| Plano | Inclui |
|---|---|
| Demonstração | Self-service em /demo · R$ 20 créditos · Teste ao Vivo · 500 leads · sem expiração por data |
| Plus | CRM completo, Sofia voz, Gabi Zap, Neural, relatório semanal, agendamento público, inbox WhatsApp |
apiGate exige token em /api/* exceto rotas públicas (/api/public/*, /api/hooks/*), webhooks Twilio e master. Cookies secure em produção.x-painel-token para endpoints internos.?clinicaId=./opt/clinica-painel/.env — nunca no código versionado.Dados da jornada, tarefas, profissionais, inbox e NPS são armazenados por clínica:
Produção (recomendado): PostgreSQL via DATABASE_URL — banco luxtor_clinica
Desenvolvimento / fallback: /opt/clinica-painel/clinica-data/{clinicaId}.json
Migração automática do legado clinica-db.json e dos arquivos JSON para PG na primeira inicialização com DATABASE_URL. Admin vê métricas em Config → Métricas por Clínica (GET /api/admin/metrics).
| Rotina | Quando | O quê |
|---|---|---|
| Monitor serviços | A cada 2 min | Alerta WhatsApp se dialer/painel/voz cair |
| Lembretes consulta | A cada 15 min | 24h e 2h antes (Gabi Zap) |
| Reagendamento | 00h | Leads nao-interessado → pendente após 30 dias |
| Relatório diário | 20h | Resumo Clínica Horizonte → admin |
| Relatório semanal | Domingo 8h | Resumo por clínica → WhatsApp do cliente |
| NPS | 3h após compareceu | Pesquisa 0-10 via Gabi + score no Relatório |
Ao primeiro acesso, o usuário deve aceitar os termos (POST /auth/accept-terms). A lista Não Perturbe permite bloquear números que solicitaram não ser contactados — o dialer respeita automaticamente.
Dados pessoais (nome, telefone, histórico) são processados para gestão comercial da clínica contratante. Solicitações de exclusão devem ser feitas à clínica ou ao suporte Luxtor.
etapa: agendado + fonte: sofia-voz. Token interno: x-painel-tokenRecepção
Tarefas
Equipe e integrações
WhatsApp inbox
Públicas (sem JWT)
NPS
Showroom — crm.luxtor.ia.br
| Serviço | PM2 | Porta |
|---|---|---|
| Painel CRM | clinica-painel | 3350 |
| Automações | clinica-automacoes | 3351 |
| Luxtor Cloud | luxtor-cloud | 3360 |
| Dialer | dialer-clinica | 4601 |
| Voz Sofia | voice-sofia-clinica | 3343 |
| Sofia gateway | sofia-clinica | 18796 |
| Gabi gateway | gabi-clinica | 18797 |
| Neural (Lux) | suporte-luxtor | 18800 |
| Salão equipe | equipe-salao | 18950 |
| Luxtor gateway | luxtor-gateway | 18790 |
Piloto — crm-piloto.luxtor.ia.br
| Serviço | PM2 | Porta |
|---|---|---|
| Painel CRM | clinica-painel | 3350 |
| Dialer | dialer-clinica-piloto | 4601 |
| Lia voz | lia-clinica-piloto | 18796 |
| Nina Zap | nina-clinica-piloto | 18797 |
| Neural (Lux) | suporte-luxtor | 18800 |
URLs: crm.luxtor.ia.br · crm-piloto.luxtor.ia.br · Deploy: scripts/deploy-crm-ambos.py
clinica-horizonte. Clientes reais não veem configuração de voz nem campanha automática com IA.Atributo UI: data-ia-teste + flag features.iaTeste em /auth/me.
agendado com observação. Recepção vê na aba Recepção. Documentação: Sofia → CRM.demo=1. Fluxo B2B: agendamento (Ato 1) → pitch Luxtor (Ato 1b+) — CRM só muda na confirmação do horário.