Navigated to blog › hubspot-csv-import-contact-properties
Back to Blog
crm-import-guides

HubSpot CSV Import: Fix Contact Properties, Lifecycle Stages, and Owner Errors

March 19, 2026
13
By SplitForge Team

HubSpot Contact Import — Quick Reference:

  • Lifecycle stage: must match internal value (lead) OR English label (Lead) — nothing else
  • Owner: must be an active HubSpot portal user email — display names not accepted
  • Enumeration properties: same internal value / English label rule applies to all dropdown properties
  • Duplicates: HubSpot updates existing contact on email match — no duplicate created
  • List enrollment: importing to a list doesn't automatically enroll contacts — active list criteria must be met
  • Error file: Settings → Imports → hover import → Download Error File

Quick Answer

HubSpot contact imports fail on three issues more than anything else: lifecycle stage values that don't match HubSpot's internal value or English label exactly, owner emails that don't correspond to an active portal user, and enumeration (dropdown) property values that aren't in the property's option list.

Why it matters: HubSpot's lifecycle stage validation is stricter than most CRMs and trips up teams migrating from other platforms — values like "MQL," "Prospect," or "Qualified Lead" are not HubSpot lifecycle stages and will fail silently.

The fix: Export HubSpot's property option lists from Settings → Properties before building your import file. Match owner emails against your portal user list. Accept that HubSpot's lifecycle stages are a fixed set — you cannot import custom lifecycle stage names.

Root cause: HubSpot validates enumeration properties against a closed option list. For default properties like Lifecycle Stage, the list is fixed by HubSpot and cannot be changed. For custom properties, the list is what you defined when creating the property.


What HubSpot's Error Messages Actually Mean

"The value '[X]' is not a valid option for the property '[Y]'. Valid options are: [list]" — An enumeration property (dropdown, radio, checkbox) received a value that doesn't match any option. For Lifecycle Stage this is extremely common because teams use non-HubSpot names (MQL, SQL, Prospect) that don't exist in HubSpot's default option set.

"The owner '[email]' does not exist in your portal" — The owner column contains an email address that is not an active HubSpot user. Former employees, typos, or role-based emails all cause this.

"[X] contacts could not be imported" — Generic import failure. Download the error file (Settings → Imports → hover import → Download Error File) to see per-row failures with specific reasons.

"[X] contacts were updated" — Informational. HubSpot found existing contacts with matching emails and updated them. Not an error — verify the updates are correct.

"File must be a .csv file" — Wrong file type. Excel .xlsx files are not accepted. Save as CSV before importing.


Fast Fix (90 Seconds)

