Airbnb, Booking.com, VRBO, Plumguide. Forty-six PMS platforms. Plus direct. Repull is the channel manager and PMS aggregator in one — and the whole template is open source.
The shape of the problem
The incumbents make you adopt their schema, their UI, and their billing relationship with your users. Repull inverts that — your schema, your UI, your billing. We just handle the channel adapters.
Push listings, photos, calendars, rates, and messages to Airbnb, Booking.com, VRBO, and Plumguide through one schema. Twenty-six Airbnb endpoints, eleven Booking endpoints, on tap.
Hostaway, Guesty, Cloudbeds, Mews, OwnerRez — connect once, read with the same shape regardless of the upstream platform. The PMS adapters are open source too.
Repull normalizes everything to a sensible default schema. If yours is different, define it once with the Custom Schema Builder, set the X-Schema header, and every response comes back in your field names.
Worked example
repull-channel-manager is the full Next.js app — calendar, reservations, connections, messaging, reviews — running on Repull's API. AI features inside it run on Vanio AI. Clone it, point it at your own Repull workspace, and you have a working channel manager today.
A git clone, an npm install, and an .env file with your Repull API key. The Vercel deploy is one click after that.
Each customer of yours gets their own Repull workspace — scoped API keys, scoped data. Your app is the multi-tenant layer on top.
Calendar grid, reservation drawer, message inbox, review approval flow — every screen is yours to extend. The data layer stays put; the UI is yours.
git clone https://github.com/ivannikolovbg/repull-channel-manager cd repull-channel-manager npm install cp .env.example .env.local # add REPULL_API_KEY + REPULL_WORKSPACE_ID npm run dev
import { Repull } from '@repull/sdk'
const repull = new Repull({
apiKey: process.env.REPULL_API_KEY!,
workspaceId: process.env.REPULL_WORKSPACE_ID!,
})
// Push a property to every connected channel
await repull.properties.create({
title: 'R-Sable 1302',
bedrooms: 2,
city: 'Radium Hot Springs',
channels: ['airbnb', 'booking', 'vrbo'],
photos: [...],
amenities: ['wifi', 'parking', 'hot-tub'],
})
// Or only Airbnb, with platform-specific fields:
await repull.properties.create({
title: 'R-Sable 1302',
...,
channels: ['airbnb'],
airbnb: { instantBook: true, minNights: 2 },
})Why open source matters here
Repull's connectors live in the open. If we ever stopped existing, you'd still have the code that talks to Airbnb. That's a deliberate choice, not a marketing line.
Every adapter is open source on GitHub. The channel-manager template is open source. The SDKs are open source. You can fork the entire stack.
See exactly how Repull talks to Airbnb. File a bug, send a PR, or copy a function. The code is the documentation.
Issues, releases, and roadmap live on GitHub. New connector requests land in PR review the same week.
An API key in 30 seconds. Connect a PMS or list direct, and every channel is a write call away.