Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions src/app/__tests__/commercial-truth-p0.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/** @vitest-environment jsdom */
import { describe, expect, it, vi, beforeEach } from "vitest";
import { render, screen } from "@testing-library/react";
import PrecosPage from "../precos/page";
import AutomacaoWhatsAppPage from "../automacao-whatsapp/page";
import { ProductsHubClient } from "@/components/products/products-hub-client";
import { getBlogArticleBySlug } from "@/lib/blog";

vi.mock("@/lib/analytics", () => ({
trackCtaWhatsAppClick: vi.fn(),
trackFunnelCtaClick: vi.fn(),
trackProductsPageCtaClicked: vi.fn(),
trackToolCardClick: vi.fn(),
trackEcosystemLinkClick: vi.fn(),
}));

const BANNED = [
"Piloto grátis",
"Piloto de 7 dias",
"1.000 mensagens",
"Mensagens ilimitadas",
"Métricas avançadas",
"métricas em tempo real",
"SLA dedicado",
"Suporte 24/7",
"responde 24/7",
"sem ocupar a equipe",
"handoff inteligente",
"handoff imediato",
"operações reais",
"em produção em operações reais",
];

function expectNoBannedClaims(text: string) {
for (const claim of BANNED) {
expect(text.toLowerCase()).not.toContain(claim.toLowerCase());
}
}

describe("P0 commercial truth", () => {
beforeEach(() => {
vi.stubEnv("NEXT_PUBLIC_WHATSAPP_NUMBER", "5511999999999");
});

it("preços não promete cota, SLA, métrica avançada nem suporte 24/7", () => {
render(<PrecosPage />);
const text = document.body.textContent ?? "";
expectNoBannedClaims(text);
expect(text).toMatch(/Implantação acompanhada/i);
expect(text).toMatch(/Operação mensal/i);
expect(text).not.toMatch(/R\$\s?\d/);
});

it("automação não promete autonomia 24/7 nem handoff inteligente", () => {
render(<AutomacaoWhatsAppPage />);
const text = document.body.textContent ?? "";
expectNoBannedClaims(text);
expect(text).toMatch(/Automatize o repetitivo/i);
expect(text).toMatch(/segue para a equipe/i);
});

it("hub de produtos não usa operações reais como prova", () => {
render(<ProductsHubClient />);
const text = document.body.textContent ?? "";
expectNoBannedClaims(text);
expect(screen.getByRole("heading", { name: /Produtos DevFlow/i })).toBeInTheDocument();
});

it("artigo de custo operacional não afirma produção em clientes", () => {
const article = getBlogArticleBySlug("reduzir-custo-operacional-automacao");
expect(article).toBeDefined();
const text = `${article?.description ?? ""} ${article?.content ?? ""}`;
expectNoBannedClaims(text);
expect(text).toMatch(/organizar operações de atendimento/i);
expect(text).not.toMatch(/em produção/i);
});
});
47 changes: 23 additions & 24 deletions src/app/automacao-whatsapp/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,44 +11,44 @@ const ogImage = `${baseUrl}/og-devflow.png`;
const faqItems = [
{
q: "Automação substitui atendente?",
a: "Substitui tarefas repetitivas e primeiro contato. Quando o cliente pede humano, há exceção ou venda complexa, o handoff deve ser imediato — com histórico e contexto na fila.",
a: "Não. Ela responde o que foi permitido. Quando a conversa exige contexto, exceção ou uma pessoa, ela segue para a equipe, com o histórico na fila.",
},
{
q: "Preciso de API oficial da Meta?",
a: "Para operação séria com múltiplos agentes, filas e métricas, o caminho é integração sobre a infraestrutura oficial. Veja o guia em WhatsApp Business API e como isso se conecta ao produto.",
a: "Sim. A operação usa a WhatsApp Cloud API oficial, com inbox, responsáveis e filas. A ativação do número é acompanhada.",
},
{
q: "Quanto tempo leva para ver valor?",
a: "A demo guiada mostra o fluxo em minutos. Piloto comercial depende do seu volume e canais; o importante é medir tempo de primeira resposta e taxa de conversão antes e depois.",
a: "A demo é uma simulação do fluxo. O diagnóstico define o que entra na implantação acompanhada.",
},
];

const heroBullets = [
"Automação que responde 24/7 sem perder qualidade",
"Métricas em tempo real e handoff para equipe humana",
"Operação confiável para escalar o atendimento",
"Automatize o repetitivo e leve exceções para a equipe",
"Acompanhe responsáveis, filas e o estado das conversas",
"A configuração inicial é acompanhada pela DevFlow",
];

