Cómo crear una interfaz de búsqueda por facetas con Algolia y Webflow sin gestionar infraestructura

Cómo crear una interfaz de búsqueda facetada con Algolia y Webflow sin gestionar infraestructura

Aprende a crear una búsqueda por facetas con Algolia y Webflow Cloud indexando el contenido del CMS, añadiendo filtros y sincronizando el índice mediante webhooks.

Cómo crear una interfaz de búsqueda facetada con Algolia y Webflow sin gestionar infraestructura

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

Puedes añadir la búsqueda por facetas de Algolia al contenido del CMS de Webflow con una aplicación Next.js en Webflow Cloud, incluyendo filtros, resaltado, paginación y sincronización por webhooks.

La búsqueda nativa de Webflow cubre todo tu sitio, pero no permite que los visitantes filtren los resultados por categoría, etiqueta, fecha u otros atributos, y ofrece poco control sobre la tolerancia a errores tipográficos y la relevancia. Algolia añade esa capa de búsqueda instantánea y por facetas sobre el contenido de tu CMS de Webflow.

Lo he utilizado en proyectos de Webflow y el patrón que aplico en cada configuración de Webflow Cloud es el mismo: react-instantsearch para la interfaz de búsqueda, montada en un componente de cliente de Next.js; un gestor de rutas (Route Handler) para la indexación masiva del contenido del CMS de Webflow; y un endpoint de webhook que mantiene el índice actualizado sin intervención manual.

En esta guía, exploramos cómo crear esa configuración desde cero: configurar el índice de Algolia, indexar el contenido del CMS de Webflow a través de la API de datos, renderizar una interfaz de búsqueda por facetas con filtrado, resaltado y paginación, y conectar webhooks para mantener el índice sincronizado a medida que el contenido cambia.

¿Qué necesitas para crear una interfaz de búsqueda por facetas con Algolia y Webflow?

La base necesaria es una aplicación Next.js en Webflow Cloud y una cuenta de Algolia. El plan gratuito de Algolia (1 millón de registros, 10 000 búsquedas al mes) es suficiente para crear y probar todo lo que veremos aquí.

Estos son los requisitos previos completos:

  • Un proyecto de Webflow Cloud con una aplicación Next.js desplegada o ejecutándose localmente, montada en una ruta de tu sitio de Webflow
  • Una cuenta de Algolia (plan gratuito en algolia.com) con una aplicación creada
  • Una colección del CMS de Webflow con el contenido que quieres hacer buscable (entradas de blog, productos, listados de directorios)
  • Un token de la API de Webflow con permisos de cms:read y sites:read, generado en Webflow en la configuración del sitio, luego en Apps e integraciones, y finalmente en acceso a la API

Una decisión arquitectónica que debe quedar clara antes de escribir código es que la clave de API de solo búsqueda es segura en el JavaScript del frontend (puede consultar pero no modificar registros). La clave de API de administración nunca debe salir del servidor. Mantengo la clave de administración en las variables de entorno del gestor de rutas y solo la clave de solo búsqueda se envía al navegador.

7 pasos para crear una búsqueda por facetas con Algolia en Webflow Cloud

La arquitectura se divide claramente en dos capas:

  • La capa de indexación (gestores de rutas) se ejecuta en el lado del servidor en Cloudflare Workers usando la clave de API de administración
  • La capa de interfaz de búsqueda (componentes de cliente de React) se ejecuta en el navegador usando solo la clave de solo búsqueda. react-instantsearch gestiona el estado entre el cuadro de búsqueda, los filtros de facetas, la paginación y la visualización de resultados, así que no tengo que coordinar eso manualmente

Vamos a profundizar en los pasos.

1. Crea el índice de Algolia y obtén tus claves de API

Inicia sesión en el panel de control de Algolia y crea un nuevo índice. Le pongo el nombre del tipo de contenido que estoy indexando, algo como webflow-resources o webflow-products, para que sea identificable en todos los proyectos.

Desde el panel de control, abre Settings > API Keys.

