17 — Transferencia Bancaria (pasarela manual #5)
Índice de la página
- 01Cliente: Martín Rieznik / LevantArte
- Área: Pagos — pasarela manual
- 020. Definición de "done" para esta checklist
- 031. Pre-requisitos
- 042. Tareas
- 2.1 Decisión de titularidad e implicancias fiscales
- 2.2 Datos bancarios — registry
- 2.3 Instructivo PDF
- 2.4 Página /martin/transferencia
- 2.5 Formulario "ya transferí"
- 2.6 Validación manual diaria
- 2.7 Activación de acceso post-aprobación
- 2.8 Casos especiales y escalation
- 2.9 SKU especial "transferencia con descuento 5%"
- 2.10 Test E2E
- 053. Variables y posibilidades a anticipar
- 064. Multi-tenant: cómo se replica al cliente #2
- 075. Recursos y archivos relacionados
- 086. Notas y aprendizajes (post-mortem)
- 09CHANGELOG
Cliente: Martín Rieznik / LevantArte
Área: Pagos — pasarela manual
Pasarela #5 del stack. Datos bancarios + instructivo PDF + página
/martin/transferenciacon 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.transferenciacon 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/transferenciaviva con instructivo + formulario "ya transferí" funcional → escribe en Supabasecompras.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: 5ypricing.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 socialowner_dni_cuit: CUIT/CUILbank_name_ars: banco cuenta ARSaccount_type_ars: caja de ahorro / cuenta corrientecbu_ars: CBU 22 dígitosalias_ars: alias bancariobank_name_usd: banco cuenta USD (puede ser el mismo o distinto)account_type_usd: tipo cuenta USDcbu_usd: CBU/CVU USDalias_usd: alias USDwise_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.mdpuede 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.mdcon 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/transferenciaform)
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 enrecursos/transferencia_instructivo_v1.pdfcon 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-24para 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-correrpython3 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.tsxdesplegada. Lee?sku=query param para mostrar monto correcto. Lee_CONFIG.md > pricing.transferenciapara 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_submitteda Supabaseeventos.
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 buckettransferencias_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 encomprascon:pasarela='transferencia',status='PENDING_VALIDATION',transaction_id_externo=<uuid generated>,metadata={comprobante_url, monto_declarado, banco_emisor}
3. INSERT eneventostipotransferencia_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
Leado evento customTransferencia_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-pendientesque 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 muestraprecio_base * 0.95como 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.94o >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 bancariosclient_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.mdcon placeholdersgenerate_transferencia_pdf.pyscript (parametrizado por cliente)transferencia_form_spec_TEMPLATE.mdtransferencia_validation_sop_TEMPLATE.mddelivery_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/transferenciaes una de las páginas16_PASARELAS_PAGO.md— pasarelas externas (las otras 4)13_PIXEL_TRACKING.md— CAPI Purchase post-aprobación15_EQUIPO_VENTAS.md— closer puede ofrecer transferencia12_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.