HubSpot integration

Your pipeline, next to your bookings.

We read HubSpot into the same warehouse as your PMS, so a homeowner lead, the deal it became and the property it signed sit in one place. Deals carry their full stage history, with who or what moved them. Contacts, owners and tasks come with them. Email content does not.

Private app tokenRead only, by constructionMetadata, never message bodiesLive today

What we read

Everything a growth engine needs, in the shape it needs it.

DealsName, pipeline, stage, amount, dates, owner. And every custom property your portal carries, without us having to know in advance what they are.
Stage historyEvery stage each deal has ever been in, when it entered, and what moved it: a person, a workflow or an integration. This is where speed-to-contact and time-in-stage come from.
ContactsLifecycle stage, owner, timestamps, associations to deals. Identity lives here and only here.
Owners and pipelinesWho owns what, and the stages every pipeline defines, so a report can name a person.
TasksSubject, status, type, owner, due date, and what they are linked to.
EmailsMetadata only. When, which direction, which staff member, how it was logged. No subject line, no body, no recipient address. The link to the contact already carries the identity.

What we learned

Things a HubSpot portal does that you have to build around.

Each of these came from something that went wrong, or nearly did, on a real portal integrated with a PMS.

01

HubSpot only returns the properties you name.

A portal integrated with a PMS can carry hundreds of custom deal properties: the PMS money model, invoice items, guest-app order ids. So properties are enumerated from the portal at run time, never guessed. And a property existing says nothing about it being filled. We measure fill before modelling on anything.

02

Stage names lie.

A stage called "never answered" turned out to have been set by hand, after real conversations had happened. So we load the full stage history for every deal, with who or what moved it, and report from that. The name on the stage is a label. The history is the fact.

03

Every tenant's custom fields are different.

We cannot know yours in advance, so each object lands as a few typed core columns plus one column holding every non-empty custom value. The raw shape is identical for every operator; your own staging models pick the fields that matter to you.

04

List endpoints page silently.

They will hand you fewer rows than exist and not say so. We ask the search index for the total, compare it with what we collected, and fail the run if the collection is short. A quiet partial load is worse than a loud failure.

05

Sensitive identifiers are refused by name.

Passport and identity numbers, payment-method ids, door codes, companion guests' contact details. A warehouse has no use for any of them and they are the worst thing it could leak. They are excluded before the request is made, and asserted absent afterwards.

06

Copies of other systems' data are not the source of truth.

Integrators sync PMS financials into the CRM. Useful, but it is a copy. We treat it as a reconciliation target and take revenue from the PMS, which is the system of record. Two sources that should agree, checked against each other, is how you catch a sync that has quietly stopped.

Then

What the CRM next to the PMS makes possible.

Owner acquisition

How fast does a new homeowner lead get a relevant response?

Stage history gives the exact answer per lead, per owner, per week. Not the average. The distribution.

Attribution

Which campaign produced the deal that signed the property?

Deal, contact and property in one place, so the line from ad spend to a signed unit is one query, not three exports.

Follow up

Which deals have not moved, and whose are they?

Time in stage with an owner's name on it becomes a work item with a deadline, not a chart.

Reconciliation

Does the CRM agree with the PMS?

When the integrator's sync stops, the two drift. We notice, because we hold both.

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

Guest and owner data

Contact details never reach the AI.

Contacts land in the staging layer, and the AI role is denied that layer outright. It reads two audited schemas that contain no email address, phone number or postal address. A test fails the build if that ever stops being true. How it is built.

Thirty minutes, on your own portal.

Tell us which PMS it is integrated with and what your pipeline looks like. We will show you what the stage history already knows.