Skip to content

Instantly share code, notes, and snippets.

@pacotole
Created March 6, 2026 18:14
Show Gist options
  • Select an option

  • Save pacotole/4551b4b291ac874e36a39e48513310d2 to your computer and use it in GitHub Desktop.

Select an option

Save pacotole/4551b4b291ac874e36a39e48513310d2 to your computer and use it in GitHub Desktop.
Joinchat Chat Funnels enhanced conversions snippet
/**
* JoinChat Enhanced Conversions
* Captura email y teléfono y envía conversiónes mejoradas a Google Ads utilizando gtag.js
*
* Configuración:
* window.JOINCHAT_EC_CONFIG = {
* conversionId: 'AW-123456789/AbC-D_efG-h12_34-567', // ID de conversión (opcional)
* sendHashed: true, // Hashear email (recomendado)
* autoSend: false // Enviar automáticamente al capturar email (opcional)
* };
*/
(function (window, document) {
'use strict';
// Configuración (puede sobrescribirse externamente)
const CONFIG = window.JOINCHAT_EC_CONFIG || {
conversionId: 'YOUR_CONVERSION_ID', // Reemplaza con tu ID de conversión
sendHashed: true,
autoSend: false
};
let userEmail = null;
let userPhone = null;
let conversionSent = false; // Flag para evitar envíos duplicados
// Hashear email con SHA-256
async function sha256(str) {
const buffer = new TextEncoder().encode(str.toLowerCase().trim());
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
// Capturar email/phone
document.addEventListener('joinchat:input', function (e) {
if (e.detail && e.detail.input === 'email') {
userEmail = e.detail.value.toLowerCase().trim();
}
if (e.detail && e.detail.input === 'phone') {
userPhone = e.detail.value.replace(/[\s\-\(\)]/g, '');
if (!userPhone.startsWith('+')) {
userPhone = '+' + userPhone;
}
}
});
// Enviar conversión o setear user_data para conversiones posteriores
async function sendOrSetEnhancedConversion(force = false) {
if (!userEmail) {
return null;
}
// Evitar envíos duplicados (a menos que se fuerce)
if (conversionSent && !force && CONFIG.conversionId && CONFIG.conversionId !== 'YOUR_CONVERSION_ID') {
return;
}
if (typeof gtag !== 'function') {
console.warn('[JoinChat EC] gtag no está disponible');
return;
}
try {
let userData = {};
if (CONFIG.sendHashed) {
userData.sha256_email_address = await sha256(userEmail);
if (userPhone) {
userData.sha256_phone_number = await sha256(userPhone);
}
} else {
userData.email = userEmail;
if (userPhone) {
userData.phone_number = userPhone;
}
}
if (CONFIG.conversionId && CONFIG.conversionId !== 'YOUR_CONVERSION_ID') {
gtag('event', 'conversion', {
'send_to': CONFIG.conversionId,
'user_data': userData
});
conversionSent = true; // Marcar como enviado
} else {
gtag('set', 'user_data', userData);
}
} catch (error) {
console.error('[JoinChat EC] Error al enviar conversión:', error);
}
}
/**
* Estos distintos ejemplos de eventos que permiten enviar la conversión en diferentes momentos:
*
* - joinchat:submitSuccess: Se dispara cuando el usuario envía el formulario exitosamente.
* - joinchat:webhookSuccess: Se dispara cuando el webhook de JoinChat confirma la captura de datos.
* - joinchat:input (con autoSend): Se dispara cada vez que se captura un email, enviando la conversión automáticamente (recomendado solo con sendHashed).
* - joinchat:bubble: Se dispara al mostrar un mensaje concreto, permitiendo enviar la conversión en un punto específico del flujo de conversación.
*
* Puedes elegir uno o varios eventos según tu flujo de conversión deseado.
*/
// Enviar conversión en submit exitoso
document.addEventListener('joinchat:submitSuccess', sendOrSetEnhancedConversion);
// Enviar conversión en webhook exitoso
document.addEventListener('joinchat:webhookSuccess', sendOrSetEnhancedConversion);
// Enviar automáticamente al capturar email (opcional, recomendado solo con sendHashed)
if (CONFIG.autoSend) {
document.addEventListener('joinchat:input', function (e) {
if (e.detail && e.detail.input === 'email') {
sendOrSetEnhancedConversion();
}
});
}
// Enviar cuando pasa por un mensaje concreto (ejemplo avanzado)
document.addEventListener('joinchat:bubble', function (e) {
if (e.detail && e.detail.message && e.detail.message.includes('¡Gracias por unirte!')) {
sendOrSetEnhancedConversion();
}
});
})(window, document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment