¿Por qué recibo envíos duplicados del formulario?
Porque el formulario se envió de verdad más de una vez y nada en el lado receptor se dio cuenta. Una página manda la misma consulta dos veces por al menos cinco razones ordinarias — un segundo clic, el reintento de una petición que ya había funcionado, una recarga, dos manejadores conectados a un mismo formulario y los bots — así que desactivar el botón tras la primera pulsación arregla una de ellas y deja el resto. La solución duradera está en el lado receptor: ignora un envío idéntico del mismo formulario dentro de una ventana corta y responde a esa repetición exactamente como si se hubiera aceptado.
Cinco formas en que una consulta se convierte en tres
El instinto es sospechar del formulario, y el formulario suele estar bien. Los duplicados son lo que ocurre cuando una página ordinaria se encuentra con una red ordinaria, y el primer movimiento útil no es un arreglo — es averiguar cuál de estos estás mirando, porque no tienen la misma respuesta.
- El visitante pulsó enviar dos veces. Nada cambió visiblemente tras la primera pulsación, así que volvió a pulsar. Es la causa más común y la única que el consejo habitual de desactivar el botón aborda de verdad.
- Una petición se reintentó después de haber funcionado. El envío llegó a tu manejador, el manejador lo guardó y la respuesta se perdió en el camino de vuelta. Para quien envía ha fallado, así que lo intenta otra vez. Esta es la que produce copias idénticas con unos segundos de diferencia, y ningún cuidado en la página lo evita.
- La página se recargó o se volvió a alcanzar con el botón atrás. Un formulario que envía y luego dibuja su propio agradecimiento en el mismo sitio ofrecerá encantado mandarlo todo otra vez cuando alguien recargue. Estas copias llegan con minutos u horas de diferencia, y eso es la pista.
- Dos cosas están manejando un formulario. El manejador de formularios del propio alojamiento más un script que añadió un generador o un plugin, cada uno enviando su copia. Llegan simultáneamente y a menudo tienen forma distinta — una lleva todos los campos, la otra aparece medio vacía.
- No era una persona. Los precargadores de enlaces, los escáneres de seguridad y los bots ordinarios alcanzan los endpoints de formularios y a veces los envían. Estas copias son inútiles más que meramente repetidas: campos vacíos, valores sin sentido o la misma carga desde muchas direcciones. Un campo trampa — una entrada que un humano nunca ve ni rellena — elimina la mayoría casi sin esfuerzo.
Dos lecturas resuelven casi todos los casos. Mira el hueco entre las copias: simultáneo apunta a dos manejadores o a un bot, unos segundos a un segundo clic o a un reintento, minutos o más a una recarga. Después mira si las copias son idénticas, porque una segunda consulta genuina de una persona real casi siempre difiere en algo, aunque sea en una palabra.
El arreglo pertenece al lado receptor
Todo lo de esa lista salvo los bots es comportamiento normal, no un defecto que puedas eliminar. Las redes pierden respuestas, la gente hace doble clic, los navegadores reenvían lo que se les dijo que enviaran. Nada de eso va a parar, así que lo que tiene que cambiar es qué ocurre cuando la misma consulta llega por segunda vez.
El mecanismo es pequeño. Deriva una huella corta del contenido del envío, recuérdala unos minutos y, si un contenido idéntico vuelve a llegar dentro de esa ventana, no guardes una segunda copia. Eso cubre el segundo clic, el reintento de red y la recarga a la vez, porque no le importa cuál de ellos ocurrió — solo que esta consulta exacta ya se ha visto.
La parte fácil de equivocar es con qué respondes al duplicado. Alojamos las páginas que publican nuestros clientes, así que sus formularios de contacto envían todos a un endpoint nuestro, y los duplicados eran una queja que volvía: tres sitios de clientes distintos, con una consulta guardada tres veces, cinco veces y dos veces. Se repitió hasta que el endpoint empezó a responder al duplicado byte a byte como si se hubiera aceptado. Un endpoint que rechaza una repetición, aunque sea con educación y con un mensaje útil, le dice a la página que tiene delante que algo salió mal, y entonces la lógica de reintento de la propia página, o el visitante leyendo el error, lo manda una vez más. Un endpoint que deduplica pero parece un fallo es un generador de duplicados.
Elegir la ventana y qué no tirar
La longitud de la ventana es la única decisión de juicio real, y cambia un error por otro. Demasiado corta y un reintento lento aún entra. Demasiado larga y descartas en silencio una segunda consulta real — la persona que escribió por la mañana, no oyó nada y volvió a escribir con las mismas palabras. Unos pocos minutos cubren las causas mecánicas, que ocurren todas rápido; nos quedamos con diez, y un formulario de contacto es indulgente aquí porque una segunda consulta genuina tan seguida es rara.
Toma la huella de los campos que rellenó el visitante y de nada más. Es tentador resumir la petición completa, y eso desactiva en silencio todo el mecanismo, porque una marca de tiempo, un token de sesión o un parámetro de seguimiento cambian en cada envío — así que todo duplicado parece único y nunca se atrapa nada. La misma precaución vale para cualquier cosa que tu propia página añada al envío después de que el visitante haya terminado con él.
Por último, cuenta los duplicados que descartas en lugar de tirarlos en silencio. Un endpoint que deduplica y una ruta de entrega rota son idénticos vistos desde una bandeja vacía, y uno de los dos es mucho más urgente: las consultas que no llegan nunca es otra investigación, y quieres poder descartar esta rápido en vez de preguntarte si tu propio arreglo se comió el mensaje.
Preguntas frecuentes
- ¿Desactivar el botón de enviar tras el primer clic arregla esto?
- Arregla una causa de cinco, y aun así merece la pena, porque esa causa es la más común y el cambio es trivial. Da al visitante una señal inmediata de que la pulsación se registró y desactiva el control mientras la petición está en vuelo. Lo que no puede tocar es un reintento que ocurre por debajo de la página, una recarga, un segundo manejador o un bot — así que trátalo como el acabado y la comprobación en el lado receptor como el arreglo.
- ¿Debería usar un token único por formulario en vez de resumir el contenido?
- Si controlas los dos extremos, sí: esa es la versión más fuerte y es lo que hacen las API de pago. Quien envía genera una clave cuando se dibuja el formulario y la reutiliza en cada reintento, así que quien recibe reconoce un reintento con exactitud en lugar de inferirlo. La razón para resumir el contenido es que no necesita nada de quien envía, lo que importa cuando el formulario lo produjo un creador de sitios, un generador o un plugin que no controlas.
- ¿Cómo limpio los duplicados que ya tengo?
- Agrupa por contenido y no por marca de tiempo, conserva el más antiguo de cada grupo y lee una muestra antes de borrar nada, porque dos consultas genuinamente distintas pueden ser idénticas palabra por palabra cuando alguien insiste tras el silencio. Si las copias llegaron a tu bandeja como correo, la misma agrupación funciona allí, y vale comprobar si tu respuesta fue solo a una de ellas. Arregla primero el endpoint o estarás haciendo esto otra vez la semana que viene.
¿Quieres que lo hagamos por ti?
AgentCeres es un equipo de marketing con IA gestionado: los especialistas redactan el trabajo y tú apruebas lo que se publica. Prueba gratis de 14 días, desde $39/mes.