Cómo enviar publicaciones de blog de Webflow a tu boletín informativo con un feed RSS en Webflow Cloud

Cómo enviar publicaciones de blog de Webflow a tu boletín con un feed RSS en Webflow Cloud

Aprende a crear un feed RSS 2.0 personalizado en Webflow Cloud desde tu colección de blog para que Mailchimp u otra herramienta de RSS a correo electrónico envíe solo las publicaciones que tú elijas.

Cómo enviar publicaciones de blog de Webflow a tu boletín con un feed RSS en Webflow Cloud

Ismail Ajagbe
Redactor técnico
Ver perfil del autor
Ismail Ajagbe
Redactor técnico
Ver perfil del autor
Índice de contenidos

Un feed RSS personalizado en Webflow Cloud permite que tu boletín envíe solo las publicaciones de blog que elijas, con un resumen redactado específicamente para el correo electrónico.

Webflow ya puede publicar un feed RSS para cualquier colección, y herramientas de boletines como Mailchimp o Kit pueden convertir ese feed en correos electrónicos. Sin embargo, el feed nativo incluye todas las publicaciones, y una publicación editada que se vuelve a publicar puede aparecer como nueva.

Cuando los editores deben elegir qué publicaciones llegan a los suscriptores, o cuando el correo electrónico necesita su propio resumen, un feed personalizado te brinda ese control.

En este tutorial, crearemos un Route Handler de Next.js en Webflow Cloud. Este lee tu colección de blog a través de la API de CMS y devuelve un RSS 2.0 válido, que tu herramienta de boletines consultará según su propio horario.

¿Qué necesitas para enviar publicaciones de blog a un boletín mediante RSS en Webflow?

Empieza comprobando si el feed nativo es suficiente. Puedes activarlo en la configuración de la página de la colección, en RSS Feed Settings, donde eliges el título del elemento, la descripción, la imagen y la fecha de publicación.

Para el feed personalizado, necesitas:

  • Un sitio con CMS: Premium o superior, el primer nivel con CMS, que también cubre la instalación de la aplicación en un dominio personalizado.
  • Una colección de blog: Publicaciones publicadas con título, slug, resumen y un campo de fecha que configures una vez, como "Fecha del boletín", además de un campo de interruptor opcional para las publicaciones que deben enviarse a los suscriptores.
  • Next.js 15 con npm: Los requisitos de bring-your-own-app de Webflow establecen que "solo admite el gestor de paquetes npm", así que omite pnpm y yarn.
  • Un token de sitio: Con el cms:read ámbito, en posesión del propietario del sitio, además del ID de la colección del blog.
  • Una herramienta de boletines compatible con RSS: Una función de RSS a correo electrónico o de campañas RSS que acepte una URL de feed pública y te permita establecer un horario de envío.

Elige la ruta de montaje, como /feeds, antes de empezar, porque la herramienta de boletines necesita la URL completa del feed bajo esa ruta.

5 pasos para enviar publicaciones de blog a un boletín mediante RSS en Webflow Cloud

Configurar un feed RSS personalizado para tu sitio de Webflow implica cinco pasos principales: preparar la estructura de la aplicación Next.js, configurar tus credenciales de CMS, crear la ruta del feed, desplegar en Webflow Cloud y vincular tu herramienta de RSS a correo electrónico.

1. Prepara la estructura de una aplicación Next.js para Webflow Cloud

Crea un nuevo proyecto de TypeScript Next.js con App Router y npm. El feed reside en un Route Handler para que no necesites componentes de cliente ni bibliotecas adicionales.

La creación de cadenas de texto simples es suficiente para producir un RSS válido, y aquí prefiero este método a una biblioteca de feeds porque cada dependencia debe ejecutarse en el entorno de Cloudflare Workers. Fija la estructura en Next.js 15, porque @latest ahora instala Next.js 16.

Ejecuta esto desde la carpeta donde guardas tus proyectos:

npx create-next-app@15 blog-feed --ts --app --use-npm
cd blog-feed

