Repull para plataformas: como funciona quando os teus clientes são os anfitriões
Estas são as perguntas que as plataformas fazem de facto antes de se comprometerem: um acordo ou muitos, qual é a unidade, quem é faturado, o que cobre mesmo a marca branca e o que acontece com uns milhares de propriedades. Respondidas com o que existe hoje, incluindo as partes que ainda não existem. Aqui não há nenhum preço: a metade comercial é uma conversa, e esta página é a metade técnica honesta de que precisas antes de a ter.
O modelo, num parágrafo
Tens um espaço de trabalho e uma chave de API. Cada um dos teus utilizadores liga as suas próprias contas do Airbnb, Booking.com ou Vrbo nesse espaço de trabalho através do Connect, com a tua marca: muitas contas por canal, lado a lado. O teu produto lê e escreve em todas com essa única chave, e cada evento de webhook diz de que conta ligada vem, para que o encaminhes para o utilizador certo. Os teus utilizadores nunca se registam na Repull nem têm uma chave. Este é todo o modelo; tudo o que se segue é consequência dele.
| Unidade | O que é | Numa integração de plataforma |
|---|---|---|
| Espaço de trabalho | O inquilino: ligações, anúncios, reservas, webhooks, chaves. | Um, o teu. A identidade de faturação e as subscrições de webhooks vivem aqui. |
| Conta ligada | Uma das contas de canal do teu utilizador: um anfitrião do Airbnb, uma propriedade do Booking.com, uma conta do Vrbo. | Muitas por canal. Cada utilizador liga as suas; os eventos e as linhas do Airbnb indicam-na. |
| Anúncio | Uma propriedade ligada. | Pertence à conta de onde veio. |
| Chave de API | Credencial bearer do espaço de trabalho. | Uma chave lê todas as contas ligadas. Os âmbitos limitam operações, não anúncios. |
Pergunta 1
Uma plataforma pode ter um único acordo com a Repull e oferecer a integração a muitos dos seus próprios utilizadores?
Sim, e é para isso que a Repull foi feita: um acordo, um espaço de trabalho da Repull para a plataforma e todos os utilizadores da plataforma ligados lá dentro. Cada utilizador liga a sua própria conta do Airbnb, Booking.com ou Vrbo através do fluxo Connect alojado com a tua marca, e o teu produto lê e escreve em todas as contas ligadas com uma única chave de API. Cada conta ligada mantém a sua identidade — os eventos de webhook e cada reserva, conversa e avaliação dizem de que conta vêm —, por isso encaminhas cada reserva, mensagem e avaliação para o utilizador certo no teu produto. Os teus utilizadores nunca se registam na Repull, nunca veem uma chave e nunca assinam nada connosco. A forma como o acordo é formalizado é uma conversa, não um plano publicado.
Na prática, a plataforma nunca pede aos seus utilizadores que assinem nada connosco, nunca lhes mostra a nossa marca a não ser uma ligação de atribuição na página Connect e nunca lhes entrega uma credencial. O teu utilizador clica em “ligar Airbnb” dentro do teu produto, completa um fluxo alojado com a tua marca e volta. A conta dele é agora mais uma conta ligada no teu espaço de trabalho.
Integrar um dos teus utilizadores
// 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.Pergunta 2
Como está estruturado: por propriedade, por utilizador ou por ligação?
As unidades são espaço de trabalho, conta ligada, anúncio e chave de API. O espaço de trabalho é teu — da plataforma — e é a fronteira do inquilino. Lá dentro, cada um dos teus utilizadores liga uma ou mais contas de canal: várias contas de anfitrião do Airbnb, várias propriedades do Booking.com, várias contas do Vrbo, lado a lado. Um anúncio é uma propriedade ligada e pertence à conta de onde veio. A chave de API pertence ao espaço de trabalho, por isso o teu produto lê todas as contas ligadas com uma só chave e distingue-as por conta: cada reserva, conversa e avaliação traz uma conta (o fornecedor e o id de conta do próprio fornecedor), cada propriedade lista as suas contas, os quatro aceitam um filtro por conta e cada evento de webhook indica a mesma conta. O que é contado comercialmente é uma pergunta diferente de como é modelado, e merece ser respondida sobre um caso real em vez de adivinhada em público.
- Muitas contas por canal. As contas de anfitrião do Airbnb, as propriedades do Booking.com e as contas do Vrbo de todos os teus utilizadores convivem no teu espaço de trabalho.
GET /v1/connect/{provider}lista-as emaccounts, eDELETE /v1/connect/{provider}aceita umaccountIdpara desligar a conta de um utilizador sem mexer nas outras. - Cada evento indica a sua conta. As entregas de webhook trazem um bloco
account—providereexternalAccountId, o id do próprio fornecedor — e a mesma conta nos cabeçalhosX-Repull-AccounteX-Repull-Account-Id. - Cada registo indica a sua conta.
GET /v1/reservations,/v1/conversationse/v1/reviewstrazemaccountem cada linha e/v1/propertiestrazaccounts; os quatro aceitam?account=provider:externalAccountIdpara ler os dados de um utilizador. - Uma chave para todo o espaço de trabalho. A chave é tua e lê todas as contas ligadas. Os âmbitos limitam o que pode fazer, não o que pode ver — que é exatamente o que queres quando a chave só vive nos teus servidores.
Encaminhar cada evento para o utilizador certo
// 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.Pergunta 3
É possível faturar diretamente o cliente final em vez da plataforma?
Hoje não, como funcionalidade de plataforma. A faturação está associada a um espaço de trabalho, por isso quem é dono do espaço de trabalho — normalmente tu, a plataforma — é quem é faturado. Não existe um objeto de faturação para revendedores nem um mecanismo para a Repull faturar os clientes finais de uma plataforma em nome dela enquanto a plataforma mantém o controlo administrativo. O que funciona é o contrário: um cliente final pode ser dono do seu próprio espaço de trabalho, pagá-lo e dar uma chave à plataforma. Se faturar os teus clientes através de nós é um requisito e não uma preferência, diz-nos: é o tipo de coisa que vale a pena construir para o parceiro certo, e não algo para fingir que já existe.
Faturar diretamente os teus clientes é um requisito para ti?
Se o teu modelo depende de nós faturarmos os teus clientes enquanto manténs o controlo administrativo, diz-nos que forma precisas. Hoje não existe, e é uma coisa concreta a construir com um parceiro por trás, não um talvez.
Escreve para hello@repull.devPergunta 4
Se o cliente final paga diretamente, a plataforma pode continuar a usar a API dentro do seu produto?
Sim. O acesso segue a chave de API, e uma chave pertence a um espaço de trabalho e não a uma pessoa, por isso um cliente que tem o seu próprio espaço de trabalho da Repull pode emitir uma chave e entregá-la à plataforma, e o produto da plataforma chama a API sobre esse espaço de trabalho exatamente como sobre o seu. Uma chave nunca atravessa espaços de trabalho, por isso este modelo implica guardar uma chave extra por cada cliente nessa situação. É a exceção, não a regra: a maioria das plataformas mantém todos os utilizadores no seu próprio espaço de trabalho de parceiro e só usa um espaço do cliente quando o cliente quer a sua própria relação de faturação connosco.
| A plataforma tem as chaves | O cliente é dono do espaço de trabalho | |
|---|---|---|
| Quem se regista | Tu, uma vez por cliente | O teu cliente |
| Quem é faturado | Tu | O teu cliente |
| Quem tem a chave | Tu | O teu cliente, que a partilha contigo |
| Experiência de integração | Tudo dentro do teu produto, com a tua marca no Connect | O teu cliente sai para se registar e volta com uma chave |
| Se deixar o teu produto | Desativas o espaço de trabalho | Fica com o espaço de trabalho e as ligações |
| Suporte | O teu | Dividido entre ti e nós |
Os dois funcionam tecnicamente. O segundo é mesmo melhor num caso: um cliente suficientemente grande para querer a sua própria relação, a sua própria fatura e a sua própria continuidade se um dia deixar o teu produto. Para todos os outros, o primeiro tem menos atrito e menos credenciais na tua base de dados.
Pergunta 5
Há acordos de parceiro, revenda, marca branca ou volume para plataformas SaaS?
Comercialmente, sim: os acordos com plataformas são exatamente a conversa que queremos ter, e as condições são definidas parceiro a parceiro em vez de publicadas. Tecnicamente, marca branca hoje significa que as páginas Connect alojadas onde chegam os utilizadores de uma plataforma têm a marca da plataforma: nome da app, logótipos claro e escuro, cores principal e de destaque para os dois temas, email de suporte, ligações para termos e privacidade, um redirecionamento por defeito de volta ao produto e um idioma por defeito. O que não significa: o URL do Connect continua em connect.repull.dev, a página tem uma ligação "Powered by Repull" e não há domínio próprio nem emails enviados a partir de um domínio do parceiro. Tudo o resto — condições de revenda, acordos de volume, co-marketing — é uma conversa.
| Hoje | |
|---|---|
| Nome da marca nas páginas Connect alojadas | Sim |
| O teu logótipo, versões clara e escura | Sim |
| As tuas cores principal e de destaque, nos dois temas | Sim |
| O teu email de suporte no rodapé | Sim |
| As tuas ligações para termos e privacidade | Sim |
| Redirecionamento por defeito de volta ao teu produto | Sim |
| Idioma por defeito das páginas alojadas | Sim |
| Connect servido a partir do teu domínio | Não: o URL continua em connect.repull.dev |
| Atribuição removida | Não: há uma ligação "Powered by Repull" |
| Emails enviados a partir do teu domínio | Não |
Configuras uma vez em /dashboard/settings/connect e aplica-se a todos os canais que os teus utilizadores ligam. O fluxo em si tem a mesma forma do Stripe Connect ou do Plaid Link: o teu servidor cria uma sessão e lê um estado, e nunca toca numa credencial de canal.
Pergunta 6
O que acontece com várias centenas ou vários milhares de propriedades ligadas?
A API foi feita para essa dimensão: os endpoints de listagem pesados são paginados por cursor, com um alias de offset para paginação curta; existem superfícies em lote para não fazeres uma chamada por propriedade (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status); as escritas aceitam um Idempotency-Key para que um timeout de rede não possa criar uma reserva duplicada; e os webhooks com registo de entregas e reenvio fazem com que não tenhas de consultar periodicamente. Milhares de propriedades de centenas dos teus utilizadores continuam a viver no teu único espaço de trabalho, atrás de uma chave e de um endpoint de webhook; o que vale a pena desenhar connosco a essa escala é o volume de integração e a forma como associas as contas ligadas aos teus utilizadores.
- Pagina com cursores. Os endpoints de listagem pesados são paginados por chave, por isso o custo por página mantém-se constante por mais fundo que vás.
?offset=existe como alias para paginação curta e é a ferramenta errada para uma passagem completa. - Escreve em lote.
PATCH /v1/availability/batchpara valores de calendário em muitas propriedades,POST /v1/listings/pricing/bulkpara decisões de preço ePOST /v1/listings/statuspara a ativação. Uma chamada, muitas propriedades, com as falhas parciais reportadas item a item em vez de fazer falhar o lote. - Envia uma chave de idempotência. Toda a escrita que cria algo aceita
Idempotency-Key. Com volume de plataforma, um timeout não é um caso raro: é uma terça-feira qualquer. - Subscreve, não consultes. Um endpoint
POST /v1/webhookspara o teu espaço de trabalho, com registo de entregas, reenvio e um endpoint de teste por tipo de evento, para construíres o handler antes do primeiro evento real.
As duas leituras de que um ecrã de suporte precisa
# 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_...'
Estás a planear para uns milhares de propriedades?
Traz o número de utilizadores, a combinação de canais e a velocidade a que esperas integrá-los. A essa escala, o volume de integração e a associação de contas a utilizadores devem ser desenhados em conjunto antes de os construíres.
Escreve para hello@repull.devPergunta 7
Há taxas de configuração, por transação ou de utilização a prever?
A utilização é medida por espaço de trabalho e vês-a na API antes de se tornar uma surpresa: GET /v1/usage/summary, GET /v1/usage/logs e GET /v1/usage/tier mostram o que um espaço de trabalho consumiu e a que tem direito, por isso uma plataforma pode acompanhar o consumo dos seus próprios clientes de forma programática. Também não há uma sandbox paga à parte para orçamentar: constróis sobre a API real desde a primeira chave. Quanto custa tudo isto para uma plataforma não é publicado de propósito, porque um número certo para uma integração de dez clientes está errado para uma de mil. Traz o teu caso e o teu volume e terás uma resposta direta.
Não haver nenhum número nesta página não é timidez. Os acordos com plataformas variam numa ordem de grandeza conforme quantos clientes finais há por trás, que canais usam e quem assegura o suporte de primeira linha, e um número publicado para um desses casos é ativamente enganador para os outros. O que podes verificar tu mesmo antes de qualquer conversa é o consumo: os endpoints de utilização mostram o que um espaço de trabalho usou e a que tem direito, por isso podes modelar a tua própria economia com números reais em vez dos nossos.
Obtém a resposta comercial para o teu caso real
Envia o número de clientes finais, os canais de que precisam e mais ou menos quantas propriedades gere cada um. Vais receber uma proposta concreta em vez de uma tabela de preços que não encaixa.
Escreve para hello@repull.devPergunta 8
Qual é o modelo comercial recomendado para uma plataforma que integra a Repull?
Um espaço de trabalho de parceiro, uma chave, um acordo connosco. Cada utilizador que integras liga as suas contas de canal no teu espaço de trabalho através do Connect, com a tua marca, com o teu próprio id de utilizador como estado da sessão. Quando termina, o webhook connect.session.completed devolve-te esse estado e a conta que ligou; guarda a conta associada ao teu utilizador. A partir daí, cada evento e cada registo indicam a sua conta, e cada listagem aceita um filtro por conta. Os teus utilizadores nunca lidam diretamente com a Repull, e adicionar um utilizador é uma sessão do Connect, não um registo. Usa um espaço de trabalho separado, do cliente, apenas quando um cliente quer expressamente a sua própria relação de faturação connosco, ou para o Repull Migrate, que cria um espaço de trabalho por cada gestor que migras.
- 1Regista-te uma vez. O teu espaço de trabalho e a sua chave de API são as únicas credenciais da Repull no teu sistema; guarda a chave nos teus servidores.
- 2Para cada utilizador, cria uma sessão do Connect com
POST /v1/connect, limitandoallowedProvidersaos canais que o teu produto suporta. - 3Passa o teu id de utilizador como
state. Quando termina,connect.session.completeddevolve essestatecom a conta que ligou: guarda a conta associada ao utilizador. - 4Subscreve um endpoint de webhook com
POST /v1/webhookse encaminha cada evento pelo seu blocoaccount. Usa os endpoints de teste e de reenvio para construíres o handler antes de chegar um evento real. - 5Lê através dos endpoints entre canais sempre que puderes, para que adicionar um canal mais tarde seja uma alteração de configuração e não uma reescrita.
A versão técnica mais aprofundada — autenticação, tipos de eventos de webhook, sandbox, cobertura por canal — está nas perguntas e respostas para plataformas SaaS. O detalhe canal a canal está nos guias do Airbnb, do Booking.com e do Vrbo, e a referência completa está na documentação.
A maioria das plataformas herda o que os seus clientes já usam, o que na prática significa vários sistemas de gestão de propriedades e não apenas um. Cada um tem o seu modelo de autenticação, os seus nomes de campos e os seus limites: os guias do Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu e Beds24 explicam o que cada sistema expõe e o que te custa mantê-lo, e a matriz de cobertura compara-os lado a lado.
A lista honesta
O que é que a Repull ainda não faz para plataformas?
Dito claramente para que ninguém construa a contar com isso. Um espaço de trabalho tem uma ligação por sistema de gestão de propriedades: ligar uma segunda conta Hostaway, Guesty ou de outro PMS no mesmo espaço de trabalho substitui a primeira, por isso hoje dois dos teus utilizadores no mesmo PMS não podem coexistir como podem as contas do Airbnb, Booking.com e Vrbo; está a ser corrigido. As chaves de API não podem ser limitadas a um subconjunto de anúncios; os âmbitos limitam operações, não inventário. Não há um endpoint geral para criar espaços de trabalho — o modelo de parceiro não precisa dele; o único espaço de trabalho criado por API é o do Repull Migrate (`POST /v1/connect` com `purpose: "migrate"`, acedido com `X-Workspace-Id`). Não há faturação por cliente final nem de revenda. A marca branca não se estende a um domínio próprio para o Connect nem a emails enviados a partir de um domínio do parceiro, e as páginas alojadas têm uma ligação "Powered by Repull". Se alguma destas coisas é essencial para o que estás a construir, diz-nos cedo.
Porque existe esta secção
Diz-nos qual destas coisas te está a atrapalhar
Indica a peça que falta, o que construirias com ela e quando precisas dela. Um requisito concreto de uma integração real é o que se constrói a seguir.
Escreve para hello@repull.dev