Saltar al contenido
Studeia Docs
AI-assisted translation — last updated 2026-06-03. For original (pt-BR or en-US), use the language switcher.

Integración Asaas (PIX + boleto + tarjeta Brasil)

Asaas es el proveedor de pago BR de Studeia: PIX, boleto y tarjeta nacional. Webhooks fail-closed, customer split por proveedor, paralelo a Stripe (USD/internacional)

2026-06-03 5 min
Resposta curta

Asaas es el proveedor de pagos brasileño de Studeia: PIX instantáneo (1.99% comisión), boleto (R$3.49), tarjeta nacional (4.99% + R$0.49). Para clientes de Brasil es más económico y nativo que Stripe. Webhooks fail-closed (503 si falta el token). Customer split por proveedor (stripeCustomerId vs asaasCustomerId). Para internacional: Stripe USD en paralelo.

Configuración

1. Panel de Asaas

  1. https://asaas.com (o sandbox: https://sandbox.asaas.com)
  2. Configuraciones > Integraciones > API > copiar Access Token
  3. Configuraciones > Webhooks > Agregar:
    • URL: https://[tenant].studeia.com/api/webhooks/asaas?token=<TU_TOKEN>
    • Eventos: PAYMENT_RECEIVED, PAYMENT_OVERDUE, PAYMENT_REFUNDED, SUBSCRIPTION_CREATED/UPDATED/DELETED
  4. Personaliza el token (cadena aleatoria, criptográficamente segura)

2. Variables de entorno

ASAAS_API_KEY=$aact_...
ASAAS_WEBHOOK_TOKEN=...generado-en-el-paso-3...
ASAAS_SANDBOX=true  # opcional, por defecto false

3. Crear productos en Asaas

Asaas usa un modelo de cobro recurrente diferente al de Stripe. En Studeia, los planes se mapean mediante código (no es necesario crear un producto en el panel de Asaas).

Flujo PIX

Admin hace clic en "Pagar con PIX" en /institution/billing
  ↓
POST /api/institution/billing/checkout
  Body: { planSlug: "mini", provider: "asaas" }
  ↓
Studeia AsaasBillingProvider.createCheckout():
  1. Resuelve asaasCustomerId (crea si no existe — POST /customers)
  2. POST /subscriptions con billingType=PIX
  3. Asaas retorna QR Code + payload PIX para copiar y pegar
  4. Studeia retorna { url } página hosted de Asaas con QR
  ↓
Admin escanea el QR en la app bancaria, paga
  ↓
PIX confirma en ~30s (instantáneo)
  ↓
Webhook PAYMENT_RECEIVED → applyWebhookEvent → promueve Tenant.plan

Hardening (reglas 138, 139)

  • Fail-closed: ausencia de ASAAS_WEBHOOK_TOKEN en el env = 503 asaas_not_configured (regla 138). Anti-bypass.
  • Validación de token: query param ?token=<...> comparado con el env (comparación timing-safe)
  • 5xx en fallo: reintenta automáticamente
  • PaymentLog idempotente: unique [provider, externalEventId]
  • Redacción de PII: rawPayload pasa por redactPaymentPayload() — elimina cpfCnpj, email, name, address, billing_details (regla 139)

Customer split por proveedor

TenantSubscription tiene campos separados:

  • stripeCustomerId — para Stripe
  • asaasCustomerId — para Asaas
  • externalCustomerId — legado (mantenido como fallback si el proveedor coincide)

resolveCustomerIdForProvider() en create-checkout.ts usa los nuevos campos — NUNCA reutilices un ID entre proveedores.

Cuándo usar Asaas vs Stripe

EscenarioRecomendado
Cliente brasileño con PIXAsaas
Cliente brasileño con boletoAsaas
Cliente brasileño con tarjetaAsaas (más económico) o Stripe
Cliente internacionalStripe USD obligatorio (Asaas bloqueado)
Cuenta empresarial enterprise grandeStripe (más herramientas — Sigma, informes personalizados)

Comisiones comparadas

MétodoAsaasStripe
PIX1.99%NO ofrece nativo
BoletoR$3.49 fijoNO ofrece nativo
Tarjeta de crédito4.99% + R$0.493.99% + R$0.59 (USD)
Tarjeta de débito1.99% + R$0.39NO ofrece (BR)
Anticipo de cobrosDisponibleNO

Para volumen B2B brasileño típico: Asaas es ~20-40% más económico en comisiones totales.

Ver también

FAQ

¿Por qué Asaas y no solo Stripe?

Para el mercado brasileño: el 95% de las transacciones B2B usan PIX (instantáneo, sin comisión) o boleto. Stripe no tiene PIX nativo (lo ofrece a través de terceros más costosos). Asaas es brasileño, integra PIX/boleto/tarjeta nacional de forma nativa con comisiones menores (1.99% PIX, R$3.49 boleto, 4.99% tarjeta + R$0.49 vs Stripe 3.99% + R$0.59).

¿Studeia detecta automáticamente qué proveedor usar?

Sí. getCurrencyFromHeaders() server-side vía x-vercel-ip-country / cf-ipcountry: BR = Asaas ofrecido en la UI (PIX/boleto/tarjeta). Fuera de BR = Stripe USD obligatorio (Asaas bloqueado server-side con 400 'asaas_not_for_international').

¿Los webhooks de Asaas son seguros?

Sí, pero con hardening. Token vía query param ASAAS_WEBHOOK_TOKEN. Sin token configurado: el webhook retorna 503 asaas_not_configured (fail-closed — regla 138). Idempotencia vía PaymentLog unique. Asaas reintenta con backoff en caso de 5xx.

¿Puedo probar Asaas en sandbox?

Sí, Asaas tiene un entorno sandbox separado: https://sandbox.asaas.com. El token y la API key son independientes. Configura ASAAS_SANDBOX=true en el env para enrutar hacia el endpoint de sandbox.

Veja tambem

Integración Asaas (PIX + boleto + tarjeta Brasil)