← Voltar aos Artigos
Cover image for ARTIGO
Generated by Sinal AISinal / Recraft V3
Artigo26 de abril de 2026

E-commerce brasileiro em 46 linhas de TypeScript

Pix + NF-e + WhatsApp + Melhor Envio. Tudo. Em menos código do que muito botão de checkout

Fabiano Cruz

Autor

Agentes de IA estão vendendo na internet. Não daqui a dois anos. Agora. A OpenAI lançou protocolo de pagamentos agênticos com Stripe e Shopify. Visa e Mastercard publicaram specs de Agentic Commerce. Google integrou Pay com Gemini.

A pergunta que importa: quando o agente for vender no Brasil, ele vai falar Pix, NF-e e WhatsApp, ou ele vai esperar alguém traduzir?

Hoje, espera. A infraestrutura de agente que existe foi escrita pra resolver problemas de quem mora em São Francisco. Stripe, SendGrid, Shopify, Twilio. Não tem NCM, não tem CFOP, não tem certificado A1, não tem QR copia-e-cola. LangChain, LlamaIndex, Composio, CrewAI são ferramentas excelentes para o problema que elas resolvem. Esse problema não é o problema brasileiro.

Pra um e-commerce novo no Brasil colocar um agente de IA pra vender hoje, a conta é essa:

  • Pix via PSP: integrar com Asaas, Zoop, ou similar. 3 semanas se der sorte. Webhook de reconciliação com idempotência, QR code com TTL, tratamento de timeout. O "se der sorte" quase nunca rola na primeira.
  • NF-e: onde a maioria quebra. Não é "chamar API": é CFOP, NCM, CEST, ICMS por UF, certificado A1, XML SEFAZ, rejeição 204 vs 225 vs 510, homologação que se comporta diferente da produção. 4 a 5 semanas, e estoura.
  • WhatsApp Business: parece fácil. Meta Cloud API é uma semana. Mas template approval, verificação de conta business, limitação de sessão 24h, tier scaling: 2 a 3 semanas fáceis.
  • Melhor Envio: OAuth2 + sandbox + cotação + etiqueta + rastreio. 1 a 2 semanas.
  • Glue: retry, dedup de webhook, logging, testes. 2 semanas de verdade.

Soma: 3 a 4 meses, assumindo que tudo encadeia, que SEFAZ não rejeita na homologação, que template do WhatsApp passa de primeira na Meta, e que o dev fica 100% dedicado. Em time normal, 5 a 6 meses. Resultado típico: 1000+ linhas de código de integração, uma pilha de contratos B2B pra gerenciar todo mês, e um dev sênior amarrado num trimestre inteiro.

A gente comprimiu isso em 46 linhas.

Fluxo de e-commerce brasileiro em dois endpoints: POST /whatsapp orquestrando Asaas (Pix) + Z-API (WhatsApp), e POST /pix-paid orquestrando NFe.io (NF-e) + Melhor Envio (etiqueta) + Z-API (rastreio). O webhook do Asaas conecta os dois grupos quando o Pix é pago.
Fluxo de e-commerce brasileiro em dois endpoints: POST /whatsapp orquestrando Asaas (Pix) + Z-API (WhatsApp), e POST /pix-paid orquestrando NFe.io (NF-e) + Melhor Envio (etiqueta) + Z-API (rastreio). O webhook do Asaas conecta os dois grupos quando o Pix é pago.

Como ficou

Código completo, em Fastify, com os dois endpoints que compõem um e-commerce típico:

import { CodeSpar, loop } from "@codespar/sdk";
import Fastify from "fastify";

const cs = new CodeSpar();
const app = Fastify();
const COMPANY_ID = process.env.NFE_COMPANY_ID!;

app.post("/whatsapp", async (req) => {
  const { phone, name, cpf, items } = req.body as any;
  const total = items.reduce((s: number, i: any) => s + i.price * i.qty, 0);
  const session = await cs.create(phone);
  const r = await loop(session, {
    steps: [
      { tool: "asaas/create_customer", params: { name, cpfCnpj: cpf, mobilePhone: phone } },
      {
        tool: "asaas/create_payment",
        params: (prev: any) => ({
          customer: prev[0].data.id,
          billingType: "PIX",
          value: total,
          dueDate: new Date(Date.now() + 86400000).toISOString().slice(0, 10),
        }),
      },
      { tool: "asaas/get_pix_qrcode", params: (prev: any) => ({ id: prev[1].data.id }) },
      {
        tool: "z-api/send_text",
        params: (prev: any) => ({ phone, message: `Seu Pix: ${prev[2].data.payload}` }),
      },
    ],
  });
  return { payment_id: (r.results[1]!.data as any).id };
});

app.post("/pix-paid", async (req) => {
  const { payment_id, phone, buyer, items } = req.body as any;
  const session = await cs.create(phone);
  await loop(session, {
    steps: [
      { tool: "nfe-io/create_nfe", params: { company_id: COMPANY_ID, environment: "Production", buyer, items, payment_id } },
      { tool: "melhor-envio/generate_label", params: (prev: any) => ({ nfe_key: prev[0].data.chave }) },
      {
        tool: "z-api/send_text",
        params: (prev: any) => ({ phone, message: `NF-e emitida. Rastreio: ${prev[1].data.tracking_code}` }),
      },
    ],
  });
  return { ok: true };
});

app.listen({ port: 3000 });

Leia a análise completa

  • Acesso completo a todas as edições
  • 5 relatórios semanais por agente de IA
  • Newsletter no email toda semana

Grátis. Sem spam. Cancele quando quiser.