alloop
Instalación

HTML y otras plataformas

El fragmento de alloop antes de cerrar el head, en cualquier web donde puedas editar la plantilla. Webflow, Framer, Astro, Next.js o HTML a mano.

Si tu web no es WordPress, la instalación es la misma idea: el fragmento va en el <head> de todas las páginas. Lo que cambia es dónde se pega en cada plataforma.

El fragmento

Antes de cerrar </head>
<script
  defer
  data-client="tu-academia"
  src="https://track.alloop.ch/static/alloop.js"
></script>

data-client es el identificador de tu academia, que te damos al montar tu cuenta. defer hace que no bloquee el pintado de la página.

Dónde se pega, por plataforma

Webflow, Framer y Squarespace tienen un campo de código global. Busca Project Settings → Custom Code → Head Code (Webflow), Site Settings → General → Custom Code (Framer) o Ajustes → Avanzado → Inyección de código (Squarespace).

Úsalo en lugar de pegarlo página a página: así entra también en las páginas que crees dentro de seis meses, cuando ya no te acuerdes de esto.

Comprueba que se está sirviendo

Mira el HTML que recibe el visitante, no el editor de tu plataforma:

for u in / /cursos/ /gracias/; do
  printf '%s → ' "$u"
  curl -s "https://tudominio.com$u" | grep -c 'alloop.js'
done
# 1 en todas = cobertura correcta

Presta atención al checkout y a la página de gracias: son las dos que más se olvidan y las dos donde ocurre la conversión.

Captura tus formularios

El fragmento mide visitas; los formularios se envían aparte. En el submit:

document.querySelector('#form-plaza').addEventListener('submit', () => {
  alloop.form({
    name:  'Nombre de la persona',
    email: 'su@email.com',
    phone: '+34600000000',
    form:  'Solicitar plaza — A1',   // para distinguirlos en el panel
  });
});

No llames al endpoint por tu cuenta

Un fetch propio parece equivalente y no lo es: pierdes la atribución de primer toque, pierdes keepalive (la petición muere al cambiar de página) y pierdes el identificador que evita que Meta cuente el mismo lead dos veces. Usa alloop.form().

alloop.form() comunica el lead a todos los canales que tengas conectados —Meta y Google Ads— una sola vez por persona, con el mismo identificador en navegador y servidor. No hay que añadir nada más para que tus campañas reciban la conversión.

Formularios de varios pasos

Si pides el email primero y las preguntas después, captura el contacto en cuanto lo tengas y registra el lead al terminar:

// Paso 1: ya tienes el email → vincula a la persona (el lead todavía no se registra)
alloop.identify(form.email.value);

// Último paso: el lead queda registrado y llega a tus anuncios
alloop.form({ name, email, phone, form: 'Guía gratuita' });

Con identify() la persona queda vinculada desde el primer paso —si abandona, sabes en qué pregunta y con qué email—, y form() es lo que Meta y Google reciben como lead. Así tus campañas optimizan hacia quien completa, y el número de leads de tu panel coincide con el de las plataformas.

Pide el WhatsApp solo a quien no te lo ha dado

Cada campo de más en un formulario te cuesta gente. Si pides el nombre y el email, alloop te dice en la respuesta si esa persona ya te dejó su WhatsApp alguna vez (en otro formulario, en otra visita o en otro dispositivo). Así solo se lo pides a quien te falta:

const r = await alloop.form({ name, email, form: 'Vídeo de la clase' });
const { has_phone } = (await r?.json?.()) ?? {};

if (has_phone === false) {
  // enseña el campo de WhatsApp y, cuando lo rellene:
  alloop.form({ name, email, phone, form: 'Vídeo de la clase' });
}

El segundo envío completa al mismo lead: Meta y Google no lo cuentan dos veces, porque va con el mismo identificador de esa visita.

Se decide por el email, no por el dispositivo: si en el mismo móvil alguien escribe otro email, es otra persona y se le pide. Y solo un true claro te ahorra el campo; si la respuesta viene sin el dato, pídelo. Si la respuesta no llega (una red lenta), no bloquees a la persona: es mejor quedarte sin un WhatsApp que perder a alguien que quería ver tu vídeo.

Si ese formulario dispara un WhatsApp automático (tu automatización de mensajes), también le llega a quien no tuvo que escribir su número: usamos el WhatsApp que esa persona ya te había dado.

Solo un sí o un no

La respuesta nunca incluye el número, solo si existe. Y solo la recibe quien acaba de enviar ese email desde tu web.

Pide los datos antes de reproducir un vídeo

Si quieres que la grabación de una clase o un vídeo de tu web pida nombre y email antes de verse (y el WhatsApp solo a quien no te lo ha dado), no hace falta que montes el formulario: marca el vídeo y carga la pieza.

