HubSpot + Custom portals integration
A portal shows members, partners or clients their own slice of the CRM, with HubSpot as the only system of record and caching as the rate limit defence.
Built by us- Into HubSpot
- Two way
- Out of HubSpot
Is there a HubSpot app for a custom portal?
No, and that is the point. There is no app to install, because a portal is software we build on HubSpot's own API, with HubSpot staying the system of record so your team keeps working in the CRM they already know. It suits member, partner and client portals where records, stages and documents are the content, and a first build runs 70 to 150 hours.
- Recommended route
- Custom middleware
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- No listed app
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect a custom portal to HubSpot
The request usually arrives as a support problem. Members email to ask when the next event is, partners email to ask what happened to the referral they sent three weeks ago, and clients email to ask for the document they were sent in March. Every one of those answers already exists in the CRM. None of them is visible to the person who wants it, so a human has to look it up and reply.
The obvious fix is a portal, and the obvious mistake is buying one that keeps its own database. That gives the team two places to update a record, two places for a stage to be wrong, and a nightly reconciliation nobody signed up for. What people actually want is a window: the CRM stays the only place the team works, and the portal shows each person their own slice of it.
That is what we build. The portal has no database of record. It holds a session, a cache and a little bookkeeping of its own, like which notification somebody has read. Everything else is HubSpot, read live and written live. A referral submitted in the portal is a deal in a pipeline within a second, and when the team moves that deal the portal shows the new stage on the next read.
We run this engine for our own partner referral portal and built the same foundation for a membership organization’s member portal. The screens and the object model differ every time. The engine, the security model and the caching strategy have carried across every build so far.
What syncs
The mapping is unusual on this page, because HubSpot is the source and the portal is the surface. A person signing in is a contact, and an access property on that contact decides whether they may sign in at all, so offboarding somebody is a CRM change rather than a support ticket.
A submission becomes a native object, not a custom one. A referral or a request is a deal in its own pipeline, because the team already knows how to work a pipeline and because stage history is then free: reading the deal’s stage history back gives the portal a tracker with a date against each step.
Content that the team publishes is custom object records: resources, events, notifications. Documents pair a custom object record with a file. Portal behaviour goes back the other way as custom behavioural events, so sign-ins and views land on the contact timeline beside emails and calls.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Portal sign-in | Contact | Two way | Email address, gated by an access property on the contact | Turning access off in the CRM locks the account on the next request. |
| Submitted request or referral | Deal | Into HubSpot | A portal reference code stored on the deal | A native deal, so the team works it in the pipeline as usual. |
| Stage tracker | Deal | Out of HubSpot | Deal stage history, read back by record identifier | A stage moved in the CRM appears in the portal on the next read. |
| Resource or catalogue item | Custom object | Out of HubSpot | Custom object record, published by the team | One cached list serves every viewer, which is the rate limit defence. |
| Notification | Custom object | Out of HubSpot | Custom object record, with read state kept in our own database | |
| Invoice or dues record | Deal | Out of HubSpot | Deal in a billing pipeline, with a payment link out | No card details touch the portal, which keeps the scope small. |
| Portal activity | Engagement | Into HubSpot | Custom behavioural event, keyed to the contact | Sign-in, record view and submit, so the CRM sees portal behaviour. |
Architecture
The browser holds a session cookie and nothing else. Every request hits our own server-side functions, which resolve the signed-in contact, check the access property, check that the record being requested actually belongs to that contact, then read HubSpot through a cache.
Caching is the load-bearing part. HubSpot’s limits are counted per app, so every signed-in user draws on one shared budget. Lists that are identical for everyone, a resource library for example, are cached once globally. Per-person reads are cached briefly and invalidated the moment that person writes something, so a submission appears immediately while a colleague’s unrelated read still comes from cache.
Our own small database holds only what HubSpot should not: session records, a sign-in audit, notification read state. Losing it would cost a few sessions and nothing of record.
What the API allows
- API style
- REST
- Authentication
- API key
- Webhooks
- Yes
- Changed-since filter
- Yes
- Sandbox
- Yes
- Rate limit
- 190 requests per 10 seconds for a private app on Professional or Enterprise, with the daily total shared across every app in the account
Developer documentation developers.hubspot.com
Three ways to connect
The choice is mostly about what the portal has to do. If the requirement is gated content, HubSpot’s own membership features already do that and a build is unnecessary. If the requirement is records, stages, uploads, a per-person pipeline view and a branded experience on a phone, that is a build.
The third route, a packaged portal product, is the one we advise against when HubSpot is already the CRM. Those products keep their own copy of the data and sync it, which turns a one-system problem into a two-system problem and puts a vendor between the team and the records they work all day.
Reuse changes the arithmetic. The second portal on an engine that already exists costs a fraction of the first, which is why we keep one foundation rather than starting each build fresh.
-
Custom middleware
RecommendedA server-side portal on HubSpot's API keeps one system of record, keeps the token off the browser, and lets the team publish content and move stages from the CRM without learning a second tool.
-
Native app
PossibleHubSpot's own membership and private content features are enough when the requirement is gated pages rather than records, stages, uploads and a per-person view of a pipeline.
-
Automation platform
AvoidA no-code portal builder usually copies your CRM into its own database, which gives you a second system of record to reconcile and a vendor between your team and your data.
What breaks and how we prevent it
190 requests every 10 seconds
Rate limits are the first thing that bites, and they bite at exactly the wrong moment: when the portal gets popular. A private app on Professional or Enterprise gets 190 requests every 10 seconds, and the daily allowance is shared with every other integration in the account. Caching, batching and keeping search off the hot path are what make a portal survive a Monday morning.
Searching on every page load
Search is a trap. The CRM search endpoint allows five requests a second per account and newly changed records take a moment to appear in its index, so a portal that looks up a person by searching on every page load is both slow and wrong. We resolve identity once at sign-in and read by record identifier afterwards.
Stale caches after a submission
Stale caches confuse people more than slow pages do. Somebody submits a referral, sees the old list, and submits again. Every write invalidates that person’s own cached reads immediately, which is why per-person and global caches are kept separate.
Access revoked after sign-in
Access is the one with consequences. A contact whose access property is turned off must lose the portal on their next request, not at the next deployment, so the gate is checked server side on every request rather than at sign-in only. Ownership is checked the same way, on every read.
Our approach
- Scope. We work out who signs in, what each person may see, and which of those things already exist as records in the portal.
- Architect. The object model first, deciding what is a native object, what is a custom object and what is only a property, then the caching plan that follows from the read pattern.
- Build. Server-side functions with the credential in a secret store, a branded interface on top, and the whole thing runnable locally against fixtures so development never touches live data.
- Validate. A sandbox portal seeded by an idempotent script, guarded so it refuses to run against production.
- Operate. Sign-in audit, error alerting, and a quarterly look at the request volume against the account’s limits.
Common questions
Do we need a HubSpot app to run a customer portal?
No. A portal is not a marketplace listing, it is software that talks to your own portal through HubSpot's API with a private app credential and a defined set of scopes. Nothing is installed in the App Marketplace, and no other customer's account is involved, which is why the security conversation is shorter than people expect.
Where does the HubSpot token live in a portal build?
Server side only, in the platform's secret store, and it never reaches the browser. The browser holds a session cookie and nothing else. Every read and write goes through our own functions, which check who is asking before they ask HubSpot, so a user cannot request a record that is not theirs by editing a URL.
How does a HubSpot-backed portal stay inside the API rate limits?
Caching is built in from the start rather than tuned in later. Limits are counted per app, so every signed-in user shares one budget. Lists that are the same for everyone are cached once and served to all, per-person reads are cached for around a minute and invalidated on write, and the CRM search endpoint, capped at five requests a second per account, is kept off the hot path.
Can portal users see only their own records?
Yes, and it is enforced on the server rather than in the interface. The signed-in contact is resolved from the session, every record read is checked against that contact's own associations, and anything else returns nothing. Hiding a record in the interface is only a convenience, and the ownership check is what controls access.
How does the team publish content to the portal?
By creating records in HubSpot. Resources, events and notifications are custom object records, so publishing an item or sending a notice is something the team does in the CRM rather than in a separate admin tool. That is the whole design goal: no second system to keep in step, and no developer in the publishing loop.
What does a portal record in HubSpot when somebody signs in?
Custom behavioural events, sent to the events endpoint with the contact identified, covering sign-in, failed sign-in, record views, submissions and downloads. Each occurrence can carry up to 50 properties, and an account can define up to 500 event types. The result is portal behaviour sitting on the contact timeline next to emails and calls.
Can a HubSpot-backed portal take payments?
It can show an invoice and link out to a payment provider, which is what we usually recommend, because no card details then pass through the portal and the compliance scope stays small. Taking payment in the page is possible and is a different project, with its own review and its own provider decision.
How long does a HubSpot-backed portal take to build?
A first portal covering sign-in, a submission flow, a tracker and a library runs 10 to 20 hours of discovery and 70 to 150 hours of build. The second portal on the same engine is much faster: our own partner portal was forked from an existing member portal and reached a live deployment in five days.
Also in Sales and marketing platforms
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Scope a Custom portals integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Where these facts come from
- Legacy private apps developers.hubspot.com
- Authentication overview developers.hubspot.com
- API usage guidelines and limits developers.hubspot.com
- Custom object records API guide developers.hubspot.com
- CRM Search API developers.hubspot.com
- Send custom event occurrences developers.hubspot.com
- Create a sandbox and deploy changes to production knowledge.hubspot.com