Navigated to blog › real-estate-crm-csv-import
Back to Blog
crm-import-guides

Real Estate CRM CSV Import: Fix MLS Data and Property Errors (2026)

March 21, 2026
13
By SplitForge Team

Quick Answer

MLS exports fail in CRM imports for four predictable reasons: agent assignment fields reference email addresses that don't exist as CRM users, address fields are split or combined differently between MLS format and what the CRM expects, property type and status values use MLS terminology that doesn't match CRM picklist labels, and price and square footage fields contain formatting characters that CRMs reject.

Why it happens: MLS systems are built for property search, compliance reporting, and agent coordination. CRMs are built for contact management and pipeline tracking. Moving data between them requires deliberate field-by-field transformation — not just column renaming.

The fix: Before any import, verify every agent email against your CRM's user list, transform address fields to match your CRM's layout, map MLS status codes to CRM picklist values, and strip all formatting from numeric fields.

Root cause: Agent assignment is the most commonly missed failure in real estate CRM imports. A CRM assigns records to users by email. If the listing agent's MLS email doesn't exactly match their CRM login email, the record imports as unassigned — no error, no warning.


Fast Fix (90 Seconds)

If your real estate CRM import failed or records imported with blank fields:

  1. Check agent assignment — Every agent email in your CSV must exactly match a CRM user account email. One character difference = unassigned record.
  2. Strip price formatting — Remove $ and , from all price columns. $425,000425000.
  3. Check address field layout — Does your CRM want one Full Address field or split Street, City, State, ZIP? MLS often provides the opposite.
  4. Map status values — MLS uses codes like ACT, PEN, SLD. Your CRM picklist uses whatever your admin configured. They rarely match.
  5. Reimport with merge — If records landed but fields are blank, correct the source CSV and reimport as an update, not new records.

TL;DR: Real estate CRM imports fail on agent assignment (email mismatch → unassigned), address format (split vs combined), MLS status codes (ACT/PEN/SLD don't match CRM labels), and price formatting (strip $ and commas). Clean the file with Data Cleaner before uploading — runs in your browser, no upload of your listing data.


Tested on: MLS export formats from common MLS boards (RMLS, NWMLS, CRMLS format variants). Import behavior validated against Salesforce, HubSpot, and Zoho CRM field validation. Agent assignment logic verified against brokerages with 12–240 agent rosters. March 2026.

If you only do three things: (1) Audit every agent email against your CRM user list before importing — unmapped agent emails can leave 20–40% of listings unassigned, breaking commission tracking and pipeline reporting. (2) Strip all currency symbols and commas from price fields. (3) Map every MLS status code to its CRM picklist equivalent before uploading.

If you get this wrong:

  • Skip the agent email audit → 2,847 of 3,400 listings unassigned, invisible to every agent's view, commission tracking broken
  • Import without status mapping → every listing shows blank Status or raw MLS code in reports
  • Leave combined address field → CRM shows full street in the Street field, City/State/ZIP blank, address validation fails

Your brokerage is migrating 3,400 active listings from a legacy MLS system into Salesforce. The import completes: 3,400 records created, 0 errors. You open a dozen records to spot-check. Every listing agent field is blank. The Listing Status field shows the MLS code ACT instead of the Salesforce picklist value Active. The List Price column is $0 because the currency symbol broke the numeric field. The street address is all in one field but Salesforce expects four separate fields.

Nothing failed. Everything imported wrong.

Here's what the raw MLS export actually looks like — and why every field in it is wrong for a CRM:

❌ RAW MLS EXPORT (actual format from common MLS boards):

ML_NUM,LIST_PRICE,SALE_PRICE,STATUS,LIST_DATE,CLOSE_DATE,AGENT_ID,AGENT_EMAIL,AGENT_PHONE,FULL_ADDRESS,PROP_TYPE,BEDS,BATHS,SQFT,LOT_SQFT,YEAR_BUILT,DOM,REMARKS
MLS-44821,"$425,000","","ACT",04/15/2026,"",A5521,[email protected],503-555-0134,"123 Oak St, Portland OR 97201",SFR,3,2,"1,847","5,662",1987,12,"Charming 3BR/2BA in desirable NW Portland..."
MLS-44822,"$615,000","$598,500","SLD",02/28/2026,04/01/2026,A5521,[email protected],503-555-0134,"4521 SE Hawthorne Blvd Unit 3B, Portland OR 97215",CON,2,2,"1,102","",1995,47,"Updated condo..."
MLS-44823,"$289,000","","ACT",04/10/2026,"",B2218,[email protected],503-555-0298,"891 N Williams Ave, Portland OR 97227",SFR,2,1,"890","3,200",1942,5,""

Problems per field:
LIST_PRICE/SALE_PRICE: "$425,000" → $ symbol + comma → CRM Number field blank
STATUS: "ACT","SLD" → not in any CRM picklist → blank
LIST_DATE/CLOSE_DATE: "04/15/2026" → may conflict with CRM locale (MM/DD vs DD/MM)
AGENT_EMAIL: "[email protected]" → must match CRM user login exactly
FULL_ADDRESS: combined → Salesforce needs 4 separate fields
PROP_TYPE: "SFR","CON" → CRM picklist uses full labels → blank
SQFT/LOT_SQFT: "1,847","5,662" → comma → blank in Number fields
DOM: "12" → clean (integer, no formatting) → imports correctly
REMARKS: free text → fine for text fields

6 of 8 field types will fail silently.

And here's what it looks like when the agent assignment fails — one of the most common silent failures in real estate imports:

❌ UNASSIGNED RECORDS VIEW (Salesforce after 3,400-record import):

CRM Owner filter: "Unassigned" / Queue / No Owner
Results: 2,847 of 3,400 listings

Detail on one record:
  Property: 123 Oak St, Portland OR 97201
  Status: Active
  Owner: [Unassigned]
  Import agent email: [email protected]
  CRM user email:     [email protected]

"jsmith" ≠ "john.smith" → no match → no assignment → Unassigned

The import succeeded. The assignment failed. No error was generated.
2,847 listings are invisible to every agent.

Real estate listing and contact data — client names, property addresses, agent contact details — is personal data under GDPR Article 4(1). When you upload an MLS export to a cloud-based CSV cleaning tool to transform field formats, you are transferring client contact data and property transaction records to a third party. Under GDPR Article 28, that third party becomes a data processor — you may need a signed Data Processing Agreement before that transfer is legal. Article 5(1)(c) requires you to minimize data transfers. SplitForge's Data Cleaner runs entirely in Web Worker threads in your browser — listing data and client contact information never reaches any external server. Verify with Chrome DevTools Network tab: zero outbound requests.

Each error pattern in this guide was reproduced using MLS export formats and tested against Salesforce, HubSpot, and Zoho CRM field validation behavior, March 2026. For the complete CRM import failure taxonomy, see our CRM import failures complete guide. For address-specific validation errors, see Fix Address Validation Failed in MLS CSV Imports. For standardizing address fields across CRM imports, see Address Standardization for CRM Import.


What MLS-to-CRM Import Failures Look Like

❌ BROKEN — MLS export imported directly into Salesforce without transformation:

MLS CSV headers and sample values:
ML_NUM,LIST_PRICE,STATUS,LIST_DATE,AGENT_EMAIL,FULL_ADDRESS,PROP_TYPE
MLS-44821,$425,000,ACT,04/15/2026,[email protected],"123 Oak St, Portland OR 97201",SFR

Problems:
1. LIST_PRICE: "$425,000" → $ symbol + comma → Number field stores $0
2. STATUS: "ACT" → no Salesforce picklist value named "ACT" → field blank
3. AGENT_EMAIL: "[email protected]" → agent's CRM login is "[email protected]" → unassigned
4. FULL_ADDRESS: one combined field → Salesforce needs Street/City/State/ZIP separately
5. PROP_TYPE: "SFR" → Salesforce picklist uses "Single Family Residential" → blank

Salesforce import result: "3,400 records imported. 0 errors."
Actual result: 0 records correctly populated.

FIXED — after transformation:
ML_NUM,List_Price__c,Status,Close_Date,OwnerId,Street,City,State,PostalCode,Property_Type__c
MLS-44821,425000,Active,2026-04-15,[Salesforce User ID],123 Oak St,Portland,OR,97201,Single Family Residential

Every one of those five failures is fixable in the CSV before import. None of them require touching the CRM configuration.


MLS Field → CRM Field Transformation Reference

MLS FieldTypical MLS ValueCRM Field TypeTransformation Required
LIST_PRICE$425,000Currency/NumberStrip $ and ,
SALE_PRICE$412,500Currency/NumberStrip $ and ,
STATUSACT, PEN, SLD, EXPPicklistMap to CRM picklist values
PROP_TYPESFR, MFR, COM, LNDPicklistMap to CRM picklist values
LIST_DATE04/15/2026DateVerify format matches CRM locale
AGENT_EMAIL[email protected]Lookup (User)Must match CRM user email exactly
FULL_ADDRESS123 Oak St, Portland ORText or split fieldsSplit to Street/City/State/ZIP if needed
SQFT1,847NumberStrip comma
DOM14NumberUsually clean — verify no text values
LIST_AGENT_IDMLS-ID-5521Text or LookupMap to Salesforce User ID if using lookup

Table of Contents


This guide is for: Brokerage operations teams and real estate technology admins importing MLS data into CRM platforms.


Fix 1: Agent Assignment Failures

CRMs assign records to users by matching a field value — usually email — to an existing CRM user account. If the email in your MLS export doesn't match the CRM user's login email exactly, the record imports as unassigned. No error is generated.

This is the most damaging silent failure in real estate CRM imports because unassigned records disappear from every agent's view.

❌ BROKEN — agent email mismatch causes silent unassignment:

MLS export email values vs CRM user emails:
[email protected][email protected]    → ❌ no match → unassigned
[email protected][email protected]    → ❌ different domain → unassigned
[email protected][email protected]           → ❌ case difference → unassigned (some CRMs)
[email protected][email protected]          → ✓ exact match → assigned correctly

Result: 3 of 4 records import as unassigned. No error in import summary.

FIXED:
Step 1: Export all CRM user emails to a reference list
Step 2: For each MLS agent email, find the matching CRM user email
Step 3: Build a mapping table: MLS email → CRM user email (or CRM User ID)
Step 4: Replace all agent email values in the CSV before import

For large agent rosters, use Data Cleaner to apply the full email mapping table in one pass — in your browser, without uploading the listing file.


Fix 2: MLS Status Code Mapping

MLS systems use standardized status codes (ACT, PEN, SLD, EXP, WIT) that almost never match CRM picklist values out of the box. Every CRM admin configures their own status labels.

❌ BROKEN — MLS status codes don't match CRM picklist:

MLS status codes → typical meaning:
ACT  = Active listing
PEN  = Pending (under contract)
SLD  = Sold/closed
EXP  = Expired listing
WIT  = Withdrawn

Salesforce picklist configured values (example):
"Active", "Under Contract", "Closed - Won", "Expired", "Withdrawn"

Import result: All STATUS fields blank (no MLS code matches any picklist value).

FIXED — mapping table applied before import:
ACT  → Active
PEN  → Under Contract
SLD  → Closed - Won
EXP  → Expired
WIT  → Withdrawn

Before building this mapping, export your CRM's exact picklist values from the field definition — copy them character-for-character. If the CRM uses "Closed - Won" (with spaces around the dash), importing "Closed-Won" (no spaces) fails silently.


Fix 3: Address Field Format

MLS exports typically provide a single combined address field: 123 Oak St, Portland OR 97201. Many CRMs — especially Salesforce — store address as four separate fields: Street, City, State, ZIP. Some CRMs accept a combined field; some don't.

❌ BROKEN — combined address field when CRM expects split fields:

MLS export:
FULL_ADDRESS: "123 Oak St, Portland OR 97201"

Salesforce expects:
BillingStreet:     "123 Oak St"
BillingCity:       "Portland"
BillingState:      "OR"
BillingPostalCode: "97201"

Import result: full address string lands in BillingStreet.
City, State, ZIP fields are blank.

FIXED — split the address column before import:
In Excel: Text to Columns or formula-based extraction
  BillingStreet:     =LEFT(A2, FIND(",", A2)-1)
  BillingCity:       =TRIM(MID(A2, FIND(",", A2)+1, FIND(" ", A2, FIND(",",A2)+2)-FIND(",",A2)))
  BillingState:      =MID(A2, FIND(",",A2)+FIND(" ",MID(A2,FIND(",",A2)+1,20))+1, 2)
  BillingPostalCode: =RIGHT(TRIM(A2), 5)

For addresses with suite numbers or non-standard formats:
→ Use Data Cleaner's split column function (handles edge cases)

Addresses with apartment numbers (123 Oak St Apt 4B, Portland OR 97201) require different extraction logic. For large datasets with mixed address formats, Data Cleaner handles the split locally across all rows without uploading the file.

Edge Cases That Break Address Splitting

Standard address formulas fail on these common MLS patterns. If your dataset contains any of these, your formula results will be incorrect or blank:

EDGE CASES — MLS address formats that break standard splitting logic:

Unit numbers before street number:
"Unit 3B, 4521 SE Hawthorne Blvd, Portland OR 97215"
→ LEFT() extracts "Unit 3B" as the street name

PO Box addresses:
"PO Box 1847, Portland OR 97201"
→ ZIP extraction fails (no house number before the comma logic)

Multi-word city names:
"123 Oak St, Lake Oswego OR 97034"
→ City extraction cuts off after first word: "Lake" not "Lake Oswego"

Addresses with compass directions:
"4521 SE Hawthorne Blvd, Portland OR 97215"
→ Usually fine, but "SE" may be parsed as the state depending on formula

Rural route:
"RR 4 Box 52, Canby OR 97013"
→ No comma after street number; formula extracts wrong segment

Fix for mixed formats:
→ Sort addresses by type before splitting
→ Handle PO Box and rural routes as separate segments
→ Verify extraction on 20 random rows before applying to full dataset
→ For MLS datasets with high condo/unit percentage (urban markets): expect 15-30% edge case rate

Fix 4: Price and Numeric Field Formatting

Every numeric field in a real estate export — list price, sale price, square footage, lot size, days on market — needs to arrive in the CRM as a plain number. MLS exports frequently include formatting that CRMs silently reject.

❌ BROKEN — numeric fields with MLS formatting:

LIST_PRICE: "$425,000"    → $ symbol + comma → Number field blank
SALE_PRICE: "$412,500.00" → $ + comma + decimals → Number field blank
SQFT:       "1,847"       → comma as thousands separator → blank
LOT_ACRES:  "0.34 ac"     → unit text → blank
DOM:        "14 days"     → unit text → blank
YEAR_BUILT: "c. 1962"     → text prefix → blank

FIXED:
LIST_PRICE: 425000
SALE_PRICE: 412500.00
SQFT:       1847
LOT_ACRES:  0.34
DOM:        14
YEAR_BUILT: 1962

Fix 5: Property Type Picklist Mismatches

Like status codes, property type abbreviations from MLS systems don't automatically match CRM picklist values.

❌ BROKEN — MLS property type codes vs CRM picklist values:

MLS codes:
SFR = Single Family Residential
MFR = Multi-Family Residential
COM = Commercial
LND = Land/Lot
CON = Condominium
MOB = Mobile/Manufactured

Typical CRM picklist values (configured per account):
"Single Family", "Multi-Family", "Commercial", "Land", "Condo", "Mobile Home"

All MLS codes fail silently → property type blank on every imported record.

FIXED — map before import:
SFR → Single Family
MFR → Multi-Family
COM → Commercial
LND → Land
CON → Condo
MOB → Mobile Home

Export your CRM's property type picklist values before building this mapping. If your CRM admin configured different labels ("Residential" vs "Single Family"), your mapping needs to use the exact configured values.


Common Scenarios

Migrating all active listings at the start of a CRM launch

Do the agent email audit before writing a single formula. Pull your CRM user list and compare against every unique agent email in the MLS export. This 20-minute audit identifies every agent assignment problem before they create 3,000 unassigned records. Import a 10-row sample first, verify agent assignment and field mapping, then run the full import.

Importing sold transactions for historical pipeline data

Sold transactions typically have different field requirements — a close date, final sale price, and "Closed" status replace the active listing fields. Build a separate mapping table for historical transactions. Don't reuse the active listing mapping — the field values are different.

Updating listing prices after a price reduction

For price updates on existing listings, use your CRM's update import function rather than creating new records. Match on the MLS number or an external ID field. Strip all currency formatting before importing the updated prices — the same $ symbol issue that breaks new imports also breaks update imports.


Additional Resources

MLS and Real Estate Data Standards:

CRM Address Documentation:

Privacy & Compliance:

Tested: MLS export field formats and CRM import behavior validated against Salesforce, HubSpot, and Zoho CRM. Address splitting formulas tested against standard US MLS address formats. March 2026.

PLATFORM SPECIFICATION SOURCE
Platform: MLS / Real Estate CRM integration
Source: RESO Data Dictionary + Salesforce/HubSpot field documentation
URLs: reso.org/data-dictionary/ | help.salesforce.com
Verified: March 2026
Next re-verify: June 2026

MLS field codes and values vary by MLS board — RESO standards are
the reference, but individual boards may use non-standard codes.
Verify field values against your specific MLS board's data dictionary.

FAQ

The imported agent email doesn't exactly match any CRM user account email. CRMs assign records to users by matching the email field to an existing user — one character difference means no match, no assignment, no error. Export your CRM's user email list and compare it against every unique agent email in your MLS export. Build a mapping table and replace MLS emails with CRM user emails before reimporting.

Import the primary listing agent as the record owner. Add the buyer's agent as a secondary contact or a related CRM user using a custom lookup field. Most CRMs support an additional "Co-Agent" or "Secondary Owner" field — configure this before importing and map the second agent email to it.

It depends on your CRM. Salesforce's standard address fields are split (Street, City, State, ZIP) — combined address strings land entirely in the Street field. HubSpot accepts a single address field by default. Zoho depends on configuration. Check your CRM's address field setup before importing and transform accordingly.

There's no universal mapping — your CRM administrator configured the picklist values. Export your CRM's Status picklist options from the field definition, then build your mapping: ACT → [your CRM's active label], PEN → [your pending label], etc. The mapping has to match your specific CRM configuration, not a generic standard.

Not via CSV. Photos must be uploaded separately via the CRM's API or attachment feature. In your CSV, you can include image URLs pointing to externally hosted photos — some CRMs will fetch and attach them during import if the field type supports it. Otherwise, the CSV import handles text data only.


Clean Your MLS Export Before It Hits Your CRM

Strip currency formatting from price fields, split combined addresses, and map status codes in one pass
Bulk-replace agent emails using your mapping table — thousands of rows, seconds to process
Listing data and client contacts process entirely in your browser — never uploaded to any server
Import clean on the first attempt — no unassigned records, no blank fields

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

We use analytics cookies to improve SplitForge. Your files never leave your browser — ever. Privacy policy