Appearance
Módulo 4 · Compliance que te defiende
Read in English: Module 4 · Compliance that defends you.
Objetivo: entender los gates que bloquean antes de marcar, leer los motivos de bloqueo, y saber exactamente qué enseñarle a un abogado o a un examinador. Tiempo: ~8 minutos · Antes: Módulo 3.
Esto no es asesoría legal
Este módulo explica cómo funciona la plataforma. Tu postura de cumplimiento confírmala siempre con tu propio abogado.
1. La diferencia: bloquear vs. reportar
Casi todos los marcadores te dan un reporte de violaciones — después de que llamaste. Aquí el modelo está invertido y es fail-closed: cada intento pasa por una cadena de gates antes de originar, y si un gate dice no — o si el gate no puede decidir por falta de datos — la llamada nunca existe. En la duda, no se marca.
Los gates que corren en cada intento:
| Gate | Regla | De dónde salen los datos |
|---|---|---|
| Reg F 7-en-7 | Máximo 7 intentos en 7 días consecutivos por deuda. | El contador cuenta por external ref (la llave del Módulo 2). |
| Reg F post-contacto | 7 días de espera después de una conversación telefónica sobre la deuda, con un agente o con la IA. | La fecha de última conversación que registra el propio sistema. |
| Horario permitido | 8:00–21:00 en la hora local del consumidor. | Zona horaria y estado del contacto importados con tu cartera. |
| DNC | Listas de no-llamar. | Registros consultados al momento de decidir. |
Por eso el mapeo del Módulo 2 no era burocracia: sin zona horaria ni estado, el gate de horario no puede decidir a favor — y no marca.
La ventana de tu campaña y su horario por día son otra cosa: preferencias de tu despacho que solo estrechan. Se suman al gate de horario, que no las lee. Ninguna de las dos abre una hora que el gate cierra, y un día que tú cerraste no se marca aunque el gate lo permitiera. Tampoco son una regla de días ni de festivos.
Campañas de voz artificial: sin tecla de baja no se marca
Las campañas de voz sintetizada — tts_blast, tts_ivr, ivr_cascade y survey — llevan dos reglas más. La divulgación de voz artificial que guardaste para tu cuenta suena al principio de cada llamada, antes de tu guion; si no tienes una válida, la campaña no marca. Y la campaña necesita una tecla de baja (optout_digit): sin ella, cada intento se bloquea como tenant_policy y queda en tu evidencia. El consumidor tiene que oír qué tecla lo da de baja: escribe esa frase en tu divulgación, justo después de que la llamada se identifica, con el marcador {optout_digit} donde va la tecla — por ejemplo «Esta es una llamada automatizada de Acme Cobranzas. Pulse {optout_digit} para dejar de recibir estas llamadas.» Cada campaña pone su propia tecla en lugar del marcador. No escribas la tecla: una divulgación sin el marcador se guarda, pero ninguna campaña de TTS, IVR o encuesta marca con ella. Las campañas de Voice AI no usan tecla: el consumidor se da de baja diciéndolo en la conversación. Detalle en la referencia de API. Guardar la divulgación exige un administrador: un inicio de sesión member recibe 403 role_forbidden.
Buzón de voz, sólo compuesto. Estas mismas campañas, con detección de contestadores, pueden dejar un mensaje en el buzón, y sólo uno que arma la plataforma: tu divulgación (con la tecla de la campaña), seguida de tu texto con el marcador {optout_number} donde va tu número gratuito de baja, que se lee dígito a dígito. Ese número tiene que ser una ruta de baja activa de tu propia cuenta (Módulo 10): quien devuelve la llamada queda en tu lista de no-llamar. Si falta cualquier pieza —la detección, el número, el marcador, o la ruta se desactivó— no se deja mensaje y se cuelga ante la máquina. Detalle en la referencia de API.
Campañas de Voice AI
- La divulgación de la IA está lista antes de la primera llamada. La plataforma la convierte en audio antes de marcar, para que sea lo primero que oye el consumidor; mientras no está, la campaña no marca. Si editas la divulgación, la campaña espera al audio nuevo.
- Tiene un tope de capacidad. La plataforma no abre más sesiones de IA de las que aguanta; cuando están todas en uso, la campaña espera y su fila dice que la cuenta tiene un freno activo (
ai_capacity). Sigue sola en cuanto termina una llamada de IA. - Una llamada que la IA no puede atender no se cuelga en silencio. Si la sesión de IA se rechaza por capacidad y ningún agente la toma, el consumidor oye el mensaje de identificación de la llamada abandonada y la llamada termina; cuenta como abandono.
- Sin agente libre, la conversación puede seguir con la IA en vez de terminar en una disculpa fija. Esa llamada no cuenta como abandono: el informe de abandono de 30 días la cuenta aparte.
- Una conversación con la IA cuenta para Reg F. Una llamada de IA contestada, que la detección no marcó como contestador, abre la espera de 7 días después de una conversación, igual que una llamada con agente: esa deuda no se vuelve a marcar dentro de la ventana. Ante la duda bloquea: un traspaso fallido o una sesión de IA que se cortó también la abren.
Detalle en la referencia de API.
2. Dónde ves los bloqueos
- En el tablero y en cada campaña: el contador blocked — intentos que el motor frenó. Un
blockedalto no es una falla; es el sistema trabajando. Si te parece demasiado alto, casi siempre es cartera ya muy trabajada (contadores 7-en-7 llenos) o datos de contacto incompletos. - En el preview de rewind verás la franja
excluded_by_compliance: cuentas que el motor bloquearía en este momento.
El consentimiento que tienes, y las bajas
El gate de consentimiento lee el consentimiento registrado de cada número. Además de que el consumidor conteste START por SMS, un administrador de la cuenta (o una llave dd_) puede registrar el consentimiento que la agencia ya tiene, con su prueba: dónde se obtuvo y dónde vive la evidencia (una grabación, un formulario firmado, una URL). Sin prueba no hay consentimiento. La plataforma guarda esa referencia tal como se da; no la abre ni la verifica, y un login member no puede escribirlo. La ruta, la importación CSV y sus límites están en la Referencia de la API. Un consentimiento no abre los demás gates: no llamar, horas y Reg F siguen decidiendo cada llamada. La prueba mínima que exige la plataforma y el trato de una línea fija declarada siguen sin decidirse; no los des por definitivos.
Y en sentido contrario: un STOP que llega por un proveedor de SMS de toda la cuenta es una baja para todas las sedes de la cuenta; uno que llega por un proveedor de una sede se queda en esa sede. Nunca cruza a otra cuenta (Módulo 16). Un START por SMS devuelve el consentimiento de SMS, pero sólo levanta la baja que escribió un STOP por SMS: la hecha por voz, tecla, llamada entrante o tu CSV se queda. El SMS también respeta REVOKE, OPT OUT, STOP ALL y frases cortas como «please stop» (Módulo 16).
Otras dos bajas se escriben solas. Cuando un agente tipifica Cese de contacto, Representado por abogado, Fallecido o No me llame más al cerrar, la plataforma escribe el cese y/o el apunte en no-llamar en la misma operación (Módulo 5). Y cuando un consumidor pulsa la tecla de baja en una llamada saliente (el optout_digit, o una acción optout del menú de la llamada), la baja se registra con el motivo outbound_dtmf_optout, así tu evidencia distingue una tecla de un STOP por SMS; la llamada se cuelga en ambos casos. Si la escritura falla, la plataforma lo registra y reintenta hasta 3 veces (a 1, 5 y 30 segundos) mientras la llamada se cuelga igual. El reintento vive en ese servidor: si se reinicia en esa ventana, la baja pendiente se pierde y optout_lost no la cuenta (solo cuenta los reintentos agotados); queda el error registrado en el primer fallo.
3. El rastro de auditoría: evidencia congelada
El filtro de campaña de esta pantalla es un selector con búsqueda que oculta las campañas archivadas y terminadas hasta que marcas Incluir inactivos y archivadas: mira cómo funcionan los selectores.