⏱ Expected time by error type:

  • Lifecycle stage fix: 5 minutes (replace values with HubSpot's exact terms)
  • Owner email fix: 10–15 minutes (export active users, VLOOKUP)
  • Enumeration property fix: 10 minutes (export property options from Settings → Properties)
  • Duplicate handling review: 5 minutes
  • Error file analysis: 5–10 minutes

If your HubSpot import just failed:

  1. Go to Settings → Imports — find your import, hover over it, click "Download Error File"
  2. Open the error file — it shows exactly which rows failed and why
  3. Group errors by type — sort by the Error column to batch identical fixes
  4. Fix the source file — apply changes per the fixes below
  5. Validate locally before re-importing — run through Data Validator to catch remaining issues without uploading your contact list to another server

🚨 Import Success ≠ Correct Data in HubSpot

Before anything else — the most important fact about HubSpot imports:

HubSpot reports "X contacts imported successfully" even when:
- Lifecycle Stage is blank (value didn't match — field was dropped)
- Owner assignment failed (contact has no owner — no error shown)
- Custom properties are blank (column header didn't map — field was dropped)

The import summary counts rows processed, not rows correct.
A "successful" import with 4,000 blank lifecycle stage fields
is not a successful import — it's a data quality crisis.

Always verify field values on sample records after import.
Always download the error file even after a "successful" run.

🛑 Do NOT import until you've confirmed:

  1. Lifecycle stage values are mapped — if your source CRM uses "MQL," "SQL," or "Prospect," you must translate them to HubSpot's terms before the import file is built. Importing unmapped values creates blank lifecycle stage fields across every affected contact.
  2. You understand overwrite behavior — HubSpot updates existing contacts on email match. If your import file has a different lifecycle stage than the contact currently holds, the import overwrites it. This cannot be undone automatically.
  3. You've backed up lifecycle stage data — export your current contacts with lifecycle stage before importing. If the import corrupts data, you need this to restore.

If you're unsure about any of the above: stop here, read Fix 1 and Fix 5 completely, then come back.

TL;DR: HubSpot import failures concentrate around lifecycle stage values (must be internal value or English label), owner email mismatches, and enumeration property format. Download the error file from Settings → Imports for per-row detail. Use Data Validator — contact data never leaves your browser.


HubSpot Lifecycle Stage — Full Reference Table

Every accepted value for Lifecycle Stage import. Bookmark this.

Lifecycle StageInternal ValueEnglish Label❌ Common Wrong Values
SubscribersubscriberSubscriber"Prospect", "New"
LeadleadLead"MQL", "LEAD", "new lead"
Marketing Qualified LeadmarketingqualifiedleadMarketing Qualified Lead"MQL", "Marketing Qualified"
Sales Qualified LeadsalesqualifiedleadSales Qualified Lead"SQL", "Sales Qualified"
OpportunityopportunityOpportunity"Deal", "Pipeline"
CustomercustomerCustomer"Closed Won", "Active"
EvangelistevangelistEvangelist"Champion", "Advocate"
OtherotherOther"Churned", "Lost", "Inactive"

Import accepts: internal value (lowercase, no spaces) OR English label (exact capitalization shown above). Nothing else.

Note: HubSpot's Lifecycle Stage is a fixed system property. You cannot add custom values. If your old CRM used "Churned" or "Cold Lead," map them to the closest HubSpot stage before import.


You're migrating 15,000 contacts from your old CRM to HubSpot. The import runs. Summary says: 8,432 created, 2,104 updated, 4,464 failed. No explanation in the success screen.

You download the error file. Almost every failure has the same message: "The value 'MQL' is not a valid option for the property 'Lifecycle Stage'. Valid options are: subscriber, lead, marketingqualifiedlead, salesqualifiedlead, opportunity, customer, evangelist, other."

Your old CRM used "MQL." HubSpot doesn't. Neither does it use "SQL," "Prospect," "Qualified Lead," or any other industry-standard term. HubSpot's lifecycle stage is a fixed property with fixed internal names that don't match what anyone else calls them.

This guide covers that failure and every other HubSpot contact import error. Property validation behavior verified against HubSpot Knowledge Base documentation, March 2026.


Table of Contents


Fix 1: Lifecycle Stage and Enumeration Property Values

HubSpot's import documentation states that for default enumeration properties (including Lifecycle Stage), imported values must match either the property's internal value or its English label. This is more specific than "value not recognized" — HubSpot's validation checks both options before rejecting.

HUBSPOT LIFECYCLE STAGE — INTERNAL VALUES vs ENGLISH LABELS:

Internal Value         → English Label           → What YOU can import
subscriber             → Subscriber              → "subscriber" OR "Subscriber"
lead                   → Lead                    → "lead" OR "Lead"
marketingqualifiedlead → Marketing Qualified Lead → "marketingqualifiedlead" OR
                                                    "Marketing Qualified Lead"
salesqualifiedlead     → Sales Qualified Lead    → "salesqualifiedlead" OR
                                                    "Sales Qualified Lead"
opportunity            → Opportunity             → "opportunity" OR "Opportunity"
customer               → Customer                → "customer" OR "Customer"
evangelist             → Evangelist              → "evangelist" OR "Evangelist"
other                  → Other                   → "other" OR "Other"

❌ REJECTED (not an internal value OR English label):
"MQL" → rejected
"SQL" → rejected
"Prospect" → rejected
"Qualified Lead" → rejected
"LEAD" → rejected (wrong case — "lead" lowercase or "Lead" capitalized, not "LEAD")
"Marketing Qualified" → rejected (partial match not accepted)

MIGRATION FIX TABLE (common old CRM values → HubSpot equivalent):
Old CRM: "Prospect" → HubSpot: "lead"
Old CRM: "MQL" → HubSpot: "marketingqualifiedlead"
Old CRM: "SQL" → HubSpot: "salesqualifiedlead"
Old CRM: "Opportunity" → HubSpot: "opportunity"
Old CRM: "Closed Won" → HubSpot: "customer"
Old CRM: "Churned" → HubSpot: "other" (no churn stage exists in HubSpot lifecycle)
❌ BROKEN — lifecycle stage import failures (from HubSpot error file):

Your CSV lifecycle stage column:
MQL → error: "The value 'MQL' is not a valid option for the property 'Lifecycle Stage'."
SQL → error: "The value 'SQL' is not a valid option..."
Prospect → error: "The value 'Prospect' is not a valid option..."
LEAD → error: "The value 'LEAD' is not a valid option..." (wrong case)
Marketing Qualified → error: "The value 'Marketing Qualified' is not a valid option..." (partial)

Contact imported but Lifecycle Stage field is blank.

FIXED — using correct values (internal OR English label):
MQL → "lead" or "Lead" (closest HubSpot equivalent)
SQL → "salesqualifiedlead" or "Sales Qualified Lead"
Prospect → "lead" or "Lead"
LEAD → "lead" (lowercase) or "Lead" (capitalized English label)
Marketing Qualified → "marketingqualifiedlead" (internal) or "Marketing Qualified Lead" (label)

🧠 Cross-CRM pattern to know: This exact match validation — internal value OR English label, nothing else — is a pattern across all major CRMs. Salesforce calls them "picklist values." Dynamics 365 calls them "OptionSet labels." Marketo calls them "field options." Different names, same mechanism. Once you understand that every CRM validates dropdown fields against a closed, exact-match list, import failures become predictable rather than mysterious.

The same internal value / English label rule applies to ALL default enumeration properties:

  • Lead Status (if used)
  • Original Source
  • Contact owner (handled separately — see Fix 2)
  • Any HubSpot default dropdown property

For custom enumeration properties (dropdowns you created): the valid options are whatever you defined when creating the property. Go to Settings → Properties → click the property → Options tab to see the exact option labels.


Fix 2: Owner Email Not Found

The HubSpot Owner field must contain the email address of an active HubSpot user in your portal — not their display name, not a role-based email, not a former employee's email.

❌ BROKEN — owner assignment failures:

HubSpot Owner column:
"Jane Smith"              → ❌ display name not accepted — use email
"[email protected]"  → ✅ if Jane Smith is an active HubSpot portal user
"[email protected]"      → ❌ if her HubSpot account uses [email protected]
"[email protected]"    → ❌ former employee email — account deactivated
"[email protected]"       → ❌ role-based email — not a HubSpot user account
[blank]                   → contact imports with no owner (assigned to nobody)

HOW TO GET ACTIVE USER EMAILS:
HubSpot → Settings → Users & Teams → Users
Export or copy the Email column — these are the exact emails to use in owner columns.

VLOOKUP to match your source names to HubSpot emails:
=VLOOKUP(A2, HubSpot_users_table, 2, FALSE)
Where column A = salesperson name from your source file
And HubSpot_users_table = the email/name mapping from Settings → Users

Fix 3: Custom Property Column Headers

Your CSV column headers must match the HubSpot property's internal name. During import, HubSpot lets you map columns to properties manually — but mismatched column names mean more manual mapping work and a higher risk of mapping to the wrong property.

PROPERTY COLUMN HEADER MATCHING:

Standard property headers (auto-recognized):
"First Name", "Last Name", "Email", "Phone", "Company", "Website"
"Job Title", "City", "State", "Country", "Zip Code"

Custom property headers:
Use the property's label exactly as it appears in Settings → Properties.
During import, HubSpot will attempt auto-mapping — but verify each mapping
in the import wizard before proceeding.

IMPORTANT DISTINCTION — two different HubSpot posts:
This post: contact properties, lifecycle stages, owner assignment
Existing post: [field mapping failed errors](/blog/hubspot-csv-field-mapping-failed)
If your import is failing at the mapping screen (column not recognized),
see the field mapping post. If values are failing after mapping, you're in the right place.

Fix 4: List Enrollment After Import

A common post-import confusion: contacts import successfully but don't appear in a list you expected them to join.

HubSpot list behavior during import:

  • Active lists (filtered by criteria): contacts must meet the list criteria AFTER import to appear. Importing a contact doesn't force enrollment — HubSpot re-evaluates list criteria.
  • Static lists: contacts are added during import if you select the list in the import wizard. If you didn't select the list during import, contacts won't be in it.
ENROLLMENT ISSUE DIAGNOSTIC:

Scenario: imported contacts with Lifecycle Stage = "lead"
Expected: contacts appear in your "All Leads" active list
Actual: list shows 0 new contacts

Cause 1: active list criteria check hasn't run yet
→ Wait 5–10 minutes; HubSpot re-evaluates active lists periodically

Cause 2: lifecycle stage didn't import correctly
→ Open one imported contact; check if Lifecycle Stage = Lead
→ If blank or wrong, the import failed on that field

Cause 3: list has additional criteria your imported contacts don't meet
→ Check ALL filter conditions on the list, not just the obvious ones

Cause 4: you imported to the database but didn't select a static list
→ For static lists: re-import or manually add contacts to the list

Fix 5: Duplicate Contact Merge Behavior

HubSpot deduplicates on email address. When a row in your import file matches an existing contact's email, HubSpot updates the existing contact rather than creating a new record. This is intentional and usually correct — but it has implications:

HUBSPOT DUPLICATE HANDLING:

Scenario: existing contact [email protected] exists with Lifecycle Stage = customer.
Your import file has [email protected] with Lifecycle Stage = lead.

Result: existing contact's Lifecycle Stage is updated to "lead".
HubSpot does NOT protect existing values from being overwritten by import.
Properties you include in the import file overwrite current values, even if
the existing value is more accurate.

BEST PRACTICE:
Before importing, decide: are you creating new contacts or updating existing ones?
If updating: your import file must have correct, complete values.
If creating: pre-check your file against existing contacts and remove rows
that match existing contacts (to avoid unintended overwrites).

For large files: run a duplicate check locally before upload.

Why did my lifecycle stage import as blank?

The value in your Lifecycle Stage column doesn't match HubSpot's internal value or English label. HubSpot does not throw an error for this — it silently drops the field and creates the contact with a blank Lifecycle Stage. The contact appears in your import success count. Check the error file (Settings → Imports → Download Error File) — blank lifecycle stage failures appear there even when the row itself succeeds. Fix: use values from the reference table above. Re-import will update the existing contact.

Why did HubSpot overwrite my existing lifecycle stage?

HubSpot deduplicates on email. When your import file contains a row matching an existing contact's email, HubSpot updates the contact — including overwriting the Lifecycle Stage with whatever value is in your CSV. If your CSV has lead and the existing contact is customer, HubSpot sets them to lead. This is irreversible automatically. Prevention: filter existing contacts out of your import file if creating new records only, or verify every Lifecycle Stage value is intentional before importing.

Why are contacts not appearing in my list after import?

Active lists re-evaluate contacts based on filter criteria — they don't add contacts just because they were imported. After import, HubSpot runs list re-evaluation (typically within 5–10 minutes). If imported contacts meet all filter criteria, they appear. If they don't appear after 15 minutes, check: (1) the contact's properties match all list conditions, (2) Lifecycle Stage imported correctly and matches the list filter, (3) the list is Active (not Static — Static lists require explicit enrollment).

Why does HubSpot say "owner does not exist" when the owner works here?

The email in your CSV's owner column doesn't match the exact email address the owner uses for their HubSpot account login. Check two things: (1) the owner's HubSpot email via Settings → Users & Teams (not their work email — some people use personal addresses for HubSpot), and (2) verify the account is active, not deactivated. Former employees whose HubSpot accounts are deactivated produce this error even if the email format looks correct.

HubSpot Contact Import Cause/Fix Table

Error / SymptomRoot CauseFix
"Value '[X]' is not valid for '[Y]'"Enumeration property value doesn't match internal value or English labelCheck Settings → Properties → option list; use exact strings
Lifecycle Stage all blank after importImported custom names ("MQL") not in HubSpot's lifecycle setMap to HubSpot equivalents before import
"Owner does not exist in portal"Owner email not an active HubSpot userExport user list from Settings → Users & Teams
Contacts imported but not in listActive list criteria not met, or static list not selected at import timeCheck list criteria; re-import selecting the static list
Existing contacts overwrittenHubSpot updates on email matchIntended behavior; verify import file values before uploading
"File must be a .csv"Excel .xlsx uploaded instead of CSVSave as CSV from Excel before importing
Import shows fewer contacts than fileDuplicate rows collapsed on email matchDeduplicate your file before import
Custom property blank after importColumn header doesn't match property labelVerify mapping in import wizard; check Settings → Properties

✅ How to Confirm Your HubSpot Import Worked

  1. Download the error file — Settings → Imports → hover your import → Download Error File. If this file has any rows, those contacts had field-level failures.
  2. Check 5 imported contacts manually — search for contacts you know were in the file. Open each one and verify: Lifecycle Stage shows correct value (not blank), Owner shows correct user, custom properties have the right values.
  3. Check list memberships — if you expected contacts to appear in active lists, wait 5–10 minutes for HubSpot to re-evaluate list criteria, then check the list count.
  4. Spot-check one updated contact — find a contact that existed before your import. Verify the fields you intended to update changed correctly, and fields you didn't include weren't blanked out.

🔁 Safe Re-Run Workflow

  1. Download the error file from your failed import — it contains all rows that failed
  2. Fix the specific field values in the error rows (lifecycle stage, owner, property values)
  3. Re-import using the corrected error file only — HubSpot deduplicates on email, so re-uploading the full file is safe but wastes processing time on rows that already succeeded
  4. Verify the re-import summary shows 0 errors

⚠️ Edge Case: HubSpot has a daily import limit (varies by subscription tier). If you hit the limit, subsequent imports are blocked until the next calendar day. If you're running large imports across multiple files, space them to avoid hitting the daily cap.

🛡 Prevent This Next Time

  1. Map old CRM lifecycle stages to HubSpot values before export — create a translation table in your source system or spreadsheet. Every future migration uses the same map.
  2. Export your HubSpot property option lists quarterly — custom properties change when someone adds or removes options. Keep a reference spreadsheet current.
  3. Always validate 10 rows before the full file — HubSpot's import wizard takes 2–3 minutes per file. A 10-row test catches all format issues in under 5 minutes total.

Consequence Ladder: What These Errors Actually Cost

CONSEQUENCE LADDER:

Blank lifecycle stage (value dropped silently):
→ Contact excluded from lifecycle-based segments
→ Lead counts in reports are understated
→ Marketing shows weaker pipeline contribution than actual
→ Prioritization models miss these contacts

Lifecycle stage overwritten (customer → lead):
→ Customer now looks like a new prospect
→ SDRs may cold-outreach existing customers (relationship risk)
→ Renewal pipeline shows fewer customers than actual
→ Revenue reporting breaks for that cohort
→ Cannot auto-undo — requires corrective import

Owner not found — contact unassigned:
→ Lead enters CRM with no assigned rep
→ First response time exceeds acceptable window
→ Lead conversion drops significantly with every hour of delay
→ Rep pipeline is understated — they never knew this lead existed

⏱ Recovery Cost of Getting This Wrong

The lifecycle stage overwrite scenario is the most expensive HubSpot import failure:

ScenarioTime to FixData Impact
Blank lifecycle stage (fix before import)10 minutesNone
Blank lifecycle stage (fix after import)1–2 hours re-importReporting gap for hours
Lifecycle stage overwritten (customer → lead)2–4 hours corrective importDays of incorrect reporting
Owner not found — leads unassigned30–60 minutes re-importLeads unworked during gap
List not enrolling — automation didn't fireVariableMissed nurture window

The validation and mapping checks in this guide take under 15 minutes. Recovery from a bad lifecycle stage overwrite on 5,000 contacts takes most of a day — and creates a reporting gap that affects weekly metrics.

Why Validate HubSpot Import Files Locally

HubSpot import files contain some of the most sensitive data in your go-to-market stack — contact details, lifecycle stage, deal stage context, and owner assignments. Many teams clean these files in cloud-based tools before importing, creating a secondary data exposure point that may require its own GDPR Article 28 Data Processing Agreement.

SplitForge validates files in Web Worker threads in your browser — for raw file contents, nothing is transmitted to any server during processing. Validate format, detect duplicates, and check blank required fields before any upload.

For the full HubSpot field mapping error guide, see HubSpot field mapping failed. For cross-platform error codes, see CRM import error codes explained. For the complete guide, see CRM import failures complete guide.


Additional Resources

Tested: HubSpot lifecycle stage internal values, enumeration property validation, and owner field behavior verified against HubSpot Knowledge Base and HubSpot product documentation. March 2026.

Official HubSpot Documentation:

Standards:


FAQ

Every HubSpot enumeration property has two representations for each option: an internal value (lowercase, no spaces, used in APIs and imports) and an English label (human-readable, mixed case). For Lifecycle Stage, "lead" is the internal value and "Lead" is the English label. HubSpot accepts either representation during import — but not variations like "LEAD" (wrong case), "MQL" (not a HubSpot stage), or "Marketing Qualified" (partial match). Both internal value and English label must match exactly.

No. Lifecycle Stage is a default HubSpot property with a fixed option set that cannot be modified. If you need custom pipeline stages beyond HubSpot's default set, use a custom dropdown property (like "Sales Stage" or "Pipeline Stage") and map your custom values there. Lifecycle Stage is designed as a standardized cross-platform metric.

The most common cause is using a value that doesn't match HubSpot's internal value or English label — the field fails silently and the contact imports with a blank Lifecycle Stage. Download the error file from Settings → Imports to see the exact failure reason per row. If the error file shows no failures for those contacts, the Lifecycle Stage column header may not have mapped to the correct HubSpot property during the import wizard step.

HubSpot deduplicates on email address. If an existing contact has the same email as a row in your import file, the existing contact is updated with your imported values. New contacts are not created. Properties in your CSV overwrite current values — HubSpot does not protect existing values from being overwritten. Fields not in your CSV are left unchanged. The import summary shows "Updated" for these contacts.

HubSpot accepts CSV files up to 150MB. For files larger than 150MB, split the file into multiple imports. HubSpot's import page provides a "split file" recommendation when your file approaches the limit.


Catch HubSpot Import Errors Before They Reach Your CRM

Validates enumeration property values, blank required fields, and duplicate emails
Detects owner email format issues before HubSpot rejects them
Works on files with 100K+ contacts — no upload, no size limit
Files process locally in your browser — contact data never transmitted to any server

Continue Reading

More guides to help you work smarter with your data

csv-import-guides

CSV Delimiter Errors: Fix Comma vs Semicolon for International Teams

Stop all data in Column A errors. Learn comma, semicolon & tab CSV delimiters plus quick fixes for global teams.

Read More
csv-guides

How to Split Large CSV Files Without Excel (Even 1M+ Rows)

Need to split a massive CSV file but Excel keeps crashing? Learn how to split files with millions of rows safely in your browser without uploads.

Read More
excel-guides

Batch Convert Multiple Excel Files to CSV Without Opening Each One

Opening 50 Excel files one at a time to save as CSV takes 45 minutes and produces inconsistent results. Three methods handle the same task in under 60 seconds — none require opening a single file.

Read More