Cualquier vídeo de YouTube, Bunny u otro
<div class="player">
  <iframe src="https://www.youtube.com/embed/ID" data-alloop-gate="clase-1"></iframe>
</div>

<script>
  window.ALLOOP_VIDEO_GATE = {
    form: "video-clase",   // cómo lo verás en tu panel
    lang: "es",            // es · en · de · fr · it · ru · lt
    host: "Andrea",        // «…te invitamos a la siguiente clase gratuita con Andrea»
  };
</script>
<script src="https://track.alloop.ch/static/alloop-video-gate.js" defer></script>

El vídeo aparece tapado con un botón de play. Al pulsarlo se piden el nombre y el email, se registra el lead con form: "video-clase" (con todo lo que hace alloop.form(): Meta, Google, tu CRM) y, si a esa persona le falta el WhatsApp, se le pide con el selector de país. Después el vídeo arranca solo. Quien ya lo dejó no vuelve a verlo: ni en ese dispositivo ni en otro vídeo marcado de tu web.

  • Puedes marcar varios vídeos en la misma página; con dejar los datos una vez se abren todos.
  • Si no quieres pedir el WhatsApp nunca, whatsapp: false.
  • accent: "#E84B3A" pone tus botones de tu color, y texts: { title: "…" } cambia cualquier frase.
  • Si tu servidor no contesta a tiempo, el vídeo se abre igual: la pieza nunca retiene a nadie.

El nombre del formulario importa

Si ese form está entre los que disparan tu automatización de WhatsApp, quien deje sus datos para ver un vídeo recibirá ese WhatsApp. Usa un nombre propio para los vídeos, como video-clase.

Cada paso queda medido en tu panel: quién abrió el formulario, quién dejó el email, a quién se le pidió el WhatsApp y quién lo dio.

Guarda lo que contestan, no solo el contacto

Si tu formulario pregunta algo más —nivel, objetivo, por qué quiere aprender—, mándalo en extra y dile al panel cómo se llama cada pregunta con labels:

alloop.form({
  name, email, phone, form: 'Guía gratuita',
  extra: {
    nivel:    form.nivel.value,          // 'B1'
    objetivo: form.objetivo.value,       // 'Integrarme y hacer amigos'
    por_que:  form.por_que.value,        // texto libre, tan largo como lo escriban
  },
  labels: {
    nivel: '¿Cuál es tu nivel?',
    objetivo: '¿Para qué quieres mejorar?',
    por_que: 'En tus palabras, ¿por qué quieres hablar español?',
  },
});

Cada respuesta se guarda entera con el lead y aparece en la sección Formularios bajo su pregunta real. Hay sitio de sobra: hasta 100 preguntas por formulario y 5.000 caracteres por respuesta, así que un cuestionario de 15 pantallas o una redacción abierta caben completos sin configurar nada.

Email, teléfono y nombre no van en extra

Van en sus propios campos (email, phone, name). Si los mandas dentro de extra se descartan de ahí a propósito: el contacto vive en la ficha de la persona, donde se puede corregir o borrar, y nunca dentro de un evento.

¿Y alloop.gate()?

gate() es para cuando la persona deja el contacto y se va directamente a WhatsApp o al pago, sin más pasos: vincula a la persona y registra el lead en el mismo instante. En un formulario con pasos, usa identify() al principio y form() al final.

Conecta tu pasarela de pago

Es el paso que hace llegar las ventas y no solo las visitas: Stripe o WooCommerce.

Cómo sabes que funciona

Entra desde un enlace marcado y compra con un nombre reconocible como test-alloop. En unos minutos la venta aparece en tu panel con importe y origen. Hasta que no la veas ahí, no está.

Si acabas de crear tu cuenta

Un proyecto nuevo tarda unos 25 minutos en empezar a ingerir, y durante esa ventana todo responde bien pero los eventos se descartan. Reintenta antes de tocar el fragmento.

Errores comunes

SíntomaCausa probableArreglo
Solo la portada registra visitasEl fragmento está en una página, no en la plantilla compartidaMuévelo al layout base
Está en el HTML pero no midePegado dentro del <body> sin ejecutarse, o duplicadoUna sola vez, en el <head>
Las visitas llegan sin origenLos enlaces se repartieron sin etiquetasMarcar enlaces
En Next.js se pierden rebotes rápidosEstrategia lazyOnloadCambia a afterInteractive

Si tu plataforma no deja editar el head global

Algunos constructores muy cerrados solo dejan tocar la portada. Dinos cuál usas: casi siempre hay una vía (una plantilla global, un contenedor de scripts) y te decimos la buena.

Siguiente paso

Conecta tu forma de cobrar en Ingresos y marca tus enlaces en Marcar enlaces.

En esta página