Necesitas tres valores:

  • Application ID: Se utiliza tanto en el código del servidor como en el del cliente
  • Search-Only API Key: Segura para el código del lado del cliente, solo permite realizar consultas
  • Admin API Key: Solo para el lado del servidor, nunca debe ir en el código del frontend

Mantén estos tres valores juntos, ya que el resto de la compilación depende de dirigir cada uno al lugar correcto. El Application ID y la clave de solo búsqueda se envían al navegador, mientras que la Admin API Key permanece en el servidor dentro de tus Route Handlers. Con el índice creado y las claves en mano, el siguiente paso es instalar los paquetes e integrar estos valores en tu entorno.

2. Instala los paquetes y configura las variables de entorno

Instala ambos paquetes de Algolia en tu proyecto de Webflow Cloud Next.js:

npm install algoliasearch react-instantsearch

algoliasearch cubre tanto el cliente de búsqueda ligero (para el navegador) como el cliente completo (para la indexación en Route Handlers). react-instantsearch proporciona los widgets de interfaz: InstantSearch, SearchBox, Hits, RefinementList, Pagination, y Highlight.

Luego, añade las credenciales a .env.local:

# .env.local
NEXT_PUBLIC_ALGOLIA_APP_ID=your_application_id
NEXT_PUBLIC_ALGOLIA_SEARCH_KEY=your_search_only_api_key
NEXT_PUBLIC_ALGOLIA_INDEX_NAME=webflow-resources
ALGOLIA_ADMIN_KEY=your_admin_api_key
ALGOLIA_INDEX_NAME=webflow-resources
WEBFLOW_API_TOKEN=your_webflow_api_token
WEBFLOW_COLLECTION_ID=your_collection_id
INDEXING_SECRET=your_random_indexing_secret

Ten en cuenta que ALGOLIA_ADMIN_KEY NO tiene el prefijo NEXT_PUBLIC_. Todo lo que lleve el prefijo NEXT_PUBLIC_ se incluye en el JavaScript del lado del cliente. La clave de administrador debe permanecer exclusivamente en el servidor. He visto este error en producción: la clave de administrador en el paquete del frontend queda expuesta a cualquiera que abra las herramientas de desarrollo.

Añade todo esto a tu entorno de Webflow Cloud en Environments > Environment Variables antes de desplegar. El nombre del índice público alimenta al cliente de búsqueda del navegador, mientras que el nombre del índice sin prefijo y el secreto de indexación solo son leídos por los Route Handlers del lado del servidor.

3. Configura los atributos y facetas de búsqueda en Algolia

Antes de indexar cualquier registro, configura los ajustes del índice. Esto le indica a Algolia qué campos son buscables y cuáles pueden usarse como filtros de facetas. Siempre hago esto antes del primer índice, no después, para que la sincronización inicial caiga en un índice ya configurado.

En el panel de control de Algolia, abre tu índice y ve a Configuration > Searchable attributes. Añade los campos que quieras buscar. Para un índice de entradas de blog, normalmente añado title, excerpt, tagsand author. Arrástralos para establecer el orden de prioridad de modo que el title coincida con el rango superior, y el excerpt también.

Luego ve a Configuration > Facets. Añade los atributos por los que los visitantes podrán filtrar. Para que la búsqueda facetada funcione, estos atributos deben estar en el registro de Algolia Y listados aquí. Opciones comunes para una biblioteca de contenido: category, tags, author. Para un catálogo de productos: brand, price_range, in_stock.

También puedes configurar estos ajustes a través de la API en tu Route Handler de indexación, lo cual mostraré en el paso 5.

4. Crea el Route Handler para la indexación masiva

El Route Handler de indexación obtiene todos los elementos publicados de tu colección CMS de Webflow y los envía a Algolia. Ejecuto esto una vez para poblar el índice, y el controlador de webhook del paso 6 se encarga del resto a partir de ahí.

Crea :app/api/algolia/index/route.ts

// app/api/algolia/index/route.ts
import { algoliasearch } from 'algoliasearch'
import { NextResponse, type NextRequest } from 'next/server'

