Para plataformas SaaS que integran Repull

Repull para plataformas: cómo funciona cuando tus clientes son los anfitriones

Estas son las preguntas que hacen de verdad las plataformas antes de comprometerse: un acuerdo o muchos, cuál es la unidad, a quién se factura, qué cubre realmente la marca blanca y qué pasa con unos miles de propiedades. Respondidas con lo que existe hoy, incluidas las partes que todavía no existen. Aquí no aparece ningún precio: la mitad comercial es una conversación, y esta página es la mitad técnica honesta que necesitas antes de tenerla.

El modelo, en un párrafo

Tienes un espacio de trabajo y una clave de API. Cada uno de tus usuarios conecta sus propias cuentas de Airbnb, Booking.com o Vrbo en ese espacio de trabajo mediante Connect, con tu marca: muchas cuentas por canal, una al lado de otra. Tu producto lee y escribe en todas con esa única clave, y cada evento de webhook indica de qué cuenta conectada viene, así que lo diriges al usuario correcto. Tus usuarios nunca se registran en Repull ni tienen una clave. Ese es todo el modelo; todo lo que sigue es consecuencia de él.

Las cuatro unidades con las que se construye una integración de plataforma
UnidadQué esEn una integración de plataforma
Espacio de trabajoEl inquilino: conexiones, anuncios, reservas, webhooks, claves.Uno, el tuyo. Aquí viven la identidad de facturación y las suscripciones de webhooks.
Cuenta conectadaUna de las cuentas de canal de tu usuario: un anfitrión de Airbnb, una propiedad de Booking.com, una cuenta de Vrbo.Muchas por canal. Cada usuario conecta las suyas; los eventos y las filas de Airbnb la indican.
AnuncioUna propiedad conectada.Pertenece a la cuenta de la que vino.
Clave de APICredencial bearer del espacio de trabajo.Una clave lee todas las cuentas conectadas. Los alcances limitan operaciones, no anuncios.

Pregunta 1

¿Puede una plataforma tener un único acuerdo con Repull y ofrecer la integración a muchos de sus propios usuarios?

Sí, y es para lo que está hecho Repull: un acuerdo, un espacio de trabajo de Repull para la plataforma y todos los usuarios de la plataforma conectados dentro de él. Cada usuario conecta su propia cuenta de Airbnb, Booking.com o Vrbo mediante el flujo Connect alojado con tu marca, y tu producto lee y escribe en todas las cuentas conectadas con una sola clave de API. Cada cuenta conectada mantiene su propia identidad —los eventos de webhook y cada reserva, conversación y reseña indican de qué cuenta vienen—, así que diriges cada reserva, mensaje y reseña al usuario correcto en tu propio producto. Tus usuarios nunca se registran en Repull, nunca ven una clave y nunca firman nada con nosotros. Cómo se formaliza el acuerdo es una conversación, no un plan publicado.

En la práctica, la plataforma nunca pide a sus usuarios que firmen nada con nosotros, nunca les muestra nuestra marca salvo un enlace de atribución en la página Connect y nunca les entrega una credencial. Tu usuario pulsa “conectar Airbnb” dentro de tu producto, completa un flujo alojado con tu marca y vuelve. Su cuenta es ya una cuenta conectada más en tu espacio de trabajo.

Dar de alta a uno de tus usuarios

// One workspace — yours — and one key for every user you onboard.
// 1. Mint a Connect session for this user, with your user id as state.
const res = await fetch('https://api.repull.dev/v1/connect', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer ' + process.env.REPULL_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    redirectUrl: 'https://your-product.com/channels/done',
    state: userId,                      // comes back to you
    allowedProviders: ['airbnb', 'booking', 'vrbo-login'],
  }),
})
const { url } = await res.json()

// 2. Redirect the user. They connect on your branded Connect page and
//    come back with ?status=connected&state=<userId>. The
//    connect.session.completed webhook carries the same state and the
//    account they connected — store that account against the user.

Pregunta 2

¿Cómo se estructura: por propiedad, por usuario o por conexión?