Cada intento queda en un registro append-only (solo se agrega, jamás se edita ni se borra) con un snapshot de cumplimiento congelado: lo que la plataforma sabía en el instante en que permitió esa llamada — contadores, hora local del consumidor, resultado de las verificaciones.
Dos propiedades hacen que esto valga en una disputa:
- Inmutable. Si un gestor corrige la disposición después, la corrección es una fila nueva que apunta a la original. La historia completa siempre es visible; nada se sobreescribe.
- Reproducible. El snapshot congela los insumos de la decisión. Aunque los datos cambien después (el consumidor entró a DNC la semana siguiente), puedes demostrar qué se sabía ese día a esa hora.
Una petición de borrado de una persona. «Sólo se añade» no significa que la plataforma nunca pueda atender una solicitud de privacidad. Con POST /v1/privacy/erasure-requests (API REST) la plataforma puede primero simular el borrado de una persona (qué se anonimizaría, qué hay que conservar y hasta cuándo) y, cuando el operador de la plataforma enciende la ejecución (viene apagada por defecto), anonimizarla: las filas se quedan, sólo se va lo que identifica a la persona, y se añade una lápida sellada a la cadena de auditoría, de modo que la cadena sigue verificando. La supresión (DNC, órdenes de cese, consentimientos revocados) y los registros dentro de tu piso de retención nunca se borran.
4. Qué registra la atestación del aviso de cobranza
Disponibilidad: esta superficie está construida en
core@main, después de corev0.87.0. La referencia generada la mostrará cuando una versión publicada de core la incluya.
En una llamada de cobranza, el agente puede declarar que entregó el aviso o que no pudo entregarlo. La plataforma guarda esa declaración como un evento append-only por llamada, con el agente que la hizo, la hora del servidor y, si se envió, el digest del texto que vio. Una rectificación agrega otro evento que apunta al anterior: no lo edita ni lo esconde. El evento y su eslabón de la cadena de auditoría se escriben juntos; si el sello falla, no se guarda ninguno.
El estado de una llamada usa exactamente este vocabulario:
| Estado | Qué significa |
|---|---|
attested | La declaración vigente del agente dice delivered. |
declared_not_delivered | La declaración vigente dice not_delivered; el evento conserva el motivo. |
unattested | La llamada está en alcance y nadie ha declarado el resultado del aviso. |
not_applicable | La llamada está fuera de alcance: no tiene deuda o no terminó como contacto humano. |
undecidable | La llamada todavía no tiene una fila final; el sistema aún no puede decidir el alcance. |
Lo ves en el objeto disclosure del CDR/historial de llamadas, en la columna disclosure_status del reporte de intentos y en el paquete de defensa. Este último conserva todas las declaraciones, incluidas las rectificadas, junto con el resumen por llamada.
Esta evidencia dice qué declaró el agente y cuándo. No demuestra que el aviso se pronunciara, que el consumidor lo oyera o lo entendiera, ni que el texto satisfaga una norma. El texto lo configura el tenant con su asesoría; la plataforma conserva su digest, pero no redacta ni aprueba el contenido por jurisdicción.
5. Qué enseñarle a un abogado
Cuando llegue la carta de un abogado de consumidor ("ustedes hostigaron a mi cliente"), tu paquete de defensa sale de aquí:
- El historial completo de la cuenta: cada intento con fecha, resultado y su snapshot — incluidas las correcciones, transparentes por diseño.
- El snapshot del intento disputado: contadores 7-en-7 al momento, hora local del consumidor, verificaciones. Responde la pregunta exacta del examinador: "¿qué sabía la plataforma cuando permitió esta llamada?"
- Los bloqueos: la prueba en negativo — todas las veces que el sistema se negó a marcar a esa cuenta y por qué.
- El techo del 3% cableado (Módulo 3): la política no dependía de que un humano se portara bien.
La diferencia de fondo: no le enseñas una política escrita que prometiste seguir — le enseñas un mecanismo que hizo imposible no seguirla, con la evidencia de cada decisión.
Ponte a prueba
- Un gate no puede determinar la hora local del consumidor porque el contacto no trae zona horaria. ¿Qué hace el sistema?
- Un gestor corrigió ayer la disposición de una llamada. ¿La fila original sigue existiendo?
- ¿Qué responde el snapshot congelado que un reporte normal no puede responder?
Respuestas
- No marca. Fail-closed: en la duda, la llamada no existe.
- Sí, siempre. El registro es append-only: la corrección es una fila nueva que apunta a la original.
- Qué sabía la plataforma en el momento exacto de la decisión, aunque los datos hayan cambiado después — eso es lo que la hace defendible ante un examinador.
Siguiente: Módulo 5 · Opera el día →