HubSpot integration
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.
What we read
What we learned
Each of these came from something that went wrong, or nearly did, on a real portal integrated with a PMS.
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.
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.
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.
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.
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.
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
Stage history gives the exact answer per lead, per owner, per week. Not the average. The distribution.
Deal, contact and property in one place, so the line from ad spend to a signed unit is one query, not three exports.
Time in stage with an owner's name on it becomes a work item with a deadline, not a chart.
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
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.
Tell us which PMS it is integrated with and what your pipeline looks like. We will show you what the stage history already knows.