export async function POST(request: NextRequest) {
  // Simple shared secret to prevent unauthorized re-indexing
  const authHeader = request.headers.get('authorization')
  if (authHeader !== `Bearer ${process.env.INDEXING_SECRET}`) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
  }

  const client = algoliasearch(
    process.env.NEXT_PUBLIC_ALGOLIA_APP_ID!,
    process.env.ALGOLIA_ADMIN_KEY!
  )

  // Fetch all published items from Webflow CMS
  let items: Record<string, unknown>[] = []
  let offset = 0
  const limit = 100

  while (true) {
    const res = await fetch(
      `https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items?limit=${limit}&offset=${offset}`,
      {
        headers: {
          Authorization: `Bearer ${process.env.WEBFLOW_API_TOKEN}`,
        },
      }
    )

    if (!res.ok) {
      return NextResponse.json({ error: 'Webflow fetch failed' }, { status: 500 })
    }

    const { items: page, pagination } = await res.json() as {
      items: Record<string, unknown>[]
      pagination: { limit: number; offset: number; total: number }
    }

    items = items.concat(page)

    if (offset + limit >= pagination.total) break
    offset += limit
  }

  // Map Webflow items to Algolia records
  // objectID must be the Webflow item id. This is what lets webhook
  // updates and deletes find the right record without creating duplicates.
  const records = items.map((item) => {
    const fields = item.fieldData as Record<string, unknown>
    return {
      objectID: item.id as string,
      title: fields.name as string,
      excerpt: fields.excerpt as string ?? '',
      category: fields.category as string ?? '',
      tags: fields.tags as string[] ?? [],
      author: fields.author as string ?? '',
      slug: fields.slug as string ?? '',
      publishedAt: item.lastPublished as string ?? '',
    }
  })

  // Push to Algolia in batches
  await client.saveObjects({
    indexName: process.env.ALGOLIA_INDEX_NAME!,
    objects: records,
  })
  return NextResponse.json({ indexed: records.length })
}

Activo esto una vez mediante curl -X POST https://yoursite.webflow.io/app/api/algolia/index -H "Authorization: Bearer YOUR_SECRET" después de desplegar.

El INDEXING_SECRET es una cadena aleatoria que configuré en las variables de entorno. No es un enfoque blindado de seguridad, pero evita la reindexación accidental causada por solicitudes perdidas.

Sin embargo, hay dos cosas a tener en cuenta aquí. La API de CMS de Webflow pagina a 100 elementos por página, por lo que el while bucle no es opcional para colecciones de más de 100. Además, el límite de tamaño promedio de registro de Algolia es de 10 KB. Si tus elementos de CMS tienen campos de texto enriquecido largos, elimina el HTML e indexa solo los extractos.

5. Construye la interfaz de búsqueda facetada

La interfaz de búsqueda es un componente de cliente de React en tu aplicación de Webflow Cloud con Next.js. Lo monto en una página /search dedicada dentro de la aplicación, a la que los visitantes acceden mediante algo como yoursite.webflow.io/app/search.

Crea app/search/SearchUI.tsx como un componente de cliente, ya que react-instantsearch gestiona el estado del navegador:

// app/search/SearchUI.tsx
'use client'

import { liteClient as algoliasearch } from 'algoliasearch/lite'
import {
  InstantSearch,
  SearchBox,
  Hits,
  Highlight,
  RefinementList,
  Pagination,
  Configure,
  CurrentRefinements,
  Stats,
} from 'react-instantsearch'
import 'instantsearch.css/themes/satellite.css'

const searchClient = algoliasearch(
  process.env.NEXT_PUBLIC_ALGOLIA_APP_ID!,
  process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY!
)

function Hit({ hit }: { hit: Record<string, unknown> }) {
  return (
    <article className="hit-card">
      <a href={`/blog/${hit.slug}`}>
        <h3>
          <Highlight attribute="title" hit={hit} />
        </h3>
        <p>
          <Highlight attribute="excerpt" hit={hit} />
        </p>
        <div className="hit-meta">
          <span>{hit.category as string}</span>
          <span>{hit.author as string}</span>
        </div>
      </a>
    </article>
  )
}

