# How to map HubSpot lifecycle stages and lead status

Translate SourceLoop's internal lifecycle stages into HubSpot's lifecyclestage and hs_lead_status properties. Custom stages supported.

Source: https://sourceloop.ai/help/map-hubspot-lifecycle-stages/
Updated: 2026-05-28

---

SourceLoop tracks visitors through internal lifecycle stages (New, Contacted, In Progress, Converted, Lost by default, plus any custom stages you add). HubSpot has its own vocabulary: the `lifecyclestage` property with 8 default values (subscriber, lead, marketingqualifiedlead, salesqualifiedlead, opportunity, customer, evangelist, other) plus `hs_lead_status` for finer-grained status inside the lead stages.

This article walks through mapping the two together, both directions, so SourceLoop dashboards show your real funnel and HubSpot contacts show SourceLoop's stage as a property your reps can filter on.

## Before you start

You'll need:

- [HubSpot connected to SourceLoop](/help/connect-hubspot-to-sourceloop/)
- **Admin** or **Owner** role in SourceLoop
- A clear list of what your HubSpot lifecycle stages are (the standard 8, plus any custom ones you've added if you're on Pro+)

## How the mapping works

The mapping is **per-connection** (one HubSpot account ↔ one set of mappings) and **bidirectional**:

- **Inbound** (HubSpot → SourceLoop): when SourceLoop pulls a contact from HubSpot, it reads the `lifecyclestage` value (e.g., `salesqualifiedlead`) and translates it to the matching SourceLoop stage (e.g., `In Progress`). The mapped stage drives funnel dashboards in SourceLoop.
- **Outbound** (SourceLoop → HubSpot): when a SourceLoop contact's stage changes (e.g., from `New` to `Converted` based on a Stripe charge), the mapping translates back to the HubSpot value (`customer`) and updates the contact property on HubSpot's side.

Lead status maps the same way, just against `hs_lead_status` instead of `lifecyclestage`.

## 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, sync toggles, and two stacked sections relevant here: **Lead status mapping** and **Lifecycle stage mapping** (plus **Deal stages** and **Field mappings** below).

![SourceLoop HubSpot drawer showing the Lead status mapping (with New mapped) and Lifecycle stage mapping (with Subscriber) sections, each with an Edit button](/help/screenshots/sourceloop-hubspot-field-mapping.webp)

3. Each mapping section has its own **Edit** button on the right. Click **Edit** next to the section you want to configure.

## Step 2: Map HubSpot lifecycle stages to SourceLoop stages

1. Find each HubSpot lifecycle stage value in the left column. The defaults are:
   - `subscriber` — someone who opted in but hasn't engaged
   - `lead` — captured email
   - `marketingqualifiedlead` — engaged enough for marketing to consider qualified
   - `salesqualifiedlead` — handed off to sales
   - `opportunity` — open deal
   - `customer` — closed-won
   - `evangelist` — vocal advocate
   - `other` — fallback bucket
2. For each, pick the **matching SourceLoop stage** in the right-column dropdown.
3. A sensible default mapping:
   - `subscriber` → New
   - `lead` → Contacted
   - `marketingqualifiedlead` → In Progress
   - `salesqualifiedlead` → In Progress
   - `opportunity` → In Progress
   - `customer` → Converted
   - `evangelist` → Converted
   - `other` → (leave unmapped)
4. Click **Save**.

If you've added custom lifecycle stages in HubSpot, they'll appear in the left column too. Map them to SourceLoop stages the same way.

## Step 3: Map HubSpot lead status to SourceLoop stages

`hs_lead_status` is a finer-grained sub-status used while a contact is in the lead or SQL lifecycle stage. HubSpot's default values:

- `NEW`
- `OPEN`
- `IN_PROGRESS`
- `OPEN_DEAL`
- `UNQUALIFIED`
- `CONNECTED`
- `BAD_TIMING`

Map each one to a SourceLoop stage. A typical mapping:

