BlogENApúntate
← Todos los artículos

Subir un email HTML a Content Builder de Salesforce, paso a paso

Cómo subir un email HTML a Content Builder de Salesforce con HTML Paste o con la API REST, con asunto, preheader y respaldos de AMPscript que no se rompen.

Por Mario Calvo · · 13 min de lectura

Respuesta rápida

Para subir un email HTML a Content Builder de Salesforce a mano, entra en Content Builder, pulsa Create, elige Email Message y después HTML Paste. Ponle nombre y carpeta, pega el código, rellena el asunto y el preheader, revisa la vista previa y guarda. Si subes emails a menudo, usa la API REST: pide un token a /v2/token y manda un POST a /asset/v1/content/assets con el tipo htmlemail (id 208) y las vistas html, subjectline y preheader. Antes de enviar, pon respaldo a cada campo personalizado con AttributeValue() y Empty(), y prueba con un suscriptor que tenga campos vacíos.

Lo que vas a encontrar

¿Cómo se sube un email HTML a Content Builder a mano?

Content Builder es la biblioteca de contenido de Salesforce Marketing Cloud Engagement. Ahí viven los emails, las plantillas, los bloques y las imágenes. Si ya tienes el HTML terminado, el tipo de email que buscas es HTML Paste. Acepta tu código tal cual, sin obligarte a rehacerlo por bloques.

Estos son los pasos:

  1. Abre Content Builder y pulsa Create.
  2. Elige Email Message.
  3. Selecciona HTML Paste.
  4. Rellena las propiedades: nombre, descripción si la usáis y la carpeta donde se va a guardar. Pulsa Next.
  5. Pega el HTML en el editor de código.
  6. Escribe el asunto y el preheader.
  7. Revisa la vista previa y guarda.

Dos caminos para llegar a Content Builder: a mano con HTML Paste en seis pasos, y por API con un token, un asset htmlemail y sus vistas

La formación oficial de Salesforce pone HTML Paste junto a las otras formas de crear un email: desde una plantilla, solo texto o a partir de un email que ya existe. Comprobado con la documentación de Salesforce en octubre de 2026: Build Emails with Content Builder en Trailhead.

Algunas costumbres ahorran muchos disgustos:

  • Ponle un nombre que se encuentre. Content Builder tiene un buscador global. 2026-10 Bienvenida 1 ES es mejor que Email final v3.
  • Elige la carpeta al principio. Mover assets después se puede, pero nadie lo hace. Las carpetas son como el resto del equipo encuentra el email.
  • Deja las imágenes alojadas. HTML Paste guarda el código, no tus archivos. Si los <img> apuntan a tu ordenador, se rompen. Sube antes las imágenes a Content Builder o usa direcciones que ya sean públicas.
  • Pega el documento entero. Con el <!DOCTYPE>, el <head> y los estilos. Content Builder guarda lo que pegas.
Forma de crear el email Cuándo encaja Qué pierdes
HTML Paste Ya tienes el HTML terminado y probado Editar por bloques arrastrando
Plantilla El equipo monta todos los emails sobre el mismo diseño Libertad en el código
Solo texto Un mensaje sencillo, como un aviso interno Imágenes, botones y diseño
Email existente Una versión nueva de algo que ya enviaste Empezar de cero y limpio

¿Cómo se sube un email HTML con la API de Content Builder?

Si subes emails cada semana, o los haces en otra herramienta, meterlos a mano cansa rápido. La API REST de Content Builder hace lo mismo en dos llamadas.

Paso 1: crea una integración de API. En Marketing Cloud, ve a Setup, luego Apps y luego Installed Packages. Crea un paquete y añádele una integración de API de tipo servidor a servidor. Dale los permisos necesarios para leer y escribir contenido. Apunta el client ID, el client secret y la URI base de autenticación. Esa URI lleva tu subdominio.

Paso 2: pide un token. Manda un POST a /v2/token en tu host de autenticación:

POST https://TU_SUBDOMINIO.auth.marketingcloudapis.com/v2/token
Content-Type: application/json

{
  "grant_type": "client_credentials",
  "client_id": "TU_CLIENT_ID",
  "client_secret": "TU_CLIENT_SECRET",
  "account_id": "TU_MID"
}

