Skip to content

landing-001 — Hero CTA direct-to-WhatsApp

CEO doc (decisão 2026-06-03) killou a mecânica de waitlist ("bobeira"). A landing vira final, não pre-launch: visitante chega, lê pitch curto (“Finanças do casal, sem briga”), clica “Falar com mel no WhatsApp” e cai direto na conversa com o bot via wa.me/<bot>?text=oi. Sem form. Sem email. Sem fila. Sem signup. Anonymous-first (ADR 006) preservado — identidade nasce no whats via waid (ADR 007), não na landing.

A landing roda como app separado (apps/landing/, Astro — ADR 005). O número do bot vem de uma variável de build (WA_BOT_NUMBER, ex.: 5511999999999); o spec é neutro em relação ao valor — só checa que a URL do clique segue o padrão wa.me/<digitos>?text=<prefix>.

Share viral (cenário landing-002) funciona via URL melfinance.com.br/?ref=<shareToken>. Quando o parceiro/amigo abre esse link na landing, a página detecta o ?ref= e:

  1. Mostra um bloco referral-prefill com texto “você foi convidado por {ownerName}” (lookup via GET /api/referral-resolve?ref=<token> ou prefill no servidor, impl decide).
  2. A CTA primária passa a apontar pra wa.me/<bot>?text=ref-<shareToken> em vez de wa.me/<bot>?text=oi. O bot detecta o prefixo ref- na primeira mensagem e dispara attribution via cenário 016 Referral attribution (refactored em paralelo).

Anonymous-first na landing: a página é stateless. Nenhum cookie, nenhum localStorage. Não existe estado a persistir — o visitante ou (a) clica e some pro whats, ou (b) chega via ?ref=, vê prefill, clica e some pro whats. Estado de couple/household só passa a existir quando o bot recebe a primeira mensagem (ADR 007 + wa-001).

A CTA secundária (“Compartilhar com parceiro/amiga”) leva pra UX coberta em landing-002 — modal ou rota /compartilhar, impl decide. O spec aqui só asserta que o botão existe e dispara navegação/UI; o resto é responsabilidade do landing-002.

Scenario: Visitante chega na landing e clica na CTA primária

Section titled “Scenario: Visitante chega na landing e clica na CTA primária”
  • Given o visitante abre a landing em PT-BR pela primeira vez, sem query param ?ref=
  • When ele vê o hero “Finanças do casal, sem briga”
  • And clica em “Falar com mel no WhatsApp”
  • Then a URL do clique aponta pra wa.me/<numero_do_bot>?text=oi (formato wa.me/<digitos> + query text=oi)
  • And nenhum cookie/localStorage é criado pelo pageview (anonymous-first — ADR 006; identidade nasce no whats)

Scenario: Visitante chega via ?ref=<shareToken> e vê prefill de referral

Section titled “Scenario: Visitante chega via ?ref=<shareToken> e vê prefill de referral”
  • Given existe um shareToken="tok_abc123" válido pertencente ao casal “Ana e Bruno”
  • And o backend mockado resolve GET /api/referral-resolve?ref=tok_abc123{ ownerName: "Ana e Bruno" }
  • When o visitante abre a landing com ?ref=tok_abc123 na URL
  • Then o hero é renderizado igual, mas o bloco referral-prefill aparece com texto “Você foi convidado por Ana e Bruno” (regex tolerante /convidad|junto/i)
  • And a CTA primária agora aponta pra wa.me/<numero_do_bot>?text=ref-tok_abc123 (prefixo ref- carrega o shareToken pro bot)
  • When o visitante clica na CTA primária
  • Then a URL do clique contém wa.me/ + text=ref-tok_abc123

Scenario: Visitante revisita a landing sem ?ref= — sem persistência local

Section titled “Scenario: Visitante revisita a landing sem ?ref= — sem persistência local”
  • Given o visitante já abriu a landing antes (clicou no CTA, voltou) e agora abre / de novo sem query param
  • When a página carrega
  • Then o hero é renderizado idêntico à primeira visita (mesmo pitch, mesma CTA “Falar com mel no WhatsApp” → wa.me/<numero_do_bot>?text=oi)
  • And nenhum cookie/localStorage relacionado a waitlist/share/ref foi criado pelo pageview anterior (anonymous-first — ADR 006)