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
102 changes: 102 additions & 0 deletions src/app/__tests__/commercial-truth-p1.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/** @vitest-environment jsdom */
import { beforeEach, describe, expect, it, vi } from "vitest";
import { render } from "@testing-library/react";
import CasesPage from "../cases/page";
import WhatsAppMultiCanalPage from "../solucoes/whatsapp-multi-canal/page";
import WhatsappBusinessApiPage from "../whatsapp-business-api/page";
import ChatbotWhatsAppPage from "../chatbot-whatsapp/page";
import { CASES_TRANSPARENCY_NOTE, nicheExamples } from "@/lib/cases";
import { projects } from "@/lib/projects";
import {
AUTOMACAO_WHATSAPP_CLINICA,
AUTOMACAO_WHATSAPP_RESTAURANTE,
} from "@/lib/niche-whatsapp-automation-pages";
import { blogArticles } from "@/lib/blog";
import SoftwareAtendimentoWhatsAppPage from "../software-atendimento-whatsapp/page";

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

function textOf(node: HTMLElement) {
return node.textContent ?? "";
}

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

it("cases continuam simulação e sem métrica de tempo de resposta", () => {
expect(CASES_TRANSPARENCY_NOTE.toLowerCase()).toContain("simulações");
const joined = JSON.stringify(nicheExamples);
expect(joined).not.toMatch(/métricas de tempo de resposta/i);
expect(joined).not.toMatch(/intenção comercial/i);
render(<CasesPage />);
const text = textOf(document.body);
expect(text).toMatch(/simulações operacionais/i);
expect(text).not.toMatch(/SLA/i);
expect(text).not.toMatch(/tempo de resposta/i);
});

it("solução e API não vendem SLA nem tempo médio como benefício", () => {
render(<WhatsAppMultiCanalPage />);
const solution = textOf(document.body);
expect(solution).not.toMatch(/SLA/i);
expect(solution).toMatch(/Não há relatório de tempo médio/i);
expect(solution).toMatch(/Não é inbox de Instagram/i);
document.body.innerHTML = "";
render(<WhatsappBusinessApiPage />);
const api = textOf(document.body);
expect(api).not.toMatch(/SLA/i);
expect(api).toMatch(/Cloud API/i);
expect(api).toMatch(/não garante aprovação/i);
});

it("projetos descrevem a WhatsApp Platform sem SLA nem dashboard", () => {
const whatsapp = projects.find((project) => project.id === "whatsapp-platform");
expect(whatsapp?.description).toMatch(/Inbox compartilhado/i);
expect(whatsapp?.description).not.toMatch(/SLA/i);
expect(whatsapp?.description).not.toMatch(/dashboard/i);
});

it("chatbot preserva a busca e não promete piloto nem autonomia 24/7", () => {
render(<ChatbotWhatsAppPage />);
const text = textOf(document.body);
expect(text.toLowerCase()).toContain("chatbot");
expect(text).toMatch(/automação/i);
expect(text).not.toMatch(/Piloto grátis/i);
expect(text).not.toMatch(/Piloto de 7 dias/i);
expect(text).not.toMatch(/24\/7|24 horas, 7 dias/i);
expect(text).not.toMatch(/bot inteligente/i);
});

it("clínica não oferece diagnóstico e restaurante não vende resultado medido", () => {
const clinic = JSON.stringify(AUTOMACAO_WHATSAPP_CLINICA);
expect(clinic.toLowerCase()).toContain("não faz diagnóstico");
expect(clinic).not.toMatch(/A IA diagnostica/i);
expect(clinic).not.toMatch(/jejum obrigatório/i);
expect(clinic).not.toMatch(/LGPD compliant|certificação formal de/i);
expect(clinic).toMatch(/checklist de privacidade/i);
const restaurant = JSON.stringify(AUTOMACAO_WHATSAPP_RESTAURANTE);
expect(restaurant).not.toMatch(/SLA/i);
expect(restaurant).not.toMatch(/muito mais rápida/i);
expect(restaurant).not.toMatch(/1–2 min/i);
expect(restaurant).toMatch(/Simulação de uso/i);
});

