Guía de integración

Las métricas de tu feed, en tu propio GA4.

Con gtm-id en el <story-feed> el componente carga tu contenedor de Google Tag Manager y publica los eventos del feed en el dataLayer compartido. Lo que viene después —triggers, variables y tags— lo armás vos, en tu contenedor.

Seis pasos, todos del lado de tu contenedor.

window.dataLayer en vivo
dataLayer.push({ event: "page_view", eventModel: { sfm_client: "mi-medio", page_title: "Portada" } }); dataLayer.push({ event: "feed_load_more", eventModel: { sfm_client: "mi-medio", cursor: "MjA" } }); dataLayer.push({ event: "card_view", eventModel: { sfm_client: "mi-medio", item_id: "1042", item_slug: "resumen-del-dia", item_type: "article" } }); dataLayer.push({ event: "story_click", eventModel: { sfm_client: "mi-medio", item_id: "1042", item_slug: "resumen-del-dia" } }); dataLayer.push({ event: "reel_mute_toggle", eventModel: { sfm_client: "mi-medio", muted: "false" } }); dataLayer.push({ event: "share", eventModel: { sfm_client: "mi-medio", method: "whatsapp", content_type: "article" } }); dataLayer.push({ event: "feed_end", eventModel: { sfm_client: "mi-medio" } }); dataLayer.push({ event: "feed_error", eventModel: { error_code: "UNKNOWN_ERROR", error_message: "…" } });
Ejemplo de lo que tu contenedor ve en GTM Preview: cada evento del feed entra con su nombre original y sus parámetros anidados en eventModel.*

Un atributo, un contrato bien delimitado

Al poner gtm-id="GTM-XXXXXX" el componente carga tu contenedor sobre el dataLayer compartido. Los 10 eventos del feed quedan visibles en tu contenedor como Custom Events con el mismo nombre, y nuestro analytics propio sigue intacto: nunca configuramos tu measurement ID, así que no hay doble conteo.

gtm-id sí hace

Todo lo que ocurre en tu página:

  • Carga tu contenedor GTM una sola vez por página, aunque haya varios feeds o tu snippet ya lo cargue.
  • Publica los 10 eventos como Custom Events con su nombre exacto y sus parámetros bajo eventModel.*.
  • Respeta tu configuración: si el contenedor ya está en la página, no lo vuelve a cargar ni dispara un gtm.js duplicado.

gtm-id no hace

Nada de lo que vive en los servidores de Google:

  • No crea triggers, tags ni variables dentro de tu contenedor.
  • No envía nada a tu propiedad GA4 por sí solo.
  • No pide ni usa tu measurement ID.

Un contenedor vacío observa y descarta

Sin los pasos 2 a 5 vas a ver los eventos en GTM Preview, pero van a llegar 0 hits a tu GA4. Los eventos ya están; hace falta que tu contenedor decida qué hacer con ellos.

Por qué esta configuración la hace el dueño del contenedor

No es una limitación nuestra ni una responsabilidad que te tiramos: es el modelo de Google, y aplica a cualquier integración —widget, player, checkout— que alimente tu GA4 a través de tu GTM. No solo a StoryFeed.

GTM se configura en la UI de Google, no desde el código de la página

Un embed no puede crear triggers, tags ni variables dentro de tu contenedor: esa configuración vive en los servidores de Google y solo alguien con acceso puede modificarla y publicarla. La propia guía oficial de eventos GA4 en GTM presupone un rol de edición sobre el contenedor.

El dataLayer es el único puente que Google prevé

gtag.js y GTM comparten ese objeto para pasar información a los tags, y ante un evento GTM dispara los tags cuyas condiciones de trigger se cumplan. Esas condiciones las definís vos: nosotros solo publicamos los eventos.

Si pudiéramos escribir en tu contenedor, sería un problema de seguridad

Un trigger o tag creado remotamente por un tercero podría disparar medición arbitraria en tu propiedad sin tu consentimiento. Por eso Google no ofrece esa vía —y por eso tampoco te pedimos tu measurement ID.

Los 10 eventos, con sus nombres exactos

Los nombres son case-sensitive: si el trigger espera Card_View y el feed emite card_view, no dispara nada.