El account_id es opcional. Es el MID de la unidad de negocio. Si no lo pones, el token vale para la unidad de negocio que creó la integración. La respuesta trae un access_token y un rest_instance_url. El token dura 20 minutos, así que reutilízalo en todas las llamadas de ese rato.

Paso 3: crea el asset. Manda el email a /asset/v1/content/assets en tu host REST:

POST {rest_instance_url}/asset/v1/content/assets
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "name": "2026-10 Bienvenida 1 ES",
  "assetType": { "name": "htmlemail", "id": 208 },
  "category": { "id": 12345 },
  "views": {
    "html": { "content": "<!DOCTYPE html><html>...</html>" },
    "subjectline": { "content": "Bienvenida a la tienda" },
    "preheader": { "content": "Dentro tienes tu código del 10 %" }
  }
}

La respuesta devuelve el id del asset nuevo. Guárdalo. La próxima vez que cambies el email, manda un PATCH a /asset/v1/content/assets/{id} con el mismo cuerpo. Así se actualiza el email en lugar de crear una copia al lado.

El category.id es la carpeta. Si no lo pones, el email cae en la carpeta por defecto de la unidad de negocio.

Nombre del tipo de asset Id Qué es
templatebasedemail 207 Email hecho sobre una plantilla de Content Builder
htmlemail 208 Email con tu propio HTML (la versión API de HTML Paste)
textonlyemail 209 Email solo de texto
htmlblock 197 Un bloque HTML reutilizable, no un email completo

Comprobado con la documentación de Salesforce en octubre de 2026: token de acceso para integraciones servidor a servidor y la lista de tipos de asset. La formación de Salesforce añade que una petición REST admite hasta 4 MB. Un email con imágenes codificadas dentro del HTML puede pasarse. Mejor alojar las imágenes.

Dos avisos prácticos. No pongas nunca el client secret en código del navegador ni en una hoja compartida. Y no pidas un token nuevo para cada llamada: Salesforce pide reutilizarlo mientras vale, y demasiadas peticiones de token acaban limitadas.

¿Dónde van el asunto y el preheader?

En un asset htmlemail, el asunto y el preheader no van dentro del HTML. Cada uno tiene su propia vista. Por eso un email puede verse perfecto en la vista previa y llegar con el asunto vacío: el HTML estaba, pero nadie rellenó la vista subjectline.

A la izquierda, una bandeja con remitente, asunto, preheader, cuerpo y pie; a la derecha, el campo del asset del que sale cada parte

Lo que quieres poner En la pantalla de Content Builder En el cuerpo de la API
Nombre interno Propiedades, nombre name
Carpeta Propiedades, carpeta category.id
Asunto Campo del asunto views.subjectline.content
Preheader Campo del preheader views.preheader.content
Cuerpo del email Editor de HTML Paste views.html.content
Nombre y dirección del remitente Perfil de remitente del envío No forma parte del asset

El preheader es la línea gris que muchas bandejas enseñan detrás del asunto. Si lo dejas vacío, la bandeja lo rellena con el primer texto que encuentra en el email. Muchas veces es «Ver en el navegador» o el texto alternativo del logo. Escríbelo a propósito. Un buen preheader añade algo que el asunto no dice.

Salesforce documenta las cadenas de personalización en el asunto, en el preheader y en el cuerpo. Así que puedes saludar por el nombre también en el asunto. Ahí valen las mismas reglas de respaldo de la sección siguiente.

¿Cómo se personaliza el HTML sin romperlo?

Marketing Cloud tiene dos formas de meter datos del suscriptor en un email.

La corta es una cadena de personalización: el nombre del atributo entre dobles signos de porcentaje, como %%FirstName%%. Se escribe rápido. El problema llega cuando el campo no existe en los datos a los que envías o está vacío. El saludo puede salir como «Hola ,» con el hueco.

La segura es AMPscript con AttributeValue(). Salesforce la recomienda frente a la referencia directa porque devuelve un valor nulo cuando no hay dato, en lugar de fallar. Se combina con Empty() e Iif() para elegir un respaldo:

Hola %%=Iif(Empty(AttributeValue("FirstName")), "de nuevo", AttributeValue("FirstName"))=%%,

Una suscriptora llamada Ana ve «Hola Ana,». Alguien sin nombre ve «Hola de nuevo,».

