diff --git a/src/app/__tests__/home-conversion.test.tsx b/src/app/__tests__/home-conversion.test.tsx
new file mode 100644
index 00000000..659af79d
--- /dev/null
+++ b/src/app/__tests__/home-conversion.test.tsx
@@ -0,0 +1,144 @@
+/** @vitest-environment jsdom */
+import { beforeEach, describe, expect, it, vi } from "vitest";
+import { fireEvent, render, screen, within } from "@testing-library/react";
+import Home from "../page";
+import { trackFunnelCtaClick, trackHomeCta } from "@/lib/analytics";
+
+vi.mock("@/lib/analytics", () => ({
+ trackFunnelCtaClick: vi.fn(),
+ trackHomeCta: vi.fn(),
+ trackCtaWhatsAppClick: vi.fn(),
+ trackCtaScroll50: vi.fn(),
+ trackScrollDepth: vi.fn(),
+ trackEcosystemLinkClick: vi.fn(),
+ trackToolCardClick: vi.fn(),
+ trackCtaDemoClick: vi.fn(),
+}));
+
+const SECTION_ORDER = [
+ "hero-heading",
+ "problem-solution-heading",
+ "how-it-works-hub-heading",
+ "whatsapp-product-heading",
+ "faq-heading",
+ "final-cta-v2-heading",
+ "tools-heading",
+ "products-heading",
+] as const;
+
+const UNSUPPORTED_CLAIMS = [
+ "LIVE",
+ "Produção",
+ "1.247",
+ "74%",
+ "2m12s",
+ "70%",
+ "100%",
+ "números reais",
+ "não mockup",
+ "não é mockup",
+ "Ver exemplo real",
+ "Operações reais",
+ "24/7",
+];
+
+describe("home conversion cleanup", () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ vi.stubEnv("NEXT_PUBLIC_WHATSAPP_NUMBER", "5511999999999");
+ });
+
+ it("ordena a decisão antes do ecossistema e não mostra prova inventada", () => {
+ render();
+
+ const nodes = SECTION_ORDER.map((id) => {
+ const node = document.getElementById(id);
+ expect(node, id).toBeTruthy();
+ return node!;
+ });
+
+ for (let index = 1; index < nodes.length; index += 1) {
+ const relation = nodes[index - 1].compareDocumentPosition(nodes[index]);
+ expect(relation & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
+ }
+
+ const text = document.body.textContent ?? "";
+ for (const claim of UNSUPPORTED_CLAIMS) {
+ expect(text).not.toContain(claim);
+ }
+
+ expect(text).toContain("Dados ilustrativos");
+ expect(text).toContain("Demonstração da plataforma");
+ expect(text).toContain("Quer entender como isso funcionaria na sua operação?");
+ expect(screen.getByRole("heading", { name: "O que entra na operação" })).toBeTruthy();
+ expect(screen.getByRole("heading", { name: "Como sua operação de WhatsApp sai do improviso" })).toBeTruthy();
+ expect(screen.getByRole("heading", { name: "Perguntas frequentes" })).toBeTruthy();
+ });
+
+ it("separa CTA primário, demo e WhatsApp no hero", () => {
+ render();
+ const hero = screen.getByRole("region", { name: /Menos mensagem perdida/i });
+
+ const primary = within(hero).getByRole("link", {
+ name: "Agendar diagnóstico da operação no WhatsApp",
+ });
+ expect(primary).toHaveAttribute("href", "/contato");
+ expect(primary.className).toContain("df-btn-primary");
+
+ const demo = within(hero).getByRole("link", {
+ name: "Ver demonstração guiada de atendimento no WhatsApp",
+ });
+ expect(demo).toHaveAttribute("href", "/demo");
+ expect(demo).toHaveTextContent("Ver demo");
+ expect(demo.className).not.toContain("df-btn-primary");
+
+ const whatsapp = within(hero).getByRole("link", {
+ name: "Falar no WhatsApp com a DevFlow Labs",
+ });
+ expect(whatsapp.getAttribute("href")).toMatch(/^https:\/\/wa\.me\/5511999999999/);
+ expect(whatsapp.className).not.toContain("df-btn");
+
+ fireEvent.click(primary);
+ expect(trackFunnelCtaClick).toHaveBeenCalledWith({
+ cta: "agendar_diagnostico",
+ surface: "hero_primary",
+ });
+ expect(trackHomeCta).toHaveBeenCalledWith("hero_agendar_diagnostico");
+
+ fireEvent.click(demo);
+ expect(trackFunnelCtaClick).toHaveBeenCalledWith({
+ cta: "ver_demo_guiada",
+ surface: "hero_secondary",
+ });
+ });
+
+ it("mantém o CTA final imediatamente relevante e rastreado", () => {
+ render();
+ const finalCta = screen.getByRole("region", {
+ name: "Quer entender como isso funcionaria na sua operação?",
+ });
+
+ const primary = within(finalCta).getByRole("link", {
+ name: "Agendar diagnóstico da operação no WhatsApp",
+ });
+ const demo = within(finalCta).getByRole("link", {
+ name: "Ver demonstração guiada de atendimento no WhatsApp",
+ });
+
+ expect(primary).toHaveAttribute("href", "/contato");
+ expect(demo).toHaveAttribute("href", "/demo");
+ expect(demo).toHaveTextContent("Ver demo");
+
+ fireEvent.click(primary);
+ expect(trackFunnelCtaClick).toHaveBeenCalledWith({
+ cta: "agendar_diagnostico",
+ surface: "final_cta_primary",
+ });
+
+ fireEvent.click(demo);
+ expect(trackFunnelCtaClick).toHaveBeenCalledWith({
+ cta: "ver_demo_guiada",
+ surface: "final_cta_secondary",
+ });
+ });
+});
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 16cde9c1..648c50fe 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -5,23 +5,15 @@ import { ScrollTracker } from "@/components/shared/scroll-tracker";
import { HeroV2 } from "@/components/sections/hero-v2";
import { TechnicalTrustStrip } from "@/components/sections/technical-trust-strip";
import { ProblemSolutionSection } from "@/components/sections/problem-solution-section";
-import { WhatsAppProductSection } from "@/components/sections/whatsapp-product-section";
-import { AuthorityRealOpsSection } from "@/components/sections/authority-real-ops-section";
import { HowItWorksHub } from "@/components/sections/how-it-works-hub";
-import { ResultsSocialProofSection } from "@/components/sections/results-social-proof-section";
+import { WhatsAppProductSection } from "@/components/sections/whatsapp-product-section";
+import { Faq } from "@/components/sections/faq";
import { FinalCtaV2 } from "@/components/sections/final-cta-v2";
-// Ecossistema secundário — abaixo da oferta principal
-import { HubPillarsSection } from "@/components/sections/hub-pillars-section";
-import { WhereToStartSection } from "@/components/sections/where-to-start-section";
+// Ecossistema secundário — só depois da decisão de conversão
import { ToolsSection } from "@/components/sections/tools-section";
import { ProductsSection } from "@/components/sections/products-section";
-// Seções existentes reaproveitadas
-import { Metrics } from "@/components/sections/metrics";
-import { ProofSocial } from "@/components/sections/proof-social";
-import { Faq } from "@/components/sections/faq";
-
const baseUrl = "https://devflowlabs.com.br";
const ogImage = `${baseUrl}/og-devflow.png`;
@@ -91,31 +83,19 @@ export default function Home() {
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
>
);
}
diff --git a/src/components/sections/authority-real-ops-section.tsx b/src/components/sections/authority-real-ops-section.tsx
deleted file mode 100644
index 6f15b9ac..00000000
--- a/src/components/sections/authority-real-ops-section.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Plug, Server, Radio } from "lucide-react";
-import { cn } from "@/lib/utils";
-
-const points = [
- {
- icon: Plug,
- title: "API Meta de verdade",
- text: "Cloud API oficial — não é atalho nem número espelhado.",
- },
- {
- icon: Server,
- title: "Plugado no seu fluxo",
- text: "Webhook, fila, handoff: desenhado pra quem recebe volume.",
- },
- {
- icon: Radio,
- title: "Mesmo código em produção",
- text: "Automações reais ativas hoje — não mockup de apresentação.",
- },
-];
-
-export function AuthorityRealOpsSection() {
- return (
-
-
-
-
-
- Operações reais em produção — não mockup de apresentação
-
-
- WhatsApp Cloud API oficial, fila priorizada, handoff humano e dashboard operacional.
-
-
-
-
- {points.map((p) => (
-
-
-
-
-
{p.title}
-
{p.text}
-
- ))}
-
-
-
- );
-}
diff --git a/src/components/sections/faq.tsx b/src/components/sections/faq.tsx
index 867f8cb8..8af4f65d 100644
--- a/src/components/sections/faq.tsx
+++ b/src/components/sections/faq.tsx
@@ -28,7 +28,7 @@ const faqItems = [
{
question: "Vocês só entregam o sistema ou ajudam a implementar?",
answer:
- "A entrega é consultiva: diagnóstico da operação, desenho dos fluxos, implementação guiada, treinamento e acompanhamento inicial com base nas métricas reais.",
+ "A entrega é consultiva: diagnóstico da operação, desenho dos fluxos, implementação guiada, treinamento e acompanhamento inicial com base no que a operação mostrar.",
},
{
question: "Para quais negócios isso faz sentido?",
@@ -104,7 +104,10 @@ export function Faq() {
diff --git a/src/components/sections/final-cta-v2.tsx b/src/components/sections/final-cta-v2.tsx
index 86a7aa93..84d9fec5 100644
--- a/src/components/sections/final-cta-v2.tsx
+++ b/src/components/sections/final-cta-v2.tsx
@@ -4,9 +4,9 @@ import Link from "next/link";
import { ArrowRight } from "lucide-react";
import { trackFunnelCtaClick } from "@/lib/analytics";
import {
+ HOME_DEMO_CTA_LABEL,
PRIMARY_CONVERT_CTA_LABEL,
PRIMARY_CONVERT_HREF,
- PRIMARY_DEMO_CTA_LABEL,
PRIMARY_DEMO_HREF,
} from "@/lib/conversion-copy";
import { cn } from "@/lib/utils";
@@ -33,17 +33,11 @@ export function FinalCtaV2() {
id="final-cta-v2-heading"
className="df-text-primary text-2xl font-bold tracking-tight sm:text-3xl"
>
- Menos mensagem perdida. Mais venda preservada.
+ Quer entender como isso funcionaria na sua operação?
- Agende um diagnóstico para transformar atendimento e vendas no WhatsApp em rotina previsível.
-
-
- IA no repetitivo, humano no que importa — com WhatsApp Cloud API oficial, fila, handoff e dashboard.
-
-
-
- Operações reais em produção · implementação consultiva ponta a ponta
+ Em uma conversa rápida, analisamos como sua equipe usa o WhatsApp hoje e mostramos onde a DevFlow pode
+ organizar atendimento, distribuição e acompanhamento.
- Cliente A consultou status do pedido #1042 — resposta automática em 12s, sem escalar para humano.
-
-
- ✓ Resolvido
- ·
- 12s de resposta
+ ))}
);
}
export function HeroV2() {
+ const whatsAppHref = getWhatsAppOrMailtoUrl(HERO_WHATSAPP_TEXT);
+ const whatsAppOpensChat = isWhatsAppNumberConfigured();
+
return (
WhatsApp Platform
·
- API oficial Meta · inbox · IA
- Cloud API oficial · inbox multiatendente · IA no repetitivo
+ Cloud API oficial · inbox da equipe
@@ -211,29 +95,11 @@ export function HeroV2() {
Menos mensagem perdida. Mais resposta no tempo certo. Mais venda preservada.
- Transformamos seu WhatsApp em operação previsível com{" "}
- inbox multiatendente, IA no repetitivo{" "}
- e handoff humano quando importa.{" "}
-
- Diagnóstico, implementação guiada e operação acompanhada — ponta a ponta.
-
+ O WhatsApp da equipe deixa de ficar espalhado no celular. A DevFlow organiza o fluxo e passa a
+ conversa para uma pessoa quando ela precisa de contexto.
- {/* Mobile / tablet: composição operacional WhatsApp */}
-
-
-
-
-
-
- {/* Desktop: grid operacional WhatsApp */}
-
-
-
-
-
-
-
-
+
+
diff --git a/src/components/sections/how-it-works-hub.tsx b/src/components/sections/how-it-works-hub.tsx
index fe74ed44..e11cee2e 100644
--- a/src/components/sections/how-it-works-hub.tsx
+++ b/src/components/sections/how-it-works-hub.tsx
@@ -1,9 +1,12 @@
+"use client";
+
import Link from "next/link";
import { ArrowRight, ClipboardList, GitBranch, Settings2, LineChart } from "lucide-react";
+import { trackFunnelCtaClick } from "@/lib/analytics";
import {
+ HOME_DEMO_CTA_LABEL,
PRIMARY_CONVERT_CTA_LABEL,
PRIMARY_CONVERT_HREF,
- PRIMARY_DEMO_CTA_LABEL,
PRIMARY_DEMO_HREF,
} from "@/lib/conversion-copy";
import { cn } from "@/lib/utils";
@@ -35,7 +38,7 @@ const steps = [
number: "04",
title: "Operação acompanhada",
description:
- "Com a operação rodando, acompanhamos métricas reais, ajustamos fluxos, treinamos a equipe e melhoramos o atendimento com base nos dados.",
+ "Com a operação rodando, acompanhamos o que ela mostra, ajustamos fluxos, treinamos a equipe e melhoramos o atendimento com base nesses dados.",
},
];
@@ -100,6 +103,9 @@ export function HowItWorksHub() {
+ trackFunnelCtaClick({ cta: "agendar_diagnostico", surface: "how_it_works_primary" })
+ }
className={cn(
"df-btn-primary inline-flex max-w-full items-center justify-center gap-2 rounded-xl px-5 py-3.5 text-center text-sm font-bold leading-snug",
"df-shadow-cta-soft transition-all hover:scale-[1.02] sm:px-7 sm:text-base"
@@ -111,9 +117,12 @@ export function HowItWorksHub() {
+ trackFunnelCtaClick({ cta: "ver_demo_guiada", surface: "how_it_works_demo" })
+ }
className="df-btn-secondary inline-flex max-w-full items-center justify-center gap-2 rounded-xl px-5 py-3.5 text-center text-sm font-semibold leading-snug transition-colors sm:px-7 sm:text-base"
>
- {PRIMARY_DEMO_CTA_LABEL}
+ {HOME_DEMO_CTA_LABEL}
diff --git a/src/components/sections/metrics.tsx b/src/components/sections/metrics.tsx
deleted file mode 100644
index 44499d8d..00000000
--- a/src/components/sections/metrics.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { cn } from "@/lib/utils";
-
-const metrics = [
- {
- value: "24/7",
- label: "Atendimento automático",
- },
- {
- value: "70%",
- label: "Mensagens automatizadas",
- sub: "até 70% resolvidas sem humano",
- },
- {
- value: "100%",
- label: "Conversas registradas",
- },
- {
- value: "—",
- label: "Handoff automático",
- sub: "para equipe humana",
- },
-];
-
-export function Metrics() {
- return (
-
-
-
-
-
- Impacto operacional
-
-
- Números reais de operações usando a DevFlow.
-
-
-
-
- {metrics.map((metric) => (
-
-
- {metric.value}
-
-
{metric.label}
- {metric.sub && (
-
{metric.sub}
- )}
-
- ))}
-
-
-
- );
-}
diff --git a/src/components/sections/problem-solution-section.tsx b/src/components/sections/problem-solution-section.tsx
index 3116774b..2a6b5b4a 100644
--- a/src/components/sections/problem-solution-section.tsx
+++ b/src/components/sections/problem-solution-section.tsx
@@ -1,27 +1,19 @@
-import Link from "next/link";
-import { ArrowRight, X, Check, AlertTriangle } from "lucide-react";
-import { WhatsAppCta } from "@/components/shared/whatsapp-cta";
-import {
- PRIMARY_CONVERT_CTA_LABEL,
- PRIMARY_CONVERT_HREF,
- QUICK_WHATSAPP_CTA_LABEL,
-} from "@/lib/conversion-copy";
-import { cn } from "@/lib/utils";
+import { X, Check, AlertTriangle } from "lucide-react";
const problems = [
"Mensagens importantes se perdem no volume",
"Cliente espera resposta e procura outro fornecedor",
"Equipe responde manualmente as mesmas dúvidas todos os dias",
"Ninguém sabe exatamente o que está parado, atrasado ou em risco",
- "Falta histórico, fila, prioridade e métrica",
+ "Falta histórico, fila e responsável",
];
-const solutions = [
- "IA responde dúvidas repetitivas 24h",
- "Handoff leva a conversa para um humano quando precisa",
- "Inbox multiatendente organiza a operação",
- "SLA e fila priorizada mostram o que exige atenção",
- "Dashboard dá visibilidade para decidir com dados",
+const changes = [
+ "O repetitivo deixa de depender de alguém no celular",
+ "A conversa que pede uma pessoa segue para a equipe com contexto",
+ "Dá para ver o que está parado e quem responde",
+ "O histórico não fica só na memória de quem atendeu",
+ "A implantação começa pelo diagnóstico da operação atual",
];
export function ProblemSolutionSection() {
@@ -60,7 +52,7 @@ export function ProblemSolutionSection() {
- WhatsApp desorganizado gera demora, mensagem perdida, equipe sobrecarregada e venda escapando.
+ WhatsApp desorganizado gera demora, mensagem perdida e equipe sobrecarregada.
- IA no repetitivo, humano no que importa — com fila priorizada, SLA e dashboard operacional.
+ A operação passa a ter dono, contexto e um caminho claro até uma pessoa.
-
- );
-}
diff --git a/src/components/sections/whatsapp-product-section.tsx b/src/components/sections/whatsapp-product-section.tsx
index 8e34fd14..18fe6f98 100644
--- a/src/components/sections/whatsapp-product-section.tsx
+++ b/src/components/sections/whatsapp-product-section.tsx
@@ -1,171 +1,61 @@
-"use client";
+import { Inbox, Bot, ListOrdered, Plug } from "lucide-react";
-import Link from "next/link";
-import { Check, ArrowRight, Zap, UserRound, BarChart3 } from "lucide-react";
-import { WhatsAppCta } from "@/components/shared/whatsapp-cta";
-import {
- ENTENDER_APLICAR_NEGOCIO_CTA_LABEL,
- PLATFORM_IN_ACTION_CTA_LABEL,
-} from "@/lib/conversion-copy";
-import { cn } from "@/lib/utils";
-
-const features = [
+const capabilities = [
{
- icon: Zap,
- title: "Resposta na hora",
- description: "FAQ, status, links — 24h sem você no celular.",
+ icon: Inbox,
+ title: "Inbox da equipe",
+ description: "Várias pessoas atendem no mesmo número, com responsável e histórico da conversa.",
},
{
- icon: UserRound,
- title: "Humano quando precisa",
- description: "Cliente pede gente? A conversa vai pra equipe.",
+ icon: Bot,
+ title: "Automação no repetitivo",
+ description:
+ "Dúvidas frequentes, status e triagem seguem um fluxo. Quando a conversa pede uma pessoa, o handoff leva o contexto.",
},
{
- icon: BarChart3,
- title: "Números na mesa",
- description: "Volume, bot vs humano — pra decidir, não pra decorar.",
+ icon: ListOrdered,
+ title: "Fila visível",
+ description: "A equipe vê o que está aguardando, em atendimento ou encerrado.",
+ },
+ {
+ icon: Plug,
+ title: "WhatsApp Cloud API oficial",
+ description: "Webhooks e API oficial da Meta. Não é número espelhado nem sessão presa a um celular.",
},
-];
-
-const highlights = [
- "API oficial Meta",
- "Sem mensagem duplicada",
- "Auditoria rastreável",
- "Escala com a operação",
];
export function WhatsAppProductSection() {
return (
-
- Solução principal da DevFlow Labs:
-
-
-
-
-
- WhatsApp Platform — operação previsível de atendimento e vendas
-
-
- Mais resposta no tempo certo, com IA no repetitivo e handoff humano quando importa.
-
- WhatsApp Cloud API oficial, sem número espelhado — fila, SLA e dashboard operacional.
-
-
-
-
-
- {features.map((feature) => (
-
-
-
-
-
{feature.title}
-
{feature.description}
-
- ))}
-
-
-
- {highlights.map((item) => (
-
-
- {item}
-
- ))}
-
-
-
-
- {PLATFORM_IN_ACTION_CTA_LABEL}
-
-
-
-
- Demo guiada em seguida — sem compromisso nesta etapa.
-
-
-
+
+
+
+ O que entra na operação
+
+
+ Capacidades da WhatsApp Platform. O desenho de cada fluxo sai do diagnóstico, não de um pacote genérico.
+