El indicador escribe un , el archivo de bloqueo que Webflow Cloud utiliza para compilar. Cuando el comando termine, ejecuta y abre . Deberías ver la página de inicio predeterminada de Next.js, y la carpeta del proyecto debería contener un directorio para la ruta del feed.--use-npmpackage-lock.jsonnpm run devhttp://localhost:3000app

2. Almacena las credenciales del CMS como variables de entorno

Coloca el token y la configuración del feed en variables de entorno para que la ruta no contenga secretos y el mismo código funcione en cualquier entorno.

La página de variables de entorno de Webflow indica que tanto las variables secretas como las normales están disponibles para la compilación y para la aplicación desplegada en tiempo de ejecución, y que los valores secretos se ocultan en los registros de compilación. Marca el token como secreto.

Crea estas variables en un archivo local , y luego en la configuración de variables de entorno de tu entorno de Webflow Cloud:.env.local

Variable Qué contiene ¿Secreto?
WEBFLOW_API_TOKEN El token del sitio concms:read Sí
WEBFLOW_COLLECTION_ID El ID de la colección del blog No
BLOG_BASE_URL La URL pública del listado de tu blog sin barra diagonal al final, por ejemplohttps://www.example.com/blog No
FEED_URL La URL pública del propio feed, por ejemplohttps://www.example.com/feeds/feed.xml No
FEED_TITLE El nombre del canal que los suscriptores ven en algunas herramientas de boletines, por ejemplo,Example Co. blog No
Variable → Qué contiene → ¿Secreto?
WEBFLOW_API_TOKEN
El token del sitio concms:read
Sí
WEBFLOW_COLLECTION_ID
El ID de la colección del blog
No
BLOG_BASE_URL
La URL pública del listado de tu blog sin barra diagonal al final, por ejemplohttps://www.example.com/blog
No
FEED_URL
La URL pública del propio feed, por ejemplohttps://www.example.com/feeds/feed.xml
No
FEED_TITLE
El nombre del canal que los suscriptores ven en algunas herramientas de boletines, por ejemplo,Example Co. blog
No

Reinicia después de editar para que Next.js detecte los nuevos valores. La ruta construye enlaces absolutos a las publicaciones a partir de y cada slug, ya que un cliente de correo electrónico no tiene una página contra la cual resolver un enlace relativo.npm run dev.env.localBLOG_BASE_URL

3. Crea el gestor de rutas RSS

Añade un gestor de rutas en una carpeta llamada para que el feed responda en una URL que termine en . El gestor lee los elementos publicados desde la Content Delivery API de Webflow, conserva las publicaciones marcadas para el boletín y devuelve XML con un tipo de contenido RSS.feed.xml/feed.xml

El host de entrega sirve respuestas en caché que no cuentan para el límite de tasa de tu API de datos, lo cual es importante porque cada consulta del boletín ejecuta esta ruta. Cambia los slugs de los campos en para que coincidan con tu colección; puedes leerlos en la configuración de cada campo en el CMS.FIELDS

Implementación del gestor de rutas

Guarda lo siguiente como app/feed.xml/route.ts:

// app/feed.xml/route.ts
// Do not add an edge runtime export: Webflow Cloud already runs on
// Cloudflare Workers, and the OpenNext adapter does not support that directive.

export const dynamic = 'force-dynamic';

type Post = { title: string; slug: string; summary: string; published: string };
type Item = { fieldData?: Record<string, unknown> };

// Replace these with your blog Collection's field slugs.
const FIELDS = {
  title: 'name',
  slug: 'slug',
  summary: 'newsletter-summary',
  published: 'newsletter-date',
  include: 'send-to-newsletter', // set to '' to include every post
};

function escapeXml(value: string): string {
  return value
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&apos;');
}

function toPost(item: Item): Post | null {
  const fields = item.fieldData ?? {};
  if (FIELDS.include && fields[FIELDS.include] !== true) return null;

  const title = fields[FIELDS.title];
  const slug = fields[FIELDS.slug];
  const summary = fields[FIELDS.summary];
  const published = fields[FIELDS.published];

  if (typeof title !== 'string' || typeof slug !== 'string' || typeof published !== 'string') {
    return null;
  }
  if (Number.isNaN(Date.parse(published))) return null;

  return { title, slug, summary: typeof summary === 'string' ? summary : '', published };
}