Las unidades son espacio de trabajo, cuenta conectada, anuncio y clave de API. El espacio de trabajo es tuyo —de la plataforma— y es el límite del inquilino. Dentro, cada uno de tus usuarios conecta una o varias cuentas de canal: varias cuentas de anfitrión de Airbnb, varias propiedades de Booking.com, varias cuentas de Vrbo, una al lado de otra. Un anuncio es una propiedad conectada y pertenece a la cuenta de la que vino. La clave de API pertenece al espacio de trabajo, así que tu producto lee todas las cuentas conectadas con una sola clave y las distingue por cuenta: cada reserva, conversación y reseña lleva una cuenta (el proveedor y el id de cuenta propio del proveedor), cada propiedad lista sus cuentas, las cuatro admiten un filtro por cuenta y cada evento de webhook indica la misma cuenta. Lo que se cuenta comercialmente es otra pregunta distinta de cómo se modela, y merece responderse sobre un caso real en lugar de adivinarse en público.

  • Muchas cuentas por canal. Las cuentas de anfitrión de Airbnb, las propiedades de Booking.com y las cuentas de Vrbo de todos tus usuarios conviven en tu espacio de trabajo. GET /v1/connect/{provider} las lista en accounts, y DELETE /v1/connect/{provider} admite un accountId para desconectar la cuenta de un usuario sin tocar las demás.
  • Cada evento indica su cuenta. Las entregas de webhook llevan un bloque account —provider y externalAccountId, el id propio del proveedor— y la misma cuenta en las cabeceras X-Repull-Account y X-Repull-Account-Id.
  • Cada registro indica su cuenta. GET /v1/reservations, /v1/conversations y /v1/reviews llevan account en cada fila y /v1/properties lleva accounts; los cuatro admiten ?account=provider:externalAccountId para leer los datos de un usuario.
  • Una clave para todo el espacio de trabajo. La clave es tuya y lee todas las cuentas conectadas. Los alcances limitan lo que puede hacer, no lo que puede ver, que es justo lo que quieres cuando la clave solo vive en tus servidores.

Dirigir cada evento al usuario correcto

// Every webhook event names the connected account it came from.
app.post('/repull/webhooks', (req, res) => {
  const event = verify(req)                 // HMAC over the raw body
  const { provider, externalAccountId } = event.account ?? {}
  const userId = accountsToUsers.get(provider + ':' + externalAccountId)
  // …hand event.data to that user's inbox, calendar or CRM
  res.sendStatus(200)
})
// The provider's account id is also on the X-Repull-Account header,
// so you can shard before parsing the body.

Pregunta 3

¿Se puede facturar directamente al cliente final en lugar de a la plataforma?

Hoy no como función de plataforma. La facturación va ligada a un espacio de trabajo, así que quien es dueño del espacio de trabajo —normalmente tú, la plataforma— es quien recibe la factura. No hay un objeto de facturación para revendedores ni un mecanismo para que Repull facture a los clientes finales de una plataforma en su nombre mientras la plataforma mantiene el control administrativo. Lo que sí funciona es al revés: un cliente final puede ser dueño de su propio espacio de trabajo, pagarlo y darle una clave a la plataforma. Si facturar a tus clientes a través de nosotros es un requisito y no una preferencia, dilo: es el tipo de cosa que vale la pena construir para el partner adecuado, y no algo que fingir que ya existe.

¿Facturar directamente a tus clientes es un requisito para ti?

Si tu modelo depende de que facturemos a tus clientes mientras tú mantienes el control administrativo, cuéntanos qué forma necesitas. Hoy no existe, y es algo concreto que construir con un partner detrás, no un quizá.

Escribe a hello@repull.dev

Pregunta 4

Si el cliente final paga directamente, ¿puede la plataforma seguir usando la API dentro de su producto?

Sí. El acceso sigue a la clave de API, y una clave pertenece a un espacio de trabajo, no a una persona, así que un cliente con su propio espacio de trabajo de Repull puede emitir una clave y dársela a la plataforma, y el producto de la plataforma llama a la API contra ese espacio de trabajo exactamente igual que contra el suyo. Una clave nunca cruza espacios de trabajo, así que este modelo implica guardar una clave más por cada cliente así. Es la excepción, no lo habitual: la mayoría de plataformas tiene a todos sus usuarios en su propio espacio de trabajo de partner y solo usa uno del cliente cuando el cliente quiere su propia relación de facturación con nosotros.

Claves en manos de la plataforma frente a claves en manos del cliente
La plataforma tiene las clavesEl cliente es dueño del espacio de trabajo
Quién se registraTú, una vez por clienteTu cliente
A quién se facturaA tiA tu cliente
Quién tiene la claveTúTu cliente, que la comparte contigo
Experiencia de altaTodo dentro de tu producto, con tu marca en ConnectTu cliente sale para registrarse y vuelve con una clave
Si se va de tu productoDesactivas el espacio de trabajoConserva el espacio de trabajo y las conexiones
SoporteEl tuyoRepartido entre tú y nosotros

Las dos funcionan técnicamente. La segunda es mejor de verdad en un caso: un cliente lo bastante grande como para querer su propia relación, su propia factura y su propia continuidad si alguna vez deja tu producto. Para todos los demás, la primera tiene menos fricción y menos credenciales en tu base de datos.

Pregunta 5

¿Hay acuerdos de partner, reventa, marca blanca o volumen para plataformas SaaS?

