Cómo validar un justificante de transferencia bancaria
Qué campos revisar en un justificante, cómo comprobar un IBAN con mod 97, cómo cuadrarlo con la inscripción y por qué un PDF no prueba que el dinero ha llegado.
Por Equipo Constaia5 min de lectura
También en: English
Muchos clubes, escuelas y organizadores siguen cobrando por transferencia. El flujo es conocido: la persona paga desde su banco, descarga el justificante o hace una captura y lo sube con la inscripción. Alguien, normalmente un voluntario, lo abre y decide si "está bien".
Este artículo explica qué mirar en un justificante, cómo validar el IBAN con el algoritmo oficial (con código que puedes copiar), cómo cuadrarlo con la inscripción y, sobre todo, qué no demuestra un justificante.
Qué campos mirar
Un justificante de transferencia útil tiene, como mínimo:
| Campo | Qué comprobar |
|---|---|
| Importe | Que coincide con la cuota (y la moneda es la esperada). |
| Fecha | Que está dentro del plazo de inscripción. Distingue fecha de orden y fecha valor si aparecen. |
| Ordenante | Quién paga. No siempre es el inscrito: padres, club, empresa. |
| Beneficiario | Que es tu entidad, con el nombre correcto. |
| IBAN del beneficiario | Que es tu cuenta, no otra parecida. |
| IBAN del ordenante | Útil para devoluciones y para conciliar. |
| Concepto o referencia | Que identifica la inscripción (nombre, número de dorsal, referencia que diste). |
El concepto es el campo más olvidado y el más útil. Si en el formulario das una referencia única por inscripción (por ejemplo INS-2026-00123) y pides que se ponga en el concepto, la conciliación posterior se simplifica mucho.
Validar el IBAN: ISO 13616 y mod 97
El IBAN es un estándar internacional, ISO 13616, con SWIFT como autoridad de registro. Tiene hasta 34 caracteres:
- 2 letras de país (
ES), - 2 dígitos de control,
- el número de cuenta nacional (BBAN), cuya longitud depende del país.
En España el IBAN tiene 24 caracteres: ES + 2 dígitos de control + 4 de entidad + 4 de oficina + 2 dígitos de control nacionales + 10 de cuenta.
Los dígitos de control siguen el método MOD 97-10 de ISO/IEC 7064. El algoritmo es:
- Quita espacios y pasa a mayúsculas.
- Mueve los 4 primeros caracteres al final.
- Sustituye cada letra por dos dígitos: A = 10, B = 11 … Z = 35.
- Calcula el resto de dividir ese número entre 97.
- Si el resto es 1, el IBAN es válido.
Según la misma fuente, este método detecta todos los errores de sustitución de un carácter y todos o casi todos los de transposición de dos caracteres contiguos. Es decir: sirve para cazar errores al teclear o al leer.
Código en JavaScript
El número resultante tiene demasiados dígitos para un Number, así que se calcula el resto dígito a dígito:
const IBAN_LENGTHS: Record<string, number> = { ES: 24, PT: 25, FR: 27, DE: 22, IT: 27 };
export function isValidIban(input: string): boolean {
const iban = input.replace(/\s+/g, "").toUpperCase();
if (!/^[A-Z]{2}\d{2}[A-Z0-9]{1,30}$/.test(iban)) return false;
const expected = IBAN_LENGTHS[iban.slice(0, 2)];
if (expected && iban.length !== expected) return false;
const rearranged = iban.slice(4) + iban.slice(0, 4);
let remainder = 0;
for (const ch of rearranged) {
const code = ch.charCodeAt(0);
const digits = code >= 65 ? String(code - 55) : ch; // A=10 … Z=35
for (const d of digits) remainder = (remainder * 10 + Number(d)) % 97;
}
return remainder === 1;
}
isValidIban("ES91 2100 0418 4502 0005 1332"); // true
isValidIban("ES91 2100 0418 4502 0005 1333"); // false: un dígito cambiadoLa tabla de longitudes del ejemplo solo incluye unos pocos países; para producción usa el registro completo de longitudes por país.
Si solo quieres comprobar un IBAN suelto, tienes nuestro validador de IBAN gratuito, que hace este cálculo en tu navegador.
Lo que el mod 97 no dice
Un IBAN válido está bien formado. No significa que la cuenta exista, que esté abierta ni que sea de quien dice el justificante.
Cuadrar con la inscripción esperada
Validar el IBAN es solo el primer paso. La pregunta real es: ¿este justificante corresponde a esta inscripción? Para responderla compara con lo que esperas:
- Importe esperado: la cuota exacta. Ojo con descuentos, tallas de camiseta o seguros de día que cambian el total.
- IBAN esperado del beneficiario: el tuyo. Un justificante a otra cuenta, aunque sea válida, no es un pago para ti.
- Referencia esperada: la que diste en el formulario, buscada en el concepto.
- Fecha: dentro del plazo.
Con estas cuatro comparaciones clasificas casi todos los casos en tres grupos: cuadra, no cuadra, o hay que mirarlo (por ejemplo, importe correcto pero sin referencia en el concepto).
Un justificante no demuestra que el dinero haya llegado
Esto es lo más importante del artículo. Un PDF o una captura de la app del banco muestra que alguien generó una orden de transferencia, o una imagen que lo parece. No demuestra que:
- la orden no se haya cancelado o devuelto después,
- el importe se haya abonado en tu cuenta,
- el documento no se haya editado.
La única prueba de cobro es tu extracto bancario, es decir, la conciliación: el movimiento aparece en tu cuenta con ese importe y esa referencia. El justificante sirve para adelantar trabajo (dar la plaza provisionalmente, detectar errores pronto), no para sustituir la conciliación.
Un flujo razonable:
- La persona sube el justificante con la inscripción.
- Validación automática: tipo de documento, IBAN, importe, referencia, fecha.
- Si cuadra, la plaza queda provisional.
- Al conciliar el extracto, la plaza pasa a confirmada. Si el pago no aparece en el plazo que fijes, se avisa.
Señales de edición o de foto de pantalla
Hay justificantes editados: se cambia el importe, la fecha o el beneficiario en un PDF o en una captura. Hay herramientas que buscan indicios (tipografías mezcladas, zonas retocadas, foto de una pantalla en vez del documento original). En Constaia esas señales aparecen como warnings:
edited_suspected: indicios de que el documento se ha modificado.screen_photo_suspected: parece una foto de una pantalla.
Son indicios, no pruebas. Un justificante sin avisos puede estar editado, y uno con avisos puede ser legítimo (mucha gente hace fotos a la pantalla del ordenador). Úsalos para mandar el caso a revisión, no para rechazar a nadie automáticamente. Y otra vez: la prueba es el extracto.
Cómo lo hace Constaia
El tipo payment_receipt extrae amount, currency, date, payer_name, payer_iban, beneficiary_name, beneficiary_iban, concept y reference, valida los IBAN y permite comparar con lo esperado mediante expected_amount, expected_iban y expected_reference:
curl https://api.constaia.com/v1/analyze \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-F file=@justificante.pdf \
-F 'options={
"expect": "payment_receipt",
"checks": {
"expected_amount": 45.00,
"expected_iban": "ES9121000418450200051332",
"expected_reference": "INS-2026-00123"
},
"metadata": { "registration_id": "00123" },
"storage": "none",
"language": "es"
}'Lo que devuelve es un veredicto valid, invalid o review con motivos, los campos extraídos y los warnings. Lo que no hace: no consulta tu banco ni confirma el cobro. Para eso sigue haciendo falta la conciliación.
Más detalle en checks, veredictos y el catálogo de tipos.
En resumen
- Revisa importe, fecha, ordenante, beneficiario, IBAN y concepto.
- Valida el IBAN con mod 97 y la longitud del país. Un IBAN válido no prueba que la cuenta exista.
- Cuadra con lo esperado: importe, tu IBAN y una referencia única por inscripción.
- Un justificante adelanta trabajo, pero el cobro solo se confirma con el extracto.
edited_suspectedyscreen_photo_suspectedson motivos para revisar, no para rechazar.
Si quieres automatizar la primera revisión de justificantes, crea una cuenta gratis: 250 créditos al mes y claves de test que no consumen créditos.