HubSpot Integration
The HubSpot integration is a two-way sync between GrowPanel and your HubSpot CRM. GrowPanel pushes MRR, ARR, plan, status, and lifecycle dates onto matched HubSpot companies or contacts, and pulls back any HubSpot property (industry, employee count, lifecycle stage, etc.) into GrowPanel as filterable custom variables.
Connecting HubSpot
- Go to Settings → Integrations
- Find the HubSpot card and click Connect
- You'll be redirected to HubSpot to approve the connection
- Pick the HubSpot account (portal) to connect, then click Connect app
- You're redirected back to GrowPanel and the Configure modal opens automatically
GrowPanel asks for the following HubSpot scopes:
oauthcrm.objects.companies.read,crm.objects.companies.writecrm.objects.contacts.read,crm.objects.contacts.writecrm.schemas.companies.write,crm.schemas.contacts.write
The schema scopes are required so GrowPanel can create the growpanel_* custom properties on first save. GrowPanel cannot read or modify anything outside the companies/contacts objects.
Configuring the integration
After connecting, the Configure modal lets you set how the sync behaves. You can change these settings at any time from the integrations page.
Sync to
Choose which HubSpot object type to write to:
- Companies — typical for B2B (one record per organization)
- Contacts — typical for B2C (one record per individual)
Match by
How GrowPanel finds the right HubSpot record for each customer:
- Email — exact email match (best for contacts)
- Email domain — everything after
@(best for companies) - GrowPanel customer ID — matches by the
growpanel_external_idproperty. Most reliable once records have been synced once.
Create record if no match found
- Checked: customers without a matching HubSpot record are created as new records
- Unchecked: customers without a match are skipped — only existing HubSpot records get updated
Recommended for B2B teams that want HubSpot to stay manually curated.
Fields to push to HubSpot
Tick the GrowPanel metrics you want written to HubSpot on every sync. The corresponding growpanel_* custom properties are created automatically in your HubSpot account when you save.
| Field | HubSpot property | Type |
|---|---|---|
| MRR | growpanel_mrr | Number |
| ARR | growpanel_arr | Number |
| Total amount paid (lifetime) | growpanel_total_amount | Number |
| Status | growpanel_status | Text (lead / trial / active / churned / paused) |
| Current plan (raw plan name) | growpanel_plan | Text |
| Plan group | growpanel_plan_group | Text |
| Paid started date | growpanel_paid_started | Date |
| Trial started date | growpanel_trial_started | Date |
| Cancel date | growpanel_cancel_date | Date |
| Next billing date | growpanel_next_billing_date | Date |
growpanel_external_id (the GrowPanel customer ID) is always pushed regardless of which fields you select — it's used to reverse-match records on future syncs.
Import fields from HubSpot
Pull HubSpot properties into GrowPanel as filterable custom variables. Each row maps one HubSpot property → one GrowPanel custom variable name.
The HubSpot property dropdown lists every property available on your portal for the chosen object type. The most commonly used properties (domain, industry, employee count, etc.) appear at the top under Common properties; the rest follow alphabetically.
Imported values appear in filter and group-by dropdowns across every report — the new keys are added to the account-level cache the moment you save, even before any sync has pulled values.
Syncing
There are three ways customer data ends up in HubSpot:
Sync a single customer
On any customer detail page, click the Resync button (it becomes a dropdown when HubSpot is connected) and choose Sync to HubSpot. This runs synchronously and gives you immediate feedback — useful for testing.
Sync all customers
From Settings → Integrations, click the refresh icon on the HubSpot card. This queues every customer in your account for sync. A progress bar shows on the card; you'll get an email when it completes.
For large accounts (thousands of customers) this runs in the background — you can keep using GrowPanel while it runs.
Auto-sync on changes
After the initial sync, GrowPanel automatically pushes updates to HubSpot whenever a customer's MRR or status changes (new subscription, plan upgrade, churn, etc.). Changes typically appear in HubSpot within a few minutes of the billing event.
What gets synced
Per customer, every sync does three things in order:
- Match — search HubSpot for a record matching the configured strategy (email / domain / external_customer_id)
- Push — write the configured
growpanel_*properties to the matched record (or create a new record ifcreateIfNoMatchis enabled and no match was found) - Pull — read the configured
importFieldsHubSpot properties back into the customer'scustom_variablesin GrowPanel
If Create record if no match found is unchecked and no match exists, the customer is skipped (counted as success — nothing failed, just nothing to do).
Disconnecting
Click the trash icon on the HubSpot card. GrowPanel revokes its OAuth token and stops syncing. The growpanel_* properties stay on your HubSpot records with their last-synced values — they're not deleted. To clean them up, delete them from HubSpot's properties settings.
Troubleshooting
"Properties are empty in HubSpot for most customers"
If the customer's GrowPanel data is empty (e.g., they're a lead with no paid_started date yet), the property is set to an empty value in HubSpot. This is intentional — it keeps the two systems consistent if a customer state changes.
"I can't see industry / employee count / founded year on company records"
These fields aren't filled in automatically by HubSpot unless you have Breeze Intelligence (paid HubSpot add-on) enabled. Without enrichment, those properties exist on the record but are empty. Once you enrich (manually per record, or via a workflow), the values flow into GrowPanel on the next sync.
"Email matching is putting many customers on the same HubSpot record"
When matching by email domain, customers sharing a domain (e.g., everyone at gmail.com) all match the same HubSpot company. This is expected behavior for B2C signups. Consider matching by GrowPanel customer ID instead if you want one HubSpot record per GrowPanel customer.
"Bulk sync stuck at X of Y"
If progress sits idle, check the Cloudflare Queues dashboard or contact support — some messages may have failed all retries and ended up in the dead-letter queue. Re-running the bulk sync will retry them.
API reference
See Settings API → HubSpot for the underlying REST endpoints, useful if you're scripting integration changes.