Skip to content

Widgets de Solnow ​

Los widgets de Solnow son Web Components que podés incrustar en cualquier web externa con solo dos líneas de HTML. Funcionan con Shadow DOM (sin conflictos de CSS), se comunican con la API de Solnow, y gestionan todo el flujo de reserva de principio a fin.


Los 3 widgets disponibles ​

WidgetTag HTMLPara qué sirve
Booking Engine<solnow-booking-engine>Catálogo completo de experiencias con buscador y filtros
Experience Detail<solnow-experience-detail>Vista completa de una sola experiencia (fotos, descripción, calendario, checkout)
Experience Selector<solnow-experience-selector>Widget compacto de reserva para una experiencia específica (calendario + checkout sin descripción)

Instalación básica ​

Cada widget tiene su propio archivo JS. Incluís el <script> antes del tag HTML del widget.

Booking Engine (catálogo completo) ​

html
<script src="https://app.solnow.io/widgets/solnow-booking-engine.js?organizationId=TU_ORG_ID"></script>

<solnow-booking-engine
  lang="es"
  primary-color="#0066cc"
></solnow-booking-engine>

Experience Detail (detalle de una experiencia) ​

html
<script src="https://app.solnow.io/widgets/solnow-experience-detail.js?organizationId=TU_ORG_ID"></script>

<!-- Por ID numérico -->
<solnow-experience-detail experience-id="42" lang="es"></solnow-experience-detail>

<!-- O por slug -->
<solnow-experience-detail slug="velero-privado-ibiza" lang="es"></solnow-experience-detail>

Experience Selector (reserva directa) ​

html
<script src="https://app.solnow.io/widgets/solnow-experience-selector.js?organizationId=TU_ORG_ID"></script>

<solnow-experience-selector
  experience-id="42"
  lang="es"
></solnow-experience-selector>

Configuración del script tag ​

El tag <script> acepta parámetros en la URL para configurar el widget:

ParámetroDescripciónEjemplo
organizationIdID de tu organización en Solnow (recomendado)?organizationId=12
originDominio de tu web (si no usás organizationId)?origin=miempresa.com
apiBaseURL base de la API (solo para desarrollo)?apiBase=https://api.dev.solnow.io

Identificación automática

Si no pasás organizationId, el widget intenta identificar tu organización por el dominio de la web donde está incrustado. Ese dominio debe estar registrado en Solnow. Si tenés el mismo widget en varias webs, usá siempre organizationId para evitar ambigüedades.


Atributos de los widgets ​

Atributos comunes (todos los widgets) ​

AtributoTipoDefaultDescripción
langstringidioma del navegadorIdioma de la UI: es, en, de, etc.
primary-colorstringcolor de la marcaColor principal en hex: #0066cc
background-colorstring#ffffffColor de fondo
text-colorstring#111827Color del texto
font-familystringsistemaFuente: 'Inter', sans-serif
book-now-button-colorstringigual a primary-colorColor del botón "Reservar ahora"
hide-brandingbooleanfalseOculta el logo de Solnow si es "true"

<solnow-booking-engine> — atributos adicionales ​

AtributoTipoDescripción
initial-experience-idnumberAbre directamente el detalle de esta experiencia al cargar
page-sizenumberResultados por página (1–100, default: 20)
transparent-bgbooleanElimina fondo, sombra, borde y padding del widget
hide-paginationbooleanOculta los controles de paginación

Filtros fijos (fixed-*) ​

Estos atributos fijan un filtro que el usuario no puede cambiar desde la UI. Útil para incrustar el widget en una página específica de tu producto.

AtributoTipoDescripción
fixed-boat-typesstringTipos de embarcación separados por coma: "velero,catamaran"
fixed-tagsstringIDs de tags separados por coma: "3,7,12"
fixed-citystringCiudad fija: "Ibiza"
fixed-manufacturerstringFabricante fijo: "Beneteau"
fixed-exclusivity-typestring"private" o "shared"
fixed-with-captainstring"required", "optional" o "excluded"
fixed-booking-typestring"packaged" o "rental"
fixed-min-capacitynumberCapacidad mínima de pasajeros
fixed-min-budgetnumberPrecio mínimo en €
fixed-max-budgetnumberPrecio máximo en €

