Este es un recorrido de producto, no el caso de ningún despacho real: describe qué pasa dentro de ServiWare cuando se timbra una factura de honorarios a un cliente persona moral, sin cifras inventadas ni un cliente en particular. La pregunta que resuelve es simple: si tu factura debería traer una retención de ISR y de IVA, ¿el sistema la calcula sola, o la tienes que restar tú a mano después de que el dinero ya llegó?
Esquema del recorrido · ilustración, no es una pantalla del sistema
- 1. Se arma la facturaEl proyecto o la iguala acumula horas y gastos; de ahí sale un borrador con los renglones a facturar.
- 2. Se timbra el CFDIServiWare calcula el IVA trasladado (16%) por renglón y lo envía al PAC. El régimen fiscal del receptor se captura y se copia al comprobante.
- 3. El cliente pagaSi el cliente retiene ISR e IVA (cuando le corresponde), lo que deposita es menor al total de la factura.
- 4. ¿Y la retención?El CFDI nunca mostró ninguna retención, y el sistema tampoco registró que se esperaba una: el despacho tiene que reconciliar la diferencia a mano.
1. El timbrado, verificado en el código
En medware-servicios, el adaptador que timbra ante el PAC (facturama-cfdi-provider.ts) arma cada concepto de la factura con un solo impuesto: { Name: 'IVA', Rate: input.taxRate, ..., IsRetention: false }. El valor IsRetention: false está escrito directamente en el código, no como una opción que alguien desactivó: no existe ningún camino en el sistema que produzca una retención, sea de ISR o de IVA.
2. El régimen del cliente se guarda, pero no se usa
Al construir el comprobante, ServiWare sí captura y envía el régimen fiscal del receptor (receiverFiscalRegime) — es un dato obligatorio de cualquier CFDI 4.0. Pero ese dato viaja únicamente hacia el nodo Receiver del comprobante: en ningún punto del código se compara contra el régimen del propio despacho para decidir si, entre un emisor persona física y un receptor persona moral, corresponde aplicar una retención. El dato está, la decisión no.
3. El total de la factura tampoco tiene concepto de retención
El cálculo interno de totales (computeInvoiceTotals, en packages/shared/src/facturacion.ts) sólo conoce dos números por factura: el subtotal y el IVA trasladado, sumados. No hay un campo para ISR retenido ni para IVA retenido en el modelo de datos de la factura — no es que el cálculo esté mal, es que ese concepto simplemente no existe todavía en la estructura que arma cada comprobante.
4. Lo que esto le cuesta al despacho
El resultado práctico son dos costos, no uno. El primero es de conciliación: cuando el cliente retiene por su cuenta (porque la ley lo obliga, con o sin aviso en la factura), lo que llega a la cuenta del despacho es menor a lo que dice el CFDI, y hoy nadie en el sistema explica esa diferencia — se investiga a mano, factura por factura. El segundo es de simplificación perdida: el art. 106 de la Ley del ISR permite que la propia factura del despacho, si trae la retención señalada, sustituya el comprobante de retención que en otro caso tendría que emitir el cliente por separado. Sin ese dato en el CFDI, el despacho no puede ofrecerle esa comodidad a sus propios clientes.
Preguntas frecuentes
¿ServiWare calcula la retención de ISR o IVA hoy?
No. El proveedor de timbrado marca cada impuesto como no-retención (IsRetention: false) y no hay ningún camino en el código que agregue un renglón de retención al CFDI.
¿El sistema sabe si mi cliente es persona moral?
Captura su régimen fiscal como dato obligatorio del CFDI, pero hoy no lo usa para decidir si corresponde una retención.
¿Dónde queda la diferencia entre lo facturado y lo que deposita el cliente?
En ningún lado dentro del sistema: se concilia manualmente fuera de ServiWare.
Fundamento legal completo en retención de ISR e IVA por honorarios: la casilla que tu CFDI nunca marca.
Ve el flujo completo en una demo
Te mostramos cómo timbra ServiWare hoy y qué parte de la reconciliación por retenciones todavía vive fuera del sistema.
Agenda una demo gratis