Pular para o conteúdo

Big Picture

scroll = zoom · drag = pan · ESC = fechar · pinch = touch zoom

Do café no carrinho à assinatura recorrente em 14 eventos pivotais, agrupados em 4 atos narrativos. EventStorming nível 1 (Brandolini): só eventos 🟧, atores 🟨 e hotspots 🟥. Pra comandos, políticas e read models por tela, veja Processo Detalhado.

🟧 evento de domínio🟨 ator / persona🟥 hotspot / questão aberta

🟥 Hotspot crítico — Backstage de Catálogo ausente

Seção intitulada “🟥 Hotspot crítico — Backstage de Catálogo ausente”
🟥 HOTSPOT CRÍTICO

Nenhum ato modela quem carrega o catálogo. Eventos como “Catálogo de cafés exibido” aparecem como read-models, mas sem comando de origem. Bloqueia decisão de stack (CMS sim/não?) e escopo do Painel Admin. 5 perguntas pra Cliente Master Espresso antes de modelar Ato 0 · Backstage:

  1. Cadastro de produto: quem cadastra novo café, bebida, complemento ou máquina? CMS admin com UI dedicada, seed estático no deploy, ou planilha/CSV integrado?
  2. Frequência de alteração de preço: mensal, trimestral, ad-hoc? Define se precisa UI de edição em tempo real ou se deploy manual aceita.
  3. Estoque e disponibilidade: trackeado por SKU? Quando esgota, produto some do catálogo automaticamente ou continua exibido com badge “indisponível”?
  4. Foto e descrição: upload via admin (Supabase Storage / S3) ou apenas URL externa cadastrada manualmente?
  5. Categorias dinâmicas: as 3 categorias T1/T2/T3 (cafés, bebidas quentes, complementos) são fixas no código ou admin pode criar/renomear novas categorias e mover produtos entre elas?

→ Ver também Questões Abertas · referência cruzada EC-11 BACKSTAGE-CATALOG.

flowchart TD
  T1[T1 · Selecao de cafes] --> T2[T2 · Bebidas quentes]
  T2 --> T3[T3 · Complementos]
  T3 --> Q{Novo cliente?<br/>sessao + estado assinatura}
  Q -->|sim / anonimo| T4[T4 · Escolha da maquina]
  Q -->|cliente existente| T5
  T4 --> T5[T5 · Revisao e termos]
  T5 -->|cesta valida + termos aceitos| T6[T6 · Cadastro + CEP]
  T5 -.->|cesta sem cafe RN-11| Block1[Bloqueado]
  T6 --> CEP{CEP na Grande SP?}
  CEP -->|sim| T7[T7 · Pagamento]
  CEP -.->|nao EC-01| Wait[Lista de espera / mailing]
  T7 -->|autorizado| Done([Assinatura ativada])
  T7 -.->|recusado| Retry[Pendente · retry 24h]

Linhas pontilhadas = unhappy paths (Block / Wait / Retry). Linhas sólidas = happy path.

ATO 0T0Admin Catálogo

Admin do cliente Master Espresso alimenta o catálogo de SKUs (produtos + preços + fotos + categorias) que será exibido no carrinho do Ato 1.

Produto cadastrado (café, bebida, complemento, máquina)
Preço atualizado
Foto e descrição publicadas
Catálogo publicado (versão exibível ao visitante)
Cadastro de produto e categorias dinâmicas — modelo ainda não decidido. Ver hotspot crítico topo. (EC-11)
ATO 1T1 – T5Visitante anônimoEx-clienteCliente ativo logado

Visitante navega o catálogo, monta a cesta de cafés + bebidas + complementos, escolhe máquina se for novo cliente, aceita os termos e submete o pedido.

Cafés adicionados ao carrinho
Carrinho enriquecido com bebidas e complementos
Modelo de máquina selecionado (novo cliente)
Termos aceitos e pedido submetido

EC-02 — critério “novo cliente” ambíguo: 3 personas distintas. Regra de negócio T3 (seleção de máquina) depende de qual persona entra no fluxo.

