Per le piattaforme SaaS che integrano Repull

Repull per le piattaforme: come funziona quando i tuoi clienti sono gli host

Queste sono le domande che le piattaforme fanno davvero prima di impegnarsi: un accordo o tanti, qual è l'unità, chi viene fatturato, cosa copre davvero il white-label e cosa succede con qualche migliaio di proprietà. Con risposte basate su ciò che esiste oggi, comprese le parti che ancora non esistono. Qui non c'è nessun prezzo: la metà commerciale è una conversazione, e questa pagina è la metà tecnica onesta che ti serve prima di farla.

Il modello, in un paragrafo

Hai uno spazio di lavoro e una chiave API. Ciascuno dei tuoi utenti collega i propri account Airbnb, Booking.com o Vrbo in quello spazio di lavoro tramite Connect, con il tuo marchio: molti account per canale, uno accanto all'altro. Il tuo prodotto legge e scrive su tutti con quell'unica chiave, e ogni evento webhook dice da quale account collegato arriva, così lo indirizzi all'utente giusto. I tuoi utenti non si registrano mai su Repull e non hanno mai una chiave. Questo è tutto il modello: tutto ciò che segue ne è una conseguenza.

Le quattro unità con cui si costruisce un'integrazione di piattaforma
UnitàCos’èIn un'integrazione di piattaforma
Spazio di lavoroIl tenant: connessioni, annunci, prenotazioni, webhook, chiavi.Uno, il tuo. Qui vivono l’identità di fatturazione e le iscrizioni ai webhook.
Account collegatoUno degli account di canale del tuo utente: un host Airbnb, una struttura Booking.com, un account Vrbo.Molti per canale. Ogni utente collega i propri; eventi e righe Airbnb lo indicano.
AnnuncioUna proprietà collegata.Appartiene all’account da cui proviene.
Chiave APICredenziale bearer dello spazio di lavoro.Una chiave legge tutti gli account collegati. Gli ambiti limitano le operazioni, non gli annunci.

Domanda 1

Una piattaforma può avere un unico accordo con Repull e offrire l'integrazione a molti dei propri utenti?

Sì, ed è ciò per cui è fatto Repull: un accordo, uno spazio di lavoro Repull per la piattaforma e tutti gli utenti della piattaforma collegati al suo interno. Ogni utente collega il proprio account Airbnb, Booking.com o Vrbo tramite il flusso Connect ospitato con il tuo marchio, e il tuo prodotto legge e scrive su ogni account collegato con un'unica chiave API. Ogni account collegato mantiene la propria identità — gli eventi webhook e ogni prenotazione, conversazione e recensione dicono da quale account arrivano — così indirizzi ogni prenotazione, messaggio e recensione all'utente giusto nel tuo prodotto. I tuoi utenti non si registrano mai su Repull, non vedono mai una chiave e non firmano mai nulla con noi. Come si formalizza l'accordo è una conversazione, non un piano pubblicato.

In pratica la piattaforma non chiede mai ai suoi utenti di firmare nulla con noi, non mostra mai il nostro marchio tranne un link di attribuzione sulla pagina Connect e non consegna mai loro una credenziale. Il tuo utente clicca “collega Airbnb” nel tuo prodotto, completa un flusso ospitato con il tuo marchio e torna. Il suo account è ora un account collegato in più nel tuo spazio di lavoro.

Attivare uno dei tuoi utenti

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

Domanda 2

Come è strutturato: per proprietà, per utente o per connessione?

Le unità sono spazio di lavoro, account collegato, annuncio e chiave API. Lo spazio di lavoro è tuo — della piattaforma — ed è il confine del tenant. Al suo interno, ciascuno dei tuoi utenti collega uno o più account di canale: diversi account host Airbnb, diverse strutture Booking.com, diversi account Vrbo, uno accanto all'altro. Un annuncio è una proprietà collegata e appartiene all'account da cui proviene. La chiave API appartiene allo spazio di lavoro, quindi il tuo prodotto legge ogni account collegato con un'unica chiave e li distingue per account: ogni prenotazione, conversazione e recensione riporta un account (il provider e l'id dell'account presso il provider), ogni proprietà elenca i suoi account, tutti e quattro accettano un filtro per account e ogni evento webhook indica lo stesso account. Cosa si conta commercialmente è una domanda diversa da come si modella, e vale la pena rispondere su un caso reale invece di tirare a indovinare in pubblico.

  • Molti account per canale.Gli account host Airbnb, le strutture Booking.com e gli account Vrbo di tutti i tuoi utenti stanno uno accanto all'altro nel tuo spazio di lavoro. GET /v1/connect/{provider} li elenca in accounts, e DELETE /v1/connect/{provider} accetta un accountIdper scollegare l'account di un utente senza toccare gli altri.
  • Ogni evento indica il proprio account. Le consegne webhook riportano un blocco account — provider e externalAccountId, l'id del provider — e lo stesso account negli header X-Repull-Account e X-Repull-Account-Id.
  • Ogni record indica il proprio account. GET /v1/reservations, /v1/conversations e /v1/reviews riportano account su ogni riga e /v1/properties riporta accounts; tutti e quattro accettano ?account=provider:externalAccountId per leggere i dati di un utente.
  • Una chiave per tutto lo spazio di lavoro. La chiave è tua e legge ogni account collegato. Gli ambiti limitano cosa può fare, non cosa può vedere: è proprio quello che vuoi quando la chiave vive solo sui tuoi server.

