Sooner or later, most growing HubSpot portals hit the same wall. You want a pricing calculator on the deal record, live stock levels from your warehouse system, or a check that runs before a deal can move stage. Workflows can't quite do it, and the traditional answer is a separate server: a developer builds a backend, someone hosts it, and someone has to keep it patched.
HubSpot's developer platform now lets you build a lot of this inside HubSpot. Two pieces do most of the work: UI extensions, which put your own interface inside HubSpot, and serverless functions, which run your backend code on HubSpot's infrastructure.
The platform changed a fair bit over the past year, so plenty of older guides are out of date. Here's how it works as of the 2026.03 platform version.
HubSpot apps are now built as developer projects: a folder of code and config files that you upload with the HubSpot CLI. Each project declares a platform version.
HubSpot now ships platform versions every six months, and each is supported for 18 months. The details are in HubSpot's Spring 2026 developer changelog. If you have older custom work in your portal, put a migration review on the calendar.
UI extensions are React components that render inside HubSpot, built with HubSpot's own component library so they look native. According to the UI extensions overview, they can appear as:
If you still have classic CRM cards built the old way, HubSpot's changelog says they need to move to app cards by 31 October 2026.
App functions are server-side JavaScript functions that HubSpot runs for you. You don't provision a server, renew certificates or manage scaling. According to HubSpot's serverless functions overview and reference:
Separately, Content Hub Enterprise still offers CMS serverless functions for websites, such as form handlers or dynamic page data. They're a different tool. They support public endpoints but can't be called from UI extensions.
You don't always need HubSpot to host your code. A UI extension can also call an external service directly with hubspot.fetch(), which has a default 15-second timeout that can be raised to 120 seconds, and a 1 MB payload limit.
One more limit worth knowing. Apps that use HubSpot's Sensitive Data scopes can't use hubspot.fetch() or serverless functions. If you handle sensitive data in HubSpot, design around that from the start.
A few patterns we see often.
An app card shows a live quote breakdown based on deal properties such as scope, tier and term. A private function applies your pricing rules and writes the result back to the deal, so reps stop maintaining a spreadsheet on the side and every quote follows the same rules.
An app card on the contact or deal pulls current information from your inventory, booking or job management system when a rep opens the record. Nothing is copied into HubSpot unless you choose to store it, so there's no middleware sync to break.
An app page walks staff through a multi-step task such as onboarding a new customer, checking each step and updating the right records as they go. This works well for processes where a missed step causes real problems.
On Content Hub Enterprise, a public endpoint can receive webhooks from another system, for example an order shipped, and update the matching deal.
Don't confuse app functions with custom coded workflow actions. Those let you write code directly inside a workflow step, and they're part of Data Hub Professional and Enterprise. If the logic only needs to run inside an automation, with no interface, a custom coded action is often simpler.
The 2026.03 release also lets developers build agent tools: custom workflow actions that HubSpot's Breeze agents can call. That's worth watching if you plan to use AI agents in your portal.
Before you build anything, make sure the data underneath is in shape. A clever app card that reads half-empty properties doesn't help anyone. I've written about cutting a portal back to the properties that matter, and about the workflows to get right first.
If you've hit the limits of standard HubSpot and you're weighing up a custom app card or function, start with our AI Readiness Audit. We'll look at your data, your workflows and your subscription, and tell you whether native features, a custom extension or something else is the right fit.