Holograma de domiciliaciones SEPA en software a medida: remesa de recibos ámbar que fluye hacia una cámara acorazada
Software / APIs

Domiciliaciones SEPA en Software a Medida: Guía de Remesas

Codezone
Codezone Empresa de Desarrollo Web y Software a Medida

Las domiciliaciones SEPA permiten a tu software a medida cobrar recibos en euros directamente de la cuenta del cliente, siempre que guardes un mandato firmado y envíes a tu banco una remesa en formato pain.008.001.08. Para una empresa de Madrid con cuotas o facturas periódicas, el trabajo real está en procesar las devoluciones. Lo construimos dentro del software de cobros a medida para empresas de Madrid.

El esquema Core da al deudor ocho semanas para devolver un adeudo autorizado sin explicaciones, y hasta 13 meses si alega que no lo autorizó. Cada devolución te retira un importe que ya contabas como cobrado, y si tu sistema no la casa con su factura, administración la persigue a mano en el extracto.

Al terminar sabrás qué esquema te conviene y qué hace tu software con cada devolución, lo que más pesa al calcular el coste de una plataforma de suscripción a medida.

Qué son las domiciliaciones SEPA y qué esquemas existen

Las domiciliaciones SEPA, o adeudos directos SEPA, son cobros en euros que inicia el acreedor contra la cuenta del deudor gracias a una autorización previa llamada mandato. Las reglas las fija el European Payments Council (EPC) en dos rulebooks: SDD Core, válido para consumidores y empresas, y SDD B2B, reservado a deudores que no son consumidores.

La versión 2025 de ambos rige desde el 5 de octubre de 2025, según el SEPA Direct Debit Core Scheme Rulebook del EPC:

  • SDD Core: Devolución de un adeudo autorizado: ocho semanas sin motivo. Plazo de retorno: cinco días hábiles interbancarios tras la liquidación.
  • SDD B2B: Devolución de un adeudo autorizado: no existe. Plazo de retorno: tres días hábiles interbancarios. El banco del deudor confirma el mandato con su cliente antes de cargar.
  • Elige B2B si: cobras importes altos a empresas que aceptan registrar el mandato en su banco.
  • Elige Core si: tienes consumidores o no puedes exigir ese trámite.
Contrato holográfico de líneas abstractas sellado por un anillo dorado que flota sobre un suelo negro reflectante
El mandato es la única prueba de que el cliente autorizó el cobro.

Qué datos del mandato SEPA debe guardar tu software

El mandato SEPA prueba que el deudor autorizó el cobro, y tu software debe poder mostrarlo si su banco lo pide. Guarda como mínimo:

  • Referencia única del mandato: viaja en cada adeudo y no cambia mientras el mandato siga vigente.
  • Identificador de acreedor: en España, ES, dos dígitos de control, un sufijo de tres cifras y el NIF de tu empresa.
  • Fecha de firma y tipo: recurrente o único, con el documento o la evidencia del mandato electrónico.
  • Fecha del último adeudo presentado: tras 36 meses sin presentar cobros debes cancelar el mandato, aunque el último se devolviera.

El preaviso al deudor sale como tarde 14 días naturales antes del vencimiento, salvo pacto distinto. El IBAN es un dato personal y su custodia sigue el RGPD en el desarrollo de software con datos bancarios.

Cómo se genera una remesa pain.008 desde tu software

La remesa SEPA es un fichero XML pain.008.001.08, la versión 2019 de ISO 20022 que exigen las guías de implantación del EPC, con los adeudos agrupados por fecha de cobro y esquema:

  • Tipo de secuencia: desde noviembre de 2016, FRST es opcional y el primer cobro puede ir como RCUR.
  • Plazo: el banco del deudor recibe el adeudo como tarde un día hábil interbancario antes del vencimiento (D-1). Tu banco fija una hora de corte anterior.
  • Respuesta: el banco te devuelve un informe pain.002.001.10 con los adeudos que no acepta.

La remesa sale de los mismos datos que tu facturación, como en la arquitectura de una app web de gestión financiera. Si mandatos y cuotas viven en sistemas distintos, la sincronización de datos entre sistemas sin duplicados evita cobrar dos veces un recibo.

Bloques de cristal ámbar alineados sobre una cinta de luz que avanza hacia un portal azul marino en una sala oscura
Cada remesa agrupa los adeudos que vencen el mismo día.

Devoluciones SEPA: las R-transactions que tu software debe procesar