export default function SearchUI() {
  return (
    <InstantSearch
      searchClient={searchClient}
      indexName={process.env.NEXT_PUBLIC_ALGOLIA_INDEX_NAME!}
      insights
    >
      {/* hitsPerPage controls results per page, clickAnalytics enables event attribution */}
      <Configure hitsPerPage={12} clickAnalytics />

      <div className="search-layout">
        <aside className="facets-panel">
          <h3>Category</h3>
          <RefinementList attribute="category" />

          <h3>Tags</h3>
          <RefinementList attribute="tags" searchable limit={10} />

          <h3>Author</h3>
          <RefinementList attribute="author" />
        </aside>

        <div className="results-panel">
          <SearchBox placeholder="Search resources..." autoFocus />
          <div className="results-meta">
            <Stats />
            <CurrentRefinements />
          </div>
          <Hits hitComponent={Hit} />
          <Pagination />
        </div>
      </div>
    </InstantSearch>
  )
}

Luego, renderízalo desde el componente de servidor de la página:

// app/search/page.tsx
import SearchUI from './SearchUI'

export default function SearchPage() {
  return (
    <main>
      <h1>Search Resources</h1>
      <SearchUI />
    </main>
  )
}

Siempre añado insights a <InstantSearch> desde el primer día, no como una ocurrencia tardía. Configurar clickAnalytics en <Configure> significa que Algolia devuelve el queryID en cada respuesta, la clave que vincula los eventos de clic a la búsqueda específica que los activó. Sin esto, tu panel de análisis mostrará datos de cero clics y los modelos de recomendación no se entrenarán correctamente.

La importación de liteClient (algoliasearch/lite) es intencional para el navegador. Es un paquete más pequeño que solo admite búsquedas sin métodos de indexación. El cliente completo de algoliasearch también incluye la superficie de la API de administración, que no tiene cabida en el código del frontend.

6. Construye el controlador de rutas del webhook para la sincronización en tiempo real

Después de la indexación masiva inicial, los webhooks mantienen el índice actualizado. Cada vez que se crea, actualiza, publica o elimina un elemento del CMS de Webflow, Webflow dispara un evento que llega a este controlador de rutas.

Crea :app/api/algolia/webhook/route.ts

// app/api/algolia/webhook/route.ts
import { algoliasearch } from 'algoliasearch'
import { NextResponse, type NextRequest } from 'next/server'

export async function POST(request: NextRequest) {
  const { triggerType, payload } = await request.json() as {
    triggerType: string
    payload: {
      id: string
      fieldData: Record<string, unknown>
      lastPublished: string | null
    }
  }

  const client = algoliasearch(
    process.env.NEXT_PUBLIC_ALGOLIA_APP_ID!,
    process.env.ALGOLIA_ADMIN_KEY!
  )
  const indexName = process.env.ALGOLIA_INDEX_NAME!
  if (triggerType === 'collection_item_deleted' || triggerType === 'collection_item_unpublished') {
    await client.deleteObject({ indexName, objectID: payload.id })
    return NextResponse.json({ action: 'deleted', objectID: payload.id })
  }

  if (triggerType === 'collection_item_created' || triggerType === 'collection_item_changed') {
    const fields = payload.fieldData
    const record = {
      objectID: payload.id,
      title: fields.name as string,
      excerpt: fields.excerpt as string ?? '',
      category: fields.category as string ?? '',
      tags: fields.tags as string[] ?? [],
      author: fields.author as string ?? '',
      slug: fields.slug as string ?? '',
      publishedAt: payload.lastPublished ?? '',
    }
    await client.saveObject({ indexName, body: record })
    return NextResponse.json({ action: 'saved', objectID: payload.id })
  }

  return NextResponse.json({ action: 'ignored', triggerType })
}

