/projects/kota-embed
← Todos os projetosKota Embed
Adesão a plano de saúde, embutida dentro das plataformas de outras empresas.
Senior Product Engineer, time de plataforma · Trabalho profissional

Visão geral
O Kota Embed permite que empregadores ofereçam plano de saúde aos funcionários sem sair do software que já usam — o fluxo de adesão roda embutido numa plataforma de terceiro, apoiado por um serviço .NET multi-tenant que integra direto com as seguradoras.
O que eu fiz
O núcleo multi-tenant foi meu — a parte que transforma um pedido de adesão numa apólice, através de nove seguradoras que se comportam de formas diferentes.
- As máquinas de estado de intent por trás de adesão, cotação, alteração e renovação.
- Requisitos adaptativos: perguntar a um serviço o que um caso precisa coletar, em vez de codificar um formulário por seguradora.
- O contrato versionado da API pública e seus webhooks.
- Contratos de provedor introduzidos atrás de feature flags e migrados sem parar o produto.
- Idempotência e supressão de duplicatas, e a suíte de integração que cobre as duas.
O front-end — o fluxo embutido e seu SDK — foi feito por outros; não tenho commits nele.
O problema
Inscrever alguém num plano de saúde parece um formulário. Não é. Cada seguradora quer dados diferentes, em formato diferente, no tempo dela; umas respondem por HTTP, outras trocando arquivos por SFTP. As obrigações regulatórias de disclosure mudam conforme a região. E tudo isso acontece dentro de um iframe hospedado na plataforma de outra empresa, onde o usuário espera que seja imediato. Um formulário hardcoded por seguradora não sobrevive à segunda seguradora.
Em números
Arquitetura
Um monólito modular em .NET dividido por contexto delimitado: o núcleo multi-tenant da plataforma, um módulo por seguradora, mais compliance, webhooks e relatório financeiro. O núcleo nunca chama uma seguradora direto — toda chamada a provedor passa por uma adapter factory, então o código que roda uma adesão não sabe com qual seguradora está falando. Trabalho de longa duração é modelado como intent: uma máquina de estados persistida, e não uma requisição mantida aberta.
- Third-party platformA aplicação hospedeira, embutindo o fluxo de adesão num iframe.
- Public APIContrato versionado e webhooks assinados para as plataformas que embutem o fluxo.
- Platform coreEmpregadores, funcionários, elegibilidade e as máquinas de estado dos intents.
- Adapter factoryA única porta para cada seguradora, mantendo o núcleo agnóstico de provedor.
- Insurer integrationsUm módulo por seguradora, por HTTP ou troca agendada de arquivos via SFTP.
A vida de uma adesão
Estes são os status pelos quais uma adesão realmente passa. Ela também pode terminar inelegível, ou nem ser realizada — o caminho feliz abaixo não é a única saída.
- ProcessingO pedido é registrado sob sua chave de idempotência e validado, antes de qualquer chamada externa.
- ActionRequiredFalta algo que só uma pessoa pode fornecer. O intent declara isso e espera, em vez de falhar.
- PendingConfirmationTudo o que a seguradora e a região exigem está reunido; quem pediu confirma antes do envio.
- EnrollingEntregue à seguradora pelo adapter dela, que responde no tempo dela.
- EnrolledA apólice existe. A plataforma reporta de volta a quem pediu.
O que faz
- Multi-tenant por construção: plataforma → empregador → funcionário → grupo, isolados por tenant.
- Configuração de grupo, adesão, cotação, alteração, renovação, importação de apólice e gestão de dependentes, cada uma como seu próprio fluxo.
- Elegibilidade calculada a partir das regras do provedor, em vez de guardada como flag.
- Dados de apólice e plano agregados entre seguradoras numa resposta única.
- Uma API pública versionada e webhooks assinados para as plataformas que embutem o fluxo.
- Integrações de seguradora tanto por API HTTP quanto por troca agendada de arquivos via SFTP.
Decisões de engenharia
Intent em vez de request/response
Uma adesão não termina dentro de uma chamada — uma seguradora pode levar minutos ou dias. Modelar isso como máquina de estados persistida, com status próprio, transforma o estado intermediário em algo que o sistema consulta, retoma e reporta, em vez de uma transação mantida aberta na esperança.
Requisitos adaptativos em vez de um formulário por seguradora
O que um caso precisa coletar depende da seguradora e da região regulatória ao mesmo tempo. Em vez de codificar nove formulários, a plataforma pergunta a um serviço de requisitos o que aquele caso exige e renderiza isso. Adicionar uma seguradora deixa de ser mudança de front-end. A consulta acontece atrás da mesma fronteira de adapter, então o núcleo continua sem manipular a identidade de nenhum provedor.
Uma adapter factory como única porta para o provedor
O núcleo da plataforma resolve um adapter e fala com ele. Nunca fica sabendo qual seguradora está atendendo, e é isso que impede uma décima integração de tocar na lógica de adesão — e o que permitiu introduzir contratos de provedor atrás de feature flags e migrar sem parar o produto.
Idempotência e supressão de duplicata como requisito, não conserto
Retry acontece, webhook chega duas vezes e consumidores rodam concorrentes sobre as mesmas linhas. A criação de intent aceita chave de idempotência, a adesão automática suprime o par intent-e-webhook duplicado, e o consumer de triagem de elegibilidade trata conflito de serialização em vez de assumir que ele não ocorre.