Para un constructor de SaaS
Editor + páginas + almacenamiento + plantillas
Guía de arquitectura SaaSPageKit: el creador de sitios GrapesJS autoalojado, con el código fuente incluido. Obtener acceso anticipado
Deja que tus usuarios construyan las páginas visualmente mientras tu equipo de desarrollo controla el editor, los componentes, el sistema de diseño, los datos, los permisos y el flujo de trabajo de publicación. Tú construyes el producto. GrapesJS es el motor de edición dentro de él.
Capas
Página principal — borrador
Ajustes
Esto es GrapesJS en sí, arrancado en tu navegador en esta página — no es una captura de pantalla ni un vídeo. Arrastra un bloque, selecciona un elemento y cambia el estilo. Todo en el lienzo es HTML y CSS simples, que es exactamente lo que tus usuarios estarían produciendo.
No estás instalando un creador de páginas. Estás añadiendo una función de edición sin código a un producto que ya posees — con tus usuarios, tus permisos, tus datos y tu publicación. El editor visual es una capa de eso, y es la capa que no tienes que escribir.
La cadena, de extremo a extremo
Cada capa por encima y por debajo del motor es tu producto. Ahí es donde reside tu diferenciación — y es donde debe ir tu tiempo de ingeniería.
Lo más útil que debes decidir antes de escribir cualquier código: qué subsistema pertenece a tu aplicación, cuál viene con el editor y cuál puedes comprar ya de fábrica. Todo lo que necesita un servidor está a la izquierda.
Nada que requiera un servidor aparece en GrapesJS. El editor se ejecuta en el navegador; no tiene idea de quién está conectado.
Un editor visual parece una demo de arrastrar y soltar hasta que lanzas uno. Estos son los subsistemas que resultan ser obligatorios, más o menos en el orden en que el gesto del usuario los recorre — y cada uno tiene que seguir funcionando mientras los demás cambian.
Nada de eso es tu producto. Construir el producto alrededor de un motor de editor existente es un proyecto fundamentalmente diferente a construir el propio motor de editores: el primero entrega una funcionalidad, el segundo compromete a un equipo a mantener un editor para siempre.
GrapesJS es un framework de editor visual de código abierto que tú mismo alojas e integras. Te proporciona la capa de edición — lienzo, componentes, estilo, paneles, comandos — como módulos documentados que configuras, amplías o reemplazas. Cada módulo a continuación enlaza con su propia documentación, para que puedas comprobar cada reclamación antes de comprometerte.
Versión 0.23.6, con licencia BSD-3-Clause; el envoltorio oficial @grapesjs/react es MIT. Ambos permiten uso comercial. Lo que GrapesJS no incluye es igualmente importante: no hay backend, no hay usuarios, ni permisos ni pipeline de publicación — véase el límite de responsabilidad arriba.
Un creador profesional sin código nunca expone todo el editor a todos los usuarios. Esa es la diferencia entre un juguete y una función de producto. Tu equipo decide — por rol, por plantilla, por componente — cuánto del editor puede alcanzar una persona determinada.
Diez decisiones que siguen siendo tuyas
const editor = grapesjs.init({
container: '#editor',
// 1. The user only ever sees blocks you registered.
blockManager: { blocks: approvedBlocks(user.role) },
// 2. The Style Manager only offers properties you allow.
styleManager: { sectors: allowedSectors(user.role) },
// 3. Devices are your breakpoints, not arbitrary widths.
deviceManager: { devices: BRAND_BREAKPOINTS },
});
// 4. Lock the chrome: a marketer never edits the header or the footer.
editor.on('component:add', (component) => {
if (LOCKED_TYPES.includes(component.get('type'))) {
component.set({
editable: false,
draggable: false,
removable: false,
copyable: false,
});
}
});
// 5. Hide panels this role has no business seeing.
if (!user.can('edit_code')) {
editor.Panels.removeButton('options', 'export-template');
}
// Every line above is a RENDERING decision. The server still checks
// user.can('publish') before it accepts the payload.Todo lo anterior es una decisión de renderizado. Ocultar un panel no es un permiso: un usuario determinado aún puede llamar al API del editor desde una consola. Tu backend debe revisar las mismas reglas antes de aceptar una partida guardada o una publicación. Consulta la sección de roles más abajo.
No necesitas tres editores para atender a tres tipos de usuario. Una instancia GrapesJS, configurada desde el rol del usuario iniciado sesión, produce tres productos realmente diferentes. Cada columna siguiente muestra lo que añade a la anterior.
Para personas que nunca han abierto una herramienta de diseño y nunca deberían tener que hacerlo.
Añade todo lo que un propietario de campaña necesita para lanzar sin desarrollador.
Añade los controles que espera un diseñador interno o un operador de agencia.
La configuración es de datos, no de código. Lo que significa que la diferencia entre tu plan Starter y tu plan Enterprise puede ser una fila en una tabla.
La forma más rápida de hacer un editor visual seguro es no ofrecerle nada inseguro. Si alimentas tus tokens en el Style Manager y tus componentes en el Block Manager, "fuera de marca" deja de ser un problema de reseña: se vuelve inaccesible.
Color
Tipo y escala
Espaciado
Disponible en el editor
No accesible
Los usuarios crean contenido real sin poder romper la coherencia de marca — y tu equipo de diseño deja de revisar las páginas una a una. Si ya envías una biblioteca de componentes, esos componentes se convierten en los bloques.
Un lienzo en blanco no es libertad, es una mirada vacía. El mayor factor que determina si los usuarios no técnicos tienen éxito en tu constructor es si lo primero que ven es un conjunto seleccionado de secciones que ya parecen tu producto.
Titular, sublínea, un llamado a la acción.
Cuadrícula de características de dos a cuatro columnas.
Tarjetas de plan transferidas a los datos de tu propio plan.
Cita, atribuición, logotipo opcional.
Pares de preguntas y respuestas.
Un mensaje, un botón.
Campos de formulario que se publican en tu endpoint.
Normalmente cerrados, siempre presentes.
Los bloques responden "¿qué puedo añadir?". Las plantillas responden "¿por dónde empiezo?". Envía un conjunto pequeño y con opiniones — un tipo de página que realmente crean tus usuarios, no una galería.
Tipos de plantillas que merecen la pena enviar
Las plantillas son proyectos guardados ordinarios con una bandera. Almacenarlas es tarea de tu aplicación, lo que significa que también lo es el versearlas.
La mejor experiencia sin código no obliga a los usuarios a diseñarlo todo desde cero.
En tu base de datos, en tus endpoints, bajo tu esquema. GrapesJS de GrapesJS es un cliente HTTP con una URL de carga y una URL de almacén — no es un servicio de alojamiento, y GJS.Market no guarda las páginas de tus clientes.
Qué ocurre realmente al guardar
grapesjs.init({
container: '#editor',
storageManager: {
type: 'remote',
autosave: true,
autosaveIntervalMs: 10_000, // debounce: one write, not one per keystroke
stepsBeforeSave: 20,
options: {
remote: {
urlLoad: `/api/pages/${pageId}`,
urlStore: `/api/pages/${pageId}`,
headers: { Authorization: `Bearer ${token}` },
},
},
},
});
// The editor sends you project JSON. What that JSON is allowed to
// become — a draft, a revision, a published page — is your API's call.GrapesJS proporciona la capa de edición. Tu aplicación controla cómo se almacenan y publican los proyectos — por eso también los borradores, revisiones y rollbacks son tuyos para diseñar. El guardado automático pertenece a un debounce; guardar por pulsación es un ataque de denegación de servicio a tu propio API.
Dos artefactos, dos trabajos
El árbol de componentes, estilos y recursos que el editor necesita para reabrir la página exactamente tal y como estaba. Versionado, diffable, nunca servido a los visitantes. Esto es lo que es una revisión.
Lo que producen 'editor.getHtml()' y 'editor.getCss()': una página estática que limpias, almacenas y sirves. Un visitante nunca debería cargar el entorno de ejecución del editor.
Editar y publicar son acciones diferentes con perfiles de riesgo distintos, y un producto sin código de producción las separa. Las dos etapas bloqueadas que aparecen a continuación son donde debe estar una comprobación de autorización — no en el editor, sino en tu API.
Una fila de proyecto sin URL activa.
Proyecto JSON guardado automáticamente, revisión por sesión.
Salida renderizada en una URL temporal firmada.
Un revisor ve la vista previa, no el editor.
Un estado cambia tu API autoriza y registra.
Resultados desinfectados escritos en tu lugar de producción.
Autorización comprobada aquí
Los permisos, aprobaciones y lógica de publicación pertenecen a la aplicación y a su backend. GrapesJS no tiene concepto de borrador, aprobación o URL activa — esos estados están en tu base de datos, y el rollback es simplemente publicar una revisión anterior.
Cuatro roles cubren la mayoría de los productos de construcción. Cada uno recibe un editor realmente diferente porque cada uno carga una configuración distinta — pero todos se aplican en el mismo lugar: tu backend.
Configura el editor, las plantillas y los roles
Edita el diseño y los estilos
Previsualiza y aprueba; no se puede editar
Edita texto e imágenes; no puede cambiar el diseño
Cómo se traslada una decisión de permiso
La autenticación y autorización a nivel de aplicación las gestiona tu backend. El editor es la última parada en esa cadena, nunca la primera: muestra las consecuencias de una decisión que tu servidor ya ha tomado, y tu servidor debe volver a tomarla cuando llega la partida.
La misma arquitectura — tu producto, tus usuarios, el motor de edición, tu API — incluye siete productos bastante diferentes. Cada tarjeta enlaza con la guía que cubre bien esa opción.
Tus clientes crean páginas dentro de tu SaaS, sobre tus planos, contra tus cuotas.
Guía de arquitectura SaaSLos usuarios construyen páginas web completas de varias páginas visualmente, con tus componentes como vocabulario.
Mecánicas de arrastrar y soltarLos equipos de marketing lanzan campañas sin esperar a un desarrollador o un despliegue.
Guía de página de aterrizajeLos editores componen el contenido de forma visual mientras el CMS sigue siendo la fuente de verdad.
Guía de CMS headlessLos usuarios ensamblan los diseños de correo electrónico sin tocar HTML basado en tablas.
Guía para crear correos electrónicosLos clientes personalizan contenido controlado dentro de un portal que tú defines completamente.
Guía de incrustaciónOfrece al editor como parte de tu propio producto de marca, a tu nombre.
Guía de marca blancaEsta tabla es deliberadamente estrecha: solo compara el motor de edición. Todo lo que aparece en el límite de responsabilidad marcado como "tu aplicación" es tu trabajo de cualquier forma — ese es el punto.
| Capacidad | Construir desde cero | GrapesJS |
|---|---|---|
| Lienzo visual | Construcción | Disponible |
| Componentes | Construcción | Disponible |
| Arrastrar y soltar | Construcción | Disponible |
| Bloques | Construcción | Extensible |
| Estilo | Construcción | Disponible |
| Capas | Construcción | Disponible |
| Comandos | Construcción | Disponible |
| Integración de almacenamiento | Construcción | Configurable |
| Componentes personalizados | Construcción | Compatible |
| Arquitectura de plugins | Construcción | Compatible |
| UX específico de producto | Construcción | Personalizable |
Capacidades comprobadas con la documentación GrapesJS 0.23.6; listados de catálogo y precios verificados 2026-09-03.
No construyas el motor de edición si tu producto real es la aplicación que lo rodea.
Listados reales del catálogo GJS.Market, agrupados por el trabajo que haces en lugar de por la taxonomía del catálogo. Los precios vienen del catálogo en vivo, así que lo que ves aquí es lo que cuesta un producto hoy.
Sustituye o remodela el editor Chrome para que se lea como parte de tu producto.
Explora esta categoríaUn panel de editor sin panel: el punto de partida más claro cuando el Chrome por defecto no es tu producto.
React para el editor UI, así que los paneles están en tu propio árbol de componentes.
Filtra el Style Manager hasta las propiedades que debería ver un rol dado.
Reglas y guías en el lienzo, para usuarios que se preocupan por dónde se alinean las cosas.
La paleta y los puntos de partida desde los que realmente trabajan tus usuarios.
Explora esta categoríaGuarda cualquier selección como un bloque reutilizable que todo tu equipo pueda arrastrar.
Gestiona una biblioteca de plantillas dentro del editor en vez de añadir una.
Un juego de bloques nativo Tailwind, si tu sistema de diseño ya es Tailwind.
Un conjunto de bloques Bootstrap 5, si ese es el framework que ya usa tu salida.
Adaptadores que apuntan el Storage Manager a un backend que ya usas.
Explora esta categoríaGuardar proyectos en Directus sin una capa de persistencia personalizada que escribir.
Persistencia respaldada por Firebase para equipos que ya están en Firebase.
Persistencia local — útil para borradores offline y para prototipar antes de que exista tu API.
Reduce la frecuencia con la que el editor escribe, para que autosave no pueda saturar tu API.
Proyectos de varias páginas, cambio de proyectos y símbolos reutilizables.
Explora esta categoríaProyectos de varias páginas: la diferencia entre un editor de páginas y un creador de sitios.
Cambia entre proyectos guardados desde dentro del editor.
Instancias reutilizables que se actualizan en todas partes a la vez — las partes compartidas de tu sistema de diseño.
El preajuste de página web: una configuración por defecto sensata desde la que empezar un creador de sitios.
Apunta el Asset Manager a Cloudinary en vez de construir un uploader.
Subidas potenciadas por Uppy con transferencias reanudables y tu propio destino de almacenamiento.
Expone exactamente las fuentes que permite tu marca, y ninguna otra.
Recorta y ajusta las imágenes dentro del editor en lugar de enviar a los usuarios a otro sitio.
Exporta, despliega e inspecciona lo que ha producido el editor.
Explora esta categoríaExporta el HTML, CSS y los recursos producidos como un archivo descargable.
Envía la salida producida directamente a un sitio Netlify.
Vista de código por componente para los usuarios avanzados que lo solicitan.
Convierte el proyecto almacenado JSON en HTML y CSS en el servidor, en el momento de publicación.
Las piezas interactivas que los usuarios piden en la segunda semana.
Explora esta categoríaDeslizadores deslizantes que tus usuarios pueden configurar sin necesidad de código.
Formulad campos y entradas, publicando donde les digas.
Paneles con pestañas como componente — recuerda que la copia con pestañas está oculta a los rastreadores.
Dos cosas que necesitarás están deliberadamente ausentes de estas estanterías, porque el catálogo no las tiene: un plugin de roles y permisos, y un plugin de flujo de trabajo de aprobación. Ambos deberían estar en tu aplicación de todos modos — consulta las secciones de roles y publicaciones anteriores, o llévalas a nuestro equipo de implementación.
Tres combinaciones que ponen un constructor en funcionamiento delante de los usuarios rápidamente. Cada una es un punto de partida, no una lista de materiales — cambia cualquier fila por la equivalente que encaje en tu backend.
Editor + páginas + almacenamiento + plantillas
Guía de arquitectura SaaSBloques + plantillas + recursos
Guía de página de aterrizajeUI personalizado + estilos controlados + componentes compartidos
Guía de marca blancaLos precios se leen del catálogo en vivo en el momento de compilación. Los plugins gratuitos son de código abierto y autoalojados como el núcleo.
El white labeling no es ocultar un logotipo. Consiste en hacer que el editor se lea como una característica de tu aplicación en lugar de como una herramienta de terceros que alguien ha incorporado.
Tus colores, tipografía e iconografía en todo el editor Chrome.
Reconstruye las barras de herramientas en función de las tareas reales de tus usuarios.
Los componentes de tu sistema de diseño, nombrados como los nombre tu equipo.
Si tus usuarios dicen "módulo", el editor no debería decir "component".
Eliminar controles es la personalización menos utilizada que existe.
Valores predeterminados, estados vacíos y la incorporación que coincidan con el resto de tu producto.
Eliminar la marca GrapesJS es trivial y está permitido por la licencia BSD-3-Clause. Hacer que el editor sienta que tu producto es un proyecto de diseño — paneles, terminología, valores predeterminados y todo lo que un usuario no ve.
GrapesJS se renderiza en un elemento DOM simple, así que integrarlo depende principalmente de qué gancho de ciclo de vida llama 'grapesjs.init()' y cuándo se limpie. Elige tu framework para los detalles específicos.
Un efecto que se inicia al montar y destruye al desmontar. El envoltorio oficial de @grapesjs/react (MIT) está disponible si quieres el propio UI del editor como componentes React.
Véase integración ReactUn compuesto que llama a init desde 'onMounted' y a destroy desde 'onBeforeUnmount'. No hay un envoltorio oficial de Vue: llamas directamente al mismo API.
Véase integración VueUn componente que usa 'ngAfterViewInit' y 'ngOnDestroy', con el editor fuera de la detección de cambios de Angular. No existe ningún envoltorio oficial de Angular.
Véase integración AngularSolo en el lado del cliente: el editor toca 'ventana' en el ámbito del módulo, así que cárgalo a través de una importación dinámica con SSR desactivado.
Véase integración Next.jsTu framework alimenta la aplicación. GrapesJS alimenta la capa de edición visual.
La diferencia entre "el editor funciona" y "podemos poner clientes en él" es más o menos esta lista. Cada grupo enlaza de nuevo a la sección que lo argumenta.
Lo que el usuario puede alcanzar y lo que no.
Registrar bloques por rol, no una vez a nivel global.
Persistencia en la que el usuario puede confiar para un día de trabajo.
autosave reboteado, no es una escritura por pulsación.
Todo lo que produce el editor proviene de un usuario.
Desinfecta al salir, en el servidor.
La diferencia entre la adopción y una cola de soporte.
Las plantillas superan a un lienzo vacío cada vez.
La edición y la publicación tienen diferentes perfiles de riesgo.
Rollback está publicando una revisión anterior.
El editor ahora forma parte del tiempo de actividad de tu producto.
Errores del editor de registros con el id del proyecto adjunto.
Un constructor sin código es, por construcción, una función que permite a los usuarios incluir contenido arbitrario en tu producto. Trata todo lo que produce como entrada no confiable, porque lo es.
Pasa el HTML y CSS producidos por un desinfectante revisado en el servidor antes de almacenarse o servirse.
Comprueba el tipo, tamaño y dimensiones del lado del servidor, y sirve medios de usuario desde un origen separado.
Cada guardado, aprobado y publicado se autoriza de nuevo en el servidor, lo que sea que haya mostrado el editor.
Un panel oculto es un estado UI. El API del editor sigue siendo accesible desde una consola de navegador.
El proyecto JSON también es entrada del usuario. Valida su forma antes de devolverla a un renderizador.
Si permites un componente de código personalizado, decide deliberadamente dónde se ejecuta y quién puede añadir uno.
Limita la velocidad, alcanza el alcance por proyecto y registra cada llamada.
GrapesJS es una biblioteca de edición, no un límite de seguridad. No garantiza la seguridad del marcado que produce, y no puede: el marcado proviene de tu usuario. La sanitización, validación y autorización son responsabilidad de tu aplicación.
El editor es una aplicación pesada del lado del cliente que vive dentro de tu producto. La mayoría de los logros vienen de no cargarlo — y de no cargarlo dos veces.
Arranca el editor cuando un usuario lo abre, no cuando la ruta se carga.
Plugins de importación dinámica que el puesto actual puede usar realmente.
Cada plugin registrado cuesta tamaño de paquete y tiempo de inicio para siempre.
Cientos de bloques ralentizan la paleta y paralizan al usuario.
Redimensiona y vuelve a codificar al subir: los usuarios insertarán 8 MB en un hero.
Una escritura cada pocos segundos, no una por pulsación.
Las imágenes base64 en línea convierten una fila de proyecto en megabytes. Almacena referencias, no datos.
La página publicada nunca debe llevar el editor. Un visitante carga HTML y CSS; solo un autor carga el motor.
La IA en un creador de páginas es más útil y menos peligrosa cuando se trata como otro usuario del mismo editor — uno que solo puede producir lo que un humano en el mismo rol podría haber producido.
Forma una sección a partir de tus bloques registrados, no a partir de marcado libre.
Rellena los nodos de texto de un diseño existente, dejando la estructura intacta.
Propone una disposición de componentes aprobados para un objetivo establecido.
Reescribe para medir la longitud, el tono o el lugar en el sitio.
Redacta una nueva definición de componente para que un desarrollador la revise — nunca para registrarla automáticamente.
Sugiere ediciones contra criterios medibles y deja que un humano las apruebe.
La IA debería operar dentro de las mismas restricciones de componentes y sistemas de diseño que los usuarios humanos. Si un generador puede emitir HTML arbitrario que tu paleta de bloques nunca ofrecería, has reabierto todos los agujeros que has cerrado.
Las capacidades anteriores describen un patrón que puedes construir sobre el propio APIs del editor, no una función de GJS.Market lanzada. El catálogo sí tiene una estantería de IA — generación de miniaturas, ayudantes respaldados por GPT — y está enlazada arriba.
Implementación
La mayoría de los equipos no se quedan atascados en 'grapesjs.init()'. Se quedan atascados en las partes que esta página dice que son suyas — permisos, publicación, almacenamiento y hacer que el editor se sienta como su producto. Eso es lo que hace nuestro equipo.
Da a tus usuarios la libertad de construir visualmente sin perder el control de tu producto.
Cuéntanos qué estás construyendo y consigue un plan definido para el editor dentro de tu producto.
Empieza a construir con GrapesJSBloques, adaptadores de almacenamiento, interfaces de editor y componentes — listados reales con precios actuales.
Explora los plugins GJS.MarketIntegración, componentes personalizados, permisos y flujos de trabajo de publicación, construidos con tu equipo.
Habla con un expertoTu producto. Tus usuarios. Tus reglas. Tu editor.