Indirizzare ogni evento all'utente giusto

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

Domanda 3

Si può fatturare direttamente al cliente finale invece che alla piattaforma?

Non come funzionalità della piattaforma, oggi. La fatturazione è legata a uno spazio di lavoro, quindi chi possiede lo spazio di lavoro — di solito tu, la piattaforma — è chi riceve la fattura. Non esiste un oggetto di fatturazione per rivenditori né un meccanismo con cui Repull fatturi i clienti finali di una piattaforma per suo conto mentre la piattaforma mantiene il controllo amministrativo. Funziona invece il contrario: un cliente finale può possedere e pagare il proprio spazio di lavoro e dare una chiave alla piattaforma. Se fatturare i tuoi clienti tramite noi è un requisito e non una preferenza, dillo: è il tipo di cosa che vale la pena costruire per il partner giusto, e non qualcosa da far finta che esista già.

Fatturare direttamente i tuoi clienti è un requisito per te?

Se il tuo modello dipende dal fatto che fatturiamo i tuoi clienti mentre tu mantieni il controllo amministrativo, raccontaci la forma che ti serve. Oggi non esiste, ed è una cosa concreta da costruire con un partner dietro, non un forse.

Scrivi a hello@repull.dev

Domanda 4

Se il cliente finale paga direttamente, la piattaforma può comunque usare l'API nel suo prodotto?

Sì. L'accesso segue la chiave API, e una chiave appartiene a uno spazio di lavoro e non a una persona, quindi un cliente che possiede il proprio spazio di lavoro Repull può emettere una chiave e darla alla piattaforma, e il prodotto della piattaforma chiama l'API su quello spazio di lavoro esattamente come sul proprio. Una chiave non attraversa mai gli spazi di lavoro, quindi questo modello significa conservare una chiave in più per ognuno di questi clienti. È l'eccezione, non la regola: la maggior parte delle piattaforme tiene tutti gli utenti nel proprio spazio di lavoro partner e usa uno spazio del cliente solo quando il cliente vuole un rapporto di fatturazione diretto con noi.

Chiavi gestite dalla piattaforma a confronto con chiavi gestite dal cliente
La piattaforma ha le chiaviIl cliente possiede lo spazio di lavoro
Chi si registraTu, una volta per clienteIl tuo cliente
Chi viene fatturatoTuIl tuo cliente
Chi ha la chiaveTuIl tuo cliente, che la condivide con te
Esperienza di onboardingTutta nel tuo prodotto, con il tuo marchio su ConnectIl tuo cliente esce per registrarsi e poi torna con una chiave
Se lascia il tuo prodottoDisattivi lo spazio di lavoroTiene lo spazio di lavoro e le connessioni
SupportoIl tuoDiviso tra te e noi

Entrambi funzionano tecnicamente. Il secondo è davvero migliore in un caso: un cliente abbastanza grande da volere un proprio rapporto, una propria fattura e una propria continuità se un giorno lasciasse il tuo prodotto. Per tutti gli altri il primo ha meno attrito e meno credenziali nel tuo database.

Domanda 5

Esistono accordi partner, di rivendita, white-label o a volume per le piattaforme SaaS?

Dal punto di vista commerciale sì: gli accordi con le piattaforme sono esattamente la conversazione che vogliamo avere, e le condizioni si definiscono partner per partner invece di essere pubblicate. Dal punto di vista tecnico, white-label oggi significa che le pagine Connect ospitate su cui arrivano gli utenti di una piattaforma portano il marchio della piattaforma: nome dell'app, loghi chiaro e scuro, colori primario e d'accento per entrambi i temi, email di supporto, link a termini e privacy, un reindirizzamento predefinito al prodotto e una lingua predefinita. Cosa non significa: l'URL di Connect resta su connect.repull.dev, la pagina riporta un link "Powered by Repull" e non ci sono dominio personalizzato né email inviate da un dominio del partner. Tutto il resto — condizioni di rivendita, accordi a volume, co-marketing — è una conversazione.