Evento Cuándo se emite Parámetros
page_view Una vez por widget, cuando su carga inicial termina OK (manual, no el automático de GA4). sfm_client page_location page_title
card_view Cada card que se vuelve activa —articles, reels y ads—. Re-ver la misma card emite de nuevo. sfm_client item_id item_slug item_type
story_view Cada artículo que el lector abre en el detalle. sfm_client item_id item_slug item_type
story_click Cada activación del CTA de una card. sfm_client item_id item_slug
reel_mute_toggle Cada cambio de mute en un reel. sfm_client item_id item_slug muted
feed_load_more Cada página del feed cargada OK, sin incluir la inicial. sfm_client cursor
feed_end El usuario llegó a la última card de una página cargada del feed (con paginación: una emisión por cada fin de página alcanzado) o navegó el detalle hasta su última página. No se emite en la respuesta terminal, para un feed vacío ni para un feed de 1 card. sfm_client
feed_error Cada error reportado. Los reintentos fallidos repiten el evento. sfm_client error_code error_message
share Cada activación de un botón de compartir —nativo, X, WhatsApp, Instagram—, por intención: aunque el share nativo se cancele, el evento sale. sfm_client method content_type item_id item_slug
feed_engagement Tiempo activo del lector en el widget; se envía al ocultar o cerrar la página. sfm_client

Deslizá horizontalmente para ver todas las columnas →

sfm_client viaja solo si el <story-feed> tiene atributo client. Sin client los eventos llegan igual, pero no se pueden atribuir por sitio ni por sección.

Seis pasos, del embed a tus reportes

Solo el paso 1 ocurre en tu página. Los otros cinco son en la UI de Google, sobre tu contenedor y tu propiedad.

Antes de empezar: los tres accesos que necesitás

Dejá abiertas estas tres ventanas: todos los pasos de la guía ocurren en una de ellas.

  1. Tu CMS o el HTML de tu página — acceso de edición a la página donde está el <story-feed>. Ahí se hace el paso 1.
  2. Google Tag Manager — entrá a tagmanager.google.com con permiso de Publicar sobre tu contenedor (rol Administrador o Editor). Ahí se hacen los pasos 2, 3, 4 y 6.
  3. Google Analytics 4 — entrá a analytics.google.com con permiso de edición sobre tu propiedad. Ahí se hacen los pasos 4 y 5.

Tus dos IDs, en un minuto

  • Tu ID de contenedor (GTM-XXXXXX): en tagmanager.google.com clickeá tu contenedor y el ID aparece arriba a la izquierda del workspace. Es el que vas a pegar en el paso 1.
  • Tu Measurement ID (G-XXXXXXX): en analytics.google.com → Admin (engranaje, esquina inferior izquierda) → columna Property → Data streams → clickeá tu stream web → Measurement ID, arriba a la derecha. Es el que vas a pegar en el paso 4.

