Ya documentamos dos hallazgos sobre el ISAI en TerraWare: cuándo nace la obligación fiscal desde el apartado y el flujo completo del apartado a la escritura. Este es distinto: no es sobre un impuesto, es sobre el dinero mismo que un comprador ya pagó. Verificamos en el código qué pasa cuando el plazo de un apartado vence y el comprador ya había abonado parte de su plan de pagos: el sistema decide, con toda intención, no perder ese dinero de vista -- y verificamos también que, pantalla por pantalla, esa decisión nunca llega a nadie que pueda actuar sobre ella.
La ley no exige que un apartado nunca venza -- exige informar y respetar sus condiciones
El artículo 7 de la Ley Federal de Protección al Consumidor (LFPC, texto reformado según decreto publicado en el Diario Oficial de la Federación el 11 de enero de 2018) es la cláusula que obliga a cualquier proveedor a sostener las condiciones de una reservación, textualmente:
"Todo proveedor está obligado a informar y a respetar los precios, tarifas, garantías, cantidades, calidades, medidas, intereses, cargos, términos, restricciones, plazos, fechas, modalidades, reservaciones y demás condiciones aplicables en la comercialización de bienes, productos o servicios, sobre todos aquellos que se hubiera ofrecido, obligado o convenido con el consumidor para la entrega del bien o prestación del servicio, y bajo ninguna circunstancia serán negados estos bienes, productos o servicios a persona alguna, así como la información de los mismos."
Un apartado inmobiliario es, en los términos exactos de la ley, una reservación: el comprador paga para que una unidad quede fuera del mercado mientras reúne su enganche o firma su contrato. El artículo 1, fracción VIII, de la propia ley extiende esta protección a las operaciones "efectuadas a través del uso de medios convencionales, electrónicos, ópticos o de cualquier otra tecnología" -- el caso de un apartado gestionado desde el sistema de la desarrolladora. La obligación no es que el plazo nunca venza: los planes de pago tienen fecha, y es razonable que una reservación caduque. La obligación es informar al comprador sobre el estado real de su dinero cuando eso ocurre, no dejarlo en un vacío del que ni el propio despacho tiene forma de enterarse.
La sanción: hasta $4,274,960.73 por incumplir esa condición
El artículo 128 de la LFPC fija la multa para quien infrinja, entre otros, el propio artículo 7:
"Las infracciones a lo dispuesto por los artículos 7 [...] serán sancionadas con multa de $1,093.02 a $4,274,960.73."
Montos vigentes por la actualización de multas de PROFECO para 2026, publicada en el Diario Oficial de la Federación en diciembre de 2025 (el artículo 128, en su texto base de 2018, listaba $702.07 a $2'745,903.07; el rango se actualiza cada año). El monto concreto dentro del rango lo determina la autoridad -normalmente a partir de una queja del consumidor ante PROFECO- y no es automático por cada apartado: es el techo de exposición si la autoridad decide sancionar el patrón.
| Elemento | Qué dice la norma |
|---|---|
| Protección extendida a operaciones por medios electrónicos | Art. 1, fr. VIII, LFPC |
| Obligación de informar y respetar las condiciones de una reservación | Art. 7, LFPC |
| Infracción al art. 7 | Multa de $1,093.02 a $4,274,960.73 (art. 128, LFPC; PROFECO, montos 2026, DOF dic-2025) |
Verificado en el código: el dinero queda en "pendiente_revision" y ninguna pantalla lo muestra
Confirmamos el hallazgo directamente en el código de TerraWare (repo medware-inmobiliaria, servicio core). Cuando el plazo de un apartado vence, expireReservations() lo marca expirado y libera la unidad. Si el plan de pagos de ese apartado tenía dinero ya cobrado, el propio código dice por qué no se cancela solo: "un plan con dinero cobrado NUNCA se cancela solo aquí, se excluye del lote y se reporta aparte [...] queda 'pendiente_revision' para que alguien lo revise a mano" (apps/services/core/src/sales/sales.service.ts:302-310). El propio método calcula y devuelve, con toda intención, exactamente el dato que hace falta para resolverlo: retenidosPorCobro: { reservationId, paidCents }[] (apps/services/core/src/sales/sales.service.ts:286-290).
Ese dato sí llega hasta la pantalla del despacho: el endpoint que dispara el barrido reenvía la respuesta completa del servicio, retenidosPorCobro incluido (apps/web-admin/app/api/reservations/expire/route.ts:34). Pero el único botón que lo consume lo descarta ahí mismo -- tipa la respuesta como { liberadas: number } y no toca nada más: const data = (await res.json()) as { liberadas: number }; setState({ kind: 'done', n: data.liberadas }) (apps/web-admin/app/(staff)/apartados/LiberarVencidos.tsx:30-31). El botón dice "Liberados: N." o "No había apartados vencidos." -- nunca cuántos de esos apartados quedaron con dinero cobrado pendiente de revisión.
Buscamos si algún otro lugar del producto recoge esa señal, y no la encontramos: el listado de apartados sólo colorea el estatus de la reservación (activo/expirado/cancelado/convertido), nunca el del plan de pagos (apps/web-admin/app/(staff)/apartados/page.tsx:94); el detalle de un apartado muestra el monto de las mensualidades pero jamás lee plan.status; y el portal del propio comprador -donde ve "Pagado", "Saldo" y su calendario de cuotas- tampoco lee el estatus de su reservación ni de su plan en ningún punto del archivo (apps/web-admin/app/(public)/portal/page.tsx). Un comprador cuyo apartado venció sigue viendo su cuenta con el mismo aspecto que uno vigente.
El dato sí se guarda -en el registro de auditoría, como parte del evento reservations.expired- pero la pantalla de auditoría del despacho sólo muestra fecha, acción y tipo, sin el contenido del evento (apps/web-admin/app/(staff)/auditoria/page.tsx); verlo exige exportar un CSV de hasta 10,000 filas y abrir a mano la columna "detalle" de cada fila buscando la acción exacta (apps/web-admin/app/api/audit/export/route.ts:24-32). El control que evita que el dinero "desaparezca" al cancelarse solo existe desde el 2026-09-04; lo que nunca se construyó fue la pantalla que deja verlo.
Qué significa en la práctica, y qué falta en el producto
Con el diseño actual, un despacho con TerraWare puede acumular apartados vencidos con dinero cobrado -reembolsable, aplicable a otra unidad, o a retener según lo pactado- sin que el sistema le muestre nunca cuántos son ni cuánto suman. Nada obliga a resolverlos en un plazo determinado; nada se lo recuerda tampoco, porque no aparecen en ninguna cola de "por resolver". Lo que falta no es una funcionalidad nueva, es mostrar el dato que ya se calcula: que LiberarVencidos.tsx muestre retenidosPorCobro junto a "Liberados", que el listado de apartados distinga visualmente un plan pendiente_revision, y que el comprador reciba un aviso -no el mismo estado de cuenta de siempre- cuando su reservación vence con dinero de por medio. Puedes ver ese recorrido completo, del apartado al limbo, en del apartado vencido al limbo: el flujo en TerraWare, o estimar la exposición con tus propios números en la calculadora de exposición por apartados vencidos.
Preguntas frecuentes
¿TerraWare cancela solo un apartado vencido que ya tiene dinero cobrado?
No. El sistema lo excluye a propósito del cierre automático y lo deja en un estado distinto ('pendiente_revision') precisamente para no perder el rastro del dinero -pero ninguna pantalla del producto muestra hoy ese estado.
¿El comprador se entera de que su apartado venció?
No a través del portal: la vista de "Estado de cuenta" del comprador muestra su plan de pagos con el mismo aspecto tenga o no vigente la reservación; ni el estatus de la reservación ni el del plan se leen en esa pantalla.
¿La Ley Federal de Protección al Consumidor obliga a resolver el apartado en un plazo determinado?
La LFPC no fija un plazo automático para este supuesto específico. Lo que sí exige el artículo 7 es informar y respetar las condiciones de la reservación convenida; no hacerlo es infracción sancionable conforme al artículo 128, con multa de $1,093.02 a $4,274,960.73.
¿Esto significa que ya hay dinero de compradores atorado en despachos que usan TerraWare?
No necesariamente: el gap es que el sistema no lo muestra, no que ya se haya acumulado en tu operación. Si tu equipo revisa a diario los planes 'pendiente_revision' directamente en la base de datos, hoy no tienes el problema -pero tampoco tienes ninguna alerta si algún apartado se te pasa.
Fuentes consultadas: Ley Federal de Protección al Consumidor, decreto de reforma publicado en el Diario Oficial de la Federación el 11 de enero de 2018 (artículo 7), texto vigente publicado por la Cámara de Diputados del H. Congreso de la Unión (artículos 1 y 128). Actualización de montos de operaciones y multas de PROFECO para 2026, Diario Oficial de la Federación, diciembre de 2025. Este artículo es orientativo y no sustituye una revisión de tu caso por tu abogado o asesor legal.
Ve qué pasa hoy cuando un apartado vence con dinero cobrado
Te mostramos en vivo el barrido de apartados vencidos, y el punto exacto donde el dinero cobrado deja de ser visible para el despacho.
Agenda una demo gratis