Comercialmente, sí: los acuerdos con plataformas son justo la conversación que queremos tener, y las condiciones se fijan por partner en lugar de publicarse. Técnicamente, marca blanca hoy significa que las páginas Connect alojadas a las que llegan los usuarios de una plataforma llevan la marca de la plataforma: nombre de la app, logos claro y oscuro, colores principal y de acento para ambos temas, email de soporte, enlaces de términos y privacidad, una redirección por defecto de vuelta al producto y un idioma por defecto. Lo que no significa: la URL de Connect sigue en connect.repull.dev, la página lleva un enlace "Powered by Repull" y no hay dominio propio ni emails enviados desde un dominio del partner. Todo lo demás —condiciones de reventa, acuerdos por volumen, co-marketing— es una conversación.

Qué cubre hoy la marca blanca y qué no
Hoy
Nombre de marca en las páginas Connect alojadasSí
Tu logo, en versión clara y oscuraSí
Tus colores principal y de acento, en ambos temasSí
Tu email de soporte en el pieSí
Tus enlaces de términos y privacidadSí
Redirección por defecto de vuelta a tu productoSí
Idioma por defecto de las páginas alojadasSí
Connect servido desde tu propio dominioNo: la URL sigue en connect.repull.dev
Sin atribuciónNo: hay un enlace "Powered by Repull"
Emails enviados desde tu dominioNo

Se configura una vez en /dashboard/settings/connect y se aplica a todos los canales que conectan tus usuarios. El flujo en sí tiene la misma forma que Stripe Connect o Plaid Link: tu servidor crea una sesión y lee un estado, y nunca toca una credencial de canal.

Pregunta 6

¿Qué pasa con varios cientos o varios miles de propiedades conectadas?

La API está hecha para ese tamaño: los endpoints de listado pesados se paginan por cursor, con un alias de offset para paginación poco profunda; hay superficies por lotes para no hacer una llamada por propiedad (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status); las escrituras admiten un Idempotency-Key para que un timeout de red no provoque una doble reserva; y los webhooks con registro de entregas y reenvío hacen que no tengas que sondear. Miles de propiedades de cientos de tus usuarios siguen viviendo en tu único espacio de trabajo, detrás de una clave y un endpoint de webhook; lo que conviene diseñar con nosotros a ese tamaño es el volumen de altas y cómo asignas las cuentas conectadas a tus usuarios.

  • Pagina con cursores. Los endpoints de listado pesados se paginan por clave, así que el coste por página se mantiene constante por mucho que avances. ?offset= existe como alias para paginación poco profunda y es la herramienta equivocada para un recorrido completo.
  • Escribe por lotes. PATCH /v1/availability/batch para valores de calendario de muchas propiedades, POST /v1/listings/pricing/bulk para decisiones de precio y POST /v1/listings/status para la activación. Una llamada, muchas propiedades, y los fallos parciales se informan elemento a elemento en lugar de hacer fallar el lote.
  • Envía una clave de idempotencia. Toda escritura que crea algo admite Idempotency-Key. Con volumen de plataforma, un timeout no es un caso raro: es un martes cualquiera.
  • Suscríbete, no sondees. Un endpoint POST /v1/webhooks para tu espacio de trabajo, con registro de entregas, reenvío y un endpoint de prueba por tipo de evento para que puedas construir el gestor antes del primer evento real.

Las dos lecturas que necesita una pantalla de soporte de plataforma

# What is connected, for a support screen.
curl https://api.repull.dev/v1/connect \
  -H 'Authorization: Bearer sk_live_...'

# What this workspace has consumed, for your own metering.
curl https://api.repull.dev/v1/usage/summary \
  -H 'Authorization: Bearer sk_live_...'

¿Planificas para unos miles de propiedades?

Trae el número de usuarios, la mezcla de canales y la velocidad a la que esperas darlos de alta. El volumen de altas y la asignación de cuentas a usuarios a ese tamaño conviene diseñarlos juntos antes de construirlos.

Escribe a hello@repull.dev

Pregunta 7

¿Hay que prever cuotas de alta, por transacción o por uso?

El uso se mide por espacio de trabajo y lo ves en la API antes de que sea una sorpresa: GET /v1/usage/summary, GET /v1/usage/logs y GET /v1/usage/tier informan de lo que ha consumido un espacio de trabajo y de a qué tiene derecho, así que una plataforma puede seguir el consumo de sus propios clientes de forma programática. Tampoco hay un sandbox de pago aparte que presupuestar: desarrollas contra la API real desde la primera clave. Lo que cuesta todo esto para una plataforma no se publica a propósito, porque una cifra que es correcta para una integración de diez clientes es incorrecta para una de mil. Trae tu caso y tu volumen y tendrás una respuesta directa.

