| ✅ OQ-LOY-08 | ¿per_contact_limit de una recompensa se cuenta sobre la vida del member o sobre un período móvil? | FS-LOY-0005 | Configurable, con default vida. “Una vez por cliente” es el caso dominante; “una vez al mes” es real pero minoritario. Un campo limit_window_days nullable cubre ambos sin bifurcar la lógica. |
| ✅ OQ-LOY-09 | Al revertir un canje, ¿los puntos restaurados mantienen su vencimiento original o se reinicia? | FS-LOY-0006 | Mantienen el original. Reiniciar convierte el rollback en una forma de extender vencimientos, y alguien lo va a descubrir. Si el lote original ya expiró, el spec ya define un lote nuevo que hereda el vencimiento más próximo. |
| ✅ OQ-LOY-10 | ¿Hay un límite de tiempo tras el cual un canje ya no se puede revertir? | FS-LOY-0006 | Sí, configurable por programa, default 90 días. Sin límite, un canje de hace dos años se puede revertir contra un saldo y un catálogo que ya no existen. |
| ✅ OQ-LOY-11 | Largo y alfabeto del código de cupón: ¿cuánta entropía frente a que sea legible en voz alta? | FS-LOY-0007 | 10 caracteres sobre alfabeto Crockford Base32 (sin I, L, O, U). Da ~50 bits, que con rate limiting es holgado, y se dicta por teléfono sin ambigüedad. |
| ✅ OQ-LOY-12 | ¿Un código genérico se puede restringir a un segmento en vez de a un contacto? | FS-LOY-0007 | Sí. Es la forma natural de una campaña (“20% para clientes VIP”) y el segmento ya existe en core. La validación agrega una verificación de pertenencia, nada más. |
| ✅ OQ-LOY-13 | Cuando se viola un conjunto no combinable, ¿el motor conserva el beneficio de mayor precedencia o rechaza el request completo? | FS-LOY-0008 | Conserva el de mayor precedencia y reporta la exclusión. Rechazar todo en un mostrador deja al cajero sin salida; conservar el mejor beneficio es lo que el cliente espera y la razón tipada explica por qué el otro no aplicó. |
| ✅ OQ-LOY-14 | Ventana de atribución de referidos por defecto: ¿30, 60 o 90 días? | FS-LOY-0009 | 60 días. 30 castiga ciclos de compra lentos (suscripciones, servicios); 90 amplía la ventana de fraude y diluye la atribución. |
| ✅ OQ-LOY-15 | ¿Las conversiones marcadas por fraude expiran si nadie las revisa, y después de cuánto? | FS-LOY-0009 | No expiran; escalan. A los 14 días sin revisar, alerta al tenant. Expirarlas automáticamente significa perder referidos legítimos por inacción administrativa, que es exactamente lo que la política de “marcar, no rechazar” quiso evitar. |
| ✅ OQ-LOY-16 | Ventana de calificación de niveles por defecto: ¿12 meses móviles o año calendario? | FS-LOY-0010 | 12 meses móviles. Es continua y justa, y evita el precipicio de enero. El año calendario existe como modo para quien lo pida, pero no como default. |
| ✅ OQ-LOY-17 | ¿Entrar en período de gracia emite un evento, para poder hacer una campaña “estás a punto de perder Gold”? | FS-LOY-0010 | Sí, loyalty.tier.grace_started. Es una de las campañas de retención de mayor rendimiento del formato, y omitir el evento la haría imposible sin sondear la base. |
| ✅ OQ-LOY-18 | ¿Un member puede saltarse un nivel cuando un solo evento cruza dos umbrales? | FS-LOY-0010 | Sí, salta al nivel más alto alcanzado, y emite un solo evento. Retenerlo un escalón es arbitrario y el member ya cumplió el umbral. |
| ✅ OQ-LOY-19 | Horizontes de aviso de vencimiento por defecto: ¿30 y 7 días, o un único aviso a 14? | FS-LOY-0011 | 30 y 7. El de 30 da tiempo real de reaccionar; el de 7 es el que convierte. Uno solo a 14 es un compromiso que no hace bien ninguna de las dos cosas. |
| ✅ OQ-LOY-20 | ¿cohort_key es la fecha de vencimiento o el mes? | FS-LOY-0011 | La fecha. El mes agrupa lotes con vencimientos distintos en un solo aviso, y el member recibe “vencen 1 200 puntos” cuando en realidad vencen 400 el día 3 y 800 el día 28. |