17 — Transferencia Bancaria (pasarela manual #5)

Índice de la página
  1. 01Cliente: Martín Rieznik / LevantArte
  2. Área: Pagos — pasarela manual
  3. 020. Definición de "done" para esta checklist
  4. 031. Pre-requisitos
  5. 042. Tareas
  6. 2.1 Decisión de titularidad e implicancias fiscales
  7. 2.2 Datos bancarios — registry
  8. 2.3 Instructivo PDF
  9. 2.4 Página /martin/transferencia
  10. 2.5 Formulario "ya transferí"
  11. 2.6 Validación manual diaria
  12. 2.7 Activación de acceso post-aprobación
  13. 2.8 Casos especiales y escalation
  14. 2.9 SKU especial "transferencia con descuento 5%"
  15. 2.10 Test E2E
  16. 053. Variables y posibilidades a anticipar
  17. 064. Multi-tenant: cómo se replica al cliente #2
  18. 075. Recursos y archivos relacionados
  19. 086. Notas y aprendizajes (post-mortem)
  20. 09CHANGELOG

Cliente: Martín Rieznik / LevantArte

Área: Pagos — pasarela manual

Pasarela #5 del stack. Datos bancarios + instructivo PDF + página /martin/transferencia con formulario "ya transferí" + validación manual diaria + activación de acceso. SLA validación ≤ 24hs. SKU especial con descuento 5% (no se cobra comisión de pasarela).

Última actualización: 2026-05-05
Responsable principal (R): Martín (datos bancarios) + Cortex (instructivo + form)
Aprobador (A): Jesús
Deadline: 2026-05-24
Depende de: 01_INFRA_TECNICA, 16_PASARELAS_PAGO
Bloquea a: 02_LANDINGS_Y_PAGES, 15_EQUIPO_VENTAS, 19_GO_LIVE_8_JUNIO


0. Definición de "done" para esta checklist

  • Datos bancarios definidos (titular, alias, CBU/CVU, CUIT/CUIL, banco, moneda) y guardados en _CONFIG.md > pricing.transferencia con decisión de titularidad documentada (Martín vs TooAudience).
  • Instructivo PDF generado (con agents/doc-creator/) con paso a paso desde Mercado Pago + Brubank + banco tradicional, descargable desde /martin/transferencia.
  • Página /martin/transferencia viva con instructivo + formulario "ya transferí" funcional → escribe en Supabase compras.status = PENDING_VALIDATION.
  • Cron / proceso de validación manual diaria documentado, con SLA ≤ 24hs, mensaje WA automático "ya recibimos tu transferencia, te activamos el acceso" cuando se valida.
  • Test E2E: 1 transferencia real de prueba → form completado → validación manual → activación de acceso → mensaje WA recibido. Documentado.

1. Pre-requisitos

# Pre-requisito Provisto por Estado
1 Decisión de titularidad de cuenta receptora (Martín o TooAudience) Jesús + Martín ⚠️ pendiente — asumido TooAudience cobra y settle al 50/50 mensual (ver § 3)
2 Datos bancarios completos (titular elegido) Martín o TooAudience ⚠️ BLOQUEANTE
3 Cuenta USD vs ARS — definir por SKU/país Jesús ⚠️ pendiente
4 Tabla compras y eventos en Supabase Eric ⚠️ pendiente (checklist 01)
5 agents/doc-creator/ operativo para generar PDF Cortex
6 Bot WA con capacidad de mensaje transactional post-aprobación Eric + Cortex ⚠️ pendiente (checklist 10)
7 Acceso a feed bancario para validación (descarga CSV o screen del homebanking) Martín o Jesús ⚠️ pendiente

2. Tareas

2.1 Decisión de titularidad e implicancias fiscales

  • Decidir titular de la cuenta receptora. R: Jesús + Martín (A). Done cuando: documentado. Asumido: TooAudience SAS (Argentina) — cobra todas las transferencias, factura al cliente final, y settle a Martín en el balance mensual del 50/50 (después de descontar gastos del embudo). Ventaja: misma operatoria multi-tenant. Si Martín prefiere cobrar él directo (factura como monotributista), switch posible — anota en _CONFIG.md > pricing.transferencia.owner.
  • Confirmar régimen fiscal del titular elegido. R: Jesús (con contador). Done cuando: validado: TooAudience puede emitir factura tipo C/B por servicios digitales en USD/ARS. IVA si aplica. AFIP receipt automático configurado.
  • Definir condiciones para el SKU "transferencia con descuento". R: Jesús + Martín. Done cuando: el descuento 5% se ofrece SOLO si el lead transfiere dentro de 24hs del checkout (no eternamente). Documentado en _CONFIG.md > pricing.transferencia.discount_pct: 5 y pricing.transferencia.discount_window_hours: 24.
  • Pedir a Martín los datos bancarios completos. R: Jesús. Done cuando: Martín respondió en privado (encriptado) los datos solicitados. Si decisión es TooAudience, recopilar de sistema interno.

2.2 Datos bancarios — registry

  • Crear bloque _CONFIG.md > pricing.transferencia. R: Cortex. Done cuando: bloque incluye:
  • owner_legal_name: razón social
  • owner_dni_cuit: CUIT/CUIL
  • bank_name_ars: banco cuenta ARS
  • account_type_ars: caja de ahorro / cuenta corriente
  • cbu_ars: CBU 22 dígitos
  • alias_ars: alias bancario
  • bank_name_usd: banco cuenta USD (puede ser el mismo o distinto)
  • account_type_usd: tipo cuenta USD
  • cbu_usd: CBU/CVU USD
  • alias_usd: alias USD
  • wise_email_usd: email Wise (opcional, para clientes fuera ARG)
  • payoneer_email_usd: email Payoneer (opcional)
  • swift_intl: datos SWIFT para internacional (opcional)
  • Definir mapeo SKU → moneda. R: Jesús. Done cuando: documentado:
  • Compradores ARG → ARS (conversión BCRA del día) o USD si lead lo pide
  • Compradores LATAM → USD (Wise / Payoneer / SWIFT)
  • Compradores resto del mundo → USD (SWIFT / Wise)
  • Si el lead solo puede ARS (ARG), conversión a USD usando dólar MEP del día.
  • Guardar datos sensibles en lugar seguro. R: Jesús. Done cuando: 1Password vault TooAudience tiene los datos. _CONFIG.md puede tener los datos públicos (alias, CBU sí), pero no claves de acceso al homebanking.

2.3 Instructivo PDF

  • Brief del instructivo. R: Cortex. Done cuando: outline en recursos/transferencia_pdf_brief.md con secciones:
    1. Portada con marca LevantArte + título "Cómo activar tu acceso por transferencia"
    2. Resumen 3 pasos (transferí → enviá comprobante → recibí acceso en menos de 24h)
    3. Datos bancarios destacados (alias + CBU + titular + monto exacto a transferir según SKU)
    4. Paso a paso con screenshots: Mercado Pago, Brubank, Banco Galicia / Santander / BBVA (top 3 ARG)
    5. Caso especial: cliente fuera de ARG → Wise / Payoneer / SWIFT
    6. Cómo enviar comprobante (link a /martin/transferencia form)
    7. Qué pasa si la transferencia no aparece (escalation a soporte WhatsApp)
    8. FAQs (5-7 preguntas)
  • Generar PDF con agents/doc-creator/. R: Cortex. Done cuando: PDF generado en recursos/transferencia_instructivo_v1.pdf con diseño editorial (Playfair + Inter), 4-6 páginas, screenshots reales, marca LevantArte aplicada.
  • Subir PDF a Vercel public assets. R: Eric + Cortex. Done cuando: PDF accesible en https://deacademia.com/martin/assets/transferencia_instructivo_v1.pdf. Versión con ?v=2026-05-24 para cache busting.
  • Audit del PDF con Martín. R: Jesús. Done cuando: Martín aprobó voz + datos.
  • Re-generar PDF si datos bancarios cambian. R: Cortex. Done cuando: proceso documentado: cambiar _CONFIG.md → re-correr python3 agents/doc-creator/scripts/generate_transferencia_pdf.py → bump version.

2.4 Página /martin/transferencia

  • Diseñar wireframe. R: Cortex. Done cuando: wireframe en recursos/transferencia_page_wireframe.md:
  • Hero: "Pagar por transferencia (-5%)"
  • Bloque destacado: alias + CBU + titular + CUIT (copy-to-clipboard buttons)
  • Bloque monto exacto: muestra el monto del SKU del lead (URL param ?sku=) en ARS y USD
  • CTA primario: "Descargar instructivo PDF"
  • CTA secundario: "Ya transferí — confirmá tu pago" → scroll al form
  • Form al final
  • Footer con "Necesitás ayuda? hablanos por WhatsApp"
  • Build de la página. R: Eric + Cortex. Done cuando: app/[client_slug]/transferencia/page.tsx desplegada. Lee ?sku= query param para mostrar monto correcto. Lee _CONFIG.md > pricing.transferencia para datos bancarios. Botones copy-to-clipboard funcionando con feedback visual.
  • Página mobile-friendly. R: Eric. Done cuando: Lighthouse ≥ 85 en mobile. Botones de copia funcionan en iOS Safari.
  • Tracking de eventos. R: Eric. Done cuando: dispara transferencia_page_view, pdf_descargado, alias_copiado, cbu_copiado, form_started, form_submitted a Supabase eventos.

2.5 Formulario "ya transferí"

  • Definir campos del form. R: Cortex. Done cuando: lista en recursos/transferencia_form_spec.md:
  • Nombre completo (required)
  • Email (required, validación regex)
  • Teléfono WhatsApp (required, validación con código país)
  • SKU comprado (auto-fill desde URL param, editable con dropdown)
  • Monto transferido (number, required)
  • Moneda (ARS/USD)
  • Fecha de transferencia (date picker, default hoy)
  • Banco emisor (text, opcional)
  • Comprobante (upload imagen/PDF, required, max 5MB)
  • Mensaje opcional (textarea)
  • Checkbox: "Confirmo que la cuenta de origen está a mi nombre" (required)
  • Honeypot anti-spam
  • Build del form. R: Eric. Done cuando: form en la misma página /martin/transferencia. Validación client-side + server-side. Upload comprobante a Supabase Storage bucket transferencias_comprobantes (path: <client_slug>/<lead_id>/<timestamp>_<filename>).
  • POST a /api/webhook/transferencia. R: Eric. Done cuando: handler:
    1. Valida payload + comprobante uploaded
    2. INSERT en compras con: pasarela='transferencia', status='PENDING_VALIDATION', transaction_id_externo=<uuid generated>, metadata={comprobante_url, monto_declarado, banco_emisor}
    3. INSERT en eventos tipo transferencia_declarada
    4. Manda mensaje WA al lead: "Ya recibimos tu aviso. Validamos en menos de 24hs y te activamos el acceso. Mientras tanto, sumate al grupo: [link]"
    5. Manda alerta a Slack/WA interno con link al row de Supabase + thumbnail del comprobante
  • NO disparar CAPI Purchase todavía. R: Eric. Done cuando: Purchase event SOLO se dispara cuando status pasa a APPROVED (en validación manual). Hasta entonces, dispara Lead o evento custom Transferencia_Declarada.
  • Confirmation screen post-submit. R: Cortex. Done cuando: copy claro: "Recibimos tu comprobante. Lo validamos en las próximas 24hs y te avisamos por WhatsApp. Si no llega antes de 24hs, escribinos."

2.6 Validación manual diaria

  • Definir proceso de validación. R: Jesús. Done cuando: documentado en recursos/transferencia_validation_sop.md:
    1. Cada día a las 10am ARG (lunes-domingo), Jesús (o Cortex con feed bancario) descarga movimientos del homebanking de últimas 24h.
    2. Abre vista /admin/transferencias-pendientes que lista compras con status=PENDING_VALIDATION ordenadas por fecha.
    3. Por cada fila: comparar comprobante uploaded + nombre + monto declarado contra movimientos reales del banco.
    4. Si match → click "Aprobar" → status pasa a APPROVED → trigger de delivery.
    5. Si no match → click "Pedir aclaración" → mensaje WA pre-aprobado.
    6. Si fraude / error grave → click "Rechazar" → status REJECTED + razón.
  • Build vista /admin/transferencias-pendientes. R: Eric. Done cuando: tabla con: lead, monto declarado, fecha, comprobante (preview clickeable), botones Aprobar/Pedir aclaración/Rechazar. Filtros por SKU + por antigüedad.
  • Botón "Aprobar". R: Eric. Done cuando: cambia status, dispara CAPI Purchase, trigger de delivery (grupo WA + Skool si aplica), manda mensaje WA "ya recibimos tu transferencia, te activamos el acceso. Bienvenido a [SKU]".
  • Botón "Pedir aclaración". R: Eric + Cortex. Done cuando: opens dropdown con razones pre-armadas (monto no coincide / nombre no coincide / comprobante ilegible / banco no apareció el movimiento) → manda mensaje WA correspondiente + cambia status a PENDING_CLARIFICATION.
  • Botón "Rechazar". R: Eric. Done cuando: requiere razón obligatoria → cambia a REJECTED + manda mensaje WA "no pudimos validar tu transferencia, contactanos" → handoff a Jesús.
  • SLA tracking. R: Eric. Done cuando: cron cada 1h cuenta filas PENDING_VALIDATION con created_at > 24h → alerta a Jesús con lista. Goal: cero filas con > 24h.

2.7 Activación de acceso post-aprobación

  • Definir delivery por SKU. R: Cortex + Eric. Done cuando: tabla en recursos/delivery_matrix.md:
  • TALLER_LUNES/MARTES/FULL → agregar a grupo WA "Compradores Taller Semana XXXX-XX-XX" + email con link a Zoom + agregar a Supabase tabla miembros_grupo
  • MEMBRESIA_ANUAL_1PAGO → agregar a comunidad Skool (si aplica) + email con onboarding + grupo WA "Miembros Anuales"
  • MEMBRESIA_MENSUAL → idem + cron de cobro mensual ⚠️ NOTA: transferencia mensual recurrente es manual — alertar al lead en day 28 para volver a transferir
  • MEMBRESIA_6_MESES → idem con 6 cobros, alertas mensuales
  • Implementar delivery.grant_access(sku, lead_id). R: Eric. Done cuando: función llamada por handler de aprobación. Idempotente (si se llama 2x, no duplica acceso).
  • Mensaje WA de bienvenida automático. R: Cortex (copy) + Eric (envío). Done cuando: copy aprobado, plantilla en recursos/messages_wa/transferencia_aprobada.md. Variables: {nombre}, {sku_nombre}, {link_grupo}, {link_zoom}. Audit voz Martín.

2.8 Casos especiales y escalation

  • Caso: transferencia que no aparece en bank feed. R: Jesús. Done cuando: SOP: esperar 48hs (algunas transferencias internacionales tardan). Si día 3 sin aparecer → contactar al lead con script "necesitamos un comprobante adicional / verificar datos". Si día 7 sin aparecer → marcar como REJECTED + escalation interna para validar si fue fraude.
  • Caso: lead transfirió a la cuenta vieja (si datos cambiaron). R: Jesús. Done cuando: SOP: si la cuenta vieja sigue activa, validar igual. Si está cerrada, contactar al lead para refund + nueva transferencia. Documentado.
  • Caso: monto transferido mayor al esperado. R: Jesús. Done cuando: SOP: aprobar el SKU + ofrecer crédito por el excedente o refund parcial. Política definida.
  • Caso: monto menor al esperado. R: Jesús. Done cuando: SOP: pedir transferencia complementaria por la diferencia. No activar acceso hasta completar.
  • Caso: lead pide refund post-aprobación. R: Jesús. Done cuando: SOP: refund manual por transferencia inversa (Jesús ejecuta). Window 7 días sin preguntas. Status pasa a REFUNDED + remover acceso.

2.9 SKU especial "transferencia con descuento 5%"

  • Definir lógica del descuento. R: Cortex. Done cuando: para cada SKU, el monto a transferir es precio_base * 0.95. Documentado en _CONFIG.md > pricing.skus[].price_transferencia.
  • Comunicar el descuento en /martin/checkout/[sku]. R: Cortex + Eric. Done cuando: botón "Pagar con transferencia (-5%)" muestra el precio descontado.
  • Mostrar monto descontado en /martin/transferencia. R: Eric. Done cuando: la página lee SKU y muestra precio_base * 0.95 como monto a transferir.
  • Validación: que el monto declarado coincida con el descontado. R: Eric. Done cuando: el form rechaza si el monto declarado < precio_base * 0.94 o > precio_base * 1.10 (margen para conversión cambio).

2.10 Test E2E

  • Test 1: transferencia real de prueba ARS. R: Jesús. Done cuando: Jesús transfiere $5 (precio TALLER_LUNES) desde su cuenta personal → completa form → Cortex/Jesús valida → activación → mensaje WA recibido. Documentado en recursos/test_transferencias.md.
  • Test 2: transferencia USD (Wise/Payoneer). R: Jesús. Done cuando: idem pero en USD.
  • Test 3: caso "monto no coincide". R: Jesús. Done cuando: transfiere monto distinto, valida que el flujo "Pedir aclaración" funciona.
  • Test 4: refund. R: Jesús. Done cuando: prueba el refund manual de un caso completo. Status REFUNDED, acceso revocado, mensaje al lead.

3. Variables y posibilidades a anticipar

Escenario Plan B
Martín no quiere usar TooAudience como titular (prefiere cobrar él) Switch a cuenta de Martín. Datos bancarios actualizados en _CONFIG.md. PDF re-generado. Implicancias: él emite factura, settle interno desde Martín a TooAudience por el 50% de TooAudience. Más trabajoso pero viable.
AFIP bloquea cuenta TooAudience por volumen alto USD Plan B inmediato: switch a cuenta Martín como puente. Plan a mediano: abrir cuenta corporativa USD en banco internacional (Mercury, Wise Business).
Lead transfiere desde cuenta de tercero (esposa, hermano) Por defecto rechazar (anti-fraude). Si caso legítimo, validación manual con WhatsApp con foto del transferente + DNI. Política documentada.
Lead quiere pagar en cripto (USDT) Fuera de scope MVP. Política: "no aceptamos cripto en esta primera versión". Re-evaluar v2.
Bank feed no descargable desde el banco (banco viejo) Validación manual mirando homebanking. Más lento pero viable. SLA puede subir a 48hs en este caso.
Comprobante uploaded es photoshop / fraudulento Auditoría: cross-check con bank feed. Si no aparece + comprobante sospechoso → REJECTED + blacklist al lead.
Membresía mensual por transferencia: lead deja de pagar mes 3 Cron alerta día 28 + día 30 + día 32. Si día 35 sin pagar → revocar acceso + email "tu acceso fue pausado". Reactivable con nueva transferencia.
Volumen alto: > 20 transferencias/día (saturación de validación manual) Contratar VA part-time para validación + Cortex automatiza el match con OCR del comprobante + bank feed parser.
Transferencia internacional SWIFT cobra fee al receptor que reduce el monto Aceptar margen del 5% (ya descuento). Si fee > 5%, contactar al lead para complementar o aceptar la pérdida. Documentar.
Cambio de alias bancario mid-cycle Bump de versión del PDF + alerta a leads con compras pendientes en últimos 7 días. Aceptar transferencias a alias viejo durante 14 días de gracia.
Lead paga 2 SKUs por error en una sola transferencia Validación manual identifica el caso. Activar ambos accesos + log especial.
Mensaje WA "ya recibimos" no llega (bot caído / lead sin WA) Fallback email automático con misma info + status visible en /martin/mi-cuenta?email= (página simple de status).
Devolución de fondos por error (lead transfiere y cancela) Refund manual. SLA 48hs. Política documentada.

4. Multi-tenant: cómo se replica al cliente #2

Esta sección alimenta sop/lanzar-cliente/17_transferencia.md.

  • Variables a externalizar:
  • client_config.json > pricing.transferencia.owner — quién recibe (cliente o TooAudience)
  • client_config.json > pricing.transferencia.bank_data_ars/usd — bloque de datos bancarios
  • client_config.json > pricing.transferencia.discount_pct (default 5)
  • client_config.json > pricing.transferencia.discount_window_hours (default 24)
  • client_config.json > pricing.transferencia.sla_validation_hours (default 24)
  • client_config.json > pricing.transferencia.intl_methods[] — Wise / Payoneer / SWIFT enabled
  • Templates a guardar en sop/lanzar-cliente/templates/transferencia/:
  • transferencia_pdf_brief_TEMPLATE.md con placeholders
  • generate_transferencia_pdf.py script (parametrizado por cliente)
  • transferencia_form_spec_TEMPLATE.md
  • transferencia_validation_sop_TEMPLATE.md
  • delivery_matrix_TEMPLATE.md (cliente decide accesos por SKU)
  • messages_wa/transferencia_* — copy genéricos
  • Sustituciones automáticas:
  • {{CLIENTE_SLUG}} → en URLs de página y assets
  • {{CLIENTE_NOMBRE}} → en PDF y mensajes
  • {{MARCA}} → marca comercial (LevantArte, etc.)
  • {{ALIAS}}, {{CBU}}, {{CUIT}} → sensible, leer de config encriptado
  • Componentes reusables 1:1:
  • Página /[slug]/transferencia/page.tsx
  • Form spec + handler
  • Vista /admin/transferencias-pendientes
  • Cron SLA breach
  • Schema Supabase (mismo)
  • Decisión repetible: cliente nuevo elige entre titularidad propia (más friction inicial) o TooAudience (más rápido). SOP debe presentar pros/cons.

5. Recursos y archivos relacionados

  • 02_LANDINGS_Y_PAGES.md/martin/transferencia es una de las páginas
  • 16_PASARELAS_PAGO.md — pasarelas externas (las otras 4)
  • 13_PIXEL_TRACKING.md — CAPI Purchase post-aprobación
  • 15_EQUIPO_VENTAS.md — closer puede ofrecer transferencia
  • 12_GRUPOS_WHATSAPP.md — delivery a grupos post-aprobación
  • ../02_PLAN_INTERNO_EQUIPO.md — § 2 pasarela #5
  • _CONFIG.md > pricing.transferencia — datos bancarios (a llenar)
  • recursos/transferencia_pdf_brief.md — brief del PDF (a crear)
  • recursos/transferencia_instructivo_v1.pdf — PDF generado (a crear)
  • recursos/transferencia_form_spec.md — spec del form (a crear)
  • recursos/transferencia_validation_sop.md — SOP validación (a crear)
  • recursos/delivery_matrix.md — qué se entrega por SKU (a crear)
  • recursos/messages_wa/transferencia_aprobada.md — copy WA (a crear)
  • recursos/test_transferencias.md — log de tests (a crear)
  • agents/doc-creator/ — generador de PDF

6. Notas y aprendizajes (post-mortem)

Llenar después del primer ciclo (semana 8-12 jun).

  • (vacío)

CHANGELOG

  • 2026-05-05 — JT — Creación inicial. Asumido: titular = TooAudience SAS (multi-tenant friendly + Martín cobra en balance mensual). SLA validación 24hs. Descuento transferencia 5% con ventana 24h. Cripto fuera de MVP.