Guesty integration

Connect Guesty to everything else you run.

We read Guesty into a warehouse that belongs to you, next to your pricing tool and your CRM. Read only, every day, with the definitions agreed up front. Then the detectors run on top and find the revenue your stack has already earned.

Guesty Open APIRead only, by constructionYour own warehouseSet up in less than a week

What we read

Everything the detectors need, and nothing they do not.

The connector is read only by construction. Most vendor keys can write. Ours cannot, and it checks that it is looking at your account before it loads a single row.

How it works

Five stages, and none of them can write to your systems.

vendor API, read onlyExtractdry-runnableValidatetypes declaredGuardright account?Mergenever replaceRun logfails loudlyA warehouse that belongs to youdaily snapshots · your own Supabase project · read only throughout
Extraction is pure, so any load can be dry-run against a real account without touching anything. The guard runs before a single row moves, because a valid key pointed at the wrong account returns a perfectly normal success. And if the rows collected come up short of what the source says exists, the load fails rather than quietly understating your revenue. Rosters, availability and rates are photographed every day in your local timezone, and that daily snapshot is what makes same-time-last-year answerable a year from now.
ListingsEvery property, with a daily snapshot of the roster so same-store and portfolio growth stay separable.
ReservationsEvery status, including inquiries. Inquiries carry a full quoted price in Guesty, which matters more than it sounds. See below.
Folio linesFees, add-ons and guest-app orders, with order references parsed and free text left out.
Nightly faresNight by night, so revenue can be recognised on the stay dates, not the booking date.
PaymentsWhat was actually collected, and when.
Money modelAccommodation fare, subtotal and gross stored on every row, so a number can never lose its basis.

Pricing context comes from your revenue tool, Wheelhouse today. Lead and owner data comes from your CRM, HubSpot today. Each source is configured by role, so swapping a tool later is one connector, not a rebuild.

Before the first number

Guesty will happily give you the wrong revenue figure.

Not because the data is bad. Because the same data supports several correct answers and nobody wrote down which one you mean.

Statuses

Inquiries carry full quoted prices.

They sit in the same collection as bookings. Sum naively and the phantom revenue can be larger than the real number. We apply a governed booked-status set in one place, visible in the interface.

Closed

Closed is a mixed bucket.

Completed stays and owner blocks share it. Zero-revenue rows contribute nights but no money, so they dilute ADR and inflate booking counts. Status is a dimension, not a yes or no.

Basis

Three revenue bases, and people mean different ones.

Accommodation fare, subtotal before tax, gross payout. Operators set targets on fare. Published growth tends to be gross. Both are right and they differ by a lot.

We reconcile to your own monthly report in week one and write the answers down before anything is built. The full list is in five definitions that change every number in your revenue report.

What we learned

Things the Guesty API does that the documentation does not mention.

Anyone who has built against it will recognise every one of these. We write them down because they are the difference between a number you can trust and one that is quietly wrong.

A field can exist, be populated, and be invisible. Enumerate before concluding something is not there.

01

Pagination is unstable without a stable sort.

Skip-offset paging without an explicit sort key returns some rows twice and drops others, while the total count still looks correct. We pass a stable sort, then fail the load if collected rows are fewer than the API reported. A partial revenue load silently understates every metric downstream, which is far worse than a visible failure.

02

Deep offsets fail.

A flat pass over tens of thousands of reservations fails partway with a server error. We slice by date window so the offset stays small. It also makes every load restartable.

03

Field projections lie in two different ways.

Dot-path projections such as money.hostPayout return null on most rows; request the parent object instead. And some fields, custom fields among them, are absent from the default projection entirely. A field can exist, be populated, and be invisible. Enumerate before concluding something is not there.

04

Custom field values are references, not labels.

You get user ids, not names, and the id-to-name mapping is not retrievable through the API version most accounts are on. We capture it at onboarding and budget for it.

05

The token endpoint throttles far harder than documented.

Documented as one request a minute. Observed: after four or five requests it returns rate-limit errors continuously for over forty minutes, through every backoff ladder. We cache the access token and reuse it for its full life. One token request a day, not one per run.

06

Date windows must be half-open.

An inclusive upper bound on the last day of the month drops post-midnight check-ins. Always >= start and < next start. Small, and it changes the month's revenue.

07

Type inference off the first rows corrupts money.

A loader that types a price column from integer-valued first rows will shunt the decimal prices that arrive later into a variant column and null the typed one. It raises no error and it changes revenue. We declare every money column and cast at the point of yield, then reconcile totals against the source.

08

Verify the account before loading anything.

A valid key on the wrong account returns a perfectly normal 200. We fetch the account identity and assert a known structural marker is present before a single row moves. For you it is a pre-flight you see and confirm.

Then

What a clean Guesty warehouse makes possible.

With two years of reservations, the roster and the money model in one place, four questions become answerable that no single tool can answer on its own.

Same time last year

Dates that sold by now last year and have not sold this year.

Needs history and a place to compare it. Nothing in a standard stack computes it.

Gap nights

Short holes in the near calendar, ranked by value.

Only the ones worth a call, most valuable first.

Repeat guests

Past guests inside their return window now.

Ranked by average stay value so today's best opportunity rises.

Cold quotes

Inquiries that carried a full price and never converted.

The quoted price is already in Guesty. The follow up can be specific.

Each one arrives as a work item with a value, a named owner and a deadline. How that works.

Guest data

Guest contact details never reach the AI.

The AI can read two schemas. Both were audited and contain no email address, phone number or postal address. The raw and staging layers, where Guesty's guest records land, are denied outright and verified by probe. A test fails the build if that ever stops being true.

Thirty minutes, on your own Guesty account.

Tell us which tools you run alongside it and what they already do for you. We will show you what is sitting in your own reservation history.