Registra el webhook a través de la API de datos de Webflow, ya que el panel solo expone activadores de publicación de sitio y envío de formularios. Envía una solicitud POST al endpoint de creación de webhook (https://api.webflow.com/v2/sites/{site_id}/webhooks) una vez por evento, con triggerType configurado para cada uno de los cuatro eventos de elementos del CMS:

  • collection_item_created
  • collection_item_changed
  • collection_item_deleted
  • collection_item_unpublished

Apunta el url de cada uno a https://yoursite.webflow.io/app/api/algolia/webhook. Crearlos a través de la API también te proporciona el x-webflow-signature encabezado si deseas validar las cargas útiles más adelante.

Una cosa que verifico pronto es que las propiedades de la carga útil del webhook coincidan con lo que realmente envía la API de Webflow. La documentación muestra isDraft/isArchived en las tablas de campos, pero las cargas útiles en vivo a menudo usan draft/archived. Siempre pruebo con un elemento real antes de confiar en los nombres de las propiedades.

7. Despliega y añade la página de búsqueda a Webflow

Despliega en Webflow Cloud con webflow cloud deploy o enviando cambios a tu rama de GitHub conectada. Una vez que se complete el despliegue, ejecuta el script de indexación mediante cURL para inicializar el índice.

Para mostrar la página de búsqueda en tu sitio de Webflow, crea una página de Webflow en una ruta como /search que incruste un iframe o use un enlace para redirigir a la ruta de montaje de búsqueda de la aplicación Cloud. El enfoque más limpio es montar la aplicación Cloud directamente en /search en la configuración de tu entorno de Webflow Cloud. De esta manera, los visitantes llegan a yoursite.webflow.io/search, y la aplicación de Next.js lo maneja de forma nativa.

Para incluir el tema CSS satélite de Algolia (que da estilo a los widgets), añade el enlace CDN a tu diseño de Next.js o impórtalo desde el paquete npm en el diseño principal del componente de cliente:

// app/layout.tsx
import 'instantsearch.css/themes/satellite.css'

O añádelo a la configuración del sitio de Webflow > Código personalizado > Código de encabezado si estás cargando la página de búsqueda como una experiencia independiente.

¿Qué causa que las búsquedas con Algolia fallen en Webflow Cloud?

La interfaz de búsqueda suele funcionar a la primera. Estos tres problemas aparecen cuando la indexación o la sincronización no se comportan como se espera.

RefinementList no muestra opciones

Esto significa que el atributo no está en el índice, aunque exista en los registros. El facet debe configurarse en Algolia antes de que InstantSearch pueda filtrar por él. Ve al panel de control de Algolia > Configuration > Facets y añade el atributo. Por experiencia, olvidar añadir como facet cuando ya está en los registros es la causa más común.attributesForFacetingtags

Los elementos eliminados de Webflow siguen apareciendo en los resultados de búsqueda

El webhook para o no se activó o no se registró. Llama al endpoint List Webhooks () y confirma que los cuatro eventos estén registrados con la URL correcta.collection_item_unpublishedcollection_item_deletedGET https://api.webflow.com/v2/sites/{site_id}/webhooks

Si un webhook se activa pero el Route Handler devuelve un error, Webflow lo intenta unas cuantas veces y luego se detiene. Revisa los registros de compilación de Webflow Cloud en busca de errores 500 en el endpoint del webhook.

Errores de tamaño de registro durante la indexación

Algolia rechaza los registros que superan sus límites de tamaño al indexar campos de texto enriquecido completos del CMS. La solución es eliminar el HTML y truncar el cuerpo del texto a entre 500 y 1000 caracteres en el mapeo de registros. Yo conservo el slug completo para los enlaces y el extracto o una versión truncada del cuerpo para las búsquedas. De todos modos, los visitantes no necesitan ver 5000 palabras en una tarjeta de resultados.

Construye más sobre esto

El índice que has creado aquí es la base para la búsqueda entre colecciones (consultar múltiples índices en una sola instancia de ), el autocompletado en la barra de navegación de Webflow y los widgets de Algolia Recommend en las páginas de plantilla de contenido.InstantSearch

Explora Webflow + Algolia para ver el panorama completo de lo que Algolia conecta en Webflow. Para una personalización más profunda de tu aplicación de Webflow Cloud más allá de lo que ofrece la configuración estándar de Next.js, la documentación para desarrolladores de Webflow cubre el almacenamiento, los entornos y las opciones de despliegue en detalle.

Preguntas frecuentes

¿Puedo buscar en varias colecciones del CMS de Webflow a la vez?

Sí. Añade un componente dentro de para cada índice adicional, o utiliza el endpoint de consulta múltiple de Algolia para federar los resultados de varios índices en una única interfaz de búsqueda. Yo creo un índice de Algolia por cada colección de Webflow y uso el widget de para combinarlos cuando necesito una búsqueda entre colecciones.<Index><InstantSearch>react-instantsearchIndex

¿Esto funciona con los productos nativos de Ecommerce de Webflow?

Sí, pero debes usar la API de datos de Webflow para obtener los datos del producto a través del endpoint en lugar de un endpoint de colección del CMS. El patrón del Route Handler de indexación es el mismo; solo cambian la URL de obtención y el mapeo de campos. El filtrado por precio funciona mejor con los widgets de Algolia o configurados con un atributo numérico./v2/sites/{site_id}/productsRangeInputRangeSliderprice

¿Es realmente seguro exponer la clave API de solo búsqueda en el código del frontend?

Sí, por diseño. Algolia genera tipos de clave separados por esta razón. La clave de solo búsqueda puede consultar registros, pero no puede añadirlos, modificarlos ni eliminarlos. Yo añado una restricción de HTTP Referrer en el panel de control de Algolia para que la clave solo acepte solicitudes desde el dominio de mi sitio. Eso la hace segura incluso si alguien copia la clave desde el código fuente de la página.

¿Qué plan requiere Webflow Cloud?

Webflow Cloud está disponible en todos los planes de sitio de Webflow, incluido el plan gratuito Starter para desarrollo en una URL webflow.io. Montar tu aplicación en un dominio personalizado requiere un plan Premium o superior, así que consulta los precios de Webflow para ver los niveles actuales. El plan gratuito de Algolia incluye 1 millón de registros y 10 000 búsquedas al mes, lo que cubre la mayoría de las cargas de trabajo de desarrollo y producción inicial.


Última actualización
July 26, 2026
Categoría

Artículos relacionados

Cómo crear una búsqueda de texto completo para Webflow CMS usando Elasticsearch y un gestor de rutas
Cómo crear una búsqueda de texto completo para Webflow CMS usando Elasticsearch y un gestor de rutas

Cómo crear una búsqueda de texto completo para Webflow CMS usando Elasticsearch y un gestor de rutas

Cómo crear una búsqueda de texto completo para Webflow CMS usando Elasticsearch y un gestor de rutas

Desarrollo
Por
Colin Lateano
,
,
Leer artículo
¿Cómo se añade un banner de consentimiento de cookies que cumpla con el RGPD a Webflow usando Cookiebot?
¿Cómo se añade un banner de consentimiento de cookies que cumpla con el RGPD a Webflow usando Cookiebot?

¿Cómo se añade un banner de consentimiento de cookies que cumpla con el RGPD a Webflow usando Cookiebot?

¿Cómo se añade un banner de consentimiento de cookies que cumpla con el RGPD a Webflow usando Cookiebot?

Desarrollo
Por
Colin Lateano
,
,
Leer artículo
Cómo usar la API de código personalizado de Webflow para enviar scripts a páginas específicas
Cómo usar la API de código personalizado de Webflow para enviar scripts a páginas específicas

Cómo usar la API de código personalizado de Webflow para enviar scripts a páginas específicas

Cómo usar la API de código personalizado de Webflow para enviar scripts a páginas específicas

Desarrollo
Por
Colin Lateano
,
,
Leer artículo
Cómo reemplazar el correo de pedido predeterminado de Webflow con una plantilla de SendGrid totalmente personalizada
Cómo reemplazar el correo de pedido predeterminado de Webflow con una plantilla de SendGrid totalmente personalizada

Cómo reemplazar el correo de pedido predeterminado de Webflow con una plantilla de SendGrid totalmente personalizada

Cómo reemplazar el correo de pedido predeterminado de Webflow con una plantilla de SendGrid totalmente personalizada

Desarrollo
Por
Colin Lateano
,
,
Leer artículo

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.