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.
| Unidad | Qué es | En una integración de plataforma |
|---|---|---|
| Espacio de trabajo | El inquilino: conexiones, anuncios, reservas, webhooks, claves. | Uno, el tuyo. Aquí viven la identidad de facturación y las suscripciones de webhooks. |
| Cuenta conectada | Una 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. |
| Anuncio | Una propiedad conectada. | Pertenece a la cuenta de la que vino. |
| Clave de API | Credencial 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 enaccounts, yDELETE /v1/connect/{provider}admite unaccountIdpara desconectar la cuenta de un usuario sin tocar las demás. - Cada evento indica su cuenta. Las entregas de webhook llevan un bloque
account—provideryexternalAccountId, el id propio del proveedor— y la misma cuenta en las cabecerasX-Repull-AccountyX-Repull-Account-Id. - Cada registro indica su cuenta.
GET /v1/reservations,/v1/conversationsy/v1/reviewsllevanaccounten cada fila y/v1/propertiesllevaaccounts; los cuatro admiten?account=provider:externalAccountIdpara 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.devPregunta 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.
| La plataforma tiene las claves | El cliente es dueño del espacio de trabajo | |
|---|---|---|
| Quién se registra | Tú, una vez por cliente | Tu cliente |
| A quién se factura | A ti | A tu cliente |
| Quién tiene la clave | Tú | Tu cliente, que la comparte contigo |
| Experiencia de alta | Todo dentro de tu producto, con tu marca en Connect | Tu cliente sale para registrarse y vuelve con una clave |
| Si se va de tu producto | Desactivas el espacio de trabajo | Conserva el espacio de trabajo y las conexiones |
| Soporte | El tuyo | Repartido 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.
| Hoy | |
|---|---|
| Nombre de marca en las páginas Connect alojadas | Sí |
| Tu logo, en versión clara y oscura | Sí |
| Tus colores principal y de acento, en ambos temas | Sí |
| Tu email de soporte en el pie | Sí |
| Tus enlaces de términos y privacidad | Sí |
| Redirección por defecto de vuelta a tu producto | Sí |
| Idioma por defecto de las páginas alojadas | Sí |
| Connect servido desde tu propio dominio | No: la URL sigue en connect.repull.dev |
| Sin atribución | No: hay un enlace "Powered by Repull" |
| Emails enviados desde tu dominio | No |
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/batchpara valores de calendario de muchas propiedades,POST /v1/listings/pricing/bulkpara decisiones de precio yPOST /v1/listings/statuspara 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/webhookspara 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.devPregunta 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.devPregunta 8
¿Cuál es el modelo comercial recomendado para una plataforma que integra Repull?
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.
- 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.
- 2Para cada usuario, crea una sesión de Connect con
POST /v1/connect, limitandoallowedProvidersa los canales que soporta tu producto. - 3Pasa tu id de usuario como
state. Cuando termina,connect.session.completeddevuelve esestatecon la cuenta que conectó: guarda la cuenta asociada al usuario. - 4Suscribe un endpoint de webhook con
POST /v1/webhooksy dirige cada evento por su bloqueaccount. Usa los endpoints de prueba y de reenvío para construir el gestor antes de que llegue un evento real. - 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
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