All articles
For HubSpot operators8 min read

The CSV import is the easy part. The real work comes after.

Three failures after the import, and how to fix them in pure HubSpot: lifecycle, attribution, dedup. Copy-paste checklist and workflow.

Between the first imports we helped with and the RevOps friends we trade notes with, we have seen enough CSVs go through HubSpot to know one thing: nobody is proud of those imports. The wizard looks like it does everything. Three days later, the funnel report means nothing.

The problem is never the import itself. It is what HubSpot does automatically right after, behind your back. Here are the three exact failures, and how to fix them with no third-party tool, in pure HubSpot.

The gist in 30 seconds
  • Three failures after the CSV: lifecycle stage soup, lost attribution, domain-vs-email dedup. All fixable in pure HubSpot.
  • Never map the lifecycle column on import. HubSpot will not downgrade a stage by workflow: let your scoring decide afterwards.
  • Original Source (level 1) is read-only. Backfill Drill-Down 1 and 2 by workflow to save campaign reporting.
  • The import checklist, the 4 custom properties and the backfill workflow are below, copyable.

Failure 1: lifecycle stage soup

On import, HubSpot pushes everyone to "Lead". Half your file may already have been "Marketing Qualified" in your base. The trap: HubSpot never downgrades a lifecycle stage by automation. Once downgraded by hand or by import, the contact stays stuck lower in the funnel.

The damage is silent: by Wednesday, your funnel report shows an MQL drop nobody caused. It is not a sales dip, it is an import artifact.

An import must never write the lifecycle stage. It should only set a source, and let your scoring decide the stage.
The lifecycle rule we wish we had known earlier

The fix is one line: do not map the lifecycle column during the wizard. Let new contacts arrive with no stage, and let your existing scoring workflow qualify them after. Your old contacts keep their stage, your new ones enter clean.

Failure 2: attribution drifting to "Offline Sources"

More than one RevOps lead has told us the same story: a few thousand prospects land in HubSpot, "Original Source" stays empty, and the weekly report attributes a healthy share of new leads to "Offline Sources", HubSpot's polite way of saying "no idea".

The point everyone learns too late: the level-1 Original Source field is read-only. You cannot rewrite it, not even by workflow. But Drill-Down 1 and 2 are editable. That is exactly where you recover attribution.

The method: import a hardcoded "source" column, then a workflow copies that value into Original Source Drill-Down 1. Campaign reporting becomes accurate again, with no afternoon of manual backfill. The exact workflow is below.

Failure 3: domain-level vs email-level dedup

The import wizard dedupes contacts on email, and companies on the company domain name. Two different keys, two different logics.

If your CSV mixes contact rows and company rows without a clean domain column, you create three "Dr. Martin's Practice" entries in your companies table while the contacts dedupe fine. Nobody notices until account-based reports go wrong.

The reflex that avoids 90% of duplicates
Before importing, make sure every row carries a normalized domain column (no full URL, no "www", just "example.com"). Check the Company object and the Contact object in the same associated import. HubSpot then merges correctly on both sides.

The full method, in five steps

Run these five steps in this order. They fix the three failures at once, and they stay entirely inside standard HubSpot.

1
Step 1
Prepare the CSV

One row per contact, a normalized domain column, a hardcoded source column. Cleaning happens in the spreadsheet, not in HubSpot.

2
Step 2
Create the 4 custom properties first

Score, campaign, keyword, delivered date. Created BEFORE the import, or you cannot map them in the wizard.

3
Step 3
Import without touching lifecycle

Contact + Company objects checked. Do not map the lifecycle column. Check "do not update existing contacts".

4
Step 4
Backfill attribution by workflow

A workflow copies your source column into Original Source Drill-Down 1. Level 1 stays read-only, the Drill-Down is enough.

5
Step 5
Verify before you prospect

Active list on the import source, check the duplicate counter, spot-check 5 company records. Only then do you send.

The import checklist to copy

Paste it next to the import wizard. Every checked box is a failure avoided. This is the same document we re-read before every large import.

Checklist - clean HubSpot CSV import
BEFORE THE IMPORT
[ ] Clean the CSV: one row = one contact, "domain" column present
[ ] Add a hardcoded "source" column (e.g. "AutoLeads - Lyon dentists")
[ ] Decide dedup key: email for contacts, domain for companies
[ ] Create the 4 custom properties (see below) BEFORE mapping

DURING THE WIZARD
[ ] Contact AND Company objects both checked (associated import)
[ ] Do NOT let lifecycle stage map to "Lead" by default
[ ] Map the "source" column to Original Source Drill-Down 1
[ ] Check "do not update existing contacts"