const features = [
{
title: "Respostas automáticas",
description:
"O sistema responde sozinho perguntas frequentes, 24/7, sem ocupar a equipe.",
"Pode responder automaticamente fluxos permitidos quando a automação está ativa.",
},
{
title: "Handoff inteligente",
title: "Handoff para uma pessoa",
description:
"Quando o cliente pede atendente ou o fluxo exige, a conversa vai para humano na hora.",
"Quando o cliente pede atendente ou o fluxo exige, a conversa segue para a equipe.",
},
{
title: "Métricas por intent e horário",
title: "Estado da conversa",
description:
"Veja o que foi automatizado e o que virou atendimento, em tempo real.",
"Acompanhe responsáveis, filas e o que ainda precisa de resposta.",
},
{
title: "Visão operacional",
title: "Histórico compartilhado",
description:
"Dashboards simples para acompanhar performance e volume da operação.",
"Quem assume a conversa vê o contexto que já estava no inbox.",
},
];

Expand All @@ -64,13 +64,13 @@ const howItWorksSteps = [
icon: MessageCircle,
title: "Cliente envia mensagem no WhatsApp",
description:
"O cliente manda a primeira mensagem. O sistema recebe e identifica a intenção.",
"O cliente manda a primeira mensagem. Se a automação estiver ativa, o fluxo permitido pode responder.",
},
{
icon: Zap,
title: "O sistema responde automaticamente",
title: "A automação responde o que foi permitido",
description:
"Conforme a intenção, a resposta é enviada na hora — sem fila, sem espera.",
"Dúvidas do roteiro configurado podem ser respondidas automaticamente. O restante fica com a equipe.",
},
{
icon: UserRound,
Expand All @@ -83,7 +83,7 @@ const howItWorksSteps = [
export const metadata: Metadata = {
title: "Automação de WhatsApp para Empresas | DevFlow Labs",
description:
"Automatize atendimento no WhatsApp com IA, métricas e controle da operação. Sistema de automação para empresas. Piloto grátis.",
"Automatize o repetitivo no WhatsApp e encaminhe exceções para a equipe. Implantação acompanhada.",
keywords: [
"automação whatsapp empresa",
"automação whatsapp atendimento",
Expand All @@ -99,7 +99,7 @@ export const metadata: Metadata = {
siteName: "DevFlow Labs",
title: "Automação de WhatsApp para Empresas | DevFlow Labs",
description:
"Automatize atendimento no WhatsApp com IA, métricas e controle da operação.",
"Automação supervisionada no WhatsApp: o repetitivo pode ser respondido e a exceção segue para a equipe.",
url: `${baseUrl}/automacao-whatsapp`,
images: [
{
Expand All @@ -114,7 +114,7 @@ export const metadata: Metadata = {
card: "summary_large_image",
title: "Automação WhatsApp para Empresas | DevFlow Labs",
description:
"Automatize atendimento no WhatsApp com IA, métricas e controle da operação.",
"Automação no repetitivo, com handoff para a equipe. Implantação acompanhada.",
images: [ogImage],
},
};
Expand All @@ -135,8 +135,7 @@ export default function AutomacaoWhatsAppPage() {
Automação de WhatsApp para Empresas
</h1>
<p className="mt-4 text-lg text-muted-foreground">
Automatize atendimento, organize conversas e nunca deixe um cliente
sem retorno. IA + métricas + handoff humano.
Automatize o repetitivo e leve exceções para a equipe. Inbox, responsáveis e handoff.
</p>
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row sm:gap-4">
<Link
Expand Down Expand Up @@ -206,7 +205,7 @@ export default function AutomacaoWhatsAppPage() {
O que a automação entrega
</h2>
<p className="mx-auto mt-3 max-w-xl text-center text-muted-foreground">
Recursos para automatizar, medir e controlar o atendimento.
Automação supervisionada dentro da operação de conversas.
</p>
<div className="mx-auto mt-12 grid max-w-5xl gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-4">
{features.map((feature) => (
Expand Down Expand Up @@ -304,7 +303,7 @@ export default function AutomacaoWhatsAppPage() {
Automação por segmento
</h2>
<p className="mx-auto mt-3 max-w-xl text-center text-muted-foreground">
Soluções prontas para o seu tipo de negócio.
Páginas de exemplo por segmento. O desenho do fluxo entra no diagnóstico.
</p>
<div className="mx-auto mt-12 flex max-w-2xl flex-wrap justify-center gap-3">
{segmentLinks.map((item) => (
Expand Down Expand Up @@ -341,7 +340,7 @@ export default function AutomacaoWhatsAppPage() {
Quer automatizar seu WhatsApp?
</h2>
<p className="mt-4 text-muted-foreground">
Piloto de 7 dias para testar. Sem compromisso.
O próximo passo é o diagnóstico. A demo é uma simulação, com dados ilustrativos.
</p>
<div className="mt-8 flex flex-col items-stretch justify-center gap-3 sm:flex-row sm:items-center">
<Link
Expand Down
7 changes: 5 additions & 2 deletions src/app/demo/__tests__/demo-page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@ describe("P1 — Demo /demo", () => {
name: /Veja como uma operação WhatsApp organizada funciona/i,
})
).toBeInTheDocument();
expect(screen.getByRole("heading", { name: /Fluxo guiado: da mensagem ao dashboard/i })).toBeInTheDocument();
expect(screen.getByRole("heading", { name: /Fluxo guiado: da mensagem à fila/i })).toBeInTheDocument();
expect(screen.getAllByText(/Cliente chama no WhatsApp/i).length).toBeGreaterThan(0);
expect(screen.getByLabelText(/Dashboard operacional simulado/i)).toBeInTheDocument();
expect(screen.getAllByText(/Dados ilustrativos/i).length).toBeGreaterThan(0);
expect(screen.getByLabelText(/Painel ilustrativo da operação/i)).toBeInTheDocument();
expect(screen.queryByText(/SLA/i)).not.toBeInTheDocument();
expect(screen.queryByText(/operação real/i)).not.toBeInTheDocument();

const diagnoseLinks = screen.getAllByRole("link", { name: /Agendar diagnóstico/i });
expect(diagnoseLinks[0]).toHaveAttribute("href", "/contato");
Expand Down
19 changes: 8 additions & 11 deletions src/app/demo/_components/DemoGuidedExperience.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ export function DemoGuidedExperience() {
Veja como uma operação WhatsApp organizada funciona
</h1>
<p className="df-text-secondary mt-4 max-w-3xl text-base leading-relaxed sm:text-lg">
Simule o fluxo de IA, handoff humano, fila e dashboard antes de agendar o diagnóstico.
Simulação para apresentar o fluxo do produto: automação, handoff e fila. Dados ilustrativos.
</p>
<div className="mt-8 flex max-w-2xl flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center">
<Link
Expand All @@ -242,8 +242,8 @@ export function DemoGuidedExperience() {
/>
</div>
<p className="df-text-secondary mt-6 max-w-2xl text-sm leading-relaxed">
IA no repetitivo, humano no que importa — WhatsApp Cloud API oficial, fila priorizada, SLA e dashboard
operacional. Diagnóstico consultivo antes da implementação.
Automação no repetitivo e pessoa quando precisa. WhatsApp Cloud API oficial, responsáveis e filas.
Demonstração da plataforma, com dados ilustrativos.
</p>
</div>
</section>
Expand All @@ -266,8 +266,8 @@ export function DemoGuidedExperience() {
Teste com um cenário do seu segmento
</h2>
<p className="df-text-secondary mt-3 leading-relaxed">
Simulação interativa: envie mensagens como cliente e veja triagem, resposta automática e handoff
humano — o mesmo tipo de fluxo que implementamos na operação real.
Simulação interativa: envie mensagens como cliente e veja resposta automática e handoff.
Dados ilustrativos, não uma operação de cliente.
</p>
</div>
<Button
Expand All @@ -289,8 +289,7 @@ export function DemoGuidedExperience() {
Próximo passo: diagnóstico da sua operação
</h3>
<p className="df-text-secondary mt-2 text-sm leading-relaxed">
Você viu IA, handoff, fila e dashboard em ação. Agende o diagnóstico para mapear volume, gargalos e
o piloto guiado no seu WhatsApp.
Você viu uma simulação de automação, handoff e fila. O próximo passo é o diagnóstico da sua operação.
</p>
<div className="mt-8 flex flex-col items-stretch gap-3 sm:flex-row sm:justify-center">
<Link
Expand Down Expand Up @@ -377,8 +376,7 @@ export function DemoGuidedExperience() {
<div>
<p className="font-semibold">Handoff humano ativo</p>
<p className="mt-0.5 df-text-secondary">
A IA encerrou a automação neste ponto. Na operação real, a conversa entra na fila com SLA,
prioridade e histórico completo para o atendente assumir.
A automação para neste ponto da simulação. A conversa segue para a equipe, na fila, com o histórico.
</p>
</div>
</div>
Expand Down Expand Up @@ -539,8 +537,7 @@ export function DemoGuidedExperience() {
Pronto para organizar sua operação no WhatsApp?
</h2>
<p className="df-text-secondary mt-3 text-sm leading-relaxed sm:text-base">
Agende o diagnóstico consultivo ou fale no WhatsApp — mapeamos volume, gargalos, handoff, SLA e dashboard
antes de implementar.
Agende o diagnóstico ou fale no WhatsApp. Mapeamos volume, fila, responsáveis e handoff antes de implantar.
</p>
<div className="mt-8 flex flex-col items-stretch justify-center gap-3 sm:flex-row sm:flex-wrap">
<Link
Expand Down
36 changes: 18 additions & 18 deletions src/app/demo/_components/DemoGuidedFlow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const STEPS: {
id: number;
title: string;
summary: string;
dashboardHighlight: "bot" | "human" | "sla" | "waiting" | "opportunity" | null;
dashboardHighlight: "bot" | "human" | "queue" | "waiting" | "opportunity" | null;
}[] = [
{
id: 1,
Expand All @@ -28,27 +28,27 @@ const STEPS: {
},
{
id: 2,
title: "IA entende a intenção",
summary: "Triagem automática classifica o pedido antes de responder ou escalar.",
title: "A automação lê o pedido",
summary: "Quando a automação está ativa, o fluxo permitido pode responder antes de encaminhar.",
dashboardHighlight: "bot",
},
{
id: 3,
title: "IA responde o repetitivo",
summary: "Dúvidas frequentes saem do caminho da equipe — 24h, com contexto.",
title: "Automação no repetitivo",
summary: "Dúvidas permitidas podem ser respondidas automaticamente. O contexto permanece na conversa.",
dashboardHighlight: "bot",
},
{
id: 4,
title: "Caso exige humano",
summary: "Negociação, exceção ou oportunidade comercial → handoff imediato.",
title: "A conversa segue para a equipe",
summary: "Exceção ou pedido de uma pessoa vira handoff, com o histórico na fila.",
dashboardHighlight: "human",
},
{
id: 5,
title: "Operação acompanha",
summary: "Inbox, fila, SLA e dashboard mostram quem responde e o que está em risco.",
dashboardHighlight: "sla",
title: "A equipe acompanha",
summary: "Inbox, responsável e fila mostram quem está com a conversa e o que ainda precisa de resposta.",
dashboardHighlight: "queue",
},
];

Expand Down Expand Up @@ -105,7 +105,7 @@ function StepContent({ stepId }: { stepId: number }) {
Entregamos hoje até 22h. Para calcular o prazo, me envie seu bairro.
</div>
<p className="df-text-secondary text-xs leading-relaxed">
Repetitivo resolvido sem escalar — equipe livre para o que importa.
Repetitivo tratado pela automação. A equipe fica nos casos que precisam de contexto.
</p>
</div>
);
Expand Down Expand Up @@ -144,12 +144,12 @@ function StepContent({ stepId }: { stepId: number }) {
</p>
<dl className="mt-3 grid gap-2 text-sm sm:grid-cols-2">
{[
["Status", "Com atendente"],
["SLA", "8 min restantes"],
["Prioridade", "Alta"],
["Responsável", "Equipe comercial"],
["Status", "Em atendimento"],
["Fila", "Fila Comercial"],
["Estado", "Precisa resposta"],
["Responsável", "Bruno"],
["Origem", "WhatsApp"],
["Próxima ação", "Responder proposta"],
["Histórico", "Preservado na conversa"],
].map(([label, value]) => (
<div key={label} className="flex flex-col gap-0.5 rounded-lg bg-card px-3 py-2">
<dt className="df-text-secondary text-[10px] font-medium uppercase tracking-wide">{label}</dt>
Expand Down Expand Up @@ -183,10 +183,10 @@ export function DemoGuidedFlow() {
id="demo-guided-flow-heading"
className="mt-4 text-balance text-2xl font-bold tracking-tight text-foreground sm:text-3xl"
>
Fluxo guiado: da mensagem ao dashboard
Fluxo guiado: da mensagem à fila
</h2>
<p className="df-text-secondary mt-3 text-sm leading-relaxed sm:text-base">
Cinco etapas mostram como IA, handoff humano, fila e SLA funcionam juntos numa operação real.
Simulação para apresentar o fluxo do produto. Dados ilustrativos de automação, handoff e fila.
</p>
</div>
<p className="df-text-muted text-sm font-medium lg:pt-6">
Expand Down
Loading
Loading