Ejemplo — widget que muestra solo veleros privados en Ibiza:

html
<solnow-booking-engine
  fixed-boat-types="velero"
  fixed-exclusivity-type="private"
  fixed-city="Ibiza"
  lang="es"
></solnow-booking-engine>

<solnow-experience-detail> — atributos adicionales ​

AtributoTipoDescripción
experience-idnumberID numérico de la experiencia (requerido si no usás slug)
slugstringSlug URL de la experiencia (requerido si no usás experience-id)

<solnow-experience-selector> — atributos adicionales ​

AtributoTipoDescripción
experience-idnumberID numérico de la experiencia (obligatorio)
fixed-booking-policy-idnumberFija la política de reserva (salida), el usuario no puede cambiarla

El objeto Webview de una experiencia ​

En la app de Solnow, cada experiencia tiene una sección Webview que controla cómo se muestra en los widgets y en tu web. Estos son los campos disponibles:

CampoDescripción
url_slugIdentificador URL amigable de la experiencia (solo minúsculas, números y guiones). Permite referenciar la experiencia por nombre en vez de por ID numérico.
link_to_websiteURL externa de la experiencia en tu web. Se usa para redirigir al usuario desde el catálogo.
videoURL de video (YouTube, Vimeo, etc.) que aparece en la vista de detalle.
custom_htmlHTML personalizado que se renderiza al pie de la vista de detalle de la experiencia. Útil para FAQs, condiciones especiales, mapas embebidos, etc.
widget_badge_idID del badge (imagen decorativa) que aparece sobre la card en el catálogo.
widget_badge_positionPosición del badge: top_left, top_right, bottom_left, bottom_right.
widget_badge_sizeTamaño del badge: small, medium, large, xlarge.

El slug (url_slug) ​

El slug es el identificador "legible" de una experiencia. En vez de usar el ID numérico, podés referenciar la experiencia con un nombre descriptivo:

html
<!-- Con ID numérico -->
<solnow-experience-detail experience-id="42"></solnow-experience-detail>

<!-- Con slug (más legible, más estable) -->
<solnow-experience-detail slug="velero-privado-ibiza"></solnow-experience-detail>

Reglas del slug:

  • Solo minúsculas, números y guiones (a-z, 0-9, -)
  • Máximo 100 caracteres
  • No puede empezar ni terminar en guión
  • Ejemplo válido: catamaran-dia-completo-mallorca

El widget badge ​

El badge es una imagen que aparece superpuesta sobre la card de la experiencia en el catálogo (el <solnow-booking-engine>). Sirve para destacar cosas como "Más vendido", "Nuevo", "Oferta", etc.

json
"widget_config": {
  "badge": {
    "image_url": "https://cdn.solnow.io/badges/bestseller.png",
    "position": "top_right",
    "size": "medium"
  }
}

El objeto widget_config se devuelve en la respuesta de la API cuando consultás el detalle o el listado de experiencias.


Parámetros URL del widget ​