En español conviene vigilar el género del respaldo. «Hola, cliente» o «Hola, amiga» no encajan con todo el mundo. Suele funcionar mejor un respaldo neutro, o cambiar la frase entera cuando no hay nombre. Para eso, un bloque de código se lee mejor que una línea larga:

%%[
  Var @nombre, @saludo
  Set @nombre = AttributeValue("FirstName")
  Set @saludo = Iif(Empty(@nombre), "Hola,", Concat("Hola, ", @nombre, ","))
]%%
<p>%%=v(@saludo)=%%</p>

Empty() devuelve verdadero cuando el valor es nulo o una cadena vacía. Comprobado con la documentación de Salesforce en octubre de 2026: AttributeValue(), Iif() y Empty() en la referencia de AMPscript.

Cómo lo escribes Si el campo tiene valor Si el campo está vacío o no existe
%%FirstName%% Hola Ana, Hola , (o un error si el campo no existe)
%%=AttributeValue("FirstName")=%% Hola Ana, Hola ,
%%=Iif(Empty(AttributeValue("FirstName")), "de nuevo", AttributeValue("FirstName"))=%% Hola Ana, Hola de nuevo,
Bloque de AMPscript con @saludo Hola, Ana, Hola,

Un detalle más. En Marketing Cloud, los campos viven en la data extension a la que envías. Si tu data extension llama a la columna First_Name, AttributeValue("FirstName") no encuentra nada. Mira el nombre exacto de las columnas antes de pegar. La chuleta de variables de nombre y baja en 21 plataformas tiene el mismo patrón para otras herramientas, por si trabajas con más de una.

¿Qué falla más a menudo y cómo se arregla?

Casi todos los problemas con HTML en Content Builder vienen de las mismas pocas causas. Ninguna es difícil de arreglar si sabes dónde mirar.

Lo que ves Causa probable Cómo se arregla
El asunto llega vacío Nadie rellenó el campo o la vista subjectline Rellénalo en el editor o mándalo en el cuerpo de la API
«Hola ,» con hueco Cadena de personalización simple y campo vacío Usa AttributeValue() con Iif() y Empty()
Imágenes rotas El src apunta a archivos locales Sube las imágenes a Content Builder o usa direcciones públicas
Aparece una segunda copia del email Mandaste otro POST en vez de un PATCH Guarda el id del asset y actualiza con PATCH
Error 401 de la API El token caducó a los 20 minutos Pide un token nuevo y repite la llamada
El email cae en otra unidad de negocio El token se pidió sin account_id Añade el MID de la unidad de negocio correcta
El envío se bloquea por falta de baja El HTML no lleva enlace de baja Pon el enlace de baja de Salesforce en el pie
Enlaces sin parámetros de seguimiento Las UTM se pusieron a mano y faltan algunas Añade las UTM a todos los enlaces antes de subir

Dos de estos merecen una explicación.

El enlace de baja. Los emails comerciales necesitan un enlace de baja que funcione, y los envíos comerciales de Marketing Cloud cuentan con él. Si el HTML viene de otra plataforma, su etiqueta de baja aquí no sirve. Cámbiala por la de Salesforce antes de subir.

Los parámetros de seguimiento. Si mides las campañas en Google Analytics, cada enlace necesita sus parámetros UTM. Ponerlos a mano en un email con quince enlaces es donde aparecen los errores. La guía de UTM en campañas de email propone una forma de nombrarlos que se mantiene igual en todos los envíos.

¿Lo subo a mano o con la API?

Depende de cada cuánto lo hagas y de quién lo haga.

Súbelo a mano cuando el email es puntual, cuando quien lo envía no es técnico, o cuando necesitas mirar el resultado antes de que pase nada más. HTML Paste sirve de sobra.

Usa la API cuando subes más de unos pocos emails al mes, cuando el HTML sale de otra herramienta o cuando el mismo email existe en varios idiomas. La API quita los errores de copiar y pegar. Además deja actualizar el email en su sitio, que importa cuando alguien ve una errata con el email ya metido en un journey.

Si necesitas varios idiomas, puedes subir un email por idioma o uno solo con todos dentro, con condiciones de AMPscript sobre un campo de idioma. La guía de plantillas de email en varios idiomas compara las dos opciones.

Cómo se hace con Remite

