Ágil para probar. Limpio para publicar.
📝 El escenario
Estás construyendo una CloudPage compleja en Salesforce Marketing Cloud (SFMC). Quieres:
- Mantener tu código versionado
- Colaborar con otros developers
- Dejar de copiar y pegar como si fuera 2007
Y claro: hacerlo sin romper nada en producción.
🧪 Todos los snippets de este post (y muchos más que iremos publicando) están disponibles en nuestro repositorio para la comunidarks:
🔗 https://github.com/jcgalindof/salesforce-cancun
🎯 La solución: cargar el código desde GitHub con SSJS
Usando un snippet como este (basado en un ejemplo de StackExchange):
<script runat="server">
Platform.Load('Core', '1.1')
// Variables globales
// Cambia estas variables de acuerdo a tu configuración
var userDetails = {
username : "salesforcecancun",
token : "c0b6a550b1aaaca1292e11cbe786e56d40b98c49",
repoName : "salesforce-cancun",
fileName : "cloudpage.amp"
}
// No modificar nada debajo de esta sección
// Función para obtener el contenido del repo privado
function getPrivateRepoContent(obj){
var resource = 'https://api.github.com/repos/'+ obj.username + '/' + obj.repoName + '/contents/' + obj.fileName
var req = new Script.Util.HttpRequest(resource);
req.emptyContentHandling = 0;
req.retries = 2;
req.continueOnError = true;
req.contentType = "application/json; charset=utf-8"
req.setHeader("Authorization","token " + obj.token);
req.setHeader("User-Agent", obj.username + '/' + obj.repoName);
// Este header es muy importante: permite obtener la versión RAW del archivo
req.setHeader("Accept", "application/vnd.github.v3.raw");
req.setHeader("Cache-Control", "");
req.method = "GET";
var resp = req.send();
// Asignamos el contenido recibido a una variable de AMPscript
Platform.Variable.SetValue("@runCode", resp.content)
}
// Ejecutamos la función usando la configuración
getPrivateRepoContent(userDetails)
</script>
%%=TreatAsContent(@runCode)=%%
Este código:
- Conecta con un repositorio privado en GitHub.
- Descarga el archivo deseado (HTML, JS, AMPscript… lo que sea).
- Lo ejecuta directamente en la CloudPage gracias a
TreatAsContent()
.
🚫 Por qué no deberías usar esto en producción
Aunque tentador, este enfoque tiene riesgos críticos si se usa sin cuidado:
❌ Token hardcodeado
- Está visible en el código.
- Puede ser explotado si alguien accede a la CloudPage o el entorno de edición.
⚡ TreatAsContent ejecuta TODO
- Si el archivo remoto está comprometido, el servidor ejecuta código sin control.
⌛ Dependencia de GitHub
- Si GitHub está caído o tu token expira, la página se rompe.
👩💻 Nuestra recomendación: entornos de prueba sí, producción no
Este método es altamente útil para desarrollo y QA:
- Puedes iterar rápido sin tocar el builder.
- Puedes versionar y trabajar en ramas.
- Puedes integrar snippets y layouts desde repos compartidos.
Y cuando todo está listo…
✅ Copias el contenido verificado desde GitHub y lo pegas limpio en la CloudPage de producción.
🛡️ Tips de seguridad
- Usa tokens con acceso limitado.
- Rota el token cada 30 días (o menos).
- Usa un entorno de prueba que no reciba tráfico de usuarios reales.
- Nunca expongas el token en un entorno accesible por terceros.
🏆 Conclusión
Esta técnica es poderosa, pero no está diseñada para vivir en producción.
Usála como herramienta de iteración rápida, no como estructura de despliegue final.
Y recuerda:
Ágil para probar. Limpio para publicar.