Repull für Plattformen: So funktioniert es, wenn deine Kunden die Gastgeber sind
Das sind die Fragen, die Plattformen wirklich stellen, bevor sie sich festlegen: ein Vertrag oder viele, was die Einheit ist, wer abgerechnet wird, was White-Label tatsächlich abdeckt und was bei ein paar tausend Objekten passiert. Beantwortet mit dem, was es heute gibt, einschließlich der Teile, die es noch nicht gibt. Hier steht kein einziger Preis: Die kommerzielle Hälfte ist ein Gespräch, und diese Seite ist die ehrliche technische Hälfte, die du vorher brauchst.
Das Modell in einem Absatz
Du hast einen Workspace und einen API-Key. Jeder deiner Nutzer verbindet seine eigenen Airbnb-, Booking.com- oder Vrbo-Konten in diesem Workspace über Connect, in deinem Branding: viele Konten pro Kanal, nebeneinander. Dein Produkt liest und schreibt über alle mit diesem einen Key, und jedes Webhook-Event sagt, aus welchem verbundenen Konto es kommt, damit du es an den richtigen Nutzer weiterleitest. Deine Nutzer registrieren sich nie bei Repull und haben nie einen Key. Das ist das ganze Modell; alles Weitere folgt daraus.
| Einheit | Was es ist | In einer Plattform-Integration |
|---|---|---|
| Workspace | Der Mandant: Verbindungen, Inserate, Buchungen, Webhooks, Keys. | Einer, deiner. Abrechnungsidentität und Webhook-Abos leben hier. |
| Verbundenes Konto | Eines der Kanalkonten deines Nutzers: ein Airbnb-Gastgeber, eine Booking.com-Unterkunft, ein Vrbo-Konto. | Viele pro Kanal. Jeder Nutzer verbindet seine eigenen; Events und Airbnb-Datensätze nennen es. |
| Inserat | Ein verbundenes Objekt. | Gehört zu dem Konto, aus dem es kam. |
| API-Key | Bearer-Zugangsdaten des Workspace. | Ein Key liest alle verbundenen Konten. Scopes begrenzen Operationen, nicht Inserate. |
Frage 1
Kann eine Plattform einen einzigen Vertrag mit Repull haben und die Integration vielen eigenen Nutzern anbieten?
Ja, genau dafür ist Repull gebaut: ein Vertrag, ein Repull-Workspace für die Plattform und alle Nutzer der Plattform darin verbunden. Jeder Nutzer verbindet sein eigenes Airbnb-, Booking.com- oder Vrbo-Konto über den gehosteten Connect-Flow in deinem Branding, und dein Produkt liest und schreibt über alle verbundenen Konten mit einem einzigen API-Key. Jedes verbundene Konto behält seine Identität — Webhook-Events und jede Buchung, Konversation und Bewertung sagen, aus welchem Konto sie stammen —, so leitest du jede Buchung, Nachricht und Bewertung an den richtigen Nutzer in deinem Produkt weiter. Deine Nutzer registrieren sich nie bei Repull, sehen nie einen Key und unterschreiben nie etwas mit uns. Wie der Vertrag formal aussieht, ist ein Gespräch, kein veröffentlichter Tarif.
In der Praxis bittet die Plattform ihre Nutzer nie, etwas mit uns zu unterschreiben, zeigt ihnen unsere Marke nur als Attributionslink auf der Connect-Seite und gibt ihnen nie Zugangsdaten. Dein Nutzer klickt in deinem Produkt auf „Airbnb verbinden“, durchläuft einen gehosteten Flow in deinem Branding und kommt zurück. Sein Konto ist jetzt ein weiteres verbundenes Konto in deinem Workspace.
Einen deiner Nutzer onboarden
// 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.Frage 2
Wie ist es aufgebaut: pro Objekt, pro Nutzer oder pro Verbindung?
Die Einheiten sind Workspace, verbundenes Konto, Inserat und API-Key. Der Workspace gehört dir — der Plattform — und ist die Mandantengrenze. Darin verbindet jeder deiner Nutzer ein oder mehrere Kanalkonten: mehrere Airbnb-Gastgeberkonten, mehrere Booking.com-Unterkünfte, mehrere Vrbo-Konten, nebeneinander. Ein Inserat ist ein verbundenes Objekt und gehört zu dem Konto, aus dem es kam. Der API-Key gehört zum Workspace, also liest dein Produkt alle verbundenen Konten mit einem Key und unterscheidet sie nach Konto: Jede Buchung, Konversation und Bewertung trägt ein Konto (den Anbieter und die eigene Konto-ID des Anbieters), jedes Objekt listet seine Konten, alle vier akzeptieren einen Kontofilter, und jedes Webhook-Event nennt dasselbe Konto. Was kommerziell gezählt wird, ist eine andere Frage als die Modellierung, und die beantworten wir lieber an einem echten Fall als öffentlich geraten.
- Viele Konten pro Kanal. Die Airbnb-Gastgeberkonten, Booking.com-Unterkünfte und Vrbo-Konten aller deiner Nutzer leben zusammen in deinem Workspace.
GET /v1/connect/{provider}listet sie unteraccounts, undDELETE /v1/connect/{provider}akzeptiert eineaccountId, um das Konto eines Nutzers zu trennen, ohne die anderen anzufassen. - Jedes Event nennt sein Konto. Webhook-Zustellungen tragen einen
account-Block —providerundexternalAccountId, die eigene ID des Anbieters — und dasselbe Konto in den HeadernX-Repull-AccountundX-Repull-Account-Id. - Jeder Datensatz nennt sein Konto.
GET /v1/reservations,/v1/conversationsund/v1/reviewstragenaccountin jeder Zeile, und/v1/propertiesträgtaccounts; alle vier akzeptieren?account=provider:externalAccountId, um die Daten eines Nutzers zu lesen. - Ein Key für den ganzen Workspace. Der Key gehört dir und liest alle verbundenen Konten. Scopes begrenzen, was er tun kann, nicht, was er sehen kann — genau das willst du, wenn der Key nur auf deinen Servern liegt.
Jedes Event an den richtigen Nutzer weiterleiten
// 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.Frage 3
Kann der Endkunde direkt abgerechnet werden statt der Plattform?
Heute nicht als Plattform-Funktion. Die Abrechnung hängt an einem Workspace, also wird abgerechnet, wem der Workspace gehört — in der Regel dir, der Plattform. Es gibt kein Abrechnungsobjekt für Reseller und keinen Mechanismus, mit dem Repull die Endkunden einer Plattform in deren Namen abrechnet, während die Plattform die administrative Kontrolle behält. Was funktioniert, ist der umgekehrte Weg: Ein Endkunde kann einen eigenen Workspace besitzen, ihn bezahlen und der Plattform einen Key geben. Wenn die Abrechnung deiner Kunden über uns eine Anforderung und keine Vorliebe ist, sag es uns: So etwas lohnt sich für den richtigen Partner zu bauen, und es ist nichts, was wir als vorhanden ausgeben.
Ist die direkte Abrechnung deiner Kunden für dich eine Anforderung?
Wenn dein Modell davon abhängt, dass wir deine Kunden abrechnen, während du die administrative Kontrolle behältst, sag uns, welche Form du brauchst. Heute gibt es das nicht, und mit einem Partner dahinter ist es ein konkretes Bauvorhaben, kein Vielleicht.
Schreib an hello@repull.devFrage 4
Wenn der Endkunde direkt zahlt, kann die Plattform die API weiter in ihrem Produkt nutzen?
Ja. Der Zugriff folgt dem API-Key, und ein Key gehört zu einem Workspace, nicht zu einer Person. Ein Kunde mit eigenem Repull-Workspace kann also einen Key ausstellen und ihn der Plattform geben, und das Produkt der Plattform ruft die API auf diesem Workspace genauso auf wie auf dem eigenen. Ein Key überschreitet nie Workspace-Grenzen, also bedeutet dieses Modell einen zusätzlichen gespeicherten Key pro Kunde in dieser Situation. Das ist die Ausnahme, nicht die Regel: Die meisten Plattformen halten alle Nutzer in ihrem eigenen Partner-Workspace und nutzen einen Kunden-Workspace nur, wenn der Kunde eine eigene Abrechnungsbeziehung mit uns möchte.
| Die Plattform hält die Keys | Der Kunde besitzt den Workspace | |
|---|---|---|
| Wer sich registriert | Du, einmal pro Kunde | Dein Kunde |
| Wer abgerechnet wird | Du | Dein Kunde |
| Wer den Key hat | Du | Dein Kunde, der ihn mit dir teilt |
| Onboarding-Erlebnis | Alles in deinem Produkt, mit deinem Branding auf Connect | Dein Kunde verlässt dein Produkt, um sich zu registrieren, und kommt mit einem Key zurück |
| Wenn er dein Produkt verlässt | Du deaktivierst den Workspace | Er behält den Workspace und die Verbindungen |
| Support | Deiner | Aufgeteilt zwischen dir und uns |
Technisch funktionieren beide. Das zweite ist in einem Fall wirklich besser: bei einem Kunden, der groß genug ist, um eine eigene Beziehung, eine eigene Rechnung und eigene Kontinuität zu wollen, falls er dein Produkt irgendwann verlässt. Für alle anderen hat das erste weniger Reibung und weniger Zugangsdaten in deiner Datenbank.
Frage 5
Gibt es Partner-, Reseller-, White-Label- oder Volumenverträge für SaaS-Plattformen?
Kommerziell ja: Plattformverträge sind genau das Gespräch, das wir führen wollen, und die Konditionen werden pro Partner festgelegt statt veröffentlicht. Technisch bedeutet White-Label heute, dass die gehosteten Connect-Seiten, auf denen die Nutzer einer Plattform landen, das Branding der Plattform tragen: App-Name, helles und dunkles Logo, Primär- und Akzentfarbe für beide Themes, Support-E-Mail, Links zu AGB und Datenschutz, eine Standard-Weiterleitung zurück ins Produkt und eine Standardsprache. Was es nicht bedeutet: Die Connect-URL bleibt auf connect.repull.dev, die Seite trägt einen „Powered by Repull“-Link, und es gibt weder eine eigene Domain noch E-Mails von einer Partner-Domain. Alles andere — Reseller-Konditionen, Volumenverträge, Co-Marketing — ist ein Gespräch.
| Heute | |
|---|---|
| Markenname auf den gehosteten Connect-Seiten | Ja |
| Dein Logo, helle und dunkle Variante | Ja |
| Deine Primär- und Akzentfarbe, in beiden Themes | Ja |
| Deine Support-E-Mail in der Fußzeile | Ja |
| Deine Links zu AGB und Datenschutz | Ja |
| Standard-Weiterleitung zurück in dein Produkt | Ja |
| Standardsprache der gehosteten Seiten | Ja |
| Connect unter deiner eigenen Domain | Nein: Die URL bleibt auf connect.repull.dev |
| Attribution entfernt | Nein: Es gibt einen „Powered by Repull“-Link |
| E-Mails von deiner Domain | Nein |
Du konfigurierst das einmal unter /dashboard/settings/connect, und es gilt für jeden Kanal, den deine Nutzer verbinden. Der Flow selbst hat dieselbe Form wie Stripe Connect oder Plaid Link: Dein Server erstellt eine Session und liest einen Status aus, und er fasst nie Kanal-Zugangsdaten an.
Frage 6
Was passiert bei mehreren hundert oder mehreren tausend verbundenen Objekten?
Die API ist für diese Größenordnung gebaut: Die schweren Listen-Endpunkte sind cursor-paginiert, mit einem Offset-Alias für kurze Seitenwechsel; es gibt Batch-Schnittstellen, damit du nicht einen Aufruf pro Objekt machst (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status); Schreibvorgänge akzeptieren einen Idempotency-Key, damit ein Netzwerk-Timeout keine doppelte Buchung erzeugen kann; und Webhooks mit Zustellprotokoll und erneuter Zustellung ersparen dir das Polling. Tausende Objekte von Hunderten deiner Nutzer leben weiterhin in deinem einen Workspace, hinter einem Key und einem Webhook-Endpunkt; was man bei dieser Größe mit uns gemeinsam planen sollte, ist das Onboarding-Volumen und wie du verbundene Konten deinen Nutzern zuordnest.
- Paginiere mit Cursors. Die schweren Listen-Endpunkte sind key-basiert paginiert, also bleiben die Kosten pro Seite konstant, egal wie tief du gehst.
?offset=gibt es als Alias für kurze Seitenwechsel, und für einen kompletten Durchlauf ist es das falsche Werkzeug. - Schreib im Batch.
PATCH /v1/availability/batchfür Kalenderwerte über viele Objekte,POST /v1/listings/pricing/bulkfür Preisentscheidungen undPOST /v1/listings/statusfür die Aktivierung. Ein Aufruf, viele Objekte, und Teilfehler werden pro Eintrag gemeldet, statt den ganzen Batch scheitern zu lassen. - Schick einen Idempotency-Key mit. Jeder Schreibvorgang, der etwas anlegt, akzeptiert
Idempotency-Key. Bei Plattformvolumen ist ein Timeout kein Sonderfall, sondern ein ganz normaler Dienstag. - Abonnieren statt pollen. Ein
POST /v1/webhooks-Endpunkt für deinen Workspace, mit Zustellprotokoll, erneuter Zustellung und einem Test-Endpunkt pro Event-Typ, damit du den Handler baust, bevor das erste echte Event ankommt.
Die zwei Abfragen, die ein Support-Screen braucht
# 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_...'
Planst du für ein paar tausend Objekte?
Bring die Zahl deiner Nutzer, den Kanal-Mix und das erwartete Onboarding-Tempo mit. In dieser Größenordnung sollten Onboarding-Volumen und die Zuordnung von Konten zu Nutzern gemeinsam geplant werden, bevor du sie baust.
Schreib an hello@repull.devFrage 7
Gibt es Einrichtungs-, Transaktions- oder Nutzungsgebühren, mit denen man rechnen muss?
Die Nutzung wird pro Workspace gemessen, und du siehst sie in der API, bevor sie zur Überraschung wird: GET /v1/usage/summary, GET /v1/usage/logs und GET /v1/usage/tier zeigen, was ein Workspace verbraucht hat und worauf er Anspruch hat, sodass eine Plattform den Verbrauch ihrer eigenen Kunden programmatisch verfolgen kann. Es gibt auch keine separate kostenpflichtige Sandbox, die du einplanen musst: Du baust ab dem ersten Key auf der echten API. Was das alles für eine Plattform kostet, wird bewusst nicht veröffentlicht, denn eine Zahl, die für eine Integration mit zehn Kunden stimmt, ist für eine mit tausend falsch. Bring deinen Fall und dein Volumen mit, und du bekommst eine klare Antwort.
Dass auf dieser Seite keine Zahl steht, ist keine Zurückhaltung. Plattformverträge unterscheiden sich um eine Größenordnung, je nachdem, wie viele Endkunden dahinterstehen, welche Kanäle sie nutzen und wer den First-Level-Support übernimmt, und eine veröffentlichte Zahl für einen dieser Fälle ist für die anderen aktiv irreführend. Was du vor jedem Gespräch selbst prüfen kannst, ist der Verbrauch: Die Usage-Endpunkte zeigen, was ein Workspace genutzt hat und worauf er Anspruch hat, also kannst du deine eigene Wirtschaftlichkeit mit echten Zahlen modellieren statt mit unseren.
Hol dir die kommerzielle Antwort für deinen echten Fall
Schick die Zahl der Endkunden, die Kanäle, die sie brauchen, und ungefähr wie viele Objekte jeder verwaltet. Du bekommst ein konkretes Angebot statt einer Preistabelle, die nicht passt.
Schreib an hello@repull.devFrage 8
Welches kommerzielle Modell empfehlt ihr für eine Plattform, die Repull integriert?
Ein Partner-Workspace, ein Key, ein Vertrag mit uns. Jeder Nutzer, den du onboardest, verbindet seine Kanalkonten in deinem Workspace über Connect, in deinem Branding, mit deiner eigenen Nutzer-ID als Session-State. Wenn er fertig ist, gibt dir der Webhook connect.session.completed diesen State und das verbundene Konto zurück; speichere das Konto bei deinem Nutzer. Ab dann nennt jedes Event und jeder Datensatz sein Konto, und jede Liste akzeptiert einen Kontofilter. Deine Nutzer haben nie direkt mit Repull zu tun, und einen Nutzer hinzuzufügen ist eine Connect-Session, keine Registrierung. Nutze einen separaten Kunden-Workspace nur, wenn ein Kunde ausdrücklich eine eigene Abrechnungsbeziehung mit uns will, oder für Repull Migrate, das pro migriertem Verwalter einen Workspace anlegt.
- 1Registriere dich einmal. Dein Workspace und sein API-Key sind die einzigen Repull-Zugangsdaten in deinem System; bewahre den Key auf deinen Servern auf.
- 2Erstelle für jeden Nutzer eine Connect-Session mit
POST /v1/connectund beschränkeallowedProvidersauf die Kanäle, die dein Produkt unterstützt. - 3Übergib deine Nutzer-ID als
state. Wenn er fertig ist, gibtconnect.session.completeddiesenstatemit dem verbundenen Konto zurück: Speichere das Konto bei diesem Nutzer. - 4Abonniere einen Webhook-Endpunkt mit
POST /v1/webhooksund leite jedes Event über seinenaccount-Block weiter. Nutze die Test- und Wiederholungs-Endpunkte, um den Handler zu bauen, bevor ein echtes Event ankommt. - 5Lies über die kanalübergreifenden Endpunkte, wo immer es geht, damit ein zusätzlicher Kanal später eine Konfigurationsänderung ist und kein Neuschreiben.
Die tiefere technische Version — Authentifizierung, Webhook-Event-Typen, Sandbox, Abdeckung pro Kanal — steht im Q&A für SaaS-Plattformen. Die Details pro Kanal findest du in den Leitfäden zu Airbnb, Booking.com und Vrbo, und die vollständige Referenz in der Dokumentation.
Die meisten Plattformen übernehmen, was ihre Kunden schon nutzen, und das heißt in der Praxis mehrere Property-Management-Systeme, nicht nur eines. Jedes hat sein eigenes Authentifizierungsmodell, eigene Feldnamen und eigene Grenzen: Die Leitfäden zu Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu und Beds24 erklären, was jedes System bereitstellt und was dich die Pflege kostet, und die Abdeckungsmatrix vergleicht sie nebeneinander.
Die ehrliche Liste
Was kann Repull für Plattformen noch nicht?
Klar gesagt, damit niemand darauf baut. Ein Workspace hat eine Verbindung pro Property-Management-System: Ein zweites Hostaway-, Guesty- oder anderes PMS-Konto im selben Workspace ersetzt das erste, also können zwei deiner Nutzer auf demselben PMS heute nicht nebeneinander existieren, wie es Airbnb-, Booking.com- und Vrbo-Konten können; das wird gerade behoben. API-Keys lassen sich nicht auf eine Teilmenge von Inseraten beschränken; Scopes begrenzen Operationen, nicht den Bestand. Es gibt keinen allgemeinen Endpunkt zum Anlegen von Workspaces — das Partnermodell braucht ihn nicht; der einzige per API angelegte Workspace ist der von Repull Migrate (`POST /v1/connect` mit `purpose: "migrate"`, angesprochen über `X-Workspace-Id`). Es gibt keine Abrechnung pro Endkunde und keine Reseller-Abrechnung. White-Label umfasst weder eine eigene Domain für Connect noch E-Mails von einer Partner-Domain, und die gehosteten Seiten tragen einen „Powered by Repull“-Link. Wenn etwas davon für dein Vorhaben entscheidend ist, sag es uns früh.
Warum es diesen Abschnitt gibt
Sag uns, was davon dir im Weg steht
Nenn den fehlenden Baustein, was du damit bauen würdest und bis wann du ihn brauchst. Eine konkrete Anforderung aus einer echten Integration ist das, was als Nächstes gebaut wird.
Schreib an hello@repull.dev