Remite crea el email desde un brief, escribe las variables en AMPscript y puede mandar el resultado directo a tu Content Builder. Este es el flujo real.

  1. Marca. Configuras tu marca una vez. Remite lee tu web para sacar colores, logo, fuentes y estilo. Eliges Salesforce como plataforma. Para usar los nombres reales de tus campos, abre Conectar CRM y pega la primera línea de una de tus data extensions. En Salesforce los campos viven en cada data extension, así que Remite los lee de ahí.
  2. Brief. Cuentas el email: objetivo, público, productos, oferta. Remite puede leer productos, precios y fotos de tu web.
  3. Antes de generar. Remite revisa el brief y, si falta algo importante, te hace una o dos preguntas rápidas.
  4. Edición. Cambias el email por chat, tocando el texto directamente o con Comentar encima de cualquier bloque. En Enlaces revisas cada enlace y pones las UTM una sola vez para todo el email.
  5. Asunto y preheader. Remite escribe el asunto con variantes A/B y el preheader. Van en sus propios campos, como espera Content Builder.
  6. Exportar. Los campos personalizados salen con AttributeValue() y un respaldo con Iif() donde la frase se rompería sin el dato. El pie lleva el enlace de baja de Salesforce. Si tienes varios idiomas, eliges Uno con todos los idiomas para tener condiciones de AMPscript sobre tu campo de idioma, o un email por idioma.
  7. Enviar a Salesforce (beta). Pegas el subdominio, el client ID, el client secret y, si quieres, el MID. El enlace ¿De dónde saco esto? explica dónde están en Installed Packages. Remite crea un asset htmlemail en Content Builder con el HTML, el asunto y el preheader. Si ya existe un email HTML con el mismo nombre, lo actualiza en lugar de hacer una copia. Tus claves se quedan en tu navegador.

Si prefieres subirlo tú, Copiar HTML te da el código listo para HTML Paste y Descargar ZIP lo guarda como archivo.

Dos límites, para que sepas qué esperar. Remite no elige la carpeta: el email cae en la carpeta por defecto de Content Builder y lo mueves tú. Y no configura el envío, el perfil de remitente ni el journey. Eso lo haces en Marketing Cloud como siempre.

Si quieres probar bien las variantes del asunto cuando el email ya esté en Salesforce, la guía del test A/B de asunto explica cómo leer el resultado. Y si estás decidiendo qué emails de lifecycle montar primero, la página de lifecycle tiene el resumen. El diagnóstico automático de lifecycle llegará próximamente.

Preguntas frecuentes

¿Cómo pego HTML en Salesforce Marketing Cloud?

En Content Builder, pulsa Create, elige Email Message y selecciona HTML Paste. Rellena nombre y carpeta, pega el código en el editor, escribe el asunto y el preheader, revisa la vista previa y guarda.

¿Cuál es el id del tipo de asset de un email HTML?

El tipo htmlemail tiene el id 208. Los emails hechos con plantilla son el 207 y los de solo texto, el 209.

¿Dónde va el asunto en la API de Content Builder?

En views.subjectline.content. El preheader va en views.preheader.content y el HTML en views.html.content. El asunto no va dentro del HTML.

¿Cómo actualizo un email sin crear un duplicado?

Guarda el id que devuelve la API al crear el asset. Manda los cambios con un PATCH a /asset/v1/content/assets/{id}. Un POST nuevo crea un segundo asset.

¿Cuánto dura un token de la API de Marketing Cloud?

Veinte minutos. Reutiliza el mismo token en todas las llamadas de ese rato y pide otro cuando caduque.

¿Cómo evito el «Hola ,» cuando falta el nombre?

Usa AttributeValue() con Iif() y Empty(), por ejemplo %%=Iif(Empty(AttributeValue("FirstName")), "de nuevo", AttributeValue("FirstName"))=%%. Después prueba con un suscriptor que no tenga nombre.

¿Puedo subir un solo email con varios idiomas?

Sí. Puedes meter todas las versiones en un HTML con condiciones de AMPscript sobre un campo de idioma, o subir un email por idioma. Uno solo se mantiene mejor; uno por idioma se revisa mejor.

¿Remite manda el email a Content Builder?

Sí, con Enviar a Salesforce (beta). Crea o actualiza un email HTML en Content Builder con el asunto y el preheader. El envío se sigue configurando en Marketing Cloud.

Si prefieres dejar de pegar HTML y reescribir AMPscript a mano, puedes apuntarte a la lista de espera de Remite.