Author: Cristóbal Galindo

  • Novedades clave de Salesforce Marketing Cloud – Semana 4, Abril 2025

    Novedades clave de Salesforce Marketing Cloud – Semana 4, Abril 2025

    El ecosistema de Salesforce sigue evolucionando con fuerza, y esta semana nos deja avances importantes que impactan directamente a quienes trabajamos con Salesforce Marketing Cloud (SFMC). Desde automatización inteligente hasta integración multicanal y mejoras en la gestión de datos, aquí tienes el resumen con lo más importante que debes conocer.

    1. Agentforce: Automatización Inteligente con IA Generativa

    Ideal para equipos de marketing que desean escalar sin perder personalización ni control.

    Salesforce acelera su apuesta por la inteligencia artificial con Agentforce, una plataforma que permite generar contenido automatizado para correos, páginas y flujos de campaña. Uno de los lanzamientos más esperados es el Agentforce Campaign Designer, que permite orquestar campañas completas desde una interfaz central, con IA asistiendo cada paso del proceso creativo y operativo.

    2. Personalización Reutilizable y Expresiones Dinámicas

    Más consistencia, menos trabajo manual.

    La nueva funcionalidad de personalización reutilizable permite asignar reglas y configuraciones a bloques de contenido y usarlas en múltiples correos. Esto no solo reduce tiempo, sino que garantiza coherencia en campañas a gran escala.

    También llegan las Expresiones, una librería de campos dinámicos que se pueden integrar en cualquier pieza de contenido, ayudando a mantener mensajes coherentes y alineados con las preferencias del cliente.

    3. WhatsApp se suma como canal nativo de comunicación

    Un paso gigante hacia la hiperpersonalización en canales que tu cliente realmente usa.

    WhatsApp ya está integrado en SFMC como canal de mensajería bidireccional, permitiendo interacciones más ricas con soporte para archivos multimedia. Esto refuerza la presencia multicanal de Marketing Cloud y ofrece nuevas posibilidades para automatizaciones con Journey Builder.

    4. Retención de Datos de Engagement: Nuevas Reglas

    Es momento de revisar tus procesos de reporting y automatización basados en datos históricos.

    A partir del 15 de mayo de 2025, Salesforce ajustará el período de retención de datos de interacción a 180 días en instancias alojadas en Hyperforce. Esta medida busca mejorar el rendimiento general y reducir la carga de datos innecesarios, algo crucial para entornos de gran volumen.

    5. Marketing Cloud Growth y Advanced: Expansión Global

    Perfecto para empresas que buscan una solución escalable sin migrar al entorno Salesforce Core completo.

    Las versiones Growth y Advanced de SFMC ahora están disponibles en cinco nuevas regiones. Estas ediciones ofrecen herramientas de marketing integradas, capacidades avanzadas de segmentación y conexión nativa con WhatsApp.

    ¿Cómo afectan estos cambios a tu estrategia de marketing?

    Estos updates no son solo técnicos: son oportunidades para repensar tu arquitectura de campañas, cómo manejas datos, y qué tan preparado estás para escalar con IA. Si aún estás usando SFMC solo para envíos básicos, 2025 es el año para evolucionar.

    Fuentes y lecturas recomendadas:

  • ¿Qué onda con SFMC y SFMC Growth?

    ¿Qué onda con SFMC y SFMC Growth?

    Estamos viendo movimientos fuertes en el ecosistema Salesforce respecto a SFMC (Salesforce Marketing Cloud “clásico”), sobre todo con la aparición de Marketing Cloud GrowthEngagement, y la presión de alinear todo con el stack Core (Sales Cloud, Data Cloud, etc.). Aquí te va una visión clara, actualizada y un poquito entre líneas:


    🔮 

    ¿Qué es lo que realmente está pasando?

    1. 

    SFMC Clásico sigue vivo, pero está madurando (en el sentido empresarial del término: ya no crece, se optimiza y se encamina al legado).

    • Se sigue vendiendo y manteniendo, especialmente para grandes cuentas y agencias con operaciones complejas.
    • La plataforma aún se expande con mejoras (como Einstein Content Selection, mejoras en Journey Builder, nuevos APIs), pero ya no es el foco de innovación estratégica.

    2. 

    Marketing Cloud Growth es el “nuevo juguete”, y apunta a PYMES y nuevos clientes.

    • Se basa sobre Core Salesforce (Sales/Service Cloud + Data Cloud), lo que lo hace más nativo en la plataforma.
    • Usa Data Cloud como base de datos de marketing, y lo acompaña con herramientas simplificadas de engagement y automatización.
    • No requiere tanta curva de aprendizaje como SFMC clásico. Está diseñado para ir más rápido, integrarse más fácilmente y escalar con el resto del CRM.

    3. 

    La transición no es inmediata ni obligatoria, pero el momentum está allá.

    • Salesforce no ha dicho oficialmente que va a “matar” SFMC clásico.
    • Pero está claro que todo lo nuevo se está desarrollando en torno a Core + Data Cloud.
    • Muchos productos Einstein, automatizaciones AI, y analíticas avanzadas requieren ya Data Cloud como backend.

    🧠 

    ¿Qué deberías considerar tú (especialista SFMC)?

    ✅ 

    Ventajas de seguir con SFMC clásico (por ahora):

    • Mayor potencia, flexibilidad y granularidad.
    • Mejor manejo de datos externos vía SQL.
    • Infraestructura comprobada para grandes empresas y ecosistemas complejos.

    ⚠️ 

    Limitaciones a futuro:

    • Puede volverse más costoso de mantener.
    • Menor compatibilidad con nuevas funciones nativas de Salesforce Core.
    • Eventual presión para migrar, especialmente si eres parte de una instancia que ya está en Core.

    🛠️ 

    Recomendación estratégica:

    • Aprende Data Cloud cuanto antes.
    • Familiarízate con Growth Edition, aunque solo sea para entender sus límites y ventajas.
    • Considera hacer proyectos mixtos, donde SFMC clásico alimenta a Core y viceversa.
    • Mantén tu valor como experto de integración entre nubes.

    💬 En palabras simples:

    SFMC clásico no ha muerto, pero ya lo están peinando para la foto familiar.

    Mientras tanto, Marketing Cloud Growth es el nuevo bebé mimado.

    Tú puedes ser la comadrona que entienda ambos idiomas.

  • Cómo mejorar la performance de tus queries en SFMC con subqueries SARGables

    Cómo mejorar la performance de tus queries en SFMC con subqueries SARGables

    Spoiler: Sí, SFMC puede llorar menos si le hablas bonito… y SARGable.

    ¿Qué es SARGabilidad?

    SARG (Search ARGument-able) es una característica de las consultas SQL que permite que los motores de base de datos usen índices de manera eficiente. Si haces cosas como WHERE FUNCTION(CAMPO) = valor, te cargas el índice. Y SFMC, que ya de por sí anda sensible, se te cae de la silla.

    El problema clásico

    Una consulta común para reportes mensuales podría verse así:

    WHERE DateJoined >= DATEADD(MONTH, -12, GETDATE())

    ¿El problema? DATEADD(MONTH, -12, GETDATE()) se evalúa por fila, y eso impide que SQL use índices sobre DateJoined.

    La solución: precalcular la fecha con una subquery

    Como SFMC a veces no permite WITH (CTEs), puedes resolverlo con una subconsulta en el JOIN:

    INNER JOIN (
        SELECT CAST(DATEADD(MONTH, -12, GETDATE()) AS DATE) AS MinDate
    ) d ON s.DateJoined >= d.MinDate

    Tu query completa podría quedar así:

    SELECT
        FORMAT(s.DateJoined, 'yyyyMM') AS MonthYear,
        s.Brand_Code,
        COUNT(*) AS Subscribers
    FROM
        ent._Subscribers s
    INNER JOIN (
        SELECT CAST(DATEADD(MONTH, -12, GETDATE()) AS DATE) AS MinDate
    ) d ON s.DateJoined >= d.MinDate
    GROUP BY
        FORMAT(s.DateJoined, 'yyyyMM'),
        s.Brand_Code

    Bonus de la casa: evitar hasheos innecesarios

    Si usas tablas que requieren matching por SHA256, considera crear una columna con el email en texto plano (o el dato necesario) para evitar re-hashear cada vez que corres la query. Esto mejora enormemente la performance, especialmente en automations.

    -- Antes
    ON CONVERT(NVARCHAR(64), HASHBYTES('SHA2_256', ...)) = EMAILHASH
    -- Después
    ON s.Email = ldb.EmailPlain

    En resumen:

    – SFMC tiene limitaciones, pero también formas de optimizar si entiendes su lógica.

    – No abuses de funciones dentro de tus WHERE o JOIN.

    – Usa subqueries como si fueran tu mejor truco de magia backend.

    – Y si puedes evitar el hash, evita el hash.

  • Certificación Data Cloud: 50% de Descuento

    Certificación Data Cloud: 50% de Descuento

    Si andas buscando hacerte data cloud consultant prueba el cupón

    DATA50

    50% de descUENTO EN TU EXAMEN DE CERTIFICACIÓN COMO DATA CLOUD CONSULTANT

    Debería darte el 50% de descuento para tu certificación como Salesforce Data Cloud Consultant

    Y aunque no es de Marketing cloud, si quieres certificarte como Salesforce Admin, prueba este cupón:

    AsSS2s23SNpNAngg

    50% DE DESCUENTO EN TU EXAMEN CERTIFICACIÓN COMO SALESFORCE ADMIN

    Así pues. Aprovecha estos cupones y continúa cosechando certificaciones para tu currículum 😃.

    Mucho éxito!

  • Actualizar el conteo de tu DE sin tener que recargar toda la ventana y por lo tanto volver a navegar los folders de ContactBuilder para encontrar tu data extension otra vez

    Actualizar el conteo de tu DE sin tener que recargar toda la ventana y por lo tanto volver a navegar los folders de ContactBuilder para encontrar tu data extension otra vez

    Ya sé que me excedi con el título, pero esto es algo que todos hemos visto y que entonces cuando estás viendo tu data extension después de un automation tienes que salir y volver a entrar para poder ver si cambiaron los números de tus datos y bla bla bla…

    Pues bueno, todo esto se debe a como funciona exact target / marketing cloud engagement / sfmc. Es un parent frame que carga iFrames y estos iFrames no se pueden refrescar desde la interfaz del navegador directamente…

    P E R O

    En chrome tienes la opción de hacer click derecho y “recargar marco” o “reload frame”

    Con eso vas a poder actualizar tu data extension sin tener que hacer todo el jolgorio de recargar la pestaña completa.

    🙂

    Espero te sirva.

    Saludos.

  • ClaimRow reclama más de un cupón cuando envío mi correo electrónico.

    Si utilizas cupones personalizados para tus envíos en SFMC la posibilidad es que estés usando la función ClaimRow de ampscript para lograr esta funcionalidad.

    Si no sabes de qué estoy hablando, vamos por partes:

    Si quieres ofrecer a tus usuarios cupones personalizados para cambiar en tus puntos de venta digitales o físicos, puedes utilizar la función ClaimRow de ampscript. Necesitarás:

    • Una Data Extension con los campos: CouponCode (text 50), Email (email), ClaimedDate(date), isClaime (boolean). Puedes agregar campos adicionales si así lo deseas. Para este ejemplo asumimos que esta DE se llama “CouponCodes_2024”
    • Un email donde utilizar la función ClaimRow.

    Una vez que tengas hecho eso es muy sencillo, según la documentación:

    %%[
    SET @EmailAddress = emailAddr /* utilicemos System String que contiene el email del usuario en el contexto del mensaje */
    SET @CouponRow = ClaimRow('CouponCodes_2024', 'isClaimed', 'EmailAddress', @EmailAddress, 'ClaimedDate', NOW()) /* la DE en la función ClaimRow debe ser declarada de forma explícita. No puede ser una variable de ampscript */
    IF NOT EMPTY(@CouponRow) then
        SET @CouponCode = FIELD(@CouponRow, 'CouponCode') /* guarda el cupón de tu fila en una variable para poder usarlo en el cuerpo del email */
    ELSE
        RAISEERROR('No hay cupones disponibles', false) /* Esto detendrá el envío completamente */
    ENDIF
    ]%%
    
    %%=v(@CouponCode)=%%

    Pura belleza, verdad?

    Pues no es cierto…

    Hay un par de cosas a considerar:

    • te recomiendo que agregues una verificación del contexto del mensaje (_messagecontext) y asegurarte que es un envío o una vista como web page y no un preview o FTAF, etc.
    • este código se copiará completamente en tu versión de texto si tienes Multipart MIME activado por lo que probablemente te enfrentes con el error que nos trae hasta este post.

    Al momento de hacer el envío, tu código ampscript se calculará dos veces: una para tu versión html y otra para su versión de texto. Y si bien ClaimRow en la documentación dice que “si encuentra una fila ya reclamada para esa dirección de correo devolverá el mismo valor previamente reclamado” en la práctica… eso no sucede.

    ¿Cómo solucionarlo?

    Hay un número de cosas que puedes hacer.

    1. Poner tu función ClaimRow dentro de otra función LookupRows para asegurarte de que no hay otra fila ya reclamada por ese email.
      • Desventajas: agregas más tiempo de cómputo y si tienes muchos emails que mandar eso puede ser problemático.
    2. Desactivar la opción Multipart MIME en tu email y enviar solo la versión HTML
      • Desventajas: Puede que tengas algunos usuarios en un cliente o servidor que solo acepte la versión de Texto y tu mensaje no va a ser entregado.
    3. (Mi favorita) Editar la versión de texto de tu Email para que incluya solo un enlace a VAWP en el que diga que para ver su cupón visiten el enlace.

    Listo!

    Si ya te habías enfrentado a este problema espero que esta solución te ayude y si no: bueno, ahora ya sabes algo más.

    Hay alguna función que te gustaría que explorara en este blog? Cuéntame en tus comentarios.

  • Llevando tus leads from Zero to Hero en marketing cloud

    Fuimos a dar una vuelta al cielo, para ver lo que es eterno

    Fuimos a la comunidad de Torreón y nos divertimos mucho. Pasen a verlo y coméntennos qué les parece 😃

  • Salesforce Certified Data Cloud Consultant

    Nomás quería presumirles que lo logré 😃

    Y ya, ese es todo el post.

  • Validar que un usuario no está registrado en una Data Extension utilizando jQuery Validate y code resources

    Validar que un usuario no está registrado en una Data Extension utilizando jQuery Validate y code resources

    Voy a iniciar una nueva sección acerca de code resources porque creo que son una herramienta poco utilizada en SFMC y que esconde muchas cosas poderosas.

    Así que pues, entremos al asunto.

    El problema

    Tienes una cloudpage atada a una promoción para registro de usuarios y necesitas garantizar que el usuario solo se registre una vez.

    La “solución”

    Lo que harías normalmente sería procesar el formulario y entonces al tratar de procesar el resultado, te darías cuenta de que el usuario ya existe y devolverías el mensaje de “híjole, ya existe el usuario, men”

    El problema con la “solución”.

    Es una pésima experiencia para el usuario llenar el formulario para darse cuenta de que ya existe y que le dedicó 20 segundos de su tiempo a llenar un formulario. Entonces en realidad esto no está tan padre.

    La solución.

    Utilizando jQuery, el plugin jQuery Validate y un code resource podremos validar el mensaje al momento de llenar el formulario y mostrar un mensaje de error, además ahorrándonos supermessages!

    Bueno vamos al asunto.

    Prerequisitos:

    1. Una cloudpage con un formulario
    2. Agregar un ID al formulario
      • para el ejemplo usaremos id=”myForm”
    3. Un code resource JSON
      • Básicamente lo usaremos para hacer un LookUpRows a la DE y devolver TRUE o FALSE si ya existe el email la DE.
    4. Habilidad media en html, js y ampscript.
      • No dejes que tu síndrome del impostor te convenza de que no puedes hacer este ejemplo, pero si te atoras: pídele ayuda a tu FED de confianza.

    Procedimiento

    Primero tomemos nuestra cloudpage e incluyamos jQuery y el plugin jQuery validator en el header.

    <!doctype html>
    <html lang="es">
        <head>
            <title>Ejemplo Formulario</title>
            <!-- Required meta tags -->
            <meta charset="utf-8" />
            <meta
                name="viewport"
                content="width=device-width, initial-scale=1, shrink-to-fit=no"
            />
            <script
                src="jquery-3.7.1.min.js"
            />
            <script
                src="1.19.5/jquery.validate.js"
            />
        </head>

    tomemos nuestro formulario en la cloudpage.

    <form action="https://cloud.my.domain.com/thankyou-page" id="myForm">
    <input type="text" name="firstName" id="firstName" placeholder="Nombre">
    <input type="text" name="email" id="email" placeholder="Email" required>
    <input type="submit" value="Enviar">
    </form>

    Después de la etiqueta </form> incluiremos la validación del formulario

    $( "#myForm" ).validate({
      rules: {
        firstName: {
          required: true
        }
        email: {
          required: true,
          email: true,
          remote: {
            url: https://cloud.my.domain.com/email-validator.json",
            type: "post",
            data: {
              email: function() {
                return $( "#email" ).val();
              }
            }
         }
    });

    Y ahora en nuestro code resource email-validator.json incluimos nuestra búsqueda de ampscript.

    %%[
       SET @RecordsDE = "RegistrosPromo"
       SET @email = RequestParameter("Email")
       SET @Rows = LookUpRows(@RecordsDE, "email", @email)
       SET @RowCount = RowCount(@Rows)
       IF @RowCount > 0 THEN
          SET @new = 'FALSE'
       ELSE
          SET @new = 'TRUE'
       ENDIF
       OUTPUT(@exists)
    ]%%

    Y voilá! Con eso tendremos una validación de forma que si el correo ya está registrado aparecerá un mensaje de error y no permitirá continuar con el envío del formulario.

    Extendiendo la funcionalidad

    Hay muchas formas de extender la funcionalidad de este sencillo código.

    • Puedes tener un code Resource JSON genérico para todas tus cloudpages y DEs, agregando un parámetro a la solicitud post que incluya el nombre de la DE en la que quieres validar los registros y utilizando ese parámetro en la función de AMPscript
    • Puedes agregar mensajes de error personalizado para los casos en los que el registro ya exista e invitar al usuario a tomar acciones específicas si ya está registrado
    • Puedes agregar más detalles a verificar con una situación similar, por ejemplo si es un registro con invitación, agregar el código de invitación en un campo y validar que el campo exista en tu registro de invitaciones (otra DE) para que solo los usuarios con un código de invitación válido se puedan registrar.
    • Y muchos más!

    Cuéntame si tienes ganas de saber más en los comentarios 🙂

  • Obtener un listado de todas tus cloudpages

    Obtener un listado de todas tus cloudpages

    Es posible?

    Bueno, si… hay seguramente otros métodos que requieran acceso de API y what not… pero si estás en una business unit a la que no tienes acceso a la API o cosas, este método te puede servir

    Todo lo que tienes que hacer es construir un link como este:

    https://cloud-pages.%%stackNumber%%.marketingcloudapps.com/fuelapi/internal/v2/cloudpages/landing-pages?pageTypeId=3&$page=%%NúmeroDePágina%%&$pageSize=%%ResultadosPorPágina%%&$orderBy=createdDate%20DESC

    Dónde:

    %%StackNumber%% s + {int}es el número de tu stack. Cómo saber eso? Bueno, cuando estás loggeado en sfmc la url de tu navegador va a ser algo como esto: https://mc.s7.exacttarget.com “s7” es el número de tu stack.

    %%Número de Página%% {int} este es un listado paginado, así que dependiendo de cuantas páginas tengas puedes utilizar este enlace para obtener la página que estás buscando, eso se controla con la siguiente variable que es

    %%Resultados por página%% {int} este número va a decir cuantos resultados obtienes por página, por lo que si tienes 500 cloudpages y tienes 50 resultados por página, vas a necesitar 10 páginas para verlas todas.

    Cómo llegué a este enlace?

    Bueno, de la forma difícil. Me pidieron un inventario de cloudpages en una Business Unit y no podía obtenerlo ni sabía cómo… Así que me puse a picotear en los archivos que se cargan cuando entras a web studio y entre esos, lo encontré:

    Ahora bien, en algunas de mis BUs este request no aparece, en otras si… no sé a qué se deba.

    Cosas a considerar:

    No aparecen los micrositios, ni los code resources. Me pondré luego a investigar si moviéndole a las categorías lo logro.

    Si ustedes tienen ganas de colaborar con esta labor científica y de investigación, échenme un mail

    Ah si, necesitan estar loggeados en la business unit que deseen descargar el listado, si no el enlace no va a funcionar.

    Qué obtenemos con ese enlace?

    Un JSON. Lo único que yo hice después fue correr ese JSON en una webapp que lo convirtió en un CSV y listo, lo puedo trabajar en excel.

    Qué otras funciones puede tener?

    Tal vez un listado custom de tus Cloudpages, etcétera. Aunque para eso te recomendaría mejor tener credenciales de API y utilizar alguno de los métodos que Ivan Razine menciona en el bienamado ssjsdocs.xyz

    Nota final:

    Este post no es una recomendación. Es solo una posible solución a uno de los problemas que posiblemente tengas. Tiene sus limitaciones y una de ellas es que no he encontrado documentación de esa fuelapi.

    Puedo estar equivocado, si hay algo que ves que te preocupa y quieres agregar a la conversación échame un mensaje 😀

    Happy coding.