Cosa copre oggi il white-label e cosa no
Oggi
Nome del marchio sulle pagine Connect ospitateSì
Il tuo logo, versione chiara e scuraSì
I tuoi colori primario e d’accento, in entrambi i temiSì
La tua email di supporto nel footerSì
I tuoi link a termini e privacySì
Reindirizzamento predefinito al tuo prodottoSì
Lingua predefinita delle pagine ospitateSì
Connect servito dal tuo dominioNo: l’URL resta su connect.repull.dev
Attribuzione rimossaNo: è presente un link "Powered by Repull"
Email inviate dal tuo dominioNo

Si imposta una volta su /dashboard/settings/connect e vale per ogni canale che collegano i tuoi utenti. Il flusso in sé ha la stessa forma di Stripe Connect o Plaid Link: il tuo server crea una sessione e legge uno stato, senza mai toccare una credenziale di canale.

Domanda 6

Cosa succede con qualche centinaio o qualche migliaio di proprietà collegate?

L'API è fatta per quelle dimensioni: gli endpoint di elenco più pesanti sono paginati a cursore, con un alias offset per la paginazione leggera; esistono superfici a lotti per non fare una chiamata per proprietà (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status); le scritture accettano un Idempotency-Key così un timeout di rete non può causare una doppia prenotazione; e i webhook con log delle consegne e reinvio fanno sì che tu non debba fare polling. Migliaia di proprietà di centinaia di tuoi utenti vivono comunque nel tuo unico spazio di lavoro, dietro una chiave e un endpoint webhook; quello che vale la pena progettare con noi a quella scala è il volume di onboarding e come associ gli account collegati ai tuoi utenti.

  • Pagina con i cursori. Gli endpoint di elenco più pesanti sono paginati per chiave, quindi il costo per pagina resta costante per quanto in profondità tu vada. ?offset= esiste come alias per la paginazione leggera ed è lo strumento sbagliato per una scansione completa.
  • Scrivi a lotti. PATCH /v1/availability/batch per i valori di calendario su molte proprietà, POST /v1/listings/pricing/bulk per le decisioni di prezzo e POST /v1/listings/statusper l'attivazione. Una chiamata, molte proprietà, con i fallimenti parziali riportati elemento per elemento invece di far fallire il lotto.
  • Invia una chiave di idempotenza. Ogni scrittura che crea qualcosa accetta Idempotency-Key. A volumi da piattaforma un timeout non è un caso limite: è un martedì qualsiasi.
  • Iscriviti, non fare polling. Un endpoint POST /v1/webhooks per il tuo spazio di lavoro, con log delle consegne, reinvio e un endpoint di test per ogni tipo di evento, così puoi costruire il gestore prima del primo evento reale.

Le due letture che servono a una schermata di supporto

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

Stai pianificando per qualche migliaio di proprietà?

Porta il numero di utenti, il mix di canali e la velocità con cui prevedi di attivarli. A quella scala il volume di onboarding e l'associazione account-utenti vanno progettati insieme prima di costruirli.

Scrivi a hello@repull.dev

Domanda 7

Ci sono costi di attivazione, per transazione o di utilizzo da prevedere?

L'utilizzo è misurato per spazio di lavoro e lo vedi nell'API prima che diventi una sorpresa: GET /v1/usage/summary, GET /v1/usage/logs e GET /v1/usage/tier riportano cosa ha consumato uno spazio di lavoro e a cosa ha diritto, così una piattaforma può monitorare il consumo dei propri clienti in modo programmatico. Non c'è nemmeno una sandbox a pagamento separata da mettere a budget: sviluppi sull'API reale fin dalla prima chiave. Quanto costa tutto questo per una piattaforma non è pubblicato di proposito, perché una cifra giusta per un'integrazione da dieci clienti è sbagliata per una da mille. Porta il tuo caso e il tuo volume e avrai una risposta diretta.

Il motivo per cui su questa pagina non c'è un numero non è riservatezza. Gli accordi con le piattaforme cambiano di un ordine di grandezza a seconda di quanti clienti finali ci sono dietro, quali canali usano e chi si occupa del supporto di primo livello, e una cifra pubblicata per uno di questi casi è attivamente fuorviante per gli altri. Quello che puoi verificare da solo prima di qualsiasi conversazione è il consumo: gli endpoint di utilizzo riportano cosa ha usato uno spazio di lavoro e a cosa ha diritto, così puoi modellare la tua economia su numeri reali invece che sui nostri.