PersonaEscolhe máquina (T3)?Vai pra T6 CEP?T7 pagamento?
Visitante anônimo (sem conta)SimSimSim
Ex-cliente (assinatura Cancelada / Suspensa)Não (já tem)SimSim
Cliente ativo logado (assinatura Ativa)N/AN/A→ T10
EC-14 pendente: ex-cliente reativa assinatura existente ou cria nova? Fluxo de renovação reaproveita CEP do cadastro?
EC-18 — limites de cesta indefinidos. Mínimo de pedido (RN-11 propõe ≥1 café)? Máximo por SKU (evita estoque drenado por 1 cliente)? Cesta totalmente vazia bloqueia checkout?
ATO 2T6 – T7Visitante → Cliente

Visitante vira cliente: informa CEP, cria conta, paga, e a assinatura é ativada.

CEP validado (Grande SP)
Conta de cliente criada (e-mail único validado)
Login realizado (ex-cliente reentra fluxo)
Senha redefinida via e-mail (reset opcional)
Método de pagamento selecionado (Pix Automático ou cartão recorrente)
PagamentoPix.Recebido (1ª cobrança Pix Automático confirmada pelo gateway)
PagamentoCartao.Cobrado (1ª cobrança cartão recorrente autorizada pelo gateway)
Assinatura mensal ativada
ViaCEP sem SLA contratual. API externa gratuita; risco de queda. (T6)
RN-01 — base Grande SP indefinida. Lista de municípios elegíveis não foi especificada. (T6)
EC-16 — autenticação não modelada. Onboarding mistura “criar conta” e “login” (ex-cliente). Sessão expira no meio do funnel = carrinho perdido? Conta duplicada (mesmo e-mail) bloqueia ou loga? Reset de senha via e-mail mágico (Supabase Auth default) ou link clássico? (T6)
DECISÃO RATIFICADA — Gabriel 2026-06-09 (Lane X)EC-02 — Gateway de pagamento: Pagar.me (Pix Automático + cartão recorrente). (T7)

Pagar.me suporta nativamente Pix Automático (cobrança recorrente via Pix conforme Bacen) e cartão recorrente tokenizado na mesma API — score 8/10 agentic (sandbox instantâneo, docs API-first). Pix e cartão são opções gêmeas no checkout: assinante escolhe. Stripe descartado: não suporta Pix Automático recorrente em BR (hard blocker per X research 2026-06-09). Custo estimado: ~0,99% por cobrança Pix Automático · 2,99% + R$0,29 por cobrança cartão recorrente.

✅ Decidido. Cliente Master Espresso só precisa abrir conta produção e nos liberar credenciais antes de S3.
ATO 3REC + T8 – T10SistemaClienteLogística

Sistema processa a cobrança mensal e despacha pedidos; provider de logística confirma entrega (ou registra falha); cliente acompanha e altera a cesta pelo painel.

Ciclo mensal de cobrança iniciado
Cobrança processada — ou retries esgotados → assinatura suspensa
Pedido montado / separado (caixa do mês)
Pedido cancelado pré-despacho (se cliente cancelou no dia)
Pedido despachado para logística
Rastreamento atualizado (webhook Melhor Envio)
Entrega confirmada
Falha de entrega registrada
Entrega reenviada (após N tentativas)
Cesta alterada agendada para próximo ciclo
EC-05 — data de corte do ciclo mensal indefinida. (T8–T10)
EC-12 — provider de logística TBD. Quem confirma entrega? Webhook do provider, app do entregador ou import manual? 3+ falhas consecutivas suspende assinatura?
DECISÃO PROVISÓRIA — aguarda confirmação Cliente Master EspressoNF-e + Logística: NF-e via integração Pagar.me + Correios PAC via Melhor Envio (proposto). (REC)

NF-e emitida via integração Pagar.me + provider fiscal (eNotas/NFE.io conforme indicação Pagar.me) para MVP. Logística: Correios PAC com etiquetas via Melhor Envio API — sem contrato corporativo, cobertura nativa SP capital + Grande SP, custo estimado ~R$15–25 por caixa.

⚑ Confirmar com Cliente Master Espresso até início Semana 3.
ATO 4T11 – T13Admin

Admin Master Espresso opera o ciclo de vida das assinaturas, com trilha de auditoria.

Admin suspendeu / cancelou / forçou cobrança
Log de auditoria gerado
Health check de ciclo executado (job rodou na data esperada?)
Reconciliação pós-cobrança executada (fallback p/ webhook perdido)
Dashboard operacional consultado (visão de inadimplentes / suspensas / churn)
EC-10 — Suspensa ≠ Cancelada + “Forçar Cobrança” sem idempotência. Máquina de estados ausente, risco de cobrança duplicada.
Observabilidade — wire via ops-stack. Sentry (errors), Better Stack (uptime cobrança job), PostHog (funil de checkout) — ver skill ops-stack p/ scaffold automático.
ATO 5T8’ – T9’ (Painel Cliente)Cliente