AFTER THE IMPORT
[ ] Create an active list filtered on "Import source = this file"
[ ] Check the skipped-duplicates counter in the import history
[ ] Run the Original Source backfill workflow on that list
[ ] Spot-check 5 random company records: no duplicate domain

The 4 custom properties to create before importing

Create these four properties in Settings, Properties before launching the wizard. They make the imported list usable from day one: branch sequences on the score, keep attribution clean, report by vertical, analyze close rate by cohort.

4 HubSpot custom properties
# Property 1 - Quality score (object: Contact)
Internal name: lead_quality_score
Type: Number
Use: branch workflows (score >= 70 -> direct sequence)

# Property 2 - Source campaign (object: Contact)
Internal name: import_campaign
Type: Single-line text
Use: Original Source Drill-Down 1, per-campaign reporting

# Property 3 - Keyword / vertical (object: Contact or Company)
Internal name: import_keyword
Type: Single-line text
Use: per-vertical reporting, list filtering

# Property 4 - Delivered date (object: Contact)
Internal name: delivered_at
Type: Date picker
Use: weekly cohorts, close rate per batch

The Original Source backfill workflow

Recreate this workflow in HubSpot (paid tier required). It never writes level-1 Original Source (impossible), it sets the Drill-Downs that actually feed your campaign reports.

HubSpot workflow - attribution backfill
HubSpot workflow - Original Source backfill
Type: Contact-based, re-enrollment OFF

Trigger (enrollment):
  Original Source  is any of  "Offline Sources"
  AND  import_campaign  is known

Action 1:
  Set property value
  Property: Original Source Drill-Down 1
  Value: copy from "import_campaign"

Action 2:
  Set property value
  Property: Original Source Drill-Down 2
  Value: "CSV import" (static)

Note: Original Source (level 1) is NOT editable by workflow.
Setting Drill-Down 1 and 2 is enough to save campaign reporting.

Manual CSV or API push: the honest comparison

The CSV import is not bad. For a single, well-cleaned file imported once, it is perfect and free. API push only earns its keep if you import often, or across several portals. The real trade-off:

Cost
CSV import (manual) ·Free, native HubSpot
API push (recurring) ·Needs a tool or code that talks to the API
Attribution
CSV import (manual) ·Backfill by workflow after the fact (method above)
API push (recurring) ·Drill-Down set at creation, nothing to backfill
Repeated imports
CSV import (manual) ·Deleted rows come back, re-dedupe by hand
API push (recurring) ·Idempotent by domain key, no resurrection
When to choose it
CSV import (manual) ·One-off, clean file, single run
API push (recurring) ·Regular flow, multiple sources or portals
Most teams do not need the API
If you import one or two files a month, the checklist and workflow above are enough, do not stand up an API integration for that. The API only pays off past a weekly import, or when several people import without coordinating.

Where AutoLeads fits

Everything above works without us: the checklist, the properties, the backfill workflow are standard HubSpot. AutoLeads only comes in if you are on the "recurring API push" side of the table: we push each lead through the official API, Company then Contact then association, with Original Source Drill-Down and the 4 properties already set at creation. No backfill, no duplicate company, and existing contacts are never overwritten. If you import one CSV a month, keep the manual method, it is fine.

See for yourself
Don't take our word for it

Run a search on your own niche with your free week, no card required. Worst case, you lose ten minutes.

If you remember one thing: the wizard is not the end of the import, it is the start. Lifecycle, attribution and dedup are fixed after, and you can do it today, in pure HubSpot.

Frequently asked questions

Why do my imported contacts all revert to "Lead"?

Because lifecycle stage defaults to "Lead" on import, and HubSpot refuses to downgrade a stage by automation. A contact that was already "Marketing Qualified" and got downgraded by the import will not climb back on its own. The fix: do not map the lifecycle column on import, let your scoring workflow decide afterwards.

Can you edit the Original Source field in HubSpot?

Not the level-1 Original Source field: it is read-only and locked at contact creation. But Original Source Drill-Down 1 and 2 are editable by workflow. That is where you backfill the campaign name to save reporting.

Does HubSpot dedupe on email or on domain?

The import wizard dedupes contacts on email address (or record ID). Companies dedupe on domain name. If your CSV mixes contact rows and company rows without a clean domain, you create duplicate companies without noticing.

Do these fixes work with free HubSpot?

Custom properties and manual dedup work on free HubSpot. The Original Source backfill workflow needs a paid Marketing or Sales tier (workflows are not in free). On free, backfill with an update-by-import instead.

Is cold email to an imported list legal in France?

In B2B, email prospecting is allowed without prior consent if the subject relates to the recipient's professional role, with a clear opt-out. See the CNIL guidelines on commercial prospecting. In B2C, consent is required.

Book a demo