- `NEW` → New
- `OPEN` → Contacted
- `IN_PROGRESS` → In Progress
- `OPEN_DEAL` → In Progress
- `CONNECTED` → In Progress
- `UNQUALIFIED` → Lost
- `BAD_TIMING` → Lost

Click **Save**.

## Step 4: Verify the mapping is taking effect

1. Wait 15 minutes for the next delta sync, or click **Resync now** on the HubSpot card.
2. Open a contact in SourceLoop's Contacts Hub. Its **Lifecycle stage** column should reflect the HubSpot value (translated to your SourceLoop stage).
3. Open the same contact in HubSpot. The `lifecyclestage` and `hs_lead_status` properties should show the values SourceLoop pushed.

If a contact shows blank, see the troubleshooting article: [Troubleshoot HubSpot sync issues](/help/troubleshoot-hubspot-sync/).

## Custom SourceLoop stages

The five default SourceLoop stages (New, Contacted, In Progress, Converted, Lost) cover most teams. If your funnel is more complex, you can add custom stages, for example, `Proposal`, `Negotiation`, `On hold`.

1. In SourceLoop, open **Settings -> Lifecycle stages**.
2. Click **Add stage**.
3. Name the stage and (optionally) mark it as "won" or "lost" for funnel reporting.
4. Save.

The new stage appears in the dropdown on the HubSpot Stage Mapping panel. Map a HubSpot value to it (you may need a custom HubSpot lifecycle stage to map from for full round-trip support).

## What about deals?

HubSpot deals have a different stage system (`dealstage`) scoped to deal pipelines. SourceLoop handles deal stages separately, on the inbound sync, deal pipelines and stages are pulled into SourceLoop's own pipeline tables for reporting. The Stage Mapping tab above is for **contact lifecycle**, not deal stages.

If you want deal pipeline reporting in SourceLoop dashboards, just make sure inbound sync is enabled. Pipelines and stages flow in automatically; no per-pipeline mapping is needed because SourceLoop preserves your HubSpot pipeline structure as-is.

## What's next

If sync is working but a specific contact isn't getting the mapped stage, the troubleshooting article walks through the common causes: [Troubleshoot HubSpot sync issues](/help/troubleshoot-hubspot-sync/).

## Frequently Asked Questions

### What's the difference between HubSpot's lifecycle stage and lead status?

HubSpot's lifecycle stage is the broad funnel position (subscriber, lead, marketing qualified lead, sales qualified lead, opportunity, customer, evangelist, other). Lead status (`hs_lead_status`) is a finer-grained sub-status within the lead / SQL stages (New, Open, In Progress, Open Deal, Unqualified, Connected, Bad Timing). SourceLoop maps to both, but they're independent.

### Do I need HubSpot Sales Hub or Marketing Hub for lifecycle stages to work?

No. Lifecycle stage is a standard property on every HubSpot account, including Free. HubSpot Sales Hub adds automation around stage transitions but the property itself works on every tier.

### Can I add custom lifecycle stages in HubSpot and map them?

Yes. HubSpot lifecycle stages can be customised on Pro+ tiers. Add your custom stages in HubSpot first, then they'll appear in SourceLoop's stage-mapping dropdown the next time it syncs your HubSpot property schema.

### SourceLoop's internal stages are different from mine. Can I rename them?

Yes. The five default SourceLoop stages (New, Contacted, In Progress, Converted, Lost) can be renamed and you can add custom ones. The mapping to HubSpot is per-connection, so renaming on SourceLoop's side doesn't break the mapping.

### What happens if SourceLoop sees a HubSpot stage I haven't mapped?

The raw HubSpot value is preserved on the contact in SourceLoop's `lifecycle_stage_raw` field, but the contact's mapped `lifecycle_stage_id` stays NULL. You can map it later, and the next sync will pick up the mapping retroactively for all existing contacts in that stage.

### Does the mapping run on every sync or just on connect?

Every sync. Each delta sync (every 15 minutes) re-applies the mapping for any contacts whose stage changed in HubSpot since the last run. So changes to the mapping take effect immediately, no full re-import needed.
