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:
- Mostra um bloco
referral-prefillcom texto “você foi convidado por {ownerName}” (lookup viaGET /api/referral-resolve?ref=<token>ou prefill no servidor, impl decide). - A CTA primária passa a apontar pra
wa.me/<bot>?text=ref-<shareToken>em vez dewa.me/<bot>?text=oi. O bot detecta o prefixoref-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(formatowa.me/<digitos>+ querytext=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_abc123na URL - Then o hero é renderizado igual, mas o bloco
referral-prefillaparece 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(prefixoref-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)