// ConectaAI — components
// All section components for the landing. Export to window at the bottom.
// ── HeroGraph ─────────────────────────────────────────────────────────────
// Force-directed network animation (Obsidian-like graph view).
const HeroGraph = ({ accent = "oklch(0.82 0.18 125)", inkColor = "rgba(255,255,255,.92)", mutedColor = "rgba(255,255,255,.45)", bgDot = "rgba(255,255,255,.06)" }) => {
const canvasRef = React.useRef(null);
const wrapRef = React.useRef(null);
React.useEffect(() => {
const canvas = canvasRef.current;
const wrap = wrapRef.current;
if (!canvas || !wrap) return;
const ctx = canvas.getContext('2d');
let dpr = Math.min(window.devicePixelRatio || 1, 2);
let W = 0,H = 0;
// Layout circular puro com 3 anéis e ~70 nós.
// Hub fixo + core (8) + ring1 (16) + ring2 (24) + ring3 (24) = 73
const NODE_DEFS = [];
NODE_DEFS.push({ id: 'hub', label: 'ConectaAI', kind: 'hub', r: 16 });
const CORE = [
{ id: 'crm', label: 'CRM' },
{ id: 'erp', label: 'ERP' },
{ id: 'wpp', label: 'WhatsApp' },
{ id: 'help', label: 'Helpdesk' },
{ id: 'db', label: 'Database' },
{ id: 'mail', label: 'E-mail' },
{ id: 'voice', label: 'Voz' },
{ id: 'pay', label: 'Pagamentos' }];
CORE.forEach((c) => NODE_DEFS.push({ ...c, kind: 'core', r: 7.5 }));
const RING1 = [
'HubSpot', 'Salesforce', 'Pipedrive', 'RD Station',
'SAP', 'TOTVS', 'Omie', 'Bling',
'Zendesk', 'Freshdesk', 'Intercom', 'Movidesk',
'Slack', 'Teams', 'Discord', 'Telegram'];
const RING2 = [
'Postgres', 'MySQL', 'MongoDB', 'Redis', 'Snowflake', 'BigQuery',
'Sheets', 'Airtable', 'Notion', 'Confluence', 'Jira', 'Linear',
'Stripe', 'Pagar.me', 'Mercado Pago', 'Asaas',
'Twilio', 'Vonage', 'Calendly', 'Cal.com',
'Drive', 'Dropbox', 'S3', 'GCS'];
const RING3 = [
'OpenAI', 'Anthropic', 'Mistral', 'Llama', 'Cohere', 'Groq',
'GitHub', 'GitLab', 'Bitbucket', 'Vercel',
'Webhooks', 'REST', 'GraphQL', 'SOAP', 'SFTP', 'FTPS',
'Kafka', 'RabbitMQ', 'SNS', 'SQS',
'Auth0', 'Okta', 'SSO', 'LDAP'];
RING1.forEach((label, i) => NODE_DEFS.push({ id: 'r1_' + i, label, kind: 'leaf', r: 5, ring: 1 }));
RING2.forEach((label, i) => NODE_DEFS.push({ id: 'r2_' + i, label, kind: 'leaf2', r: 4, ring: 2 }));
RING3.forEach((label, i) => NODE_DEFS.push({ id: 'r3_' + i, label, kind: 'leaf3', r: 3.5, ring: 3 }));
// Edges: hub→core, core→ring1 (cada core puxa 2 do ring1), ring1→ring2, ring2→ring3, + cross
const EDGES = [];
CORE.forEach((c) => EDGES.push(['hub', c.id]));
// core → ring1 (cada core conecta com 2 do ring1, em ordem)
for (let i = 0; i < RING1.length; i++) {
const coreIdx = Math.floor(i / 2) % CORE.length;
EDGES.push([CORE[coreIdx].id, 'r1_' + i]);
}
// ring1 → ring2 (cada ring1 puxa ~1.5 ring2)
for (let i = 0; i < RING2.length; i++) {
const r1Idx = Math.floor(i / 1.5) % RING1.length;
EDGES.push(['r1_' + r1Idx, 'r2_' + i]);
}
// ring2 → ring3
for (let i = 0; i < RING3.length; i++) {
const r2Idx = i % RING2.length;
EDGES.push(['r2_' + r2Idx, 'r3_' + i]);
}
// Cross-conexões pra textura
for (let i = 0; i < 14; i++) {
const a = NODE_DEFS[1 + Math.floor(Math.random() * (NODE_DEFS.length - 1))];
const b = NODE_DEFS[1 + Math.floor(Math.random() * (NODE_DEFS.length - 1))];
if (a.id !== b.id) EDGES.push([a.id, b.id]);
}
const nodes = NODE_DEFS.map((d, i) => ({
...d,
x: 0, y: 0, vx: 0, vy: 0,
fixed: d.id === 'hub',
// ângulo orbital pra animação suave
baseAngle: 0,
orbitSpeed: 0
}));
const byId = Object.fromEntries(nodes.map((n) => [n.id, n]));
const edges = EDGES.
filter(([a, b]) => byId[a] && byId[b]).
map(([a, b]) => ({ a: byId[a], b: byId[b], pulses: [] }));
function spawnPulse() {
// Prefere edges saindo do hub
const hubEdges = edges.filter((e) => e.a.kind === 'hub' || e.b.kind === 'hub');
const pool = Math.random() < 0.55 ? hubEdges : edges;
const edge = pool[Math.floor(Math.random() * pool.length)];
if (!edge) return;
const dir = Math.random() < 0.5 ? 1 : -1;
edge.pulses.push({ t: 0, dir, speed: 0.006 + Math.random() * 0.012 });
}
function getRadii() {
const m = Math.min(W, H);
return {
rCore: m * 0.18,
r1: m * 0.34,
r2: m * 0.44,
r3: m * 0.52
};
}
function layout() {
const cx = W / 2,cy = H / 2;
byId.hub.x = cx;byId.hub.y = cy;
const { rCore, r1, r2, r3 } = getRadii();
const core = nodes.filter((n) => n.kind === 'core');
const l1 = nodes.filter((n) => n.ring === 1);
const l2 = nodes.filter((n) => n.ring === 2);
const l3 = nodes.filter((n) => n.ring === 3);
core.forEach((n, i) => {
const a = i / core.length * Math.PI * 2 - Math.PI / 2;
n.baseAngle = a;n.orbitSpeed = 0.00006;
n.x = cx + Math.cos(a) * rCore;n.y = cy + Math.sin(a) * rCore;
});
l1.forEach((n, i) => {
const a = i / l1.length * Math.PI * 2;
n.baseAngle = a;n.orbitSpeed = -0.00004;
n.x = cx + Math.cos(a) * r1;n.y = cy + Math.sin(a) * r1;
});
l2.forEach((n, i) => {
const a = i / l2.length * Math.PI * 2 + 0.1;
n.baseAngle = a;n.orbitSpeed = 0.00003;
n.x = cx + Math.cos(a) * r2;n.y = cy + Math.sin(a) * r2;
});
l3.forEach((n, i) => {
const a = i / l3.length * Math.PI * 2 - 0.15;
n.baseAngle = a;n.orbitSpeed = -0.00002;
n.x = cx + Math.cos(a) * r3;n.y = cy + Math.sin(a) * r3;
});
}
function resize() {
const rect = wrap.getBoundingClientRect();
W = Math.max(320, Math.min(2000, rect.width || 800));
H = Math.max(320, Math.min(900, rect.height || 600));
canvas.width = W * dpr;canvas.height = H * dpr;
canvas.style.width = W + 'px';canvas.style.height = H + 'px';
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
layout();
}
resize();
const ro = new ResizeObserver(resize);ro.observe(wrap);
const mouse = { x: -9999, y: -9999, active: false };
const onMove = (e) => {
const r = canvas.getBoundingClientRect();
mouse.x = e.clientX - r.left;mouse.y = e.clientY - r.top;mouse.active = true;
};
const onLeave = () => {mouse.active = false;mouse.x = -9999;mouse.y = -9999;};
canvas.addEventListener('mousemove', onMove);
canvas.addEventListener('mouseleave', onLeave);
function step(ts) {
const cx = W / 2,cy = H / 2;
const { rCore, r1, r2, r3 } = getRadii();
// Posição base orbital + jitter suave
for (const n of nodes) {
if (n.fixed) {n.x = cx;n.y = cy;continue;}
const radius = n.kind === 'core' ? rCore : n.ring === 1 ? r1 : n.ring === 2 ? r2 : r3;
const a = n.baseAngle + ts * n.orbitSpeed;
const wobble = Math.sin(ts * 0.0008 + n.baseAngle * 3) * 4;
const tx = cx + Math.cos(a) * (radius + wobble);
const ty = cy + Math.sin(a) * (radius + wobble);
// Mouse repulsão
let mx = 0,my = 0;
if (mouse.active) {
const dx = n.x - mouse.x,dy = n.y - mouse.y;
const d2 = dx * dx + dy * dy + 0.01;
if (d2 < 14000) {
const d = Math.sqrt(d2);
const f = 30 / Math.max(1, d / 8);
mx = dx / d * f;my = dy / d * f;
}
}
// Lerp suave pra base + offset de mouse
n.x += (tx + mx - n.x) * 0.06;
n.y += (ty + my - n.y) * 0.06;
}
// Avança pulsos
for (const e of edges) {
e.pulses = e.pulses.filter((p) => {p.t += p.speed;return p.t <= 1;});
}
}
function draw(ts) {
ctx.clearRect(0, 0, W, H);
// Fundo: anéis-guia muito sutis
const cx = W / 2,cy = H / 2;
const { rCore, r1, r2, r3 } = getRadii();
ctx.strokeStyle = 'rgba(255,255,255,.04)';
ctx.lineWidth = 1;
[rCore, r1, r2, r3].forEach((r) => {
ctx.beginPath();ctx.arc(cx, cy, r, 0, Math.PI * 2);ctx.stroke();
});
// Pontos no fundo
const gridSize = 32;
ctx.fillStyle = bgDot;
for (let x = W / 2 % gridSize; x < W; x += gridSize) {
for (let y = H / 2 % gridSize; y < H; y += gridSize) {
ctx.fillRect(x, y, 1, 1);
}
}
// Edges
for (const e of edges) {
const dx = e.b.x - e.a.x,dy = e.b.y - e.a.y;
const d = Math.sqrt(dx * dx + dy * dy);
if (d < 0.1) continue;
const ux = dx / d,uy = dy / d;
const x1 = e.a.x + ux * e.a.r,y1 = e.a.y + uy * e.a.r;
const x2 = e.b.x - ux * e.b.r,y2 = e.b.y - uy * e.b.r;
const isHubEdge = e.a.kind === 'hub' || e.b.kind === 'hub';
const isCoreEdge = e.a.kind === 'core' || e.b.kind === 'core';
ctx.strokeStyle = isHubEdge ? 'rgba(255,255,255,.22)' :
isCoreEdge ? 'rgba(255,255,255,.11)' :
'rgba(255,255,255,.06)';
ctx.lineWidth = isHubEdge ? 1.1 : 0.7;
ctx.beginPath();ctx.moveTo(x1, y1);ctx.lineTo(x2, y2);ctx.stroke();
for (const p of e.pulses) {
const t = p.dir === 1 ? p.t : 1 - p.t;
const px = x1 + (x2 - x1) * t,py = y1 + (y2 - y1) * t;
const t0 = Math.max(0, t - 0.14);
const tx = x1 + (x2 - x1) * t0,ty = y1 + (y2 - y1) * t0;
const grad = ctx.createLinearGradient(tx, ty, px, py);
grad.addColorStop(0, 'rgba(255,255,255,0)');
grad.addColorStop(1, accent);
ctx.strokeStyle = grad;ctx.lineWidth = 1.6;
ctx.beginPath();ctx.moveTo(tx, ty);ctx.lineTo(px, py);ctx.stroke();
ctx.fillStyle = accent;
ctx.beginPath();ctx.arc(px, py, 2.2, 0, Math.PI * 2);ctx.fill();
}
}
// Nodes
for (const n of nodes) {
if (n.kind === 'hub') {
const pulse = (Math.sin(ts * 0.0018) + 1) / 2;
const haloR = n.r + 14 + pulse * 10;
const grad = ctx.createRadialGradient(n.x, n.y, n.r, n.x, n.y, haloR + 22);
grad.addColorStop(0, 'rgba(255,255,255,0)');
grad.addColorStop(0.45, 'rgba(217, 184, 87, 0.28)');
grad.addColorStop(1, 'rgba(255,255,255,0)');
ctx.fillStyle = grad;
ctx.beginPath();ctx.arc(n.x, n.y, haloR + 22, 0, Math.PI * 2);ctx.fill();
}
ctx.beginPath();ctx.arc(n.x, n.y, n.r, 0, Math.PI * 2);
if (n.kind === 'hub') {
ctx.fillStyle = accent;ctx.fill();
ctx.lineWidth = 1.5;ctx.strokeStyle = 'rgba(255,255,255,.9)';ctx.stroke();
} else if (n.kind === 'core') {
ctx.fillStyle = 'rgba(255,255,255,.95)';ctx.fill();
} else if (n.ring === 1) {
ctx.fillStyle = 'rgba(255,255,255,.7)';ctx.fill();
} else if (n.ring === 2) {
ctx.fillStyle = 'rgba(255,255,255,.5)';ctx.fill();
} else {
ctx.fillStyle = 'rgba(255,255,255,.35)';ctx.fill();
}
// Labels apenas em hub + core + ring1 (ring2/3 ficam só como nuvem visual)
if (n.kind === 'hub' || n.kind === 'core' || n.ring === 1) {
ctx.font = n.kind === 'hub' ?
'600 13px ui-sans-serif, system-ui' :
n.kind === 'core' ? '500 11px ui-monospace, monospace' : '400 10px ui-monospace, monospace';
ctx.fillStyle = n.kind === 'hub' ? inkColor :
n.kind === 'core' ? 'rgba(255,255,255,.88)' : mutedColor;
ctx.textAlign = 'center';ctx.textBaseline = 'top';
ctx.fillText(n.kind === 'hub' ? 'ConectaAI' : n.label, n.x, n.y + n.r + 5);
}
}
}
let raf = 0,lastPulse = 0;
const tick = (ts) => {
if (ts - lastPulse > 220) {
spawnPulse();
if (Math.random() < 0.7) spawnPulse();
if (Math.random() < 0.4) spawnPulse();
lastPulse = ts;
}
step(ts);draw(ts);
raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => {
cancelAnimationFrame(raf);
ro.disconnect();
canvas.removeEventListener('mousemove', onMove);
canvas.removeEventListener('mouseleave', onLeave);
};
}, [accent, inkColor, mutedColor, bgDot]);
return (
● contexto sendo puxado em tempo real
72 nós · 100+ conexões ativas
);
};
const NodeMark = ({ size = 22, color = "currentColor" }) =>
;
const Nav = () =>
;
const Hero = () => {
const [hasBackdrop, setHasBackdrop] = React.useState(
() => (document.body.dataset.graph || 'constellation') === 'constellation'
);
React.useEffect(() => {
const obs = new MutationObserver(() => {
setHasBackdrop((document.body.dataset.graph || 'constellation') === 'constellation');
});
obs.observe(document.body, { attributes: true, attributeFilter: ['data-graph'] });
return () => obs.disconnect();
}, []);
return (
4 anos · 100+ provedores no Brasil
CHAPECÓ SANTA CATARINA · 2026
Atendimento impecável .
Sem montar operação .
A gente já opera atendimento pra mais de 100 provedores há 4 anos. Agora colocamos IA na frente — pra resolver o que dá pra resolver em segundos, e deixar nosso time humano só com o que importa.
Implementação em 14 dias · LGPD · ISO 27001 em processo
{/* Card-style graph (renderiza só em variantes orbital/dataflow) */}
);
};
// Backdrop: renderiza só quando graphStyle === constellation, full-bleed atrás do hero
const HeroGraphBackdrop = () => {
const [style, setStyle] = React.useState(
() => document.body.dataset.graph || 'constellation'
);
const [accent, setAccent] = React.useState(
() => getComputedStyle(document.documentElement).getPropertyValue('--accent').trim() || 'oklch(0.82 0.18 125)'
);
React.useEffect(() => {
const obs = new MutationObserver(() => {
setStyle(document.body.dataset.graph || 'constellation');
setAccent(getComputedStyle(document.documentElement).getPropertyValue('--accent').trim());
});
obs.observe(document.body, { attributes: true, attributeFilter: ['data-graph'] });
obs.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] });
return () => obs.disconnect();
}, []);
if (style !== 'constellation') return null;
return (
);
};
// Bridge: lê body[data-graph] e reage a mudanças do tweak panel
const HeroGraphPickerLive = ({ renderMode = 'auto' }) => {
const [style, setStyle] = React.useState(
() => document.body.dataset.graph || 'constellation'
);
const [accent, setAccent] = React.useState(
() => getComputedStyle(document.documentElement).getPropertyValue('--accent').trim() || 'oklch(0.82 0.18 125)'
);
React.useEffect(() => {
const obs = new MutationObserver(() => {
setStyle(document.body.dataset.graph || 'constellation');
setAccent(getComputedStyle(document.documentElement).getPropertyValue('--accent').trim());
});
obs.observe(document.body, { attributes: true, attributeFilter: ['data-graph'] });
obs.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] });
return () => obs.disconnect();
}, []);
// Card-mode hides constellation (it renders as full-bleed backdrop instead)
if (renderMode === 'card' && style === 'constellation') return null;
return ;
};
const LogosStrip = () =>
4anos
operando atendimento
100+
provedores atendidos no Brasil
24/7
turnos cobertos pela operação
PT+ES
português e espanhol nativos
;
const Ticker = () =>
Suporte L1 2ª via Reset CPE
Diagnóstico de link Status do plano Agendamento
Cobrança Acordo Onboarding
Pré-venda Upsell Pesquisa CSAT
Triagem Roteamento Transcrição
Suporte L1 2ª via Reset CPE
Diagnóstico de link Status do plano Agendamento
Cobrança Acordo Pesquisa CSAT
;
const WhyUs = () => {
const pillars = [
{
n: "01",
title: <>Operamos antes de programar>,
body: "A gente vem de 4 anos atendendo provedor por turno, na régua, com gente. Quem desenha o software já passou a noite no console — não é teoria de SaaS.",
vis: "ops",
},
{
n: "02",
title: <>IA que defleta , humano que resolve >,
body: "A IA fecha o que é repetitivo em segundos. O caso que escala chega no humano com o cliente identificado, histórico carregado e proposta de solução pronta.",
vis: "deflect",
},
{
n: "03",
title: <>Mais barato porque é mais rápido >,
body: "Não é cortar pessoas pra economizar. É absorver volume com software pra cada minuto humano render mais. O custo por atendimento cai sem o CSAT cair junto.",
vis: "cost",
}
];
return (
00 — Por que a gente
Software de IA todo mundo promete.Operação rodando , é outro assunto.
Você não está contratando uma plataforma com manual de uso. Está contratando a operação inteira — IA + pessoas + processo — pra atender seu cliente como se fosse o nosso.
{pillars.map((p, i) => (
{p.n}
{p.title}
{p.body}
{p.vis === "ops" && (
06h 12h
18h 24h
)}
{p.vis === "deflect" && (
72% IA
28% humano
)}
{p.vis === "cost" && (
antes R$ 18,80 /atendimento
→
agora R$ 8,40
)}
))}
);
};
const HowItWorks = () =>
01 — Como funciona
Da chamada do cliente à pesquisa de CSAT , em uma operação só.
Não é uma ferramenta que você instala. É um fluxo end-to-end que a gente opera — IA na frente, humano no meio quando precisa, métrica no fim sempre.
~ 0s
01 / Entrada
Cliente chega
WhatsApp, voz, e-mail ou chat. Roteador identifica o cliente no seu CRM/ERP e carrega o histórico antes da primeira resposta.
WhatsApp Voz SIP E-mail Chat
→
4–40s
02 / IA tenta resolver
Agente responde
Para 70% dos casos — 2ª via, status, agendamento, dúvida técnica L1 — a IA resolve direto, com tom da marca, dentro da política.
RAG nos seus dados Ferramentas reais Guardrails
→
< 60s
03 / Humano com contexto
Operador assume
Os 30% que escalam caem no nosso operador com o caso pré-resumido, sentimento do cliente já lido, e a próxima ação sugerida.
Resumo automático Sentimento Próxima ação
→
D+0
04 / Fechamento
Mede e aprende
Pesquisa de CSAT automática, transcrição arquivada, motivos categorizados. Toda semana o agente aprende com o que humano resolveu.
CSAT FCR Motivos
;
const Agents = () => {
const agents = [
{
tag: "agent/01 · atendimento",
state: "em produção",
name: <>Atendimento de ponta >,
desc: "Responde por WhatsApp, e-mail e chat com contexto do cliente. Escala pro humano só quando precisa.",
skills: ["WhatsApp", "E-mail", "CRM", "RAG"],
metric: { k: "Resolução sem handoff", v: "78%" }
},
{
tag: "agent/02 · back office",
state: "em produção",
name: <>Operação silenciosa >,
desc: "Concilia pedidos, fecha tickets repetitivos e reconcilia dados entre sistemas durante a madrugada.",
skills: ["ERP", "Planilhas", "SQL", "Cron"],
metric: { k: "Horas/mês liberadas", v: "420h" }
},
{
tag: "agent/03 · vendas",
state: "em produção",
name: <>Pré-venda qualificada >,
desc: "Qualifica leads pelo ICP, enriquece dados e marca reunião só com quem faz sentido pro seu time.",
skills: ["HubSpot", "Enriquecimento", "Calendly"],
metric: { k: "SQLs / mês", v: "3,2×" }
},
{
tag: "agent/04 · financeiro",
state: "em produção",
name: <>Cobrança humana >,
desc: "Negocia parcelamento, emite boletos e fecha acordos dentro da sua política, sem tom robótico.",
skills: ["Boleto", "Pix", "Régua"],
metric: { k: "Recuperação D+30", v: "+34%" }
},
{
tag: "agent/05 · RH",
state: "beta",
name: <>Onboarding assistido >,
desc: "Guia novos colaboradores pelos primeiros 30 dias, responde sobre política, benefícios e processos internos.",
skills: ["SSO", "Notion", "Benefícios"],
metric: { k: "Tickets RH evitados", v: "61%" }
},
{
tag: "agent/06 · custom",
state: "do seu jeito",
name: <>Monte o seu >,
desc: "Do zero ou partindo de um dos templates acima. Integrações, prompts e regras 100% sob seu controle.",
skills: ["SDK", "API", "Templates"],
metric: { k: "Tempo até 1º deploy", v: "< 14d" }
}];
return (
02 — Agentes
Uma biblioteca viva de agentes prontos para operar.
Cada um com papel, ferramentas e métricas definidas. Use como ponto de partida ou customize do zero.
{agents.map((a, i) =>
{a.tag}
{a.state}
{a.name}
{a.desc}
{a.skills.map((s) => {s} )}
{a.metric.k}
{a.metric.v}
)}
);
};
const IntegLogo = ({ logo, name }) => {
const [failed, setFailed] = React.useState(false);
const [isDark, setIsDark] = React.useState(() =>
typeof document !== 'undefined' && document.body?.dataset.theme === 'dark'
);
React.useEffect(() => {
const obs = new MutationObserver(() => {
setIsDark(document.body.dataset.theme === 'dark');
});
obs.observe(document.body, { attributes: true, attributeFilter: ['data-theme'] });
return () => obs.disconnect();
}, []);
const buildMono = (str) => {
const words = str.split(/[\s\-!]+/).filter(Boolean);
if (words.length >= 2) return (words[0][0] + words[1][0]).toUpperCase();
return str.slice(0, 2).replace(/^./, c => c.toUpperCase());
};
const fallbackMono = buildMono(name);
const useImg = (logo.kind === "icon" || logo.kind === "file" || logo.kind === "url") && !failed;
const tint = isDark ? "ffffff" : "111111";
const src = logo.kind === "icon"
? `https://cdn.simpleicons.org/${logo.slug}/${tint}`
: (logo.kind === "file" || logo.kind === "url") ? (isDark && logo.srcDark ? logo.srcDark : logo.src) : null;
const cls = ["integ-logo"];
if (logo.kind === "file") cls.push("integ-logo--file");
if (logo.darkInvert && isDark) cls.push("integ-logo--invert");
if (logo.lightInvert && !isDark) cls.push("integ-logo--invert");
if (logo.brand) cls.push("integ-logo--brand");
return (
{useImg ? (
setFailed(true)}
/>
) : (
{logo.text || fallbackMono}
)}
);
};
const Integrations = () => {
// Logo strategy:
// - Marcas com presença em simple-icons CDN: usamos cdn.simpleicons.org (SVG, monocromático).
// - Marcas regionais/proprietárias sem CDN público: monogram (iniciais) renderizado em CSS.
const integs = [
{ name: "IXC Provedor", cat: "CRM", logo: { kind: "file", src: "brand/logos/ixc-provedor.png" } },
{ name: "Trello", cat: "CRM", logo: { kind: "icon", slug: "trello" } },
{ name: "WhatsApp Business API", cat: "Canal", logo: { kind: "url", brand: true, src: "https://cdn.simpleicons.org/whatsapp/3B5BFF", srcDark: "https://cdn.simpleicons.org/whatsapp/3B5BFF" } } },
{ name: "Conecta SIP-AI", cat: "Canal", logo: { kind: "file", brand: true, src: "brand/logos/conecta-mark-accent.svg", srcDark: "brand/logos/conecta-mark-accent.svg" } },
{ name: "OpenAI", cat: "AI", logo: { kind: "file", src: "brand/logos/openai.png", darkInvert: true } },
{ name: "Anthropic", cat: "AI", logo: { kind: "file", src: "brand/logos/anthropic.webp", darkInvert: true } },
{ name: "Opa! Suite", cat: "Helpdesk", logo: { kind: "file", src: "brand/logos/opa-suite.svg" } },
{ name: "Twilio", cat: "Helpdesk", logo: { kind: "file", src: "brand/logos/twilio.png" } },
{ name: "IXC Provedor", cat: "ERP", logo: { kind: "file", src: "brand/logos/ixc-provedor.png" } },
{ name: "Hubsoft", cat: "ERP", logo: { kind: "file", src: "brand/logos/hubsoft.png", lightInvert: true } },
{ name: "IXC ACS", cat: "TR069", logo: { kind: "file", src: "brand/logos/ixc-acs.png" } },
{ name: "Postgres", cat: "Dados", logo: { kind: "icon", slug: "postgresql" } }
];
return (
03 — Integrações
Tudo que sua empresa já usa , conversando entre si.
Conectores nativos, SDK aberto e webhooks para plugar qualquer sistema. Se existe, a gente conecta.
{integs.map((i, idx) =>
)}
);
};
const Cases = () =>
04 — Casos de uso
Empresas reais, com números auditáveis .
Sem cherry-picking: cada caso mostra o antes, o depois e a metodologia. Peça o deck detalhado em PDF.
Provedor MG · 14k assinantes case-01
Da espera de 47 minutos ao atendido em segundos .
Pico de chamadas no fim da tarde derrubava a fila. Agente de Suporte L1 absorveu 2ª via, status do plano e reset de CPE direto pelo IXC, sem fila.
−87%
Tempo médio de espera
Provedor SP · 38k assinantes case-02
Madrugada que não chama o técnico à toa.
Diagnóstico via IXC ACS antes de abrir chamado. Quedas reais escalam pro plantão; oscilação de Wi-Fi vira instrução guiada na hora.
8min
Tempo médio de diagnóstico
24/7
Cobertura sem plantão presencial
Provedor PR · 9k assinantes case-03
Cobrança que não soa como cobrança.
Régua de inadimplência conversando no WhatsApp, gerando 2ª via, oferecendo acordo dentro da política. Humano só entra em exceção.
−2.1pp
Inadimplência mensal
3.4x
ROI no primeiro trimestre
Provedor BA · 22k assinantes case-04
Retenção que liga antes do cliente cancelar.
Sinais do CRM (queda de uso, ticket recorrente, pedido de cancelamento) viram ação. Agente de retenção propõe upgrade ou aciona o humano certo.
14d
Do setup ao primeiro turno
;
const Pricing = () =>
05 — Planos
Comece pequeno . Escale sem reescrever nada.
Cobrança por turno resolvido, não por usuário. Se o agente não entregou, você não paga.
Início · piloto
Conecta Start
R$ 926,80
/ mês
1 agente em produção
Até 100 turnos resolvidos
3 conectores prontos
Painel de métricas essenciais
SLA dedicado
Ambiente isolado
R$ 8.9k
/ mês
Até 5 agentes simultâneos
Até 1.000 turnos resolvidos
Conectores ilimitados
Auditoria completa + logs
SLA 99.9% com suporte
Ambiente isolado na sua nuvem
Grupo · enterprise
Conecta Scale
sob medida
Agentes e turnos ilimitados
On-prem ou VPC dedicada
Modelos dedicados / fine-tune
Certificações customizadas
Squad de implementação
Contrato anual com POC paga
;
const ContactForm = () => {
// ⚠️ Substitua por seu endpoint Formspree real:
// 1. Crie conta grátis em formspree.io com comercial@speedgrowthisp.com.br
// 2. Crie um formulário "ConectaAI"
// 3. Cole abaixo o endpoint (formato: https://formspree.io/f/XXXXXXX)
const FORMSPREE_ENDPOINT = "https://formspree.io/f/xvzlzrzk";
const [status, setStatus] = React.useState("idle"); // idle | sending | ok | err
const [msg, setMsg] = React.useState("");
async function handleSubmit(e) {
e.preventDefault();
const form = e.currentTarget;
const data = new FormData(form);
// Validação manual (form usa noValidate pra UX customizada)
const nome = String(data.get("nome") || "").trim();
const email = String(data.get("email") || "").trim();
const consent = data.get("consent");
if (!nome) { setStatus("err"); setMsg("Informe seu nome."); return; }
if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
setStatus("err"); setMsg("Email inválido."); return;
}
if (!consent) {
setStatus("err"); setMsg("Aceite a política de privacidade pra continuar."); return;
}
setStatus("sending");
setMsg("");
try {
const res = await fetch(FORMSPREE_ENDPOINT, {
method: "POST",
headers: { Accept: "application/json" },
body: data,
});
if (res.ok) {
setStatus("ok");
setMsg("Recebido. Retornamos em até 1 dia útil.");
form.reset();
return;
}
let detail = "";
try {
const j = await res.json();
detail = (j.errors && j.errors[0] && j.errors[0].message) || "";
} catch (_) {}
setStatus("err");
setMsg(detail
? `Erro: ${detail}. Tente comercial@speedgrowthisp.com.br`
: "Não foi possível enviar. Tente comercial@speedgrowthisp.com.br");
} catch (err) {
setStatus("err");
setMsg("Falha de conexão. Tente novamente ou escreva pra comercial@speedgrowthisp.com.br");
}
}
return (
);
};
const CTAFinal = () =>
Pronto para botar um agente em turno ?
Setup em 14 dias
Dados no Brasil
Sem lock-in de modelo
Pago por resultado
Ou nos diga sobre seu provedor
;
const SocialIcon = ({ kind }) => {
const paths = {
linkedin: ,
instagram: <> >,
facebook: ,
};
return (
{paths[kind]}
);
};
const Footer = () =>
;
Object.assign(window, {
HeroGraph, HeroGraphPickerLive, NodeMark, Nav, Hero, LogosStrip, Ticker, HowItWorks, Agents, Integrations, Cases, Pricing, CTAFinal, ContactForm, Footer
});