HubSpot Destination
Overview
The HubSpot destination writes evaluation results to your HubSpot Contact and Company objects. TrailSpark maps scores, reasoning, and evaluation dates to custom properties you define in HubSpot, and optionally pushes buying-group coverage and role data when you enable that section.
Prerequisites
- HubSpot integration connected (Settings > CRM Integration > Connect tab)
- Custom properties created in HubSpot for TrailSpark data
- Admin or Owner role in TrailSpark
- HubSpot admin access to create properties
Custom Properties in HubSpot
Create these custom properties on the Contact object:
| Property Label | Suggested Internal Name | Field Type |
|---|---|---|
| TrailSpark Score | trailspark_score | Single-line text (values: hot, warm, cold) |
| TrailSpark Evaluation Date | trailspark_evaluation_date | Date picker |
| TrailSpark Reasoning | trailspark_reasoning | Multi-line text |
For company propensity, create on the Company object:
| Property Label | Suggested Internal Name | Field Type |
|---|---|---|
| TrailSpark Propensity | trailspark_propensity | Single-line text (values: high_propensity, medium_propensity, low_propensity) |
| TrailSpark ICP | trailspark_icp | Single-line text (the ICP name the account was scored against) |
| TrailSpark Score status | trailspark_score_status | Single-line text (values: current, retired, not_evaluated) |
| TrailSpark AI Reasoning | trailspark_account_reasoning | Multi-line text (see the warning below) |
If you also want the ICP or Score status on the Contact, create matching Single-line text properties (for example trailspark_icp and trailspark_score_status) on the Contact object.
Buying-group properties are documented below — add them only if you plan to use that feature.
Create a "TrailSpark" property group in HubSpot to keep all TrailSpark properties organized together.
Configuration
Go to Settings > CRM Integration > Destinations tab.
Destination Settings
- Send Evaluations to HubSpot -- Toggle to enable/disable the destination
- HubSpot Integration -- Select which connected HubSpot instance to use
- Create Records if Not Found -- When enabled, creates new Contact records if no match exists. Filter by score level (Hot, Warm, Cold)
Contact Field Mapping
Map three required fields to HubSpot Contact properties:
| UI Label | Description |
|---|---|
| Score Field | Where the evaluation score is stored |
| Evaluation Date Field | Where the evaluation timestamp is stored |
| Reasoning Field | Where the AI reasoning is stored |
| ICP | Where the name of the ICP the contact was scored against is stored (optional) |
| Score status | Where the account's score status (current, retired, or not evaluated) is stored (optional) |
TrailSpark loads your HubSpot property metadata automatically. Select properties from the dropdown. If a previously mapped property no longer exists in HubSpot, the field resets to blank.
Company Propensity Score
The propensity score card configures where account-level propensity (high/medium/low) is written:
- Company Propensity Field (primary) -- Written to the Company object when a linked Company exists
- Contact Propensity Field (fallback) -- Written to the Contact object when no Company is linked
Both fields are optional.
ICP
The ICP card configures where the name of the ICP each account was scored against is written on the Company. It travels on the same account-level sync as the propensity score, so a CRM automation can branch on which ICP produced a score (for example, route Trial-ICP hot accounts to Customer Success and Acquisition-ICP hot accounts to Sales). The field is optional. When an account was scored without a specific ICP, nothing is written.
AI reasoning
The AI reasoning card configures where each account's plain-language explanation is written on the Company — the same narrative you see on the account in TrailSpark and in Slack alerts. It travels on the same account-level sync as the propensity score and always describes that score, so the two can never disagree.
Map it when you want reps to read why an account is hot without leaving HubSpot — on the Company record, in an account view, in a report, or in a meeting sidebar. This is separate from the Contact-level Reasoning Field, which explains an individual person's score; map either, both, or neither.
Use a Multi-line text property. HubSpot updates a record in a single write, so a property that is too small to hold the explanation rejects the whole update — the propensity score and buying-group fields included, not just the reasoning. A Single-line text property is not large enough.
The field is optional. When an account's evaluation has no explanation, nothing is written — your existing property value is left untouched rather than blanked. When an account's score is retired, the last explanation stays in place and Score status flips to retired.
Score status
The Score status card configures where each account's score status is written on the Company (and, on the Contact tab, on the Contact). It travels on the same sync as the propensity score and takes one of three values:
- current -- the pushed propensity score reflects the account's live standing.
- retired -- the account no longer matches the ICP it was scored against, so its last pushed score is stale and should no longer be trusted.
- not_evaluated -- the account has no evaluation yet.
When an account leaves the ICP it was scored against, TrailSpark promptly updates this field to retired in HubSpot (for destinations that map it) — you don't have to wait for the account's next sync. Without the field, a retired account simply stops receiving score updates and its last pushed score silently goes stale, so a CRM automation cannot tell a fresh score from a stale one. Map it to let automations suppress or flag scores that are no longer current. The field is optional; unmapped, nothing is written.
Enrichment Fields
The Enrichment Fields card writes data from your connected enrichment providers (for example Clay or Reo.dev) into HubSpot Company fields you choose. All fields are optional and only write when you map them.
| UI Label | Written to | What it contains |
|---|---|---|
| Industry | Company | Industry, from your enrichment provider(s) |
| Employee Count | Company | Employee count, from your enrichment provider(s) |
| Region | Company | Geographic region, from your enrichment provider(s) |
| Market Segment | Company | Market segment, from your enrichment provider(s) |
| Website Domain | Company | Website domain, from your enrichment provider(s) |
TrailSpark writes only enrichment-provider data into these fields -- never your HubSpot Company's own value, and never a blend of the two. A mapped field is left blank when there is no matched enrichment value; it is not filled from HubSpot.
This writes on the same account-level sync that pushes propensity and buying-group coverage, for accounts linked to a HubSpot Company record.
Custom enrichment fields
If your enrichment provider sends fields beyond the standard five and you've turned them on under Enriched fields (see Enrichment Rules & Budget Caps), each active field gets its own extra row on this card, using the label you gave it. Map it to a HubSpot Company property the same way as the standard fields. Turning a field off later doesn't remove an existing mapping -- the row is kept and marked "No longer active," and it stops writing until the field is reactivated.
Buying Group Fields
Enable the Push buying-group fields toggle to push coverage and role data alongside evaluation scores. All fields in this section are optional — they write only when you map them.
Contact properties
| UI Label | Written to | What it contains |
|---|---|---|
| Buying-group roles | Contact | The contact's assigned role names, semicolon-separated |
| CRM Role Source Field | Read from Contact | TrailSpark reads this field from your HubSpot contacts. Set it to a field where you've recorded a role; TrailSpark uses it as the authoritative assignment. |
Account properties (company-level)
| UI Label | Written to | What it contains |
|---|---|---|
| Buying-group stage | Company | Dormant, Forming, or Complete |
| Engagement completeness (%) | Company | Share of required roles with an actively engaged person |
| Known completeness (%) | Company | Share of required roles with any person assigned |
| People still needed | Company | Count of additional people needed to complete the group |
| Missing roles | Company | Role names not yet filled (semicolon-separated) |
| Engaged roles | Company | Role names currently active (semicolon-separated) |
| Propensity as-of date | Company | Date the propensity score was last evaluated |
| At-risk status | Company | "At Risk" when high propensity meets stalled engagement; otherwise "Current" |
| Renewal health | Company | Health signal for renewal-ICP accounts: Healthy, Cooling, Fading, Cold, or Pending |
For what these values mean, see Account coverage.
You do not need to map every buying-group property. Map only the ones you plan to act on in HubSpot workflows or lists.
Troubleshooting
| Issue | Resolution |
|---|---|
| Property not in dropdown | Verify the property exists on the Contact object and the internal name is correct |
| Data not writing | Check that the destination is enabled and integration is still connected |
| Contact not found | TrailSpark matches by email address -- ensure the contact exists in HubSpot |
| Buying-group fields not writing | Confirm the "Push buying-group fields" toggle is on and the property is mapped |
Next Steps
- Salesforce Destination
- Airtable Destination
- Account coverage -- Understand the values being pushed