export async function GET(): Promise<Response> {
  const collectionId = process.env.WEBFLOW_COLLECTION_ID;
  const token = process.env.WEBFLOW_API_TOKEN;
  const blogBaseUrl = process.env.BLOG_BASE_URL;
  const feedUrl = process.env.FEED_URL;
  const feedTitle = process.env.FEED_TITLE ?? 'Blog';

  if (!collectionId || !token || !blogBaseUrl || !feedUrl) {
    return new Response('Feed is not configured', { status: 500 });
  }

  const query = new URLSearchParams({ limit: '20' });
  query.set(`sort[${FIELDS.published}]`, 'desc');
  if (FIELDS.include) query.set(`filter[${FIELDS.include}][eq]`, 'true');

  const res = await fetch(
    `https://api-cdn.webflow.com/v2/collections/${collectionId}/items/live?${query}`,
    { headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' } },
  );

  if (!res.ok) {
    return new Response(`CMS request failed with status ${res.status}`, { status: 502 });
  }

  const data = (await res.json()) as { items?: Item[] };

  const posts = (data.items ?? [])
    .map(toPost)
    .filter((post): post is Post => post !== null);

  const itemsXml = posts
    .map((post) => {
      const link = `${blogBaseUrl}/${post.slug}`;
      return `
    <item>
      <title>${escapeXml(post.title)}</title>
      <link>${escapeXml(link)}</link>
      <guid isPermaLink="true">${escapeXml(link)}</guid>
      <pubDate>${new Date(post.published).toUTCString()}</pubDate>
      <description>${escapeXml(post.summary)}</description>
    </item>`;
    })
    .join('');

  const xml = `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>${escapeXml(feedTitle)}</title>
    <link>${escapeXml(blogBaseUrl)}</link>
    <description>${escapeXml(`Latest posts from ${feedTitle}`)}</description>
    <atom:link href="${escapeXml(feedUrl)}" rel="self" type="application/rss+xml"/>
    <lastBuildDate>${new Date().toUTCString()}</lastBuildDate>${itemsXml}
  </channel>
</rss>`;

  return new Response(xml, {
    headers: { 'Content-Type': 'application/rss+xml; charset=utf-8' },
  });
}

El feed es público y el token permanece en el servidor porque no tiene NEXT_PUBLIC_ prefijo. Escapar cada valor evita que los títulos con un ampersand o comillas rompan el XML y toUTCString() produce el formato de fecha RFC 822 que requiere la especificación RSS 2.0.

Gestión de GUID de elementos y filtrado

Usar la URL de la publicación como guid y una fecha establecida por los editores mantiene estable la identidad de cada elemento, por lo que volver a publicar una entrada nunca hace que parezca nueva. La comprobación del interruptor lee true explícitamente, porque la API omite un campo de fieldData cuando no tiene valor.

La solicitud permite que la API realice la selección: filter[...] mantiene solo las publicaciones con el interruptor activado y sort[...] las ordena por la fecha del boletín, ambos documentados en la referencia Listar elementos activos, por lo que una llamada devuelve las 20 publicaciones más recientes para el feed. La ruta sigue comprobando cada elemento, por lo que una publicación sin fecha nunca genera una entrada no válida.

Abre http://localhost:3000/feed.xml, y deberías ver un documento XML con esas publicaciones. Si aparece vacío, comprueba que los slugs en FIELDS coincidan con tu Colección y que al menos una publicación publicada tenga el interruptor activado.

4. Despliega y confirma que la URL del feed incluya la ruta de montaje

Conecta tu repositorio a Webflow Cloud, establece la ruta de montaje del entorno en /feeds y ejecuta un despliegue.

Cuando finalice el despliegue, solicita el feed en su URL de producción, que es tu dominio más la ruta de montaje más /feed.xml. Una ruta que responde en /feed.xml localmente responde en /feeds/feed.xml una vez que la aplicación está montada en /feeds.

Los documentos de configuración de Webflow describen la ruta de montaje tal como se aplica cuando la aplicación se compila, por lo que las rutas del servidor no necesitan cambios.

Comprueba la ruta desplegada y sus encabezados desde una terminal:

curl -i https://www.example.com/feeds/feed.xml

Una respuesta correcta devuelve un estado 200 con content-type: application/rss+xml; charset=utf-8, seguido del cuerpo XML. Pega la URL en un validador RSS como segunda comprobación para detectar fechas mal formadas o caracteres no escapados antes de que los vea un suscriptor.

Cuando ambos pasos se completen, tendrás una URL de feed pública lista para la herramienta de boletines, servida desde tu propio dominio.

5. Apunta tu campaña RSS de boletines al feed

Crea una campaña basada en RSS en tu plataforma de boletines y asígnale la URL /feeds/feed.xml que confirmaste con curl. Los nombres de los menús varían según el proveedor, así que sigue la documentación de campañas RSS de tu plataforma para ver los controles exactos.

Las campañas RSS de Mailchimp se envían según un programa recurrente que tú eliges, de diario a mensual, y Kit puede enviar una difusión por cada nueva publicación o un resumen semanal. En cada caso, eliges la audiencia y una plantilla que extrae el título y el resumen de cada elemento junto con su enlace.

Yo elegiría un resumen semanal en lugar de enviar por cada publicación para la mayoría de los blogs, porque así una ráfaga de publicaciones llega como un solo correo electrónico en lugar de tres. Activa la aprobación manual para el primer envío si tu plataforma lo ofrece.

Una vista previa, si la plataforma la ofrece, debería mostrar los títulos y resúmenes de tus publicaciones recientes en la plantilla, y cada elemento debería enlazar a la publicación en vivo en tu sitio de Webflow.

¿Qué hace que un feed de boletín RSS de Webflow falle?

Prueba el feed en producción y localmente, porque la ruta de montaje y el entorno desplegado pueden ocultar fallos que no aparecen en tu máquina.

El despliegue falla con un error de tiempo de ejecución edge de OpenNext

La página de aplicaciones personalizadas de Webflow todavía indica añadir a las rutas de API, por lo que seguir la documentación al pie de la letra provoca este fallo. La confusión surge porque "edge" significa dos cosas distintas.export const runtime = 'edge'

Webflow Cloud se ejecuta en Cloudflare Workers, que es una plataforma edge. El destino de tiempo de ejecución de Next.js es una configuración independiente, y el adaptador de OpenNext para Cloudflare que utiliza Webflow Cloud para desplegar Next.js no es compatible con él.edge

Elimina la exportación de y vuelve a desplegar. Si un compañero o un asistente de IA sigue añadiendo la línea de nuevo, deja un comentario en la parte superior del archivo explicando por qué no debe incluirse esa directiva.runtimeapp/feed.xml/route.ts

El feed devuelve un error 404 en producción, pero carga correctamente en /feed.xml en local

Una herramienta de boletines que apunta a está solicitando una ruta que tu sitio de Webflow no sirve, porque la aplicación reside bajo su ruta de montaje.https://www.example.com/feed.xml

Utiliza la URL de producción montada del paso 4 en la campaña de correo y en el validador. Si más adelante añades una página del lado del cliente que obtenga el feed, anteponle una variable que tú mismo definas, ya que Webflow Cloud no reescribe las llamadas del lado del cliente para incluir la ruta de montaje.NEXT_PUBLIC_BASE_PATHfetch

La ruta desplegada lanza un error sobre node:fs

La ruta, o un asistente que importa, utiliza en el momento de la solicitud, por ejemplo, para almacenar en disco. solo proporcionan por defecto a partir de la fecha de compatibilidad 2025-09-01, que es posterior a la fecha en la configuración de ejemplo de Webflow Cloud, y como el mismo código se ejecuta bajo Node.js local, el error solo aparece tras el despliegue.node:fsfeed.xmlnode:fs

Un archivo generado por un script de postbuild tampoco serviría de nada, ya que quedaría desactualizado hasta el siguiente despliegue.

Genera el XML como una cadena de texto en cada solicitud, exactamente igual que hace el Route Handler, y elimina cualquier importación de o y cualquier script de postbuild que genere el archivo.fswriteFile

El feed desplegado devuelve "Feed is not configured"

La ruta devuelve ese mensaje cuando falta una variable de entorno obligatoria del paso 2. nunca sale de tu máquina, por lo que los valores que funcionan bajo no existen en producción hasta que los añades al entorno de Webflow Cloud..env.localnpm run dev

Añade las variables que falten al entorno desde el que se despliega la aplicación, marcando el token como secreto, y luego inicia un nuevo despliegue. Si la respuesta cambia a "CMS request failed with status 401", comprueba que el token tenga el ámbito .cms:read

Qué puedes crear a continuación con RSS y Webflow

Una vez que el boletín se gestione automáticamente desde tu blog, la misma ruta puede alimentar otros canales sin pasos de publicación adicionales. Yo añadiría un segundo Route Handler que filtre por categoría para obtener resúmenes temáticos, o un feed de texto completo para los lectores que lo prefieran.

En cuanto al marketing de los feeds, la guía de Webflow sobre RSS feeds explica cómo los equipos los aprovechan más allá del correo electrónico.

Sobre la plataforma en la que se ejecuta esta ruta, la documentación para desarrolladores de Webflow cubre las aplicaciones de Webflow Cloud y cómo se despliegan.

Preguntas frecuentes

¿Puede el feed incluir la publicación completa en lugar de un resumen?

Sí. Añade tu campo de texto enriquecido a y muéstralo dentro de un elemento , con declarado en la etiqueta y el HTML envuelto en CDATA. Un literal dentro de la publicación cerraría el CDATA antes de tiempo, así que sustitúyelo antes de envolverlo. Ten en cuenta que el correo electrónico puede renderizarse de forma menos predecible que tu sitio, ya que los clientes de correo suelen eliminar los estilos.FIELDScontent:encodedxmlns:content="http://purl.org/rss/1.0/modules/content/"rss]]>

