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.
- 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 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 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.
One row per contact, a normalized domain column, a hardcoded source column. Cleaning happens in the spreadsheet, not in HubSpot.
Score, campaign, keyword, delivered date. Created BEFORE the import, or you cannot map them in the wizard.
Contact + Company objects checked. Do not map the lifecycle column. Check "do not update existing contacts".
A workflow copies your source column into Original Source Drill-Down 1. Level 1 stays read-only, the Drill-Down is enough.
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.
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 domainThe 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.
# 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 batchThe 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 - 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:
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.
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.