Ottieni la risposta commerciale per il tuo caso reale

Mandaci il numero di clienti finali, i canali di cui hanno bisogno e più o meno quante proprietà gestisce ciascuno. Riceverai una proposta concreta invece di un listino che non ti calza.

Scrivi a hello@repull.dev

Domanda 8

Uno spazio di lavoro partner, una chiave, un accordo con noi. Ogni utente che attivi collega i propri account di canale nel tuo spazio di lavoro tramite Connect, con il tuo marchio, con il tuo id utente come stato della sessione. Quando ha finito, il webhook connect.session.completed ti restituisce quello stato e l'account collegato; salva l'account associato al tuo utente. Da lì in poi ogni evento e ogni record indicano il proprio account, e ogni elenco accetta un filtro per account. I tuoi utenti non hanno mai a che fare direttamente con Repull, e aggiungere un utente è una sessione Connect, non una registrazione. Usa uno spazio di lavoro separato, di proprietà del cliente, solo quando un cliente vuole espressamente un proprio rapporto di fatturazione con noi, oppure per Repull Migrate, che crea uno spazio di lavoro per ogni property manager che trasferisci.

  1. 1Registrati una volta. Il tuo spazio di lavoro e la sua chiave API sono le uniche credenziali Repull nel tuo sistema; tieni la chiave sui tuoi server.
  2. 2Per ogni utente, crea una sessione Connect con POST /v1/connect, limitando allowedProviders ai canali supportati dal tuo prodotto.
  3. 3Passa il tuo id utente come state. Quando ha finito, connect.session.completed restituisce quello state con l'account collegato: salva l'account associato all'utente.
  4. 4Iscrivi un endpoint webhook con POST /v1/webhooks e indirizza ogni evento in base al suo blocco account. Usa gli endpoint di test e di reinvio per costruire il gestore prima che arrivi un evento reale.
  5. 5Leggi tramite gli endpoint trasversali ai canali ogni volta che puoi, così aggiungere un canale in futuro sarà un cambio di configurazione e non una riscrittura.

La versione tecnica più approfondita — autenticazione, tipi di eventi webhook, sandbox, copertura per canale — è nelle domande e risposte per piattaforme SaaS. Il dettaglio canale per canale è nelle guide di Airbnb, Booking.com e Vrbo, e il riferimento completo è nella documentazione.

La maggior parte delle piattaforme eredita ciò che usano già i propri clienti, cioè in pratica una varietà di sistemi di gestione delle proprietà e non uno solo. Ognuno ha il proprio modello di autenticazione, i propri nomi dei campi e i propri limiti: le guide di Guesty, Hostaway, Hospitable, Lodgify, OwnerRez, Smoobu e Beds24 spiegano cosa espone ciascun sistema e quanto ti costa mantenerlo, e la matrice di copertura li confronta fianco a fianco.

L'elenco onesto

Cosa non fa ancora Repull per le piattaforme?

Lo diciamo chiaramente perché nessuno ci costruisca sopra. Uno spazio di lavoro ha una connessione per sistema di gestione delle proprietà: collegare un secondo account Hostaway, Guesty o di un altro PMS nello stesso spazio di lavoro sostituisce il primo, quindi oggi due tuoi utenti sullo stesso PMS non possono stare uno accanto all'altro come possono invece gli account Airbnb, Booking.com e Vrbo; lo stiamo correggendo. Le chiavi API non possono essere limitate a un sottoinsieme di annunci; gli ambiti limitano le operazioni, non l'inventario. Non esiste un endpoint generale per creare spazi di lavoro — il modello partner non ne ha bisogno; l'unico spazio di lavoro creato via API è quello di Repull Migrate (`POST /v1/connect` con `purpose: "migrate"`, raggiunto con `X-Workspace-Id`). Non esiste fatturazione per cliente finale né di rivendita. Il white-label non si estende a un dominio personalizzato per Connect né a email inviate da un dominio del partner, e le pagine ospitate riportano un link "Powered by Repull". Se una di queste cose è fondamentale per quello che costruisci, dillo presto.

Perché esiste questa sezione

Una piattaforma che scopre al terzo mese che manca un elemento di base ci ha già costruito attorno. Tutto quello che c'è sopra è ciò che il prodotto fa; questo è ciò che non fa, messo per iscritto perché la conversazione parta dagli stessi fatti. Se uno di questi punti ti blocca, è una prima email molto migliore di una richiesta generica.

Dicci quale di questi ti blocca

Indica il pezzo che manca, cosa ci costruiresti e quando ti serve. Un requisito specifico da un'integrazione reale è ciò che viene costruito dopo.

Scrivi a hello@repull.dev