it("blog e software de atendimento não vendem handoff inteligente nem tempo de resposta", () => {
const blog = JSON.stringify(blogArticles);
expect(blog).not.toMatch(/handoff inteligente/i);
expect(blog).not.toMatch(/24 horas por dia/i);
expect(blog).not.toMatch(/tempo de primeira resposta/i);
document.body.innerHTML = "";
render(<SoftwareAtendimentoWhatsAppPage />);
const text = textOf(document.body);
expect(text).toMatch(/inbox compartilhado/i);
expect(text).not.toMatch(/tempo de resposta/i);
expect(text).not.toMatch(/Handoff automático/i);
});
});
10 changes: 5 additions & 5 deletions src/app/cases/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const canonical = `${baseUrl}/cases`;

const ogTitle = "Cases e exemplos de operação WhatsApp | DevFlow Labs";
const ogDescription =
"Veja exemplos de como a WhatsApp Platform da DevFlow Labs pode organizar atendimento, automação, handoff humano e métricas em diferentes nichos.";
"Cenários de como a WhatsApp Platform organiza atendimento, automação supervisionada, responsáveis e handoff. Os exemplos são simulações.";

export const metadata: Metadata = {
title: ogTitle,
Expand Down Expand Up @@ -79,11 +79,11 @@ export default function CasesPage() {
id="cases-hero-heading"
className="df-text-primary mt-5 max-w-4xl text-balance text-3xl font-bold tracking-tight sm:text-4xl lg:text-[2.65rem] lg:leading-[1.12]"
>
Veja como a WhatsApp Platform se aplica em negócios reais
Veja cenários de como a WhatsApp Platform organiza o atendimento
</h1>
<p className="df-text-secondary mt-5 max-w-3xl text-pretty text-lg leading-relaxed sm:text-xl">
Modelos baseados em cenários comuns de atendimento no WhatsApp: mensagens perdidas, demora na
resposta, falta de controle e ausência de métricas.
Simulações de uso com problemas comuns: mensagens sem dono, fila misturada e a equipe sem o
histórico da conversa.
</p>
<p className="df-text-muted mt-6 max-w-3xl rounded-xl border df-border-brand df-surface-elevated px-4 py-3 text-sm leading-relaxed backdrop-blur-sm sm:text-[0.9375rem]">
{CASES_TRANSPARENCY_NOTE}
Expand Down Expand Up @@ -230,7 +230,7 @@ export default function CasesPage() {
id="simulation-steps-heading"
className="df-text-primary text-2xl font-bold tracking-tight sm:text-3xl"
>
Como transformamos simulação em operação real
Como a simulação vira implantação acompanhada
</h2>
<ol className="mt-10 grid gap-6 sm:grid-cols-3" role="list">
{operationSteps.map((step, i) => (
Expand Down
27 changes: 13 additions & 14 deletions src/app/chatbot-whatsapp/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import { cn } from "@/lib/utils";
const baseUrl = "https://devflowlabs.com.br";

const benefits = [
"Respostas 24 horas, 7 dias por semana",
"Handoff para atendente humano quando preciso",
"Integração oficial com Meta/WhatsApp",
"Métricas e relatórios em tempo real",
"Automação no repetitivo, quando o fluxo está ativo",
"A conversa segue para uma pessoa quando precisa de contexto",
"WhatsApp Cloud API oficial da Meta",
"Responsáveis, filas e histórico da conversa",
];

const useCases = [
Expand All @@ -24,7 +24,7 @@ const useCases = [
export const metadata: Metadata = {
title: "Chatbot para WhatsApp | Bot de Atendimento | DevFlow Labs",
description:
"Chatbot WhatsApp para empresas. Automatize atendimento com bot inteligente, handoff humano e métricas. Piloto grátis.",
"Chatbot WhatsApp dentro de uma operação de atendimento: automação no repetitivo, handoff para a equipe e implantação acompanhada.",
keywords: [
"chatbot whatsapp",
"bot para whatsapp atendimento",
Expand All @@ -37,13 +37,13 @@ export const metadata: Metadata = {
openGraph: {
title: "Chatbot para WhatsApp | DevFlow Labs",
description:
"Chatbot WhatsApp para empresas. Automatize atendimento com bot inteligente e handoff humano.",
"Chatbot WhatsApp como parte da operação: automação no repetitivo e handoff para a equipe.",
url: `${baseUrl}/chatbot-whatsapp`,
},
twitter: {
title: "Chatbot para WhatsApp | DevFlow Labs",
description:
"Chatbot WhatsApp para empresas. Automatize atendimento com bot inteligente e handoff humano.",
"Chatbot WhatsApp como parte da operação: automação no repetitivo e handoff para a equipe.",
},
};

Expand All @@ -64,11 +64,11 @@ export default function ChatbotWhatsAppPage() {
id="hero-heading"
className="text-4xl font-bold tracking-tight text-foreground sm:text-5xl lg:text-6xl"
>
Chatbot para WhatsApp
Mais do que um chatbot: organize o atendimento no WhatsApp
</h1>
<p className="mt-4 text-lg df-text-secondary">
Bot de atendimento que responde clientes automaticamente e transfere
para humano quando precisa. Vale a pena? Sim — quando feito direito.
Dá para buscar por chatbot WhatsApp. O produto é a operação: a automação responde o que foi
permitido e a conversa segue para uma pessoa quando precisa de contexto.
</p>
<div className="mt-8">
<WhatsAppCta
Expand All @@ -90,8 +90,7 @@ export default function ChatbotWhatsAppPage() {
Por que usar um chatbot no WhatsApp?
</h2>
<p className="mx-auto mt-3 max-w-xl text-center df-text-secondary">
Clientes esperam resposta rápida. Um bot entrega isso sem sobrecarregar
sua equipe.
O repetitivo sai do caminho da equipe. Quem precisa de contexto continua com uma pessoa.
</p>
<ul className="mx-auto mt-12 grid max-w-2xl gap-4 sm:grid-cols-2" role="list">
{benefits.map((item) => (
Expand All @@ -118,7 +117,7 @@ export default function ChatbotWhatsAppPage() {
O que o chatbot pode fazer
</h2>
<p className="mx-auto mt-3 max-w-xl text-center df-text-secondary">
Casos de uso que automatizam a maior parte do atendimento.
Exemplos do que um fluxo permitido pode cobrir. O restante fica com a equipe.
</p>
<div className="mx-auto mt-12 flex max-w-2xl flex-wrap justify-center gap-3">
{useCases.map((item) => (
Expand Down Expand Up @@ -146,7 +145,7 @@ export default function ChatbotWhatsAppPage() {
Quer um chatbot para seu WhatsApp?
</h2>
<p className="mt-4 df-text-secondary">
Piloto de 7 dias para testar. Sem compromisso.
O próximo passo é o diagnóstico. A demo é uma simulação.
</p>
<div className="mt-8">
<WhatsAppCta
Expand Down
13 changes: 6 additions & 7 deletions src/app/sobre/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const ogImage = `${baseUrl}/og-devflow.png`;
export const metadata: Metadata = {
title: "Sobre a DevFlow Labs",
description:
"Engenharia de produto na intersecção de CRM, prospecção, WhatsApp e demo — sistemas para gerar lead, operar conversa e fechar com controle.",
"Engenharia de produto para a operação de conversas no WhatsApp, com inbox, responsáveis, filas e implantação acompanhada.",
alternates: {
canonical: `${baseUrl}/sobre`,
},
Expand All @@ -20,7 +20,7 @@ export const metadata: Metadata = {
siteName: "DevFlow Labs",
title: "Sobre a DevFlow Labs | Produto, operação e WhatsApp",
description:
"Construímos software onde geração de lead, CRM, follow-up, automação no WhatsApp e venda demo-driven trabalham no mesmo loop.",
"Construímos a operação de atendimento no WhatsApp e as ferramentas do ecossistema. O CRM interno é só o funil comercial da DevFlow.",
url: `${baseUrl}/sobre`,
images: [
{
Expand All @@ -35,7 +35,7 @@ export const metadata: Metadata = {
card: "summary_large_image",
title: "Sobre a DevFlow Labs",
description:
"Sistemas que conectam prospecção, CRM, follow-up e WhatsApp Platform — foco atual em atendimento com escala.",
"WhatsApp Platform como camada operacional das conversas, com implantação acompanhada.",
images: [ogImage],
},
};
Expand Down Expand Up @@ -73,8 +73,7 @@ export default function SobrePage() {
</h2>
<div className={body}>
<p>
Somos um time enxuto de engenharia e produto, baseado no Brasil, focado em sistemas que sobrevivem à operação real:
fila, handoff, prioridade comercial e métricas que importam para quem responde cliente.
Somos um time enxuto de engenharia e produto, baseado no Brasil, focado em inbox, responsável, fila e handoff.
</p>
<p>
Não vendemos “site institucional” nem escopo genérico: entregamos plataformas e ferramentas que você usa no dia a dia para responder mais rápido e com menos caos.
Expand All @@ -90,7 +89,7 @@ export default function SobrePage() {
<p>
Hoje o foco público é a{" "}
<strong className="font-semibold text-foreground">WhatsApp Platform</strong>
: inbox multiatendente, automação com controle humano e narrativa alinhada a venda e suporte em escala.
: inbox compartilhado, responsáveis, filas, handoff e automação no repetitivo.
</p>
<p>
Em paralelo mantemos o{" "}
Expand All @@ -116,7 +115,7 @@ export default function SobrePage() {
Começamos pelo gargalo: onde a conversa morre, onde o comercial perde contexto, onde a automação vira risco em vez de alavanca.
</p>
<p>
Projetamos para handoff explícito, fila visível e decisões comerciais — IA entra onde acelera, nunca onde esconde risco de marca ou de receita.
A conversa pode ter um responsável e seguir para outra pessoa com o histórico. A automação fica no que foi permitido.
</p>
<p>
Linguagem, ritmo de demo e onboarding seguem a mesma regra: menos slide, mais sistema em uso.
Expand Down
21 changes: 10 additions & 11 deletions src/app/software-atendimento-whatsapp/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,27 @@ const features = [
},
{
icon: BarChart3,
title: "Métricas e relatórios",
title: "Fila e responsável",
description:
"Volume, tempo de resposta, taxa de automação. Dados para decidir.",
"Dá para ver quem está com a conversa e o que ainda precisa de resposta.",
},
{
icon: Users,
title: "Equipe e handoff",
description:
"Distribua conversas entre atendentes. Handoff automático quando o bot não resolve.",
"Mais de uma pessoa atende. A conversa pode ser transferida com o histórico.",
},
];

const comparisons = [
"WhatsApp comum: sem filas, sem métricas, sem organização",
"Software de atendimento: tudo centralizado, mensurável e escalável",
"WhatsApp comum: a conversa fica no celular de alguém",
"Inbox compartilhado: fila, responsável e histórico no mesmo lugar",
];

export const metadata: Metadata = {
title: "Software de Atendimento no WhatsApp | Plataforma | DevFlow Labs",
description:
"Plataforma de atendimento no WhatsApp com automação, métricas e equipe. Centralize conversas e escale o suporte.",
"Operação de atendimento no WhatsApp: inbox compartilhado, responsáveis, filas e automação no repetitivo.",
keywords: [
"software atendimento whatsapp",
"plataforma atendimento whatsapp",
Expand All @@ -48,13 +48,13 @@ export const metadata: Metadata = {
openGraph: {
title: "Software de Atendimento no WhatsApp | DevFlow Labs",
description:
"Plataforma de atendimento no WhatsApp com automação, métricas e equipe.",
"Inbox compartilhado, responsáveis, filas e automação supervisionada no WhatsApp.",
url: `${baseUrl}/software-atendimento-whatsapp`,
},
twitter: {
title: "Software Atendimento WhatsApp | DevFlow Labs",
description:
"Plataforma de atendimento no WhatsApp com automação, métricas e equipe.",
"Inbox compartilhado, responsáveis, filas e automação supervisionada no WhatsApp.",
},
};

Expand All @@ -78,8 +78,7 @@ export default function SoftwareAtendimentoWhatsAppPage() {
Software de Atendimento no WhatsApp
</h1>
<p className="mt-4 text-lg df-text-secondary">
Plataforma completa: automação, central de conversas, métricas e equipe.
Para quem precisa de controle real da operação.
Inbox compartilhado, responsáveis, filas e automação no que foi permitido.
</p>
<div className="mt-8">
<WhatsAppCta
Expand All @@ -101,7 +100,7 @@ export default function SoftwareAtendimentoWhatsAppPage() {
Por que um software em vez do WhatsApp comum?
</h2>
<p className="mx-auto mt-3 max-w-xl text-center df-text-secondary">
Quando o volume cresce, organização e métricas fazem a diferença.
Quando o volume cresce, fila e responsável fazem a diferença.
</p>
<div className="mx-auto mt-12 max-w-2xl space-y-4">
{comparisons.map((item, i) => (
Expand Down
Loading
Loading