Hey Tom, great questions. short answer is: yes, you can run a React-based app card on a production Sales Hub Professional portal, but there is one limitation you might want to be aware of:
The app card and HubSpot’s Table component do not require Enterprise. Enterprise becomes relevant if the app relies on HubSpot-hosted serverless functions. If you want to remain compatible with Professional, you can use an external backend through hubspot.fetch() or other supported CRM components.
That requirement is tied to the portal where the app is installed–not the developer account used to build it. You can build and test in a developer test account without Enterprise, but the production portal’s subscription determines which features the installed app can use.
For Deals, you’ll generally need:
crm.objects.deals.read to display Deal data.
crm.objects.deals.write if your backend will save property changes.
Both scopes are available on Professional. The installer can be a Super Admin, but that isn’t the only option: a user with HubSpot Marketplace access and the necessary scope permissions can also install the app. Placing the card on the Deal layout requires Super Admin or Customize record page layout permission.
Your proposed size–15-20 rows with six editable columns–isn’t a concern from a UI or API-limit perspective. I’d just avoid saving on every keystroke: save on commit, by row, or batch the changed values where possible.
One thing I’d clarify before building is what each row represents. CrmPropertyList won’t solve the multi-row use case–it displays properties from one Deal or one explicitly identified record. If each row represents a separate Deal, line item, associated CRM record, or external record, each row should carry its own record ID and be persisted independently.
CrmAssociationTable can display associated CRM records, but it doesn’t provide the editable-grid workflow you’re describing. For that, you’ll need to compose inputs inside HubSpot’s standard Table yourself or use a higher-level component.
Full disclosure: I maintain an open-source library called hs-uix, and this is exactly the kind of problem its DataTable is intended to help with. It’s built entirely from native @hubspot/ui-extensions components and already handles inline or full-row editing, validation, multiple input types, sorting, filtering, and pagination:
npm install hs-uix
import { DataTable } from "hs-uix/datatable";
You’d still own the actual persistence in onRowEdit–hs-uix handles the table and editing experience, while your app decides how each change is saved.
So my recommendation would be: the custom grid is completely viable on Sales Hub Professional. Just avoid HubSpot-hosted serverless functions if Professional compatibility is a requirement, and make sure the underlying row model is clear before building the interface.
Hope that helps and would be happy to provide you with a clearer example if you wanted to go the HS-UIX route.