Arrastrar y soltar
Los usuarios construyen los diseños moviendo bloques sobre el lienzo, en el orden en que los desean.
PageKit: el creador de sitios GrapesJS autoalojado, con el código fuente incluido. Obtener acceso anticipado
Ofrece a tus usuarios una forma visual de crear plantillas de correo responsivas — bloques reutilizables, MJML, componentes personalizados y exportación HTML lista para producción, todo dentro de tu propio producto.
El bucle en el que viven tus usuarios
26k+
GitHub estrellas
100+
Plugins en GJS.Market
10 years
Desarrollo activo
BSD-3-Clause
Licencia principal
Abre una plantilla de la estantería, cámbiala y guárdala como una nueva. La estantería crece en uno. Ese bucle —no los diseños individuales— es lo que ofrece un creador de plantillas de correo electrónico a tus usuarios.
Biblioteca de plantillas
Añadir un bloque
Tu logo
Bienvenido a bordo, {{ user.first_name }}
Así es como poner en marcha tu primer proyecto.
Abre tu salpicadero
Cancelar suscripción · Gestionar preferencias
Las etiquetas de fusión permanecen intactas: tu renderizador las resuelve por destinatario en el momento de enviarlas.
La demo anterior es un modelo del bucle. Esto es el propio GrapesJS, ejecutando el preset oficial de MJML — cargado solo cuando lo pides, así que esta página no cuesta nada hasta entonces.
Abrir en una pestaña nuevaLa demo del editor MJML publicada por el propio proyecto GrapesJS. Añade una sección, edita el texto y luego mira el marcado generado.
Carga un iframe desde la propia web de la demo.
En GJS.Market
Editor MJML está disponible como producto
Un generador de plantillas de correo permite a las personas crear y cambiar la disposición de los correos de forma visual en lugar de escribir a mano el marcado HTML de correo. Una *biblioteca* de plantilla envía diseños terminados; un *creador* de plantillas ofrece la capacidad de crearlos — y de seguir haciéndolos después de que los hayas enviado.
Escribe el HTML
tablas, estilos en línea, comentarios condicionales
Prueba entre clientes
No puedes ver el resultado mientras escribes
Dásela a marketing
como un archivo, o pegado en una herramienta
Cada cambio vuelve a ti
Un ticket de desarrollador por ajuste
Una plantilla, un propietario, un cuello de botella.
Abre un punto de partida
de la estantería, o en blanco
Edición visual
El resultado está en pantalla todo el tiempo
Guárdalo como plantilla
una fila que posee tu cliente
Reutilizarlo y revertirlo
Sin entrada, sin promotor
Muchas plantillas, propiedad de quienes las envían a ellas.
Las plantillas ofrecen a tus usuarios un punto de partida. Un constructor les da control.
Una biblioteca es una estantería con techo: cubre lo que fue construida para cubrir, y las peticiones por encima de esa línea no tienen a dónde ir. Un constructor es un bucle — y la estantería crece cada vez que alguien la rodea.
"Necesitamos un correo de bienvenida limpio para el viernes."
Biblioteca de plantillas
Resuelto. Para esto es exactamente para lo que sirve una buena biblioteca: elige una, cambia las palabras, envía.
Generador de plantillas
También resuelto, desde los mismos puntos de partida. Un constructor nave con una biblioteca dentro.
"Cada inquilino necesita su propio fundamento legal."
Biblioteca de plantillas
Un pie de página compartido, o un fork de cada plantilla por inquilino.
Generador de plantillas
Un bloque de pie de página, guardado una vez por inquilino y reutilizado en sus plantillas.
"Poned el pedido real del cliente en el recibo."
Biblioteca de plantillas
Texto estático provisional. Los datos tienen que empalmarse aguas abajo.
Generador de plantillas
Un componente vinculado a tu modelo de pedidos, editable como bloque y resuelto en el momento de enviar.
"Restaura la versión que enviamos el martes pasado."
Biblioteca de plantillas
Lo que sea que se haya sobrescrito es lo que tienes.
Generador de plantillas
Una fila de versiones. La restauración es una consulta, no un proyecto arqueológico.
"Deja que nuestros clientes construyan los suyos propios, sin enviarnos correos."
Biblioteca de plantillas
No es lo que hace una biblioteca — no tiene una superficie de autoría.
Generador de plantillas
El objetivo principal. Tus usuarios crean y mantienen plantillas que nunca ves.
Envía la biblioteca. Luego envía lo que haga más de ellos.
La superficie de edición que obtienen tus usuarios, y las partes de ella que controlas.
Los usuarios construyen los diseños moviendo bloques sobre el lienzo, en el orden en que los desean.
El texto, las imágenes y los enlaces se editan en su lugar, con el resultado renderizado en pantalla todo el tiempo.
Las secciones que tus usuarios guardan una vez y luego las dejan en cualquier plantilla.
Previsualiza y ajusta el diseño en los anchos que importan para el correo electrónico, mientras editas.
Crea contra mjml donde quieres que se genere un marcado responsivo para ti en lugar de que se mantenga a mano.
Produce el HTML del correo electrónico que tu flujo de trabajo de entrega ya espera.
Gestiona las imágenes que hace referencia una plantilla, en la tienda que ya uses.
Añade componentes editables que reflejen los datos y flujos de trabajo de tu propio producto.
Una pila completa de historiales, así que experimentar con la plantilla de otra persona es seguro.
Da a los usuarios una biblioteca de secciones para ensamblar, en lugar de hacer que empiecen cada correo desde un lienzo vacío. Cada una es una definición de bloque que registras una vez.
Logo, texto del preencabezado y la fila de navegación, si usas alguno.
La declaración inicial y la primera llamada a la acción.
Una fila o cuadrícula de artículos, vinculados a tu catálogo donde quieres que estén vivos.
Filas cortas de iconos y texto para notas de lanzamiento y incorporación.
Comparación de planos diseñada para sobrevivir a un renderizador basado en tablas.
Una cita, una atribución y un avatar opcional.
Un botón antibalas que se renderiza sin imágenes de fondo.
Dirección, enlace de preferencias y el enlace de baja que legalmente debes incluir.
Los bloques estándar cubren la distribución. Lo que hace que el constructor sea tuyo son los componentes que conocen tus datos: un pedido, una suscripción, una reserva, una recomendación.
Estándar
Los primitivos que todo correo necesita necesita. Vienen con el editor.
Compuesta
Tus bloques estándar, montados una vez y registrados para reutilización.
Bound
Componentes con rasgos que tus usuarios establezcan y etiquetas de fusión que tu renderizador resuelve por destinatario.
El editor renderiza un marcador de posición mientras se escribe la plantilla. Tu backend intercambia los valores reales en el momento de enviar.
// A component bound to your own model. The editor renders a placeholder; your
// backend swaps in the real order at send time, per recipient.
editor.DomComponents.addType('order-summary', {
model: {
defaults: {
droppable: false,
// Traits are the fields the person editing the template can set.
traits: [
{ name: 'orderId', label: 'Order', type: 'text' },
{ name: 'showTax', label: 'Show tax line', type: 'checkbox' },
],
// Merge tags survive export untouched and are resolved by your renderer.
components: '<mj-text>{{ order.total }}</mj-text>',
},
},
});En un sistema de plantillas, las plantillas difieren según quién las posee y quién puede cambiarlas — no solo por lo que dicen. Estas son las clases que merece la pena modelar desde el primer día.
Clases de propiedad
Estas son clases de propiedad en un sistema de plantillas, no productos a la venta. GJS.Market lista plugins y preajustes para editores; no vende plantillas de correo electrónico.
Previsualiza el diseño en el ancho en el que realmente se renderiza el correo electrónico, mientras aún lo estás editando. 600px es la convención de larga data para la columna del cuerpo — una convención, no una especificación.
Qué pueden cambiar los usuarios por ancho
Dos columnas en un cliente de escritorio, apiladas en un teléfono — decididas en la plantilla, no por la suposición del cliente del destinatario.
Los clientes de correo electrónico implementan HTML y CSS de forma diferente, y siempre lo han hecho. Un constructor visual no elimina eso: estandariza el paso de autoría para que salga el mismo marcado conocido de bueno cada vez.
| Cliente | Qué hace diferente | Lo que hace el constructor al respecto |
|---|---|---|
| Gmail | Elimina bloqueos <style> en algunos contextos, incluyendo las aplicaciones móviles de Gmail con cuentas que no son de Gmail. | Emite estilos con líneas en lugar de depender de que una hoja de estilos sobreviva al viaje. |
| Outlook (Windows) | Renderiza con el motor Word: no hay flexbox, ni cuadrícula, y se elimina el radio de borde en una celda de tabla. | Genera un diseño basado en tablas y botones a prueba de balas en lugar de un diseño CSS. |
| Apple Mail | El más completo de estándares de los cuatro; también el más propenso a exponer un diseño que solo funcionaba por accidente en otros lugares. | Previsualiza en cada ancho durante la edición, para que el diseño sea deliberado y no incidental. |
| Yahoo Mail | Históricamente inconsistente con las consultas de medios; el comportamiento actual es Not publicly documented. | Prefiero diseños que se degradan a una sola columna legible sin necesidad de consulta de medios. |
Restricciones verificadas en 2026-08-28. Cambios de comportamiento; Comprobar caniemail.com el estado actual y probar los correos de producción con los clientes que tu propia audiencia realmente utiliza.
mjml existe para que el marcado de correo responsivo sea algo que generes en lugar de mantenerlo a mano. GrapesJS puede extenderse con grapesjs-mjml para poner una superficie de edición visual encima.
MJML es lo suficientemente compacto como para revisarlo en una solicitud de tirada, cosa que el HTML bruto de correo no es.
El compilador emite el andamiaje de tablas y las consultas de medios, así que nadie las escribe a mano.
Mantén el MJML junto al JSON del proyecto, para que una plantilla se mantenga editable como fuente.
La pregunta que decide si tienes un constructor o un visor: ¿qué filas existen después de que un usuario haga clic en Guardar? Tres tablas lo cubren.
templates
Una fila por plantilla, asignada a un inquilino.
template_versions
Solo añadir información. Restaurar el correo del martes pasado es una consulta.
blocks
Guardé una vez, luego lo dejé en cualquier plantilla.
Una fila de versiones contiene los tres
JSON
Datos del proyecto
Lo que vuelves a cargar al editor. Sin él, una plantilla es de solo lectura para siempre.
MJML
Fuente editable
Diffable, revisable y recompilable cuando el compilador mejora.
HTML
Lo que envías
Renderizado e inlineado, entregado a tu proveedor sin cambios.
Guarda los tres. Cada uno responde a una pregunta diferente, y reconstruir cualquiera de ellos a partir de los otros es con pérdida.
Cómo se relacionan los tres formatosEl editor es un cliente. Pide a tu API una plantilla y te la devuelve; nunca aprende quiénes son tus inquilinos y nunca tiene la única copia de nada.
Dónde va una plantilla
// Storage scoped to the tenant AND the template. The editor never learns who
// the tenant is — your API does, from the session, and refuses everything else.
editor.Storage.add('remote', {
async load({ templateId }) {
const res = await fetch(`/api/templates/${templateId}/project`);
return res.json();
},
async store(project, { templateId }) {
await fetch(`/api/templates/${templateId}/project`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(project),
});
},
});Integra el editor con el backend que ya ejecutas, en lugar de mover tu flujo de trabajo de correo a la plataforma de otra persona. GJS.Market vende plugins de editor — no aloja tus plantillas ni envía tu correo.
En el momento en que un segundo cliente guarda una plantilla, la propiedad deja de ser un detalle. Tres niveles cubren casi todos los productos.
Tuyo. Visible para todos los inquilinos, editable por ninguno — los puntos de partida que mantengas.
Salvado por un cliente, visible para todo su equipo, invisible para los demás.
Trabajo en progreso. Privado hasta que alguien lo promocione a plantilla de inquilino.
El mismo sistema de plantillas, apuntando a diferentes trabajos.
Deja que los clientes creen campañas visualmente y mantén cada envío como una plantilla versionada.
Incrustación del editorPlantillas reutilizables de divulgación que comparte todo el equipo, sin que un diseñador esté al tanto.
Generador de correo electrónico de arrastrar y soltarPlantillas para viajes automatizados, con componentes vinculados al evento que los activó.
Generador de correo ReactUn flujo de trabajo de diseño sin código para escritores que nunca deberían ver una disposición de tabla.
Editor de CMS sin cabezaCreación de correos dentro del producto que la gente ya tiene abierto, no en una herramienta separada.
Creador de páginas de marca blancaEdición controlada: regiones bloqueadas por marca, texto editable, etiquetas de fusión que no se pueden romper.
Creador de páginas embebibleEl lienzo de edición es la parte visible. El resto es un sistema de plantillas — y el resto es donde va el tiempo.
De qué está hecho un sistema de plantillas
Desde cero
Todo
Con GrapesJS
La capa de edición, ya construida
GrapesJS te da la capa de edición. El sistema de plantillas encima — propiedad, versionado, arrendamiento — es tuyo, y debe serlo: es la parte que encaja con tu producto.
Listados reales del catálogo, agrupados por el trabajo que realizan dentro de un sistema de plantillas. Los nombres y precios vienen directamente del mercado, así que nada aquí puede desviarse de lo que realmente está a la venta.
Guardar, listar y reabrir plantillas — el tema de esta página.
Explora esta categoríaLo que empieza una nueva plantilla antes de que nadie haya guardado una.
Explora esta categoríaIncorpora componentes MJML al editor, compilados en tiempo real, para que se genere un marcado responsivo en lugar de escrito a mano.
El camino pre-MJML: bloques de correo electrónico basados en tablas y un inliner CSS, sin paso de compilación intermedio.
Para la parte de una plantilla que tiene que estar escrita a mano.
Explora esta categoríaConectar el almacenamiento del editor a un backend que controlas.
Explora esta categoríaPersiste los datos del proyecto en Firebase, claves según la clave que tu app tenga sus plantillas.
Persiste los datos del proyecto en Directus, lo cual es conveniente cuando las plantillas están junto a tu otro contenido.
Las imágenes a las que una plantilla hace referencia, que deben sobrevivir a la plantilla.
Explora esta categoríaApunta al gestor de activos en Cloudinary, así que las imágenes plantilla se transforman y se sirven desde un solo lugar.
Añade un flujo de carga más completo para las imágenes que tus usuarios introducen en una plantilla.
Cuatro combinaciones que ya funcionan juntas, elegidas por la biblioteca de plantillas que estás creando.
Para los clientes que mantienen cada uno su propia biblioteca
Incrustación en un SaaSPor un equipo, que produce muchas campañas
Para plantillas que estén junto a tu otro contenido
Editor de CMS sin cabezaPara un editor montado dentro de una app de React
Los precios se leen en directo desde el catálogo en el momento de la compilación.
GrapesJS es la capa de edición y se detiene en el HTML. Todo lo que viene después es tu backend y el proveedor al que ya pagas — no hay envío integrado en el editor, y aquí no se implica ninguno.
Etapa 01
El envío hace referencia a una versión específica, así que lo que se envió sigue siendo reproducible después de que la plantilla avanza.
template_versions.idEtapa 02
Tu renderizador resuelve las etiquetas de fusión por destinatario. El editor nunca ve los datos de los clientes.
{{ order.total }}Etapa 03
Basado en tablas e en línea, que es lo que todo proveedor espera recibir.
text/htmlEtapa 04
El ESP que ya uses. Cambiarlo no cambia nada del sistema de plantillas.
POST /messagesEtapa 05
Aperturas, clics y rebotes se adhieren a la versión que los produjo, lo que los hace comparables.
webhookEl núcleo del editor más el plugin oficial de MJML. Ambos son BSD-3-Clause.
npm install grapesjs grapesjs-mjmlimport grapesjs from 'grapesjs';
import grapesjsMjml from 'grapesjs-mjml';
import 'grapesjs/dist/css/grapes.min.css';
// One editor instance per template being edited. The template id — not a page
// id — is what every load and store call is keyed by.
const editor = grapesjs.init({
container: '#template-editor',
plugins: [grapesjsMjml],
pluginsOpts: {
[grapesjsMjml]: {
imagePlaceholderSrc: 'https://cdn.your-app.com/email/placeholder.png',
},
},
storageManager: {
type: 'remote',
autosave: true,
stepsBeforeSave: 10,
},
});Guardar es cuando un creador de plantillas deja de ser un editor. "Guardar como plantilla" crea una fila que pertenece a tu cliente; guardar de nuevo añade una versión en lugar de sobrescribirla.
// "Save as new template" — a row your customer owns from now on.
async function saveAsTemplate(name) {
const res = await fetch('/api/templates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name,
project: editor.getProjectData(), // re-openable in the editor
}),
});
return res.json(); // { id, name, version: 1 }
}
// Editing an existing template appends a version rather than overwriting it,
// so "restore the version we sent last Tuesday" stays a query, not a restore.
async function saveVersion(templateId) {
await fetch(`/api/templates/${templateId}/versions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ project: editor.getProjectData() }),
});
}Los detalles del framework están en sus propias páginas — esta página se mantiene neutral en cuanto al framework a propósito.
Equipos que necesitan que la creación de correos se haga dentro de su producto en lugar de al lado.
Integra la edición visual de correo electrónico en tu aplicación para que los clientes dejen de exportar a otra herramienta.
Ofrece a los clientes un creador de campañas cuyas plantillas puedas versionar, auditar y dar soporte a los usuarios.
Empieza desde una base de edición extensible en lugar de escribir un lienzo y una pila de historia.
Construye un sistema de correo reutilizable por cliente, entregado en bloques y plantillas bloqueadas.
Añadir la creación de correo sin tener un núcleo de editor y su mantenimiento para siempre.
Permite que los usuarios produzcan correos electrónicos propios de la marca sin poner margen ni abrir un ticket.
Esta página trata sobre el sistema de plantillas. Estas cubren las preguntas vecinas.
MJML entra, HTML basado en tablas en línea y se entrega a un proveedor de envío. El argumento de formato y entrega completo.
Generador de correo GrapesJSLa experiencia de edición desde el lado del marketer, más que el modelo de datos que hay debajo.
Generador de correo electrónico de arrastrar y soltarMontar y controlar el editor desde una aplicación React.
Generador de correo ReactLa misma pregunta de incrustación para páginas en lugar de correo electrónico.
Creador de páginas SaaSEmpieza con GrapesJS, adapta la experiencia de edición a tu producto y amplíala con los plugins que tu sistema de plantillas necesita.
Instala el núcleo, monta el editor y conecta el almacenamiento a tu propia API.
Lee el inicio rápidoPresets, bloques, almacenamiento y exportación — listados reales con precios en vivo.
Navegar por plugins de correo electrónicoCuéntanos qué tiene que hacer tu sistema de plantillas y nosotros cubriremos el alcance de la construcción.
Empieza un resumenLecturas relacionadas