¿Cómo puedo enviar solo algunas publicaciones al boletín?

Para eso sirve el include slug en FIELDS . Añade un campo de interruptor a tu colección de blog, algo como "Enviar al boletín", y los editores podrán activarlo o desactivarlo en cada publicación. Las publicaciones con el interruptor desactivado nunca llegarán al feed, así podrás mantener la campaña en envío automático sin necesidad de revisiones adicionales.

¿Las encuestas del boletín cuentan para mis límites de Webflow Cloud?

Sí. La página de uso de Webflow Cloud indica que "solo se contabilizan las solicitudes que ejecutan el código de tu aplicación", y cada encuesta ejecuta la ruta. La llamada al CMS que realiza la ruta es una subsolicitud, la cual no cuenta para ese total. Webflow Cloud también establece private, no-cache en cada respuesta, por lo que un encuestador no puede reutilizar una copia anterior, y para tráfico intenso, la guía de límite de tasa 429 cubre el almacenamiento en caché en el servidor.

¿Por qué mi boletín volvió a enviar publicaciones que ya se habían enviado?

Las herramientas de boletines consideran un elemento como nuevo cuando cambia su GUID o su pubDate . Cambiar el slug de una publicación modifica su enlace y, por tanto, su GUID, y cambiar la fecha del boletín altera la pubDate. Evita renombrar slugs en publicaciones ya publicadas y mantén la fecha del boletín fija una vez que la publicación se haya enviado.


Última actualización
October 24, 2026
Categoría

Artículos relacionados


verifone logomonday.com logospotify logoted logogreenhouse logoclear logocheckout.com logoreddit logothe new york times logoideo logoupwork logodiscord logo
verifone logomonday.com logospotify logoted logogreenhouse logoclear logocheckout.com logoreddit logothe new york times logoideo logoupwork logodiscord logo

Empieza gratis

Prueba Webflow todo el tiempo que quieras con nuestro plan Starter gratuito. Compra un plan de sitio de pago para publicar, alojar y desbloquear funciones adicionales.

Empieza, es gratis
Ver demostración

Prueba Webflow todo el tiempo que quieras con nuestro plan Starter gratuito. Compra un plan de sitio de pago para publicar, alojar y desbloquear funciones adicionales.