HubSpot uses URL parameters for tracking, attribution, and CRM integration. Understanding these URLs helps you connect marketing efforts to sales outcomes.
Key Takeaways
- 1HubSpot tracking code sets __hstc and hubspotutk cookies
- 2UTM parameters are captured and stored in contact records
- 3Form embed URLs include portal and form IDs
- 4CRM links use app.hubspot.com/contacts/{portal}/record
- 5API uses api.hubapi.com with portal-specific paths
“The HubSpot tracking code automatically captures page views and stores visitor information in cookies. UTM parameters are associated with contacts when they submit forms.”
Tracking Parameters
HubSpot captures UTM parameters from landing page visits and associates them with contacts when they submit forms. These parameters flow through your entire funnel, from first touch to closed deal, giving you complete attribution visibility.
| Parameter | Purpose | Storage |
|---|---|---|
| utm_source | Traffic source | Original source |
| utm_medium | Marketing medium | Original medium |
| utm_campaign | Campaign name | Original campaign |
| utm_content | Content variation | Original content |
| utm_term | Search terms | Original term |
| hsa_* | HubSpot Ads params | Ad campaign data |
Standard UTM parameters map directly to contact properties in HubSpot. The hsa_ prefixed parameters are specific to HubSpot's advertising integration, capturing ad platform data when visitors arrive from connected ad accounts like Google Ads or Facebook.
The HubSpot tracking script sets several cookies to identify visitors across sessions. These cookies enable attribution even when visitors return days later to convert, connecting their journey back to the original source.
Tracking Cookies & URLs
// HubSpot tracking script sets these cookies
// __hstc: Visitor tracking (visitor ID, timestamps)
// hubspotutk: Visitor token (unique ID)
// __hssc: Session tracking
// __hssrc: Session reset
// Get HubSpot user token for form submissions
function getHubspotUserToken() {
const cookies = document.cookie.split(';');
for (const cookie of cookies) {
const [name, value] = cookie.trim().split('=');
if (name === 'hubspotutk') {
return value;
}
}
return null;
}
// Include in form submissions
const formData = {
email: 'user@example.com',
hutk: getHubspotUserToken(),
pageUri: window.location.href,
pageName: document.title
};
// HubSpot tracking script URL
// //js.hs-scripts.com/{portal_id}.js
// Page view tracking is automatic
// Manual event tracking:
_hsq.push(['trackEvent', {
id: 'clicked-cta',
value: 'pricing-page'
}]);The code shows how to read the hubspotutk cookie and include it in form submissions for visitor identification. The _hsq array provides manual event tracking for custom interactions beyond standard page views. Always include pageUri and pageName to give context to each event in the contact timeline.
HubSpot forms can be embedded on any page using JavaScript or served directly via shareable URLs. The embed code connects forms to your HubSpot portal and handles submission tracking automatically.
Form Embed URLs
<!-- HubSpot Form Embed -->
<script charset="utf-8" type="text/javascript"
src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
hbspt.forms.create({
portalId: "123456",
formId: "abc123-def456-ghi789",
region: "na1", // Data center region
target: "#form-container",
onFormSubmit: function(form) {
// Track form submission
console.log('Form submitted');
}
});
</script>
<!-- Direct form URL -->
<!-- https://share.hsforms.com/1{formId} -->
<!-- https://share.hsforms.com/1abc123-def456-ghi789 -->
<!-- Form with pre-filled fields (URL params) -->
<!-- https://share.hsforms.com/1abc123?email=john@example.com&firstname=John -->
<!-- Embedded form iframe URL -->
<!-- https://forms.hsforms.com/embeddedform?portalId=123456&formId=abc123 -->The JavaScript embed gives you the most control with callbacks for form events. The direct URL format is useful for sharing forms externally or linking from places where JavaScript is not available. Notice how prefilled fields are passed as query parameters on the share URL.
Deep linking to CRM records is useful for integrations, notifications, and internal tools. HubSpot uses a consistent URL pattern that includes your portal ID and the object type identifier.
CRM Record URLs
# HubSpot CRM URL patterns
# Contact record
https://app.hubspot.com/contacts/{portal_id}/record/0-1/{contact_id}
# Company record
https://app.hubspot.com/contacts/{portal_id}/record/0-2/{company_id}
# Deal record
https://app.hubspot.com/contacts/{portal_id}/record/0-3/{deal_id}
# Ticket record
https://app.hubspot.com/contacts/{portal_id}/record/0-5/{ticket_id}
# Contact list view
https://app.hubspot.com/contacts/{portal_id}/objects/0-1/views/all/list
# Email in CRM
https://app.hubspot.com/email/{portal_id}/edit/{email_id}
# Landing page editor
https://app.hubspot.com/content/{portal_id}/landing-page/{page_id}/edit
# Workflow
https://app.hubspot.com/workflows/{portal_id}/flow/{workflow_id}/editThe object type identifiers (0-1 for contacts, 0-2 for companies, etc.) are internal HubSpot codes that appear in record URLs. When building integrations, store record IDs and construct URLs using these patterns to link users directly to relevant CRM records from your external systems.
The HubSpot API provides programmatic access to CRM data, forms, and marketing tools. All endpoints use the api.hubapi.com base URL with version prefixes for each API family.
API URL Patterns
// HubSpot API base URL
const baseUrl = 'https://api.hubapi.com';
// Common endpoints
const endpoints = {
// Contacts
contacts: '/crm/v3/objects/contacts',
contactById: '/crm/v3/objects/contacts/{contactId}',
contactSearch: '/crm/v3/objects/contacts/search',
// Companies
companies: '/crm/v3/objects/companies',
// Deals
deals: '/crm/v3/objects/deals',
// Forms
forms: '/marketing/v3/forms',
formSubmissions: '/form-integrations/v1/submissions/forms/{formId}'
};
// Example: Create contact
const response = await fetch(`${baseUrl}/crm/v3/objects/contacts`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
properties: {
email: 'user@example.com',
firstname: 'John',
lastname: 'Doe',
hs_lead_status: 'NEW'
}
})
});
// Form submission API
await fetch(`${baseUrl}/submissions/v3/integration/secure/submit/${portalId}/${formId}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fields: [
{ name: 'email', value: 'user@example.com' },
{ name: 'firstname', value: 'John' }
],
context: {
hutk: hubspotutk,
pageUri: window.location.href,
pageName: document.title
}
})
});The CRM API uses a consistent pattern where object types (contacts, companies, deals) share the same endpoint structure. Form submissions via API require the portal ID and form ID in the URL, plus context data that links the submission to tracking cookies for proper attribution.
Building properly tagged URLs for your HubSpot campaigns ensures attribution data flows correctly into contact records. While HubSpot's email tools add tracking automatically, you need to manually tag links in ads, social posts, and external content.
Tracking URL Builder
// Build HubSpot-compatible tracking URLs
function buildHubSpotTrackingUrl(baseUrl, params) {
const url = new URL(baseUrl);
// Standard UTM parameters
if (params.source) url.searchParams.set('utm_source', params.source);
if (params.medium) url.searchParams.set('utm_medium', params.medium);
if (params.campaign) url.searchParams.set('utm_campaign', params.campaign);
if (params.content) url.searchParams.set('utm_content', params.content);
if (params.term) url.searchParams.set('utm_term', params.term);
return url.toString();
}
// Email tracking link
const emailLink = buildHubSpotTrackingUrl('https://mysite.com/pricing', {
source: 'hubspot',
medium: 'email',
campaign: 'product_launch_2026',
content: 'pricing_cta'
});
// HubSpot captures these UTMs and stores them on the contact record:
// - Original Source (first touch)
// - Latest Source (last touch)
// - All source data in timeline
// For ads integration, HubSpot uses hsa_ parameters
// https://mysite.com/?hsa_acc=123&hsa_cam=456&hsa_grp=789&hsa_ad=012HubSpot stores both original (first touch) and latest (last touch) source data on contact records. This dual attribution model helps you understand both what brought someone to your site initially and what brought them back to convert. The hsa_ parameters populate automatically when you connect ad accounts in HubSpot.