Repull dla platform: jak to działa, gdy Twoimi klientami są gospodarze
To pytania, które platformy naprawdę zadają, zanim się zobowiążą: jedna umowa czy wiele, co jest jednostką, kto jest fakturowany, co faktycznie obejmuje white-label i co się dzieje przy kilku tysiącach obiektów. Odpowiadamy tym, co istnieje dziś, łącznie z elementami, których jeszcze nie ma. Nie ma tu ani jednej ceny: część komercyjna to rozmowa, a ta strona to uczciwa część techniczna, której potrzebujesz przed nią.
Model w jednym akapicie
Masz jeden workspace i jeden klucz API. Każdy Twój użytkownik łączy własne konta Airbnb, Booking.com lub Vrbo w tym workspace’ie przez Connect, z Twoim brandingiem: wiele kont na kanał, obok siebie. Twój produkt czyta i zapisuje we wszystkich tym jednym kluczem, a każde zdarzenie webhook mówi, z którego połączonego konta pochodzi, żebyś skierował je do właściwego użytkownika. Twoi użytkownicy nigdy nie rejestrują się w Repull i nigdy nie mają klucza. To cały model; wszystko poniżej z niego wynika.
| Jednostka | Czym jest | W integracji platformy |
|---|---|---|
| Workspace | Najemca: połączenia, oferty, rezerwacje, webhooki, klucze. | Jeden, Twój. Tu żyją tożsamość rozliczeniowa i subskrypcje webhooków. |
| Połączone konto | Jedno z kont kanałów Twojego użytkownika: gospodarz Airbnb, obiekt Booking.com, konto Vrbo. | Wiele na kanał. Każdy użytkownik łączy własne; zdarzenia i rekordy Airbnb je wskazują. |
| Oferta | Połączony obiekt. | Należy do konta, z którego pochodzi. |
| Klucz API | Poświadczenie bearer workspace’u. | Jeden klucz czyta wszystkie połączone konta. Zakresy ograniczają operacje, nie oferty. |
Pytanie 1
Czy platforma może mieć jedną umowę z Repull i oferować integrację wielu swoim użytkownikom?
Tak, właśnie do tego zbudowano Repull: jedna umowa, jeden workspace Repull dla platformy i wszyscy użytkownicy platformy podłączeni w jego obrębie. Każdy użytkownik łączy własne konto Airbnb, Booking.com lub Vrbo przez hostowany proces Connect z Twoim brandingiem, a Twój produkt czyta i zapisuje dane we wszystkich połączonych kontach jednym kluczem API. Każde połączone konto zachowuje swoją tożsamość — zdarzenia webhook oraz każda rezerwacja, rozmowa i opinia mówią, z którego konta pochodzą — więc każdą rezerwację, wiadomość i opinię kierujesz do właściwego użytkownika w swoim produkcie. Twoi użytkownicy nigdy nie rejestrują się w Repull, nigdy nie widzą klucza i nigdy nic z nami nie podpisują. Formalny kształt umowy to kwestia rozmowy, a nie opublikowanego cennika.
W praktyce platforma nigdy nie prosi użytkowników o podpisanie czegokolwiek z nami, nie pokazuje im naszej marki poza linkiem atrybucji na stronie Connect i nigdy nie przekazuje im poświadczeń. Twój użytkownik klika „połącz Airbnb” w Twoim produkcie, przechodzi przez hostowany proces z Twoim brandingiem i wraca. Jego konto jest teraz kolejnym połączonym kontem w Twoim workspace’ie.
Wdrażanie jednego z Twoich użytkowników
// 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.Pytanie 2
Jak to jest zbudowane: na obiekt, na użytkownika czy na połączenie?
Jednostki to workspace, połączone konto, oferta i klucz API. Workspace należy do Ciebie — do platformy — i stanowi granicę najemcy. W jego obrębie każdy Twój użytkownik łączy jedno lub więcej kont kanałów: kilka kont gospodarza Airbnb, kilka obiektów Booking.com, kilka kont Vrbo, obok siebie. Oferta to połączony obiekt i należy do konta, z którego pochodzi. Klucz API należy do workspace’u, więc Twój produkt czyta wszystkie połączone konta jednym kluczem i rozróżnia je po koncie: każda rezerwacja, rozmowa i opinia ma przypisane konto (dostawcę i własne id konta u dostawcy), każdy obiekt wymienia swoje konta, wszystkie cztery przyjmują filtr konta, a każde zdarzenie webhook wskazuje to samo konto. To, co liczy się komercyjnie, to inne pytanie niż sposób modelowania, i lepiej odpowiedzieć na nie na prawdziwym przypadku niż zgadywać publicznie.
- Wiele kont na kanał. Konta gospodarzy Airbnb, obiekty Booking.com i konta Vrbo wszystkich Twoich użytkowników żyją razem w Twoim workspace’ie.
GET /v1/connect/{provider}wymienia je waccounts, aDELETE /v1/connect/{provider}przyjmujeaccountId, żeby odłączyć konto jednego użytkownika bez ruszania pozostałych. - Każde zdarzenie wskazuje swoje konto. Dostarczenia webhooków zawierają blok
account—provideriexternalAccountId, własne id dostawcy — oraz to samo konto w nagłówkachX-Repull-AccountiX-Repull-Account-Id. - Każdy rekord wskazuje swoje konto.
GET /v1/reservations,/v1/conversationsi/v1/reviewsmająaccountw każdym wierszu, a/v1/propertiesmaaccounts; wszystkie cztery przyjmują?account=provider:externalAccountId, żeby odczytać dane jednego użytkownika. - Jeden klucz na cały workspace. Klucz jest Twój i czyta wszystkie połączone konta. Zakresy ograniczają to, co może zrobić, a nie to, co może zobaczyć — dokładnie tego chcesz, gdy klucz żyje tylko na Twoich serwerach.
Kierowanie każdego zdarzenia do właściwego użytkownika
// 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.Pytanie 3
Czy można fakturować bezpośrednio klienta końcowego zamiast platformy?
Dziś nie jako funkcja platformy. Rozliczenia są przypisane do workspace’u, więc fakturowany jest właściciel workspace’u — zwykle Ty, czyli platforma. Nie ma obiektu rozliczeniowego dla resellerów ani mechanizmu, w którym Repull fakturuje klientów końcowych platformy w jej imieniu, podczas gdy platforma zachowuje kontrolę administracyjną. Działa odwrotna droga: klient końcowy może mieć własny workspace, płacić za niego i przekazać platformie klucz. Jeśli fakturowanie Twoich klientów przez nas to wymóg, a nie preferencja, daj nam znać: to coś, co warto zbudować dla właściwego partnera, a nie coś, co będziemy udawać, że już istnieje.
Czy bezpośrednie fakturowanie Twoich klientów to dla Ciebie wymóg?
Jeśli Twój model zależy od tego, że fakturujemy Twoich klientów, a Ty zachowujesz kontrolę administracyjną, powiedz nam, jakiego kształtu potrzebujesz. Dziś tego nie ma, a z partnerem za tym to konkretna rzecz do zbudowania, a nie może.
Napisz na hello@repull.devPytanie 4
Jeśli klient końcowy płaci bezpośrednio, czy platforma nadal może korzystać z API w swoim produkcie?
Tak. Dostęp idzie za kluczem API, a klucz należy do workspace’u, nie do osoby, więc klient z własnym workspace’em Repull może wystawić klucz i przekazać go platformie, a produkt platformy wywołuje API na tym workspace’ie dokładnie tak samo jak na własnym. Klucz nigdy nie przekracza granic workspace’u, więc ten model oznacza jeden dodatkowy przechowywany klucz na każdego takiego klienta. To wyjątek, a nie reguła: większość platform trzyma wszystkich użytkowników we własnym workspace’ie partnerskim, a workspace klienta wykorzystuje tylko wtedy, gdy klient chce mieć z nami własną relację rozliczeniową.
| Platforma trzyma klucze | Klient jest właścicielem workspace’u | |
|---|---|---|
| Kto się rejestruje | Ty, raz na klienta | Twój klient |
| Kto jest fakturowany | Ty | Twój klient |
| Kto ma klucz | Ty | Twój klient, który udostępnia go Tobie |
| Doświadczenie wdrożenia | Wszystko w Twoim produkcie, z Twoim brandingiem w Connect | Twój klient wychodzi, żeby się zarejestrować, i wraca z kluczem |
| Gdy odejdzie z Twojego produktu | Wyłączasz workspace | Zachowuje workspace i połączenia |
| Wsparcie | Twoje | Podzielone między Ciebie a nas |
Technicznie działają oba. Drugi jest naprawdę lepszy w jednym przypadku: przy kliencie na tyle dużym, że chce własnej relacji, własnej faktury i własnej ciągłości, gdyby kiedyś odszedł z Twojego produktu. Dla wszystkich pozostałych pierwszy oznacza mniej tarcia i mniej poświadczeń w Twojej bazie danych.
Pytanie 5
Czy są umowy partnerskie, resellerskie, white-label albo wolumenowe dla platform SaaS?
Komercyjnie tak: umowy z platformami to dokładnie ta rozmowa, którą chcemy prowadzić, a warunki ustalamy z każdym partnerem osobno, zamiast je publikować. Technicznie white-label oznacza dziś, że hostowane strony Connect, na które trafiają użytkownicy platformy, mają branding platformy: nazwę aplikacji, jasne i ciemne logo, kolor główny i akcentowy dla obu motywów, e-mail wsparcia, linki do regulaminu i polityki prywatności, domyślne przekierowanie z powrotem do produktu i domyślny język. Czego nie oznacza: adres URL Connect pozostaje na connect.repull.dev, strona ma link „Powered by Repull”, nie ma własnej domeny ani e-maili wysyłanych z domeny partnera. Cała reszta — warunki resellerskie, umowy wolumenowe, wspólny marketing — to kwestia rozmowy.
| Dziś | |
|---|---|
| Nazwa marki na hostowanych stronach Connect | Tak |
| Twoje logo, wersja jasna i ciemna | Tak |
| Twój kolor główny i akcentowy, w obu motywach | Tak |
| Twój e-mail wsparcia w stopce | Tak |
| Twoje linki do regulaminu i polityki prywatności | Tak |
| Domyślne przekierowanie z powrotem do Twojego produktu | Tak |
| Domyślny język hostowanych stron | Tak |
| Connect pod Twoją własną domeną | Nie: adres pozostaje na connect.repull.dev |
| Usunięta atrybucja | Nie: jest link „Powered by Repull” |
| E-maile wysyłane z Twojej domeny | Nie |
Konfigurujesz to raz w /dashboard/settings/connect i działa dla każdego kanału, który łączą Twoi użytkownicy. Sam proces ma ten sam kształt co Stripe Connect czy Plaid Link: Twój serwer tworzy sesję i odczytuje status, i nigdy nie dotyka poświadczeń kanału.
Pytanie 6
Co się dzieje przy kilkuset lub kilku tysiącach połączonych obiektów?
API jest zbudowane na taką skalę: ciężkie endpointy list są stronicowane kursorem, z aliasem offset do krótkiego stronicowania; są interfejsy wsadowe, żebyś nie robił jednego wywołania na obiekt (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status); zapisy przyjmują Idempotency-Key, więc timeout sieci nie utworzy zdublowanej rezerwacji; a webhooki z dziennikiem dostarczeń i ponowną wysyłką sprawiają, że nie musisz odpytywać. Tysiące obiektów od setek Twoich użytkowników nadal mieszkają w Twoim jednym workspace’ie, za jednym kluczem i jednym endpointem webhook; przy tej skali warto zaprojektować z nami tempo onboardingu i sposób przypisywania połączonych kont do Twoich użytkowników.
- Stronicuj kursorami. Ciężkie endpointy list są stronicowane po kluczu, więc koszt strony pozostaje stały bez względu na to, jak głęboko wejdziesz.
?offset=istnieje jako alias do krótkiego stronicowania i jest złym narzędziem do pełnego przejścia. - Zapisuj wsadowo.
PATCH /v1/availability/batchdla wartości kalendarza w wielu obiektach,POST /v1/listings/pricing/bulkdla decyzji cenowych iPOST /v1/listings/statusdla aktywacji. Jedno wywołanie, wiele obiektów, a częściowe błędy są raportowane per pozycja, zamiast wywracać cały wsad. - Wysyłaj klucz idempotencji. Każdy zapis, który coś tworzy, przyjmuje
Idempotency-Key. Przy wolumenie platformy timeout to nie przypadek brzegowy, tylko zwykły wtorek. - Subskrybuj, nie odpytuj. Jeden endpoint
POST /v1/webhooksdla Twojego workspace’u, z dziennikiem dostarczeń, ponowną wysyłką i endpointem testowym dla każdego typu zdarzenia, żebyś zbudował handler, zanim przyjdzie pierwsze prawdziwe zdarzenie.
Dwa odczyty, których potrzebuje ekran wsparcia
# 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_...'
Planujesz kilka tysięcy obiektów?
Przynieś liczbę użytkowników, mix kanałów i oczekiwane tempo wdrażania. Przy tej skali tempo onboardingu i przypisywanie kont do użytkowników warto zaprojektować razem, zanim je zbudujesz.
Napisz na hello@repull.devPytanie 7
Czy trzeba planować opłaty za wdrożenie, transakcje lub użycie?
Użycie jest mierzone per workspace i widzisz je w API, zanim stanie się niespodzianką: GET /v1/usage/summary, GET /v1/usage/logs i GET /v1/usage/tier pokazują, co workspace zużył i do czego ma prawo, więc platforma może programowo śledzić zużycie własnych klientów. Nie ma też osobnego płatnego sandboxa do zabudżetowania: budujesz na prawdziwym API od pierwszego klucza. Ile to wszystko kosztuje platformę, celowo nie publikujemy, bo liczba poprawna dla integracji z dziesięcioma klientami jest błędna dla integracji z tysiącem. Przynieś swój przypadek i wolumen, a dostaniesz konkretną odpowiedź.
Brak jakiejkolwiek liczby na tej stronie to nie nieśmiałość. Umowy z platformami różnią się o rząd wielkości w zależności od tego, ilu klientów końcowych za nimi stoi, z jakich kanałów korzystają i kto prowadzi wsparcie pierwszej linii, a opublikowana liczba dla jednego z tych przypadków aktywnie wprowadza w błąd w pozostałych. Przed jakąkolwiek rozmową możesz sam sprawdzić zużycie: endpointy usage pokazują, co workspace wykorzystał i do czego ma prawo, więc możesz modelować własną ekonomię na prawdziwych liczbach, a nie na naszych.
Uzyskaj odpowiedź komercyjną dla swojego prawdziwego przypadku
Wyślij liczbę klientów końcowych, kanały, których potrzebują, i mniej więcej ile obiektów prowadzi każdy z nich. Dostaniesz konkretną propozycję zamiast cennika, który nie pasuje.
Napisz na hello@repull.devPytanie 8
Jaki model komercyjny polecacie platformie integrującej Repull?
Jeden workspace partnerski, jeden klucz, jedna umowa z nami. Każdy użytkownik, którego wdrażasz, łączy swoje konta kanałów w Twoim workspace’ie przez Connect, z Twoim brandingiem, z Twoim własnym id użytkownika jako stanem sesji. Po zakończeniu webhook connect.session.completed zwraca Ci ten stan i połączone konto; zapisz konto przy swoim użytkowniku. Od tej chwili każde zdarzenie i każdy rekord wskazuje swoje konto, a każda lista przyjmuje filtr konta. Twoi użytkownicy nigdy nie mają bezpośrednio do czynienia z Repull, a dodanie użytkownika to sesja Connect, nie rejestracja. Osobnego workspace’u klienta używaj tylko wtedy, gdy klient wyraźnie chce mieć z nami własną relację rozliczeniową, albo dla Repull Migrate, które tworzy workspace dla każdego migrowanego zarządcy.
- 1Zarejestruj się raz. Twój workspace i jego klucz API to jedyne poświadczenia Repull w Twoim systemie; trzymaj klucz na swoich serwerach.
- 2Dla każdego użytkownika utwórz sesję Connect przez
POST /v1/connect, ograniczającallowedProvidersdo kanałów obsługiwanych przez Twój produkt. - 3Przekaż swoje id użytkownika jako
state. Po zakończeniuconnect.session.completedzwraca tenstatewraz z połączonym kontem: zapisz konto przy tym użytkowniku. - 4Zasubskrybuj endpoint webhook przez
POST /v1/webhooksi kieruj każde zdarzenie według jego blokuaccount. Użyj endpointów testowych i ponownej wysyłki, żeby zbudować handler, zanim przyjdzie prawdziwe zdarzenie. - 5Czytaj przez endpointy międzykanałowe, gdzie tylko się da, żeby dodanie kanału później było zmianą konfiguracji, a nie przepisywaniem kodu.
Głębsza wersja techniczna — uwierzytelnianie, typy zdarzeń webhook, sandbox, pokrycie per kanał — jest w Q&A dla platform SaaS. Szczegóły dla każdego kanału znajdziesz w przewodnikach po Airbnb, Booking.com i Vrbo, a pełną referencję w dokumentacji.
Większość platform dziedziczy to, czego ich klienci już używają, a w praktyce oznacza to kilka systemów zarządzania obiektami, nie jeden. Każdy ma własny model uwierzytelniania, własne nazwy pól i własne limity: przewodniki po Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu i Beds24 wyjaśniają, co udostępnia każdy system i ile kosztuje Cię jego utrzymanie, a macierz pokrycia porównuje je obok siebie.
Uczciwa lista
Czego Repull jeszcze nie robi dla platform?
Mówimy to wprost, żeby nikt na tym nie budował. Workspace ma jedno połączenie na system zarządzania obiektami: podłączenie drugiego konta Hostaway, Guesty lub innego PMS w tym samym workspace’ie zastępuje pierwsze, więc dziś dwóch Twoich użytkowników na tym samym PMS nie może współistnieć tak, jak konta Airbnb, Booking.com i Vrbo; to jest naprawiane. Kluczy API nie da się ograniczyć do podzbioru ofert; zakresy ograniczają operacje, nie zasoby. Nie ma ogólnego endpointu do tworzenia workspace’ów — model partnerski go nie potrzebuje; jedyny workspace tworzony przez API to ten z Repull Migrate (`POST /v1/connect` z `purpose: "migrate"`, adresowany przez `X-Workspace-Id`). Nie ma rozliczeń per klient końcowy ani rozliczeń resellerskich. White-label nie obejmuje własnej domeny dla Connect ani e-maili wysyłanych z domeny partnera, a hostowane strony mają link „Powered by Repull”. Jeśli któraś z tych rzeczy jest kluczowa dla tego, co budujesz, powiedz nam wcześnie.
Dlaczego ta sekcja istnieje
Powiedz nam, co z tego Ci przeszkadza
Wskaż brakujący element, co byś z nim zbudował i na kiedy go potrzebujesz. Konkretny wymóg z prawdziwej integracji to właśnie to, co budujemy jako następne.
Napisz na hello@repull.dev