Pour les plateformes SaaS qui intègrent Repull

Repull pour les plateformes : comment ça marche quand tes clients sont les hôtes

Voici les questions que les plateformes posent vraiment avant de s'engager : un accord ou plusieurs, quelle est l'unité, qui est facturé, ce que couvre vraiment la marque blanche, et ce qui se passe à quelques milliers de biens. Avec des réponses fondées sur ce qui existe aujourd'hui, y compris les parties qui n'existent pas encore. Aucun prix ici : la moitié commerciale est une conversation, et cette page est la moitié technique honnête dont tu as besoin avant de l'avoir.

Le modèle, en un paragraphe

Tu as un espace de travail et une clé d'API. Chacun de tes utilisateurs connecte ses propres comptes Airbnb, Booking.com ou Vrbo dans cet espace de travail via Connect, à tes couleurs : plusieurs comptes par canal, côte à côte. Ton produit lit et écrit sur tous avec cette seule clé, et chaque événement webhook indique de quel compte connecté il vient, pour que tu l'achemines vers le bon utilisateur. Tes utilisateurs ne s'inscrivent jamais chez Repull et n'ont jamais de clé. C'est tout le modèle ; tout ce qui suit en découle.

Les quatre unités qui composent une intégration de plateforme
UnitéCe que c’estDans une intégration de plateforme
Espace de travailLe locataire : connexions, annonces, réservations, webhooks, clés.Un seul, le tien. L’identité de facturation et les abonnements webhook y vivent.
Compte connectéL’un des comptes de canal de ton utilisateur : un hôte Airbnb, un établissement Booking.com, un compte Vrbo.Plusieurs par canal. Chaque utilisateur connecte les siens ; les événements et les lignes Airbnb l’indiquent.
AnnonceUn bien connecté.Appartient au compte dont elle vient.
Clé d’APIIdentifiant bearer de l’espace de travail.Une clé lit tous les comptes connectés. Les périmètres limitent les opérations, pas les annonces.

Question 1

Une plateforme peut-elle avoir un seul accord avec Repull tout en offrant l'intégration à beaucoup de ses propres utilisateurs ?

Oui, et c'est exactement ce pour quoi Repull est fait : un accord, un espace de travail Repull pour la plateforme, et tous les utilisateurs de la plateforme connectés à l'intérieur. Chaque utilisateur connecte son propre compte Airbnb, Booking.com ou Vrbo via le flux Connect hébergé à tes couleurs, et ton produit lit et écrit sur chaque compte connecté avec une seule clé d'API. Chaque compte connecté garde sa propre identité — les événements webhook et chaque réservation, conversation et avis indiquent de quel compte ils viennent — donc tu achemines chaque réservation, message et avis vers le bon utilisateur dans ton propre produit. Tes utilisateurs ne s'inscrivent jamais chez Repull, ne voient jamais de clé et ne signent jamais rien avec nous. La façon dont l'accord est formalisé est une conversation, pas une offre publiée.

En pratique, la plateforme ne demande jamais à ses utilisateurs de signer quoi que ce soit avec nous, ne leur montre jamais notre marque à part un lien d'attribution sur la page Connect, et ne leur remet jamais d'identifiant. Ton utilisateur clique sur “connecter Airbnb” dans ton produit, passe par un flux hébergé à tes couleurs et revient. Son compte est désormais un compte connecté de plus dans ton espace de travail.

Embarquer l'un de tes utilisateurs

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

Question 2

Comment est-ce structuré : par bien, par utilisateur ou par connexion ?