Cliente opera a própria assinatura — cancela, pausa, atualiza cartão ou endereço — sem precisar contatar Admin. Requisito legal: CDC art. 49 (direito de arrependimento, 7 dias).

Cliente solicitou cancelamento (com / sem motivo)
Cliente pausou assinatura voluntariamente
Cartão atualizado (renovação ou troca)
Endereço de entrega atualizado (com nova validação CEP)
CDC art. 49 — direito de arrependimento. 7 dias após contratação. Implica fluxo de cancelamento estendido + reembolso integral nesse período?
Pausa ≠ Suspensa. Pausa voluntária do cliente vs Suspensa por inadimplência — máquina de estados precisa de estado Pausada separado, ou reusa Suspensa com flag de origem?

Domínio Transversal · Comodato (cross-Atos T3 → REC → T13)

Seção intitulada “Domínio Transversal · Comodato (cross-Atos T3 → REC → T13)”
COMODATOcross T3 / REC / T13SistemaLogísticaAdmin

Hardware físico (máquina) cria obrigações contratuais bidirecionais que cruzam todos os atos: despacho inicial em T3, ciclo de manutenção em REC, devolução pós-cancelamento em T13. Domínio ausente do BRIEF — modelo trata máquina como dado-de-graça.

Máquina despachada em comodato (nº série + termo)
Máquina com defeito reportada
Substituição de máquina solicitada
Máquina devolvida (pós-cancelamento)
Prazo de devolução expirado
Multa de comodato aplicada
EC-15 — prazo mínimo de assinatura para comodato. Cancelar antes de N meses paga multa proporcional? Valor por mês restante? (RN-07 / RN-10)
Seguro de máquina. Quem responde por dano, furto ou roubo? Embutido na mensalidade, opcional contratado ou cliente paga integralmente? (RN-08)
Logística reversa. Quem agenda coleta da máquina devolvida? Mesmo provider de entrega (Correios PAC + Melhor Envio) ou contratado separadamente?

Comunicação Transversal · Notificações ao Cliente

Seção intitulada “Comunicação Transversal · Notificações ao Cliente”

Nenhum ato modela explicitamente comunicação — gap crítico em sistema de assinatura recorrente. Tabela abaixo lista os 7 triggers mínimos.

Trigger (evento)NotificaçãoCanalSLA
Assinatura ativada (T7)Boas-vindas + confirmação + termosimediato
Cobrança processada (REC)Recibo + NF-e anexaaté 24 h
Pagamento recusado (Inadimplente)Alerta + link para atualizar cartãoSMSimediato
Pedido despachado (T8)Código de rastreamento + ETAaté 1 h pós-despacho
Entrega falhouComunicado + próximos passos (reentrega / pickup)SMSimediato
Assinatura suspensa por SLAAviso de suspensão + link reativaçãoimediato
Cesta alterada (T10)Confirmação + lembrete data próximo cicloimediato
EC-17 — provider de e-mail TBD. Resend / Postmark / SendGrid / AWS SES? Volume estimado ~7 × N assinantes/mês.
SMS é necessário? Custo ~R$0,08/SMS. Restringir aos triggers críticos (pagamento recusado, entrega falhou) ou descartar pra MVP?

Padrões de stack para envio: ver skill ops-stackreferences/growth.md (Resend é o default Gabriel) + references/observability.md (delivery webhooks pra Sentry).

A ausência de uma máquina de estados explícita é o núcleo do hotspot EC-10. O diagrama e a tabela abaixo definem os seis estados válidos e todas as transições — incluindo o guard obrigatório em Forçar Cobrança para eliminar o risco de cobrança duplicada.