El widget de Booking Engine gestiona su estado interno a través de la URL. En modo web component usa hash routing (#/?param=valor) para no interferir con la URL de tu página.

Los parámetros disponibles son:

ParámetroTipoDescripción
experienceIdnumberAbre directamente el detalle de esta experiencia
viewstringVista activa: "list" o "detail"
bookingPolicyIdnumberPolítica de reserva preseleccionada
adultsnumberNúmero de adultos preseleccionado
childrennumberNúmero de niños preseleccionado
startDatestringFecha inicio en formato YYYY-MM-DD
startTimestringHora inicio en formato HH:mm
endDatestringFecha fin en formato YYYY-MM-DD
endTimestringHora fin en formato HH:mm
extraIdsstringIDs de extras en CSV: "1,2,3"
autoCheckoutbooleanSi es true, va directo al checkout
customerNamestringNombre del cliente (pre-rellena el formulario)
customerEmailstringEmail del cliente (pre-rellena el formulario)
customerPhonestringTeléfono del cliente (pre-rellena el formulario)
tokenstringToken de sesión de reserva activa
organizationIdstringOverride del organization ID

Ejemplo — enlace directo a una experiencia con datos pre-cargados:

https://muweb.com/charter#/?experienceId=42&adults=4&startDate=2025-07-15&autoCheckout=true

Eventos del widget ​

Los widgets emiten Custom Events que podés escuchar desde tu web para reaccionar a las acciones del usuario.

javascript
const widget = document.querySelector('solnow-booking-engine')

// Usuario seleccionó una experiencia
widget.addEventListener('experience-selected', (event) => {
  console.log('Experiencia:', event.detail.experienceId, event.detail.experience)
})

// Usuario realizó una búsqueda
widget.addEventListener('search', (event) => {
  console.log('Filtros:', event.detail.filters)
  console.log('Resultados:', event.detail.total)
})

// Vista cambió (list / detail)
widget.addEventListener('view-change', (event) => {
  console.log('Vista activa:', event.detail.view)
})

// Error
widget.addEventListener('error', (event) => {
  console.error('Error en el widget:', event.detail.message)
})

Para solnow-experience-detail y solnow-experience-selector:

javascript
const widget = document.querySelector('solnow-experience-detail')

// Reserva completada
widget.addEventListener('booking-complete', (event) => {
  console.log('Datos de la reserva:', event.detail)
})

// Error de configuración
widget.addEventListener('error', (event) => {
  console.error(event.detail.message)
})

Ejemplo completo de integración ​

html
<!DOCTYPE html>
<html lang="es">
<head>
  <title>Mi empresa de charter</title>
</head>
<body>

  <!-- 1. Script del widget -->
  <script src="https://app.solnow.io/widgets/solnow-booking-engine.js?organizationId=12"></script>

  <!-- 2. El widget -->
  <solnow-booking-engine
    id="mi-widget"
    lang="es"
    primary-color="#1a56db"
    fixed-city="Mallorca"
    page-size="12"
  ></solnow-booking-engine>

  <!-- 3. Escuchar eventos -->
  <script>
    const widget = document.getElementById('mi-widget')
    
    widget.addEventListener('experience-selected', (e) => {
      // Por ejemplo: actualizar la URL de tu web
      history.pushState({}, '', `/barco/${e.detail.experienceId}`)
    })

    widget.addEventListener('booking-complete', (e) => {
      // Tracking, analytics, etc.
      gtag('event', 'purchase', { value: e.detail.total })
    })
  </script>

</body>
</html>

API pública — endpoints del booking engine ​

El widget consume estos endpoints públicos (sin autenticación). También los podés usar directamente si estás construyendo tu propia UI.

MétodoEndpointDescripción
GET/api/website/configConfiguración pública (form de checkout, ajustes)
POST/api/website/searchBuscar experiencias con filtros
GET/api/website/experiences/detail?id=XDetalle de una experiencia por ID
GET/api/website/experiences/detail?slug=XDetalle de una experiencia por slug
GET/api/website/experiences/{id}/availability?year=Y&month=MDisponibilidad mensual de una experiencia
GET/api/website/filter-optionsOpciones de filtro disponibles (tipos de barco, tags, ciudades…)
POST/api/website/calculate-priceCalcular precio de una reserva
POST/api/website/initiate-paymentIniciar el pago de una reserva
POST/api/website/booking-sessionCrear sesión de reserva
GET/api/website/booking-session?token=XRecuperar sesión de reserva por token

La organización se identifica por el header Origin o Referer de la petición, o pasando organization_id como query param.

Entorno de producción

La URL base de la API es: https://api.solnow.io/api

¿Necesitas ayuda? Contacta con soporte@solnow.io