Les unités sont l'espace de travail, le compte connecté, l'annonce et la clé d'API. L'espace de travail est à toi — à la plateforme — et c'est la frontière du locataire. À l'intérieur, chacun de tes utilisateurs connecte un ou plusieurs comptes de canal : plusieurs comptes hôtes Airbnb, plusieurs établissements Booking.com, plusieurs comptes Vrbo, côte à côte. Une annonce est un bien connecté et appartient au compte dont elle vient. La clé d'API appartient à l'espace de travail, donc ton produit lit tous les comptes connectés avec une seule clé et les distingue par compte : chaque réservation, conversation et avis porte un compte (le fournisseur et l'id de compte propre au fournisseur), chaque bien liste ses comptes, les quatre acceptent un filtre par compte, et chaque événement webhook indique le même compte. Ce qui est compté commercialement est une question distincte de la façon dont c'est modélisé, et elle mérite une réponse sur un cas réel plutôt qu'une supposition en public.

  • Plusieurs comptes par canal. Les comptes hôtes Airbnb, les établissements Booking.com et les comptes Vrbo de tous tes utilisateurs cohabitent dans ton espace de travail. GET /v1/connect/{provider} les liste dans accounts, et DELETE /v1/connect/{provider} accepte un accountIdpour déconnecter le compte d'un utilisateur sans toucher aux autres.
  • Chaque événement indique son compte. Les livraisons webhook portent un bloc account — provider et externalAccountId, l'id propre au fournisseur — et le même compte dans les en-têtes X-Repull-Account et X-Repull-Account-Id.
  • Chaque enregistrement indique son compte. GET /v1/reservations, /v1/conversations et /v1/reviews portent account sur chaque ligne et /v1/properties porte accounts ; les quatre acceptent ?account=provider:externalAccountIdpour lire les données d'un utilisateur.
  • Une clé pour tout l’espace de travail.La clé est à toi et lit tous les comptes connectés. Les périmètres limitent ce qu'elle peut faire, pas ce qu'elle peut voir— c'est exactement ce que tu veux quand la clé ne vit que sur tes serveurs.

Acheminer chaque événement vers le bon utilisateur

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

Question 3

Peut-on facturer directement le client final plutôt que la plateforme ?

Pas comme fonctionnalité de plateforme aujourd'hui. La facturation est rattachée à un espace de travail, donc celui qui possède l'espace de travail — en général toi, la plateforme — est celui qui est facturé. Il n'existe pas d'objet de facturation revendeur, ni de mécanisme permettant à Repull de facturer les clients finaux d'une plateforme pour son compte pendant que la plateforme garde le contrôle administratif. Ce qui fonctionne, c'est l'inverse : un client final peut posséder et payer son propre espace de travail et donner une clé à la plateforme. Si facturer tes clients par notre intermédiaire est une exigence et pas une préférence, dis-le : c'est le genre de chose qui vaut la peine d'être construite pour le bon partenaire, pas quelque chose à faire semblant d'avoir déjà.

La facturation directe de tes clients est-elle une exigence pour toi ?

Si ton modèle dépend de ce que nous facturions tes clients pendant que tu gardes le contrôle administratif, dis-nous la forme dont tu as besoin. Ça n'existe pas aujourd'hui, et c'est une chose concrète à construire avec un partenaire derrière, pas un peut-être.

Écrire à hello@repull.dev

Question 4

Si le client final paie directement, la plateforme peut-elle quand même utiliser l'API dans son produit ?

Oui. L'accès suit la clé d'API, et une clé appartient à un espace de travail, pas à une personne, donc un client qui possède son propre espace de travail Repull peut émettre une clé et la donner à la plateforme, et le produit de la plateforme appelle l'API sur cet espace de travail exactement comme sur le sien. Une clé ne traverse jamais les espaces de travail, donc ce modèle implique de garder une clé de plus par client concerné. C'est l'exception, pas la règle : la plupart des plateformes gardent tous leurs utilisateurs dans leur propre espace de travail partenaire et n'utilisent un espace appartenant au client que lorsque celui-ci veut sa propre relation de facturation avec nous.

Clés détenues par la plateforme comparées aux clés détenues par le client
La plateforme détient les clésLe client possède l’espace de travail
Qui s’inscritToi, une fois par clientTon client
Qui est facturéToiTon client
Qui détient la cléToiTon client, qui la partage avec toi
Parcours d’embarquementEntièrement dans ton produit, à tes couleurs sur ConnectTon client part s’inscrire, puis revient avec une clé
S’il quitte ton produitTu désactives l’espace de travailIl garde l’espace de travail et les connexions
SupportLe tienPartagé entre toi et nous

Les deux fonctionnent techniquement. Le second est vraiment meilleur dans un cas : un client assez gros pour vouloir sa propre relation, sa propre facture et sa propre continuité s'il quitte un jour ton produit. Pour tous les autres, le premier crée moins de friction et met moins d'identifiants dans ta base.

Question 5

Existe-t-il des accords partenaire, revendeur, marque blanche ou volume pour les plateformes SaaS ?

Commercialement, oui : les accords avec les plateformes sont exactement la conversation qu'on veut avoir, et les conditions se fixent partenaire par partenaire au lieu d'être publiées. Techniquement, la marque blanche aujourd'hui, ça veut dire que les pages Connect hébergées sur lesquelles arrivent les utilisateurs d'une plateforme portent la marque de la plateforme : nom de l'app, logos clair et sombre, couleurs principale et d'accent pour les deux thèmes, email de support, liens vers les conditions et la confidentialité, une redirection par défaut vers le produit et une langue par défaut. Ce que ça ne veut pas dire : l'URL de Connect reste sur connect.repull.dev, la page porte un lien "Powered by Repull", et il n'y a ni domaine personnalisé ni email envoyé depuis un domaine partenaire. Tout le reste — conditions revendeur, accords de volume, co-marketing — est une conversation.

Ce que couvre la marque blanche aujourd'hui, et ce qu'elle ne couvre pas
Aujourd'hui
Nom de marque sur les pages Connect hébergéesOui
Ton logo, versions claire et sombreOui
Tes couleurs principale et d’accent, dans les deux thèmesOui
Ton email de support dans le pied de pageOui
Tes liens vers les conditions et la confidentialitéOui
Redirection par défaut vers ton produitOui
Langue par défaut des pages hébergéesOui
Connect servi depuis ton propre domaineNon : l’URL reste sur connect.repull.dev
Attribution retiréeNon : un lien "Powered by Repull" est présent
Emails envoyés depuis ton domaineNon

Ça se règle une fois dans /dashboard/settings/connectet ça s'applique à tous les canaux que tes utilisateurs connectent. Le flux lui-même a la même forme que Stripe Connect ou Plaid Link : ton serveur crée une session et lit un statut, sans jamais toucher à un identifiant de canal.

Question 6

Que se passe-t-il avec plusieurs centaines ou plusieurs milliers de biens connectés ?

L'API est faite pour cette taille : les endpoints de liste lourds sont paginés par curseur, avec un alias offset pour la pagination peu profonde ; des surfaces par lots existent pour ne pas faire un appel par bien (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status) ; les écritures acceptent un Idempotency-Key pour qu'un timeout réseau ne puisse pas créer de double réservation ; et les webhooks avec journal de livraison et rejeu t'évitent de sonder. Des milliers de biens de centaines de tes utilisateurs vivent toujours dans ton unique espace de travail, derrière une clé et un endpoint webhook ; ce qui vaut la peine d'être conçu avec nous à cette échelle, c'est le volume d'embarquement et la façon dont tu associes les comptes connectés à tes utilisateurs.

  • Pagine avec des curseurs. Les endpoints de liste lourds sont paginés par clé, donc le coût par page reste constant quelle que soit la profondeur. ?offset=existe comme alias pour la pagination peu profonde et n'est pas le bon outil pour un parcours complet.
  • Écris par lots. PATCH /v1/availability/batch pour les valeurs de calendrier sur de nombreux biens, POST /v1/listings/pricing/bulk pour les décisions de prix et POST /v1/listings/statuspour l'activation. Un appel, beaucoup de biens, avec les échecs partiels signalés élément par élément au lieu de faire échouer le lot.
  • Envoie une clé d’idempotence. Toute écriture qui crée quelque chose accepte Idempotency-Key. À l'échelle d'une plateforme, un timeout n'est pas un cas limite, c'est un mardi comme un autre.
  • Abonne-toi, ne sonde pas. Un endpoint POST /v1/webhookspour ton espace de travail, avec journal de livraison, rejeu et un endpoint de test par type d'événement pour construire ton gestionnaire avant le premier vrai événement.

Les deux lectures dont un écran de support a besoin

# 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_...'

Tu prévois quelques milliers de biens ?

Viens avec le nombre d'utilisateurs, la répartition des canaux et la vitesse à laquelle tu comptes les embarquer. À cette taille, le volume d'embarquement et l'association comptes-utilisateurs se conçoivent ensemble avant de les construire.

Écrire à hello@repull.dev

Question 7

Faut-il prévoir des frais de mise en place, par transaction ou d'usage ?

L'usage est mesuré par espace de travail et tu le vois dans l'API avant qu'il ne devienne une surprise : GET /v1/usage/summary, GET /v1/usage/logs et GET /v1/usage/tier indiquent ce qu'un espace de travail a consommé et ce à quoi il a droit, donc une plateforme peut suivre la consommation de ses propres clients par programme. Il n'y a pas non plus de sandbox payante à budgéter : tu développes sur la vraie API dès la première clé. Ce que tout ça coûte pour une plateforme n'est volontairement pas publié, parce qu'un chiffre juste pour une intégration à dix clients est faux pour une intégration à mille. Viens avec ton cas et ton volume et tu auras une réponse franche.

S'il n'y a aucun chiffre sur cette page, ce n'est pas par coquetterie. Les accords avec les plateformes varient d'un ordre de grandeur selon le nombre de clients finaux derrière, les canaux qu'ils utilisent et qui assure le support de premier niveau, et un chiffre publié pour l'un de ces cas induit en erreur pour les autres. Ce que tu peux vérifier toi-même avant toute discussion, c'est la consommation : les endpoints d'usage indiquent ce qu'un espace de travail a utilisé et ce à quoi il a droit, donc tu peux modéliser ton économie à partir de vrais chiffres plutôt que des nôtres.

Obtiens la réponse commerciale pour ton vrai cas

Envoie le nombre de clients finaux, les canaux dont ils ont besoin et à peu près combien de biens chacun gère. Tu recevras une proposition concrète plutôt qu'une grille tarifaire qui ne colle pas.

Écrire à hello@repull.dev

Question 8

Un espace de travail partenaire, une clé, un accord avec nous. Chaque utilisateur que tu embarques connecte ses comptes de canal dans ton espace de travail via Connect, à tes couleurs, avec ton propre id utilisateur comme état de session. Quand il a fini, le webhook connect.session.completed te renvoie cet état et le compte qu'il a connecté ; enregistre le compte rattaché à ton utilisateur. À partir de là, chaque événement et chaque enregistrement indiquent leur compte, et chaque liste accepte un filtre par compte. Tes utilisateurs n'ont jamais affaire directement à Repull, et ajouter un utilisateur, c'est une session Connect, pas une inscription. N'utilise un espace de travail séparé appartenant au client que si un client veut explicitement sa propre relation de facturation avec nous, ou pour Repull Migrate, qui crée un espace de travail par gestionnaire que tu migres.

  1. 1Inscris-toi une fois. Ton espace de travail et sa clé d'API sont les seuls identifiants Repull dans ton système ; garde la clé sur tes serveurs.
  2. 2Pour chaque utilisateur, crée une session Connect avec POST /v1/connect, en limitant allowedProviders aux canaux que ton produit prend en charge.
  3. 3Passe ton id utilisateur en state. Quand il a fini, connect.session.completed renvoie ce state avec le compte qu'il a connecté : enregistre le compte rattaché à l'utilisateur.
  4. 4Abonne un endpoint webhook avec POST /v1/webhooks et achemine chaque événement selon son bloc account. Utilise les endpoints de test et de rejeu pour construire ton gestionnaire avant qu'un vrai événement arrive.
  5. 5Lis via les endpoints multicanaux dès que possible, pour qu'ajouter un canal plus tard soit un changement de configuration et pas une réécriture.

La version technique détaillée — authentification, types d'événements webhook, sandbox, couverture par canal — est dans les questions-réponses pour plateformes SaaS. Le détail canal par canal est dans les guides Airbnb, Booking.com et Vrbo, et la référence complète dans la doc.

La plupart des plateformes héritent de ce que leurs clients utilisent déjà, c'est-à-dire en pratique de plusieurs logiciels de gestion plutôt que d'un seul. Chacun a son modèle d'authentification, ses noms de champs et ses limites : les guides Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu et Beds24détaillent ce que chaque système expose et ce qu'il te coûte à maintenir, et la matrice de couverture les compare côte à côte.

La liste honnête

Que ne fait pas encore Repull pour les plateformes ?

On le dit clairement pour que personne ne construise en comptant dessus. Un espace de travail a une connexion par logiciel de gestion : connecter un second compte Hostaway, Guesty ou d'un autre PMS dans le même espace de travail remplace le premier, donc aujourd'hui deux de tes utilisateurs sur le même PMS ne peuvent pas coexister comme le peuvent les comptes Airbnb, Booking.com et Vrbo ; c'est en cours de correction. Les clés d'API ne peuvent pas être limitées à un sous-ensemble d'annonces ; les périmètres limitent les opérations, pas l'inventaire. Il n'y a pas d'endpoint général de création d'espaces de travail — le modèle partenaire n'en a pas besoin ; le seul espace de travail créé par API est celui de Repull Migrate (`POST /v1/connect` avec `purpose: "migrate"`, accessible avec `X-Workspace-Id`). Il n'y a pas de facturation par client final ni de facturation revendeur. La marque blanche ne s'étend ni à un domaine personnalisé pour Connect ni aux emails envoyés depuis un domaine partenaire, et les pages hébergées portent un lien "Powered by Repull". Si l'un de ces points est essentiel à ce que tu construis, dis-le tôt.

Pourquoi cette section existe

Une plateforme qui découvre au troisième mois qu'une brique de base manque a déjà construit autour. Tout ce qui précède, c'est ce que fait le produit ; ceci, c'est ce qu'il ne fait pas, écrit noir sur blanc pour que la discussion parte des mêmes faits. Si l'un de ces points te bloque, c'est un bien meilleur premier email qu'une demande générale.

Dis-nous lequel de ces points te gêne

Nomme la brique manquante, ce que tu construirais avec et quand tu en as besoin. Une exigence précise issue d'une vraie intégration, c'est ce qui se construit ensuite.

Écrire à hello@repull.dev