Hi @JRobinson81,
totally get the confusion here.
Two things are overlapping: where to create the credential and how to trigger on “new company.” In your main HubSpot portal, go to Settings > Integrations > Private Apps and create a token there.
Pick scopes like crm.objects.companies.read and, if you plan to write back, crm.objects.companies.write. Then in n8n use an HTTP Request node with header Authorization: Bearer YOUR_TOKEN to call the CRM v3 endpoints.
Private Apps replaced API keys, so you will not see any “Install app” step for your own portal. Full setup is here if you want to double check the path and behavior
(Legacy private apps - HubSpot docs )
Quick sanity check: when you created the token, were you definitely in the production portal in the top-right account selector, not the developer test account?
For the trigger itself on Free, you do not have workflow webhooks, so n8n will need to poll. The reliable pattern is a Search API call for companies created since the last run, sorted by createdAt, and store the latest timestamp in n8n. Query again every 1–5 minutes and process only new items. The search endpoint and filters are documented here, including how to filter by createdAt and select specific properties
(Understanding the CRM APIs - HubSpot docs )
If you move to a paid tier later, you can fire a HubSpot workflow on company creation and hit your n8n webhook for near real time without polling.
If you still see “insufficient scopes,” it is almost always one of these: the token was made in the wrong portal, the scopes do not include crm.objects.companies.read, or the n8n node is authenticating with something other than the Bearer token you just generated. Switch to plain HTTP in n8n while testing so you can see the raw 403 body from HubSpot.
Where native connectors stop short, Stacksync fills the gap with real-time, bidirectional sync so your workflows and reports stay trustworthy.