Für SaaS-Plattformen, die Repull integrieren

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.

Die vier Einheiten, aus denen eine Plattform-Integration besteht
EinheitWas es istIn einer Plattform-Integration
WorkspaceDer Mandant: Verbindungen, Inserate, Buchungen, Webhooks, Keys.Einer, deiner. Abrechnungsidentität und Webhook-Abos leben hier.
Verbundenes KontoEines 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.
InseratEin verbundenes Objekt.Gehört zu dem Konto, aus dem es kam.
API-KeyBearer-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 unter accounts, und DELETE /v1/connect/{provider} akzeptiert eine accountId, um das Konto eines Nutzers zu trennen, ohne die anderen anzufassen.
  • Jedes Event nennt sein Konto. Webhook-Zustellungen tragen einen account-Block — provider und externalAccountId, die eigene ID des Anbieters — und dasselbe Konto in den Headern X-Repull-Account und X-Repull-Account-Id.
  • Jeder Datensatz nennt sein Konto. GET /v1/reservations, /v1/conversations und /v1/reviews tragen account in jeder Zeile, und /v1/properties trägt accounts; 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.dev

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

Keys bei der Plattform im Vergleich zu Keys beim Kunden
Die Plattform hält die KeysDer Kunde besitzt den Workspace
Wer sich registriertDu, einmal pro KundeDein Kunde
Wer abgerechnet wirdDuDein Kunde
Wer den Key hatDuDein Kunde, der ihn mit dir teilt
Onboarding-ErlebnisAlles in deinem Produkt, mit deinem Branding auf ConnectDein Kunde verlässt dein Produkt, um sich zu registrieren, und kommt mit einem Key zurück
Wenn er dein Produkt verlässtDu deaktivierst den WorkspaceEr behält den Workspace und die Verbindungen
SupportDeinerAufgeteilt 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.

Was White-Label heute abdeckt und was nicht
Heute
Markenname auf den gehosteten Connect-SeitenJa
Dein Logo, helle und dunkle VarianteJa
Deine Primär- und Akzentfarbe, in beiden ThemesJa
Deine Support-E-Mail in der FußzeileJa
Deine Links zu AGB und DatenschutzJa
Standard-Weiterleitung zurück in dein ProduktJa
Standardsprache der gehosteten SeitenJa
Connect unter deiner eigenen DomainNein: Die URL bleibt auf connect.repull.dev
Attribution entferntNein: Es gibt einen „Powered by Repull“-Link
E-Mails von deiner DomainNein

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/batch für Kalenderwerte über viele Objekte, POST /v1/listings/pricing/bulk für Preisentscheidungen und POST /v1/listings/status fü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.dev

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

Frage 8

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.

  1. 1Registriere dich einmal. Dein Workspace und sein API-Key sind die einzigen Repull-Zugangsdaten in deinem System; bewahre den Key auf deinen Servern auf.
  2. 2Erstelle für jeden Nutzer eine Connect-Session mit POST /v1/connect und beschränke allowedProviders auf die Kanäle, die dein Produkt unterstützt.
  3. 3Übergib deine Nutzer-ID als state. Wenn er fertig ist, gibt connect.session.completed diesen state mit dem verbundenen Konto zurück: Speichere das Konto bei diesem Nutzer.
  4. 4Abonniere einen Webhook-Endpunkt mit POST /v1/webhooks und leite jedes Event über seinen account-Block weiter. Nutze die Test- und Wiederholungs-Endpunkte, um den Handler zu bauen, bevor ein echtes Event ankommt.
  5. 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

Eine Plattform, die im dritten Monat merkt, dass ein Grundbaustein fehlt, hat schon um diese Lücke herumgebaut. Alles oben ist das, was das Produkt kann; das hier ist, was es nicht kann, aufgeschrieben, damit das Gespräch von denselben Fakten ausgeht. Wenn dich etwas davon blockiert, ist das eine viel bessere erste E-Mail als eine allgemeine Anfrage.

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