Una R-transaction es cualquier adeudo que sale del circuito normal. El rulebook Core distingue:

  • Rechazo (reject): antes de la liquidación, por IBAN erróneo o cuenta cerrada.
  • Retorno (return): después de la liquidación, hasta cinco días hábiles interbancarios en Core, por ejemplo sin fondos.
  • Reembolso (refund): lo pide el deudor en ocho semanas, o en 13 meses si el cargo no estaba autorizado.
  • Retrocesión (reversal): la inicias tú para devolver íntegro un cobro erróneo.

En España, ese derecho de ocho semanas lo fijan los artículos 48 y 49 del Real Decreto-ley 19/2018 de servicios de pago.

Cada devolución trae un código de motivo ISO. Tu software la casa con su factura mediante la conciliación bancaria automática por API y decide si reintenta, una política que detallamos en cómo gestionar los cobros fallidos en suscripciones. Para cobros puntuales sin mandato, integrar Bizum en una web o app cobra al instante; el resto de opciones están en los tipos de pasarelas de pago por arquitectura.

Prisma holográfico dorado que filtra un flujo de partículas y deja pasar solo las que brillan en verde
Lo que no puede cobrarse se queda fuera antes de crear el fichero.
CodeZone Pro Tip: calcula el identificador de acreedor con su dígito de control y excluye de la remesa cada adeudo cuyo mandato no permite cobrar en esa fecha.
from datetime import date

def _a_digitos(texto: str) -> str:
    # ISO 7064 MOD 97-10: cada letra se sustituye por su valor (A=10 ... Z=35)
    return "".join(str(int(c, 36)) for c in texto)

def identificador_acreedor(nif: str, sufijo: str = "000", pais: str = "ES") -> str:
    # El sufijo (posiciones 5 a 7) no entra en el cálculo, como indica la guía de implantación del EPC
    base = "".join(c for c in nif.upper() if c.isalnum())
    control = 98 - int(_a_digitos(base + pais + "00")) % 97
    return f"{pais}{control:02d}{sufijo}{base}"

def _sumar_meses(d: date, meses: int) -> date:
    y, m = divmod(d.month - 1 + meses, 12)
    return date(d.year + y, m + 1, min(d.day, 28))  # día 28: mejor caducar antes que cobrar de más

def motivo_exclusion(mandato: dict, vencimiento: date, hoy: date) -> str | None:
    """Devuelve por qué un adeudo no puede ir en la remesa, o None si puede."""
    if not mandato.get("fecha_firma") or mandato.get("cancelado"):
        return "mandato sin firmar o cancelado"
    # 36 meses sin presentar cobros obligan a cancelar el mandato, aunque el último se devolviera
    ultimo = mandato.get("ultimo_adeudo") or mandato["fecha_firma"]
    if vencimiento > _sumar_meses(ultimo, 36):
        return "mandato caducado: pide uno nuevo"
    # Preaviso de 14 días naturales salvo que hayas pactado otro plazo con el deudor
    aviso = mandato.get("preaviso_enviado")
    if not aviso or (vencimiento - aviso).days < mandato.get("dias_preaviso", 14):
        return "preaviso fuera de plazo"
    if (vencimiento - hoy).days < 2:  # margen sobre D-1 para la hora de corte de tu banco
        return "vencimiento demasiado próximo"
    return None
if __name__ == "__main__":
    print(identificador_acreedor("09999999999", "ZZZ", "DE"))  # DE98ZZZ09999999999
    m = {"fecha_firma": date(2026, 1, 10), "preaviso_enviado": date(2026, 10, 1)}
    print(motivo_exclusion(m, date(2026, 10, 20), date(2026, 10, 16)))  # None: entra en la remesa

Filtrar antes de generar el fichero evita devoluciones por mandato caducado o inexistente, y cada recibo excluido guarda su motivo para administración.

Lo Que Pierdes Si No Puedes Demostrar el Mandato

Pasadas las ocho semanas, si el deudor alega que no autorizó un cargo, su banco puede pedir copia del mandato a través del tuyo y debes aportarla. Sin referencia o evidencia de firma, no tienes argumentos frente al reembolso.

Escudo holográfico ámbar agrietado con destellos rojos de alerta mientras partículas doradas regresan hacia un núcleo
Un mandato que no puedes enseñar es un cobro que puedes perder.

En Codezone integramos remesas SEPA y su conciliación en software a medida. Cuéntanos cómo cobras hoy tus recibos y te decimos qué falta para automatizarlo.