Para plataformas SaaS que integram a Repull

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.

As quatro unidades com que se constrói uma integração de plataforma
UnidadeO que éNuma integração de plataforma
Espaço de trabalhoO 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 ligadaUma 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úncioUma propriedade ligada.Pertence à conta de onde veio.
Chave de APICredencial 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 em accounts, e DELETE /v1/connect/{provider} aceita um accountId para desligar a conta de um utilizador sem mexer nas outras.
  • Cada evento indica a sua conta. As entregas de webhook trazem um bloco account — provider e externalAccountId, o id do próprio fornecedor — e a mesma conta nos cabeçalhos X-Repull-Account e X-Repull-Account-Id.
  • Cada registo indica a sua conta. GET /v1/reservations, /v1/conversations e /v1/reviews trazem account em cada linha e /v1/properties traz accounts; os quatro aceitam ?account=provider:externalAccountId para 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.dev

Pergunta 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.

Chaves na posse da plataforma comparadas com chaves na posse do cliente
A plataforma tem as chavesO cliente é dono do espaço de trabalho
Quem se registaTu, uma vez por clienteO teu cliente
Quem é faturadoTuO teu cliente
Quem tem a chaveTuO teu cliente, que a partilha contigo
Experiência de integraçãoTudo dentro do teu produto, com a tua marca no ConnectO teu cliente sai para se registar e volta com uma chave
Se deixar o teu produtoDesativas o espaço de trabalhoFica com o espaço de trabalho e as ligações
SuporteO teuDividido 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.

O que a marca branca cobre hoje e o que não cobre
Hoje
Nome da marca nas páginas Connect alojadasSim
O teu logótipo, versões clara e escuraSim
As tuas cores principal e de destaque, nos dois temasSim
O teu email de suporte no rodapéSim
As tuas ligações para termos e privacidadeSim
Redirecionamento por defeito de volta ao teu produtoSim
Idioma por defeito das páginas alojadasSim
Connect servido a partir do teu domínioNão: o URL continua em connect.repull.dev
Atribuição removidaNão: há uma ligação "Powered by Repull"
Emails enviados a partir do teu domínioNã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/batch para valores de calendário em muitas propriedades, POST /v1/listings/pricing/bulk para decisões de preço e POST /v1/listings/status para 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/webhooks para 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.dev

Pergunta 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.dev

Pergunta 8

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.

  1. 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.
  2. 2Para cada utilizador, cria uma sessão do Connect com POST /v1/connect, limitando allowedProviders aos canais que o teu produto suporta.
  3. 3Passa o teu id de utilizador como state. Quando termina, connect.session.completed devolve esse state com a conta que ligou: guarda a conta associada ao utilizador.
  4. 4Subscreve um endpoint de webhook com POST /v1/webhooks e encaminha cada evento pelo seu bloco account. Usa os endpoints de teste e de reenvio para construíres o handler antes de chegar um evento real.
  5. 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

Uma plataforma que descobre ao terceiro mês que falta uma peça básica já construiu à volta dessa falta. Tudo o que está acima é o que o produto faz; isto é o que não faz, escrito para que a conversa comece a partir dos mesmos factos. Se alguma destas coisas te bloqueia, é um primeiro email muito melhor do que um pedido de informação geral.

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