Los menús de Google los citamos en inglés, como los muestra la interfaz por defecto. Si tu cuenta está en español, buscá el equivalente — p. ej. Triggers aparece como Disparadores y Tags como Etiquetas.

  1. Agregar gtm-id al embed

    Es el único paso que se hace en tu página, y es una línea.

    Dónde

    En tu CMS o el HTML de tu página: la misma pantalla donde pegaste el snippet del feed — p. ej. CMS → Páginas → la página del feed → bloque HTML; si el feed vive en una plantilla, editá la plantilla.

    <story-feed
      endpoint="https://api.storyfeedmedia.com/api/v1/feed?client=TU_CLIENTE"
      client="TU_CLIENTE"
      gtm-id="GTM-XXXXXX"></story-feed>
    1. Abrí tu CMS y entrá a la página o plantilla donde está el <story-feed>. Si no sabés cuál es, abrí esa página en el navegador y buscá el feed: el bloque que lo contiene es el que tenés que editar.
    2. Copiá el snippet de arriba, pegalo en ese bloque y reemplazá TU_CLIENTE y GTM-XXXXXX por tus valores reales.
    3. Guardá y publicá la página. Si tu sitio tiene caché o CDN, vaciala: si no, el cambio no se va a ver.
    4. Abrí la página en el navegador y apretá F12 → pestaña Console: no debe aparecer ningún console.warn sobre gtm-id.
    • gtm-id tiene que matchear el formato GTM-XXXXXX. Un valor inválido solo deja un console.warn y no carga nada.
    • Si tu página ya carga ese mismo contenedor con tu propio snippet, el componente lo detecta y no lo vuelve a cargar.
    • Con varios <story-feed> en la página, el mismo gtm-id se carga una sola vez.
  2. Triggers en tu GTM

    Creá triggers tipo Custom Event para los eventos del feed. Hay dos modalidades válidas: la agrupada es la más rápida.

    Dónde

    En tagmanager.google.com → clic en tu cuenta y contenedor → menú de la izquierda: Triggers → botón New, arriba a la derecha.

    a · Uno agrupado (recomendado)

    La más rápida. Un solo trigger con Event name en regex —marcando Use regex matching— que cubre los 10 eventos, y un único tag GA4 (paso 4) que los reenvía todos.

    b · Uno por evento

    10 triggers, uno por evento (Event name = page_view, card_view, etc.). Más pasos, pero podés tratar cada evento por separado: un tag distinto o distintos parámetros por evento.

    Event name (regex)
    page_view|card_view|story_view|story_click|feed_engagement|reel_mute_toggle|feed_load_more|feed_end|feed_error|share
    1. Entrá a tagmanager.google.com con la cuenta que administra tu sitio y clickeá tu contenedor (si tenés varios, el que usa tu página).
    2. En el menú de la izquierda clickeá Triggers y después New, arriba a la derecha.
    3. Clickeá Trigger Configuration —el panel gris de la izquierda— y elegí Custom Event en la lista que se abre.
    4. En Event name pegá la expresión de arriba (botón Copiar) y marcá Use regex matching. Es case-sensitive: los nombres van en minúscula y con guion bajo.
    5. En This trigger fires on dejá All Custom Events marcado, que es el valor por defecto.
    6. Clickeá Save, arriba a la derecha. Si elegís la opción b, repetí los puntos 2 a 6 con el nombre exacto de cada evento —p. ej. card_view— hasta tener los 10 triggers.
    7. Cuando esté listo: botón naranja Submit, esquina superior derecha → Publish → poné un nombre de versión (p. ej. StoryFeed triggers) → Publish de nuevo. Hasta publicar, en tu página no se dispara nada de esto.
  3. Variables de capa de datos

    Los parámetros llegan anidados bajo eventModel.<param> por interoperabilidad entre gtag.js y GTM. Creá Data Layer Variables con estos nombres:

    Dónde

    En tagmanager.google.com → tu contenedor → menú de la izquierda: Variables → sección User-Defined Variables → botón New.

    • eventModel.sfm_client
    • eventModel.item_id
    • eventModel.item_slug
    • eventModel.item_type
    • eventModel.cursor
    • eventModel.muted
    • eventModel.error_code
    • eventModel.error_message
    • eventModel.page_location
    • eventModel.page_title
    • eventModel.method
    • eventModel.content_type (solo share)
    1. Clickeá New dentro de la sección User-Defined Variables —no confundir con Built-In Variables, que están arriba y no se pueden editar—.
    2. Clickeá Variable Configuration y elegí Data Layer Variable en la lista de tipos.
    3. En Data Layer Variable Name escribí exactamente eventModel.sfm_client: los puntos y las minúsculas importan.
    4. Dejá el resto como está y clickeá Save arriba a la derecha.
    5. Repetí los puntos 1 a 4 con cada parámetro de la lista de arriba que quieras usar —como mínimo eventModel.sfm_client y los de contenido (item_id, item_slug, item_type)—.
    6. No hace falta publicar por cada variable: al final del paso 4 vas a hacer Submit → Publish con todo junto.
  4. Tag GA4 que reenvía a tu propiedad

    Creá uno o varios GA4 Event tags con esto:

    Dónde

    En dos ventanas: primero en analytics.google.com para copiar tu Measurement ID, y después en tagmanager.google.com → tu contenedor → menú de la izquierda: Tags → botón New.

    1. Primero, tu Measurement ID: entrá a analytics.google.com → Admin (engranaje, esquina inferior izquierda) → columna Property → Data streams → clickeá tu stream web → copiá el Measurement ID (G-…), arriba a la derecha.
    2. Volvé a tagmanager.google.com → menú Tags → New → Tag Configuration → elegí Google Analytics: GA4 Event.
    3. En Measurement ID pegá el G-… que copiaste. Este es tu ID: si pegás el de otra propiedad —o el de StoryFeed—, la medición se duplica o se va donde no debe.
    4. En Event Name escribí el mismo nombre del evento —p. ej. card_view—, o —si armaste el trigger agrupado— usá la variable integrada Event (activala en Variables → Configure).
    5. En Event Parameters clickeá Add row: en Parameter name escribí sfm_client y en Value clickeá el ícono de variables —el ladrillo— y elegí eventModel.sfm_client. Repetí con item_id y item_slug.
    6. Clickeá Triggering, debajo de la configuración → Choose a trigger → seleccioná los triggers del paso 2 —con el trigger agrupado, elegí ese—.
    7. Clickeá Save arriba a la derecha; después Submit → Publish para que las variables, los triggers y este tag pasen a estar activos en tu página.
  5. Custom definitions en tu GA4

    Los parámetros viajan en el hit, pero GA4 solo los muestra en reportes y exploraciones si los registrás en Admin → Custom definitions como dimensiones personalizadas de alcance Evento. Mínimo: sfm_client. Recomendado sumar item_id, item_slug y item_type. Sin este paso los datos existen pero no aparecen en los reportes estándar.

    Dónde

    En analytics.google.com → Admin (engranaje, esquina inferior izquierda) → columna Property (la del medio) → Data display → Custom definitions.

    1. Entrá a analytics.google.com con la cuenta de tu medio y clickeá Admin, el engranaje de la esquina inferior izquierda.
    2. En la columna Property —la del medio, no la de Cuenta— buscá el bloque Data display y clickeá Custom definitions.
    3. Clickeá el botón Create custom dimension.
    4. Completá los tres campos: Dimension name = sfm_client —es el nombre que vas a ver en los reportes—, Scope = Event y Event parameter = sfm_client.
    5. Clickeá Save y repetí los puntos 3 a 5 con item_id, item_slug y item_type.
    6. Estas dimensiones se aplican a los eventos que lleguen después de crearlas: los eventos de prueba que mandaste antes no aparecen en los reportes con su valor.
  6. Verificar

    Cinco chequeos, en este orden:

    Dónde

    En dos lugares: tagmanager.google.com → tu contenedor → botón Preview, arriba a la derecha; y analytics.google.com → Reports → Realtime.

    1. En tagmanager.google.com → tu contenedor, clickeá Preview, arriba a la derecha: se abre Tag Assistant en otra pestaña. Pegá ahí la URL de tu página y clickeá Connect.
    2. Interactuá con el feed —scroll, clic en una card, mute de un reel—. En el panel izquierdo del Tag Assistant tenés que ver los Custom Events (card_view, story_click…) y, en Tags Fired, tu tag GA4.
    3. En analytics.google.com → Reports, menú de la izquierda → Realtime: tus eventos deberían aparecer ahí en pocos segundos. Si tu sitio corre en modo debug, también en Admin → DebugView.
    4. Antes de cerrar, volvé a Submit → Publish en GTM: los cambios guardados pero no publicados no se aplican a tus visitantes reales.
    5. Si en Tag Assistant no ves ni el gtm.js, revisá la CSP de tu sitio: tiene que permitir https://www.googletagmanager.com en script-src y connect-src —donde se configuren los headers: nginx, Apache, panel de hosting o tu CMS—.

    La CSP bloquea el 90% de los "no veo nada"

    Si tu sitio usa Content-Security-Policy estricta y no permite googletagmanager.com, el gtm.js del paso 1 se bloquea y no llega ningún evento: ni en Preview ni en tu GA4.

Preguntas frecuentes

¿El page_view del widget duplica el pageview de mi sitio?

No. Es un evento adicional del widget —una vez por instancia cargada— y no reemplaza tu medición: tu pageview sigue saliendo de tus propios tags, sin cambios.

¿Necesito el atributo client?

Para atribuir por sitio o sección, sí: sin client no hay sfm_client y no vas a poder segmentar.

Puse gtm-id y no veo nada en mi GA4

Revisá en este orden: el formato del ID, la CSP bloqueando gtm.js, que los triggers y tags estén publicados —no solo en Preview—, el Measurement ID del tag, y las custom definitions.

¿Tu contenedor ve los eventos y tu GA4 no recibe nada?

Pasanos lo que muestra GTM Preview —el nombre del evento y sus eventModel.*— y lo revisamos juntos.