stateDiagram-v2
  [*] --> Pendente: pedido submetido
  Pendente --> Ativa: pagamento autorizado
  Pendente --> Cancelada: 2 retries falharam (ativacao)

  Ativa --> Inadimplente: ciclo mensal recusado
  Inadimplente --> Ativa: retry confirmado (webhook)
  Inadimplente --> Suspensa: retries esgotados

  Ativa --> Suspensa: cliente suspendeu
  Suspensa --> Ativa: cliente reativou
  Suspensa --> Cancelada: SLA esgotado / cancelou

  Ativa --> Cancelada: cancelamento direto

  Ativa --> AguardandoConfirmacao: Forcar Cobranca [guard duplo]
  AguardandoConfirmacao --> Ativa: webhook confirmou
  AguardandoConfirmacao --> Inadimplente: webhook recusou

  Cancelada --> [*]

  note right of AguardandoConfirmacao
    Guard (EC-10): status == Ativa
    AND NOT cobranca_em_andamento(ciclo_atual)
    Sem guard = cobranca duplicada
  end note
DeParaGatilhoIdempotência
PendenteAtivaPagamento autorizado pelo gatewayGuard: event idempotency key único por transação
AtivaInadimplenteCiclo mensal falhou (gateway recusou)Guard: só transita uma vez por ciclo (idempotency key = assinatura + ciclo)
InadimplenteAtivaRetry bem-sucedido — webhook confirmou pagamentoGuard: webhook idempotency key pelo gateway
InadimplenteSuspensaNúmero máximo de retries esgotados (política: N tentativas em X dias)Guard: só transita se status ainda for Inadimplente
AtivaSuspensaCliente pediu suspensão pelo painelGuard: idempotente (replayable) — status check antes de persistir
SuspensaAtivaCliente reativou a assinatura (evento Reativada)Guard: só transita se status == Suspensa
SuspensaCanceladaSLA de suspensão esgotado OU cliente cancelou explicitamenteGuard: Cancelada é terminal — sem retorno
AtivaCanceladaCliente cancelou diretamente (sem passar por Suspensa)Guard: Cancelada é terminal — sem retorno
AtivaAguardandoConfirmaçãoAdmin executou Forçar Cobrançarequer guard duploCRÍTICO — sem guard = cobrança duplicada (EC-10)
AguardandoConfirmaçãoAtivaWebhook do gateway confirmou pagamentoGuard: webhook idempotency key pelo gateway
AguardandoConfirmaçãoInadimplenteWebhook do gateway recusou pagamentoGuard: webhook idempotency key pelo gateway

Guard obrigatório — Forçar Cobrança: a ação só pode ser disparada quando assinatura.status == “Ativa” E NOT exists(cobranca_em_andamento(ciclo_atual)). Sem esse guard duplo, um duplo-clique no painel admin (ou retry de requisição HTTP) cria duas cobranças no gateway para o mesmo ciclo. A flag cobranca_em_andamento deve ser persistida atomicamente junto com a transição para AguardandoConfirmação — nunca em memória.

Ato 2 · T6CEP fora de cobertura
TriggerT6 CEP validado (ViaCEP retorna OK)
Evento de desvioCEP fora da lista Grande SP

Conversão bloqueada antes da criação de conta. Visitante vê cobertura limitada + opção de entrar na lista de espera (mailing). Nenhum evento de conta criada ou assinatura é emitido.

Ato 2 · T7Primeira cobrança recusada
TriggerT7 Pagamento recorrente autorizado pelo gateway
Evento de desvioGateway recusa cartão na ativação inicial

Assinatura criada com status Pendente (nunca Ativa). Retry automático em 24 h; após 2 tentativas sem sucesso, status muda para Cancelada por falha de ativação. Distinto dos retries do Ato 3, que se aplicam apenas a clientes ativos no ciclo recorrente.

Ato 3 · T10Alteração após data de corte
TriggerT10 Cesta alterada agendada para próximo ciclo
Evento de desvioEdição submetida depois do dia de corte do mês

Sistema aceita a alteração mas agenda para o ciclo seguinte (evento Cesta alterada agendada já existe no happy path). Hotspot: o cliente sabe disso? A UI mostra contagem regressiva até o próximo corte? Sem feedback visual, a expectativa de entrega no ciclo atual é frustrada silenciosamente.

📚 Processo Detalhado · 48 eventos + comandos + políticas + read models (swim lanes T1–T13 + REC)

O modelo Process Modeling (Brandolini nível 2) está em /eventstorming/process/ — visão completa por swim lane com todos os comandos (azul), políticas (lilás), agregados (amarelo) e read models (verde) que disparam cada evento. Página dedicada porque o scroll de 48 eventos é longo e inviabiliza inline.