Holograma de formularios web conectados al CRM: líneas abstractas de luz verde que fluyen hacia un núcleo dorado
Desarrollo WebSoftware / APIs

Formularios Web Conectados al CRM: Validación y RGPD

Codezone
Codezone Empresa de Desarrollo Web y Software a Medida

Un formulario web conectado al CRM valida los datos en el servidor, filtra el spam, guarda la prueba del consentimiento que exige el RGPD y crea el lead con su campaña de origen, sin que nadie copie nada a mano. Es la diferencia entre una web que recoge contactos y una que alimenta ventas medibles. Lo construimos dentro de nuestro desarrollo web orientado a captación.

Cuando el formulario solo envía un email, alguien lo pasa al CRM horas después y por el camino se pierde la campaña de origen. Ocurre igual en la web corporativa que en una PWA para empresas con formularios que funcionan sin conexión: el contacto llega, pero tarde y sin contexto.

Al terminar sabrás qué exigir a tus formularios antes de invertir en campañas, empezando por conectar Google Ads con el CRM para medir ventas reales en Madrid.

Qué es un formulario web conectado al CRM

Un formulario web conectado al CRM es un formulario cuyo envío llega a un servidor propio que valida los campos, comprueba que no es spam, registra el consentimiento y crea o actualiza el contacto en el CRM por API, con los parámetros de campaña de la visita.

El plugin que manda un correo al buzón comercial resuelve la recogida, pero deja fuera la atribución y la prueba legal, que son justo lo que marketing y ventas necesitan después.

Embudo holográfico verde esmeralda que filtra partículas doradas hacia un núcleo de cristal y expulsa chispas rojas
Cada envío pasa por el servidor antes de convertirse en lead.

Validación y antispam sin perder leads reales

La validación fiable ocurre en el servidor, porque cualquier comprobación del navegador se puede saltar con una petición directa al endpoint.

  • Validación: formato de email y longitud máxima de cada campo, repetidos en el servidor aunque el navegador ya los compruebe.
  • Honeypot: un campo oculto que una persona deja vacío y que muchos bots rellenan.
  • Desafío invisible: Cloudflare Turnstile devuelve un token que tu servidor verifica; cada token caduca a los pocos minutos y solo se valida una vez.
  • Envíos repetidos: un identificador por envío evita dos leads cuando alguien pulsa dos veces, con la misma lógica de la sincronización de datos sin duplicados ni descuadres.

Consentimiento RGPD en formularios web

El artículo 7.1 del Reglamento (UE) 2016/679 obliga al responsable a poder demostrar que el interesado consintió, así que el CRM debe guardar la prueba junto al contacto.

  • Casilla sin marcar: el considerando 32 del Reglamento (UE) 2016/679 publicado en EUR-Lex excluye como consentimiento las casillas ya marcadas.
  • Finalidades separadas: responder a la consulta y enviar comunicaciones comerciales son tratamientos distintos. El envío comercial por email exige autorización previa según el artículo 21 de la Ley 34/2002 de servicios de la sociedad de la información, salvo relación contractual previa y productos similares.
  • Prueba: fecha, texto exacto aceptado, versión de la política y página del formulario.
  • Retirada: el artículo 7.3 exige que retirar el consentimiento sea tan fácil como darlo, así que la baja también se sincroniza con el CRM.

El resto de obligaciones de diseño las recoge la guía técnica de RGPD en el desarrollo de software.

Escudo holográfico verde con una casilla de luz vacía en el centro rodeado de anillos dorados que giran despacio
El consentimiento se demuestra con la prueba guardada en el CRM.

Atribución y alta automática del lead

La atribución se pierde en el primer formulario que no guarda los parámetros con los que llegó la visita.

Si los textos de la web salen de un CMS headless que gestiona el contenido corporativo, el formulario sigue siendo un servicio aparte que no depende del panel editorial.

Hilos de luz dorada que unen esferas verdes flotantes con un cubo de cristal central sobre un suelo oscuro reflectante
La campaña de origen viaja con el lead hasta el CRM.
CodeZone Pro Tip: esta función recibe el envío del formulario, descarta bots, verifica el token de Turnstile y crea o actualiza el contacto en HubSpot con la campaña y la prueba de consentimiento.
// Node 18 o superior: fetch viene incluido, sin dependencias externas
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
async function verificarTurnstile(token, ip) {
  const body = new URLSearchParams({ secret: process.env.TURNSTILE_SECRET, response: token || "" });
  if (ip) body.set("remoteip", ip); // opcional: sin IP no se envía el texto "undefined"
  const r = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", { method: "POST", body });
  return (await r.json()).success === true;
}

async function procesarFormulario(campos, ip) {
  // Honeypot: respondemos ok para no enseñar al bot qué lo ha delatado
  if (campos.web_empresa) return { ok: true };
  const email = String(campos.email || "").trim().toLowerCase();
  if (!EMAIL_RE.test(email) || String(campos.mensaje || "").length > 2000) return { ok: false, error: "datos" };
  if (!(await verificarTurnstile(campos["cf-turnstile-response"], ip))) return { ok: false, error: "antispam" };
  const properties = {
    email,
    firstname: String(campos.nombre || "").slice(0, 100),
    // Propiedades personalizadas: créalas antes en HubSpot con estos nombres internos
    utm_source: campos.utm_source || "",
    gclid: campos.gclid || "",
  };
  // Solo se escribe el consentimiento cuando se da: un envío posterior sin casilla no borra uno anterior
  if (campos.acepta_comercial === "on") {
    properties.consentimiento_comercial = "si";
    properties.prueba_consentimiento = JSON.stringify({ fecha: new Date().toISOString(), texto: campos.texto_legal, pagina: campos.pagina });
  }
  // Upsert por email: si el contacto ya existe se actualiza en lugar de duplicarse
  const r = await fetch("https://api.hubapi.com/crm/v3/objects/contacts/batch/upsert", {
    method: "POST",
    headers: { Authorization: `Bearer ${process.env.HUBSPOT_TOKEN}`, "Content-Type": "application/json" },
    body: JSON.stringify({ inputs: [{ idProperty: "email", id: email, properties }] }),
  });
  return { ok: r.ok, status: r.status };
}

Con esta función, cada lead entra en el CRM a los pocos segundos con su campaña y su prueba legal, y nadie tiene que copiar correos a mano para que ventas lo vea.

Lo Que Cuesta un Lead Que No Llega al CRM

Un formulario sin integración paga el anuncio y pierde el dato: la venta existe, pero nadie sabe qué campaña la trajo ni si el contacto aceptó recibir ofertas.

Esfera dorada que cae fuera de una red de luz verde mientras una alarma roja ilumina el suelo de cristal
Un lead que no entra en el CRM es inversión publicitaria perdida.

En Codezone conectamos tus formularios con el CRM y dejamos trazado el consentimiento. Enséñanos el formulario que usas hoy y te decimos qué le falta.