Que no haya ninguna cifra en esta página no es timidez. Los acuerdos con plataformas varían en un orden de magnitud según cuántos clientes finales hay detrás, qué canales usan y quién lleva el soporte de primer nivel, y una cifra publicada para uno de esos casos engaña activamente para los demás. Lo que sí puedes comprobar tú antes de cualquier conversación es el consumo: los endpoints de uso informan de lo que ha usado un espacio de trabajo y de a qué tiene derecho, así que puedes modelar tu propia economía con cifras reales en lugar de con las nuestras.

Obtén la respuesta comercial para tu caso real

Envíanos el número de clientes finales, los canales que necesitan y más o menos cuántas propiedades gestiona cada uno. Recibirás una propuesta concreta en lugar de una tabla de precios que no encaja.

Escribe a hello@repull.dev

Pregunta 8

Un espacio de trabajo de partner, una clave, un acuerdo con nosotros. Cada usuario que das de alta conecta sus cuentas de canal en tu espacio de trabajo mediante Connect, con tu marca, con tu propio id de usuario como estado de la sesión. Cuando termina, el webhook connect.session.completed te devuelve ese estado y la cuenta que conectó; guarda la cuenta asociada a tu usuario. A partir de ahí, cada evento y cada registro indican su cuenta, y cada listado admite un filtro por cuenta. Tus usuarios nunca tratan con Repull directamente, y añadir un usuario es una sesión de Connect, no un registro. Usa un espacio de trabajo aparte, propiedad del cliente, solo cuando un cliente quiera expresamente su propia relación de facturación con nosotros, o para Repull Migrate, que crea un espacio de trabajo por cada gestor que trasladas.

  1. 1Regístrate una vez. Tu espacio de trabajo y su clave de API son las únicas credenciales de Repull en tu sistema; guarda la clave en tus servidores.
  2. 2Para cada usuario, crea una sesión de Connect con POST /v1/connect, limitando allowedProviders a los canales que soporta tu producto.
  3. 3Pasa tu id de usuario como state. Cuando termina, connect.session.completed devuelve ese state con la cuenta que conectó: guarda la cuenta asociada al usuario.
  4. 4Suscribe un endpoint de webhook con POST /v1/webhooks y dirige cada evento por su bloque account. Usa los endpoints de prueba y de reenvío para construir el gestor antes de que llegue un evento real.
  5. 5Lee a través de los endpoints entre canales siempre que puedas, para que añadir un canal más adelante sea un cambio de configuración y no una reescritura.

La versión técnica más profunda —autenticación, tipos de eventos de webhook, sandbox, cobertura por canal— está en las preguntas y respuestas para plataformas SaaS. El detalle canal por canal está en las guías de Airbnb, Booking.com y Vrbo, y la referencia completa en la documentación.

La mayoría de plataformas hereda lo que ya usan sus clientes, lo que en la práctica significa una variedad de sistemas de gestión de propiedades y no uno solo. Cada uno tiene su propio modelo de autenticación, sus propios nombres de campos y sus propios límites: las guías de Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu y Beds24 explican lo que expone cada sistema y lo que te cuesta mantenerlo, y la matriz de cobertura los compara uno al lado del otro.

La lista honesta

¿Qué no hace todavía Repull para plataformas?

Dicho claramente para que nadie construya contando con ello. Un espacio de trabajo tiene una conexión por sistema de gestión de propiedades: conectar una segunda cuenta de Hostaway, Guesty u otro PMS en el mismo espacio de trabajo sustituye a la primera, así que hoy dos de tus usuarios en el mismo PMS no pueden convivir como sí pueden las cuentas de Airbnb, Booking.com y Vrbo; se está corrigiendo. Las claves de API no se pueden limitar a un subconjunto de anuncios; los alcances limitan operaciones, no inventario. No hay un endpoint general para crear espacios de trabajo —el modelo de partner no lo necesita—; el único espacio de trabajo creado por API es el de Repull Migrate (`POST /v1/connect` con `purpose: "migrate"`, al que se accede con `X-Workspace-Id`). No hay facturación por cliente final ni de reventa. La marca blanca no llega a un dominio propio para Connect ni a emails enviados desde un dominio del partner, y las páginas alojadas llevan un enlace "Powered by Repull". Si alguna de estas cosas es clave para lo que construyes, dilo pronto.

Por qué existe esta sección

Una plataforma que descubre que falta una pieza básica en el tercer mes ya ha construido alrededor de esa carencia. Todo lo anterior es lo que hace el producto; esto es lo que no hace, escrito para que la conversación empiece con los mismos datos. Si alguna de estas cosas te bloquea, es un primer email mucho mejor que una consulta general.

Dinos cuál de estas cosas te estorba

Indica la pieza que falta, qué construirías con ella y cuándo la necesitas. Un requisito concreto de una integración real es lo que se construye a continuación.

Escribe a hello@repull.dev