# How to push UTM parameters to HubSpot

Map SourceLoop's UTM and source fields to HubSpot contact, company, and deal properties. Default mapping, custom properties, inbound vs outbound direction.

Source: https://sourceloop.ai/help/push-utms-to-hubspot/
Updated: 2026-05-28

---

By default, SourceLoop ships with a sensible mapping that writes UTM and source data to a set of `sourceloop_*` custom properties on the HubSpot contact. For most teams that's enough. For teams that already have their own UTM properties (or want SourceLoop's data to drive a HubSpot workflow that already exists), you can remap any field to any HubSpot property.

This article covers the field mapping system end to end, default mapping, customising it, contact vs company vs deal mappings, and direction.

## Before you start

You'll need:

- [HubSpot connected to SourceLoop](/help/connect-hubspot-to-sourceloop/) (the connection must show **Connected**)
- HubSpot **Super Admin** or **Account Access** (to create custom properties on HubSpot's side if you want SourceLoop to auto-create them)
- **Admin** or **Owner** role in SourceLoop

## The fields SourceLoop can push

SourceLoop tracks every visitor session across these dimensions. Any of them can be pushed to HubSpot:

**Contact identity:**
- Email, contact name, phone, company name, country, city, title, LinkedIn URL

**Attribution (per-touchpoint):**
- First-touch: source, medium, campaign, content, term, landing page, channel, keyword
- Last-touch (converting session): same set
- Multi-touch model output: configurable per workspace

**Lifecycle:**
- Lead status (raw and mapped, see [Map SourceLoop stages to HubSpot lifecycle stages](/help/map-hubspot-lifecycle-stages/))
- Lifecycle stage (raw and mapped)
- Lead score
- Qualified (true/false)

**Revenue:**
- Quote value (expected revenue from this lead)
- Sales value (realised revenue, when payment integrations are connected)

## The default mapping

When you connect HubSpot and enable outbound sync, SourceLoop ships these default mappings on the **contact** entity:

- `first_channel` → `sourceloop_first_channel`
- `first_source` → `sourceloop_first_source`
- `first_medium` → `sourceloop_first_medium`
- `first_campaign` → `sourceloop_first_campaign`
- `first_landing_page` → `sourceloop_first_landing_page`
- `latest_channel` → `sourceloop_latest_channel`
- `latest_source` → `sourceloop_latest_source`
- `latest_medium` → `sourceloop_latest_medium`
- `latest_campaign` → `sourceloop_latest_campaign`
- `latest_landing_page` → `sourceloop_latest_landing_page`
- `lead_status_raw` → `hs_lead_status`
- `lifecycle_stage_raw` → `lifecyclestage`

These custom properties are created in your HubSpot portal automatically the first time SourceLoop writes to them, you don't have to pre-create anything.

## Step 1: Open the HubSpot drawer

1. Sign in to [SourceLoop](https://app.sourceloop.ai/).
2. Open **Setup -> CRM -> HubSpot**. The drawer opens with the connection status at the top and several stacked sections: **Lead status mapping**, **Lifecycle stage mapping**, **Deal stages**, and **Field mappings**.

![SourceLoop HubSpot drawer showing sync toggles, lead status mapping, lifecycle stage mapping, deal stages, and field mappings sections](/help/screenshots/sourceloop-hubspot-field-mapping.webp)

3. Scroll down to the **Field mappings** section. It lists the entities you can map (Contacts, Companies, Deals) each with its own **Edit** button.
4. Click **Edit** next to **Contacts** (or **Companies** / **Deals** depending on which entity you're mapping).

## Step 2: Add a custom mapping

1. Click **Add mapping**.
2. Pick the **entity type**:
   - **Contact** (most common)
   - **Company** (account-level attribution; SourceLoop aggregates from the company's contacts)
   - **Deal** (closed-won attribution; sourced from the contact that opened the deal)
3. Pick the **SourceLoop field** (left dropdown), e.g., `first_campaign`.
4. Pick the **HubSpot property** (right dropdown), e.g., `original_utm_campaign` (your existing property) or type a new property API name.
5. Pick the **direction**:
   - **Outbound** (SourceLoop → HubSpot) — for fields you want SourceLoop to own.
   - **Inbound** (HubSpot → SourceLoop) — for HubSpot data you want SourceLoop to import (e.g., HubSpot's own deal stage, owner, deal amount).
   - **Bidirectional** — both ways; the most-recent value wins.
6. Click **Save**.

The new mapping takes effect on the next sync cycle (within 15 minutes).

## Step 3: Verify the mapping is working

1. Wait for one full sync cycle (~15 minutes) after a new conversion happens.
2. Open the contact in HubSpot.
3. Check the properties you mapped, the values should match what's on the contact in SourceLoop's Contacts Hub.

If a property isn't getting written, see the troubleshooting checklist in [Troubleshoot HubSpot sync issues](/help/troubleshoot-hubspot-sync/).

## When to map to your own properties vs SourceLoop's defaults

A simple rule of thumb:

- **Map to SourceLoop defaults** when HubSpot is your CRM but you don't have UTM workflows already wired to other properties. The `sourceloop_*` properties keep the marketing data cleanly namespaced.
- **Map to your own properties** when you've already built HubSpot workflows, lists, or reports against your own UTM fields (e.g., `original_utm_source`, `latest_utm_source`). Pointing SourceLoop at those fields means your existing automation just works.

If you're not sure, start with the defaults. You can always add custom mappings later without breaking anything.

## Company and deal mappings

Most teams stop at contact-level mappings. Two cases where company / deal mappings are useful:

- **B2B with account-based reporting** — push first-touch source to the company record so your sales reports group by source at the account level (e.g., "all leads from this account came in via LinkedIn organic").
- **Closed-won attribution** — push the original contact's first-touch source to the deal record so HubSpot's revenue reports can group by source.

Both use the same mapping flow, just pick the entity type accordingly.

## What's next

Once your contact properties are flowing, the natural next step is mapping lifecycle stages and lead status so SourceLoop's internal pipeline aligns with HubSpot's. See [Map SourceLoop stages to HubSpot lifecycle stages](/help/map-hubspot-lifecycle-stages/).

## Frequently Asked Questions

### Do I need to create custom properties in HubSpot first?

No. When SourceLoop's default mapping is enabled, it creates the required custom properties (`sourceloop_first_source`, `sourceloop_last_source`, the UTM properties, etc.) automatically the first time it tries to write them. If you'd rather map to your own existing properties, add the mapping manually in the Field Mapping tab and skip the auto-create.

### Can I push UTMs to the company record, not just the contact?

Yes. Entity type 'company' is supported. Add a mapping with the entity set to 'company' and pick a HubSpot company property as the target. SourceLoop writes the company-level UTMs (aggregated from the company's contacts) on the next sync.

### Can I map the same SourceLoop field to two HubSpot properties?

Yes. Add two mappings, same internal field, two different external fields. SourceLoop writes both on every sync.

### What's the difference between `first_campaign` and `latest_campaign` in the SourceLoop side?

The `first_campaign` field is the UTM campaign of the visitor's very first session with you (first touch). The `latest_campaign` field is the UTM campaign of the session in which they actually converted (last touch, or "converting session"). Both are useful, last touch closes the deal, first touch shows what initially drove discovery.

### Can I prevent SourceLoop from overwriting a HubSpot property after the initial set?

Yes. Set the field mapping's direction to **outbound only** and set the property's "write mode" to **on create**. SourceLoop populates it only on the first sync for that contact, then leaves it alone.

### What if my HubSpot custom property has a different label than the API name?

SourceLoop's Field Mapping panel shows both the label and the API name. Map against the API name, which is what HubSpot actually uses to identify the property. Labels can change without breaking the mapping.
