For the people who own the data
What this portal reads from HubSpot — and what it cannot do.
You should not have to take our word for any of this. Every number in the portal is traceable to one HubSpot call, and every one of those calls is listed here in plain English. If something on this page is not acceptable to you, it does not get built.
Our guarantees
Read-only
The access token carries read permissions and nothing else. There is no code path in this site that creates, edits, merges or deletes a HubSpot record.
Revocable by you
Access is a private app you create inside your own HubSpot. You can review its call history and delete it at any moment, without involving us. Revoking it stops all access immediately.
Nothing is migrated
Your seminars, contacts and registrations stay exactly where they are. This portal is a window onto HubSpot, not a copy of it.
How a page is built
Four steps, every time. The important one is step 3: your lawyers never wait on HubSpot, because the portal serves a cached copy and refreshes it in the background.
- 1
The portal asks HubSpot what you have
It reads your object schemas first, so it adapts to how your portal is actually set up instead of assuming a structure. This is how it finds your Seminars and Registrations objects.
- 2
It reads the records it needs
Seminars in the published pipeline stage, the contacts belonging to the firm's email domain, and the registrations linked to them. Nothing outside that.
- 3
It stores a short-lived copy
Results are cached for a few minutes so pages load instantly and HubSpot is not called on every visit. This also keeps you far below HubSpot's rate limits.
- 4
HubSpot tells it when something changed
In production a webhook from your portal refreshes that cache the moment a seminar or registration is updated, so the portal stays current without polling. Not wired in this concept build — there is no portal to receive it from yet.
The objects we touch
Read from portal 23163472.
| Object | Type ID | We read | We write |
|---|---|---|---|
| Seminars | 2-15935181 | Title, description, CPD points, practice area, jurisdiction, format, price, dates | NOTHING |
| Registrations | discovered at runtime | Which person attended which seminar, and in which format | NOTHING |
| Contacts | contacts | Name, work email, practice area — for lawyers on the subscription only | NOTHING |
| Companies | companies | The firm's package balance and subscription term | NOTHING |
The exact permissions to tick
When you create the private app in HubSpot, these are the only scopes it needs. Every one ends in .read.
- crm.objects.custom.read
- crm.schemas.custom.read
- crm.objects.contacts.read
- crm.objects.companies.read
Things you should know before saying yes
The parts a vendor normally leaves out.
HubSpot cannot log your users in outside HubSpot
CMS Memberships only works on HubSpot-hosted pages. If a portal lives anywhere else, it needs its own sign-in, with HubSpot as the profile store rather than the login. That is a real decision with a real cost, and it is the single biggest item in this project.
Your Registrations object is too large to search
HubSpot's search API stops at 10,000 results. With roughly 158,000 registrations, any full listing has to page through with a cursor instead. It is a solved problem, but it is the kind of thing that quietly breaks a naive integration six months in.
Some of your practice-area values do not match their labels
In your portal, Compulsory displays as “Professional Skills and Practice Management”, and MandA as “Mergers & Acquisitions”. Several values are like this — the full mapping is in the build. Nothing is broken, but any migration needs that mapping written down rather than guessed.
If HubSpot is unavailable, this portal still loads
It serves its last good copy and says so, rather than showing an error page to a partner at a law firm. With no token configured, that is exactly what you are looking at now — the status bar reads “HubSpot connection ready” rather than claiming a connection it does not have.
Want to see it against your own data?
Create a read-only private app in HubSpot, send us the token, and this same portal will be showing your seminars and your contacts within the hour. Delete the app afterwards and the access ends immediately — cached copies expire within minutes, and we hold nothing else.
Back to the corporate portal