Quick Answer
Importing e-commerce data into a CRM fails for five predictable reasons: customer deduplication logic that creates duplicate contacts instead of merging repeat buyers, order data imported as contact records instead of deal or activity objects, product SKU fields that don't match CRM product catalog entries, currency and number fields with formatting the CRM rejects, and date fields in platform-specific formats the CRM can't parse.
Why it happens: E-commerce platforms and CRMs have completely different data models. Shopify's "Customer" is a contact with order history. A CRM's "Contact" is a person with pipeline activity. Mapping between them requires understanding both models — not just renaming columns.
The fix: Map e-commerce objects to CRM objects before importing, deduplicate on email before the file reaches the CRM, and transform all numeric and date fields to match CRM expectations.
Root cause: Duplicate customer records are among the most common e-commerce CRM import failures. A customer who ordered three times creates three separate Contact records if email-based deduplication isn't handled before or during import.
Fast Fix (90 Seconds)
If your e-commerce CRM import failed or created duplicate contacts:
- Deduplicate on email first — Run deduplication on the email column before importing. Keep the most recent record for each email address.
- Check the object type — Are you importing customers as Contacts? Orders as Deals? Activities? Confirm the CRM object type before mapping.
- Strip price formatting — Remove
$,€, and commas from all price/revenue fields. - Check date formats — Shopify exports ISO 8601 with timezone (
2026-04-15T14:30:00-07:00). Most CRMs needYYYY-MM-DDorMM/DD/YYYYwith no timezone. - Import customers first, then orders — Orders reference customers. If customers don't exist yet, order imports fail on the lookup.
TL;DR: Deduplicate customers on email before import, strip price formatting, convert Shopify timestamps to plain dates, and import in order: customers first, then orders. Run Data Validator to catch type mismatches and duplicates before the CRM sees the file.
Tested on: Shopify customer and order exports, WooCommerce CSV files. Import behavior validated against Salesforce, HubSpot, and Zoho CRM. Deduplication logic verified against stores with 5,000–150,000 customer records. March 2026.
If you only do three things: (1) Deduplicate on email before importing — this alone prevents one of the most common post-import cleanup projects. (2) Import customers first, then orders — order lookups fail if the customer Contact doesn't exist yet. (3) Strip currency symbols and timezone offsets from all date/price fields.
If you get this wrong:
- Skip deduplication → 31,000 contacts for 18,000 customers (72% inflation), 6 hours of manual merging, split activity history across duplicates, email campaigns send to same address 2–3x
- Import orders before customers → every order line item fails with "Contact not found"
- Leave timezone offset in date fields → all date fields blank, making order history invisible in CRM timeline views
Your DTC brand is integrating Shopify with Salesforce. You export your 18,000 customers and import them as Contacts. The import completes with 0 errors. You open the Contact list and see 31,000 records — 13,000 duplicates from repeat buyers who ordered under the same email address in different sessions. Shopify created a new Customer record for each session. Your Salesforce Contact list is already corrupted before a single rep has touched it.
Here's what that CRM aftermath actually looks like:
REALITY — what happens inside the CRM after an undeduped Shopify import:
Contact list (filtered by email: [email protected]):
Contact ID: 003XX000001AAAA | Name: Alice Chen | Source: Shopify | Created: 2024-03-15
Contact ID: 003XX000001BBBB | Name: Alice Chen | Source: Shopify | Created: 2024-11-08
Contact ID: 003XX000001CCCC | Name: Alice Chen | Source: Shopify | Created: 2026-01-15
3 Contact records. Same person. CRM now has:
→ 3 separate activity histories (split across records)
→ 3 separate email opt-in consent records
→ Email campaigns send 3x to [email protected] (GDPR violation risk)
→ Sales rep calls Alice — sees 1/3 of her history each time
→ Dedup tool runs → flags 13,000 pairs → manual merge takes 6 hours
For a 18,000-customer import: 31,000 contacts = 72% inflation.
And here's how it happens — the normal path that nobody audits:
REALITY (actual Shopify → CRM migration at most companies):
Step 1: Ops team exports Shopify customers to "customers_export_final.csv"
Step 2: Opens in Excel → timestamps auto-reformatted by Excel locale settings
Step 3: Saves file → ISO 8601 timestamps corrupted to Excel's local format
Step 4: Uploads to cloud CSV validator to "clean it"
→ 18,000 customer records + purchase history uploaded to unknown server
→ GDPR Article 28: third party now a data processor, no DPA in place
Step 5: Imports to Salesforce with no dedup rules configured
Step 6: 13,000 duplicates created → 6 hours of manual merge work
Every step in this path is the default choice. None of it is malicious.
All of it is avoidable.
E-commerce customer and order data is among the most privacy-sensitive CRM data — it contains purchase history, behavioral patterns, and email addresses linked to transaction records, constituting personal data under GDPR Article 4(1). When you upload a Shopify customer export to a cloud-based CSV validator, you are transferring your entire customer database 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. Under Article 5(1)(c), this upload processes more data than necessary to fix a file format issue. SplitForge's Data Validator runs entirely in Web Worker threads in your browser — customer data never reaches any external server. Confirm this in Chrome DevTools Network tab: zero outbound requests.
E-commerce import patterns in this guide were tested against Shopify export formats, WooCommerce CSV exports, and Salesforce, HubSpot, and Zoho CRM import behavior, March 2026. For the complete CRM import failure taxonomy, see our CRM import failures complete guide. For Shopify-specific import errors, see Shopify CSV Import Errors. For pre-import product data cleaning, see Clean Product Catalog CSVs for Shopify and WooCommerce.
E-commerce Data Model vs CRM Data Model
Before mapping any fields, understand what you're mapping between:
| E-commerce Object | CRM Object | Notes |
|---|---|---|
| Customer | Contact | Deduplicate on email before import |
| Order | Deal / Opportunity | One order = one deal; OR summarize as customer lifetime value on Contact |
| Order line item | Product / Line Item | Requires product catalog match in CRM |
| Order note | Activity / Note | Import as activity attached to Contact |
| Customer tag | CRM tag or custom field | Map tag values to CRM field options |
| Customer address | Contact address fields | Split or combine based on CRM layout |
| Abandoned cart | Activity or custom object | CRM-dependent; check object support |
The most common mistake is importing Orders as Contacts — creating a Contact record per order rather than per customer. Decide the object mapping before touching the CSV.
What E-commerce Import Failures Look Like
❌ BROKEN — Shopify customer export imported directly into Salesforce:
Shopify Customer CSV sample:
id,email,first_name,last_name,orders_count,total_spent,created_at,tags
3421,[email protected],Alice,Chen,3,1250.75,2024-03-15T10:22:00-07:00,vip wholesale
3421,[email protected],Alice,Chen,3,1250.75,2024-11-08T14:15:00-08:00,vip wholesale
9834,[email protected],Bob,Smith,1,89.99,2026-01-22T09:30:00-07:00,
Two rows for Alice Chen — same customer, different Shopify session records.
CRM imports both → two Contact records for [email protected].
total_spent: "1250.75" → actually fine (no currency symbol)
created_at: "2024-03-15T10:22:00-07:00" → ISO 8601 with TZ offset → most CRMs reject
FIXED:
- Deduplicate: keep one row per email, use most recent created_at
- created_at → date only: 2024-03-15
- tags: "vip wholesale" → "vip,wholesale" (split to separate tags if CRM needs comma-separated)
- Import as: Contact with custom fields for orders_count and total_spent
Table of Contents
- Fix 1: Customer Deduplication Before Import
- Fix 2: Shopify Timestamp Format
- Fix 3: Order Data Object Mapping
- Fix 4: Price and Revenue Field Formatting
- Fix 5: Product SKU and Catalog Matching
- Common Scenarios
- Additional Resources
- FAQ
Fix 1: Customer Deduplication Before Import
Shopify and WooCommerce can create multiple records per customer — guest checkouts, account merges, multiple sessions. Before importing any customer data to a CRM, deduplicate on email address. Keep one record per unique email — typically the most recent or the one with the highest order count.
❌ BROKEN — multiple platform records for the same customer:
Shopify export (three rows, one customer):
email, orders_count, total_spent, last_order_date
[email protected], 1, 89.99, 2023-06-10
[email protected], 2, 289.50, 2024-02-28
[email protected], 3, 1250.75, 2026-01-15
Imported to Salesforce without dedup:
→ 3 Contact records for [email protected]
→ Each shows partial order history
→ CRM dedup tools flag them later, but manual merge takes time
FIXED — deduplicated before import (keep most recent + aggregate values):
email, orders_count, total_spent, last_order_date
[email protected], 3, 1250.75, 2026-01-15
One record. Full aggregated history.
Edge Case: Gmail Plus-Alias Duplicates
Standard email deduplication misses one common pattern: the same Gmail inbox used with different plus-aliases.
EDGE CASE — Gmail plus-alias creates false duplicates:
Shopify records:
[email protected] → ordered March 2024 (standard checkout)
[email protected] → ordered June 2025 (from marketing email link)
[email protected] → ordered January 2026 (from sale campaign)
Standard dedup on exact email: finds 0 duplicates (three different strings)
Reality: all three deliver to [email protected] — same person, same inbox
For stores with active email marketing using tracked links:
→ Normalize emails before dedup: strip + aliases
→ Method: =LEFT(A2, IF(ISERROR(FIND("+",A2)), FIND("@",A2)-1, FIND("+",A2)-1)) & MID(A2, FIND("@",A2), 100)
→ Strips "+anything" before "@" for Gmail addresses
→ Then dedup on the normalized email column
→ Keep original email for import (CRM should receive the real email, not the normalized one)
This edge case affects stores with list segmentation or promotional campaigns that use plus-alias tracking. You can do this manually in Excel or Python, or with a normalization step in your data pipeline — the key is to normalize for dedup comparison while preserving the original value for import.
Fix 2: Shopify Timestamp Format
Shopify exports timestamps in ISO 8601 format with timezone offset: 2026-04-15T14:30:00-07:00. Most CRM date fields don't accept this format — they need YYYY-MM-DD (date only) or YYYY-MM-DD HH:MM:SS (datetime without offset).
❌ BROKEN — Shopify timestamp formats that fail CRM date fields:
Shopify export values:
created_at: "2026-04-15T14:30:00-07:00" → ISO 8601 with TZ offset → rejected
updated_at: "2026-04-15T21:30:00Z" → UTC with Z → rejected by strict parsers
processed_at: "April 15, 2026" → natural language → rejected
FIXED — strip time component and TZ offset for date-only CRM fields:
created_at: 2026-04-15
updated_at: 2026-04-15
processed_at: 2026-04-15
For CRM datetime fields (timestamp with time):
"2026-04-15T14:30:00-07:00" → "2026-04-15 14:30:00" (drop TZ offset, use local time)
In Excel: =TEXT(DATEVALUE(LEFT(A2,10)),"YYYY-MM-DD") extracts the date portion from any Shopify ISO timestamp regardless of the time and timezone components.
Fix 3: Order Data Object Mapping
Orders don't belong in the Contact object. They belong in Deals (Salesforce/HubSpot), Potentials (Zoho), or a custom object depending on your CRM. Importing order data as Contact records creates one Contact per order instead of one Contact per customer.
ECOMMERCE → CRM OBJECT MAPPING:
Use case: Track customer purchase history
→ Import orders as Deals/Opportunities linked to the Contact
→ One Deal per order, Contact = the customer
→ Deal Amount = order total, Close Date = order date, Stage = "Closed Won"
Use case: Track customer lifetime value on Contact
→ Summarize order history as custom fields on Contact
→ Custom fields: Total Orders, Total Spent, Last Order Date, First Order Date
→ Import once; update via sync going forward
Use case: Full order line item history
→ Requires a product catalog in your CRM
→ Import products first → then Contacts → then Deals → then Deal Line Items
→ Salesforce Products, HubSpot Products Library, Zoho Products must exist first
Use case: Marketing segmentation only
→ Import customers as Contacts with order summary fields
→ Don't import individual orders — too much data for CRM use case
→ Use tags or custom fields: "VIP", "Lapsed 90 days", "High AOV"
Fix 4: Price and Revenue Field Formatting
E-commerce exports vary on price formatting. Shopify typically exports prices as plain decimals (correct). WooCommerce exports sometimes include currency symbols depending on locale settings. Verify before importing.
❌ BROKEN — price formatting that fails CRM currency fields:
WooCommerce export (European locale):
order_total: "1.250,75" → European number format (period = thousands, comma = decimal)
line_total: "€89,99" → currency symbol + European decimal
shipping: "12,50 EUR" → currency symbol + trailing text
Salesforce Currency field expects:
1250.75
89.99
12.50
FIXED:
1250.75 (swap period/comma, strip currency)
89.99 (strip €, convert comma decimal to period)
12.50 (strip EUR and space)
For WooCommerce stores with European locale settings, every numeric field needs both the currency symbol stripped and the decimal format converted. Data Validator catches these format violations across your entire order export in your browser.
Fix 5: Product SKU and Catalog Matching
If you're importing order line items that reference products, the CRM's product catalog must contain matching SKU entries before the import runs. Line items that reference non-existent SKUs either fail or create orphaned records.
❌ BROKEN — order line item references SKU not in CRM catalog:
Shopify order line item export:
order_id, sku, product_name, quantity, price
ORD-4521, WIDGET-001, Blue Widget 12oz, 2, 29.99
ORD-4521, WIDGET-002, Red Widget 8oz, 1, 24.99
ORD-4521, BUNDLE-X, Summer Bundle, 1, 79.99
CRM product catalog contains: WIDGET-001, WIDGET-002
Missing: BUNDLE-X
Import result:
- WIDGET-001 line item: linked correctly
- WIDGET-002 line item: linked correctly
- BUNDLE-X line item: "Product not found" or imported as unlinked text
FIXED:
Step 1: Export SKU list from CRM product catalog
Step 2: Compare against all SKUs in the order export
Step 3: Add missing products to CRM catalog before importing orders
Step 4: For bundles/custom SKUs: create a "Bundle" product type in CRM catalog
Common Scenarios
DTC brand importing customer LTV for sales segmentation
For DTC brands where the CRM use case is sales outreach rather than full order tracking, import customers as Contacts with aggregated order fields: Total Orders, Total Spent, Last Order Date, AOV (average order value), and a Customer Segment tag (VIP, At-Risk, Lapsed). This gives sales reps the context they need without cluttering the CRM with individual transaction records.
B2B e-commerce with company accounts
For B2B Shopify stores where customers represent companies rather than individuals, import at the Account level (company) before the Contact level (person). Map Shopify's company field to the CRM Account Name, create Accounts first, then import Contacts linked to those Accounts. Without this sequence, Contact records have no Account association.
Syncing ongoing orders after initial import
For ongoing sync (new orders added to CRM regularly), build a recurring import process rather than a one-time migration. The recurring process should: export only orders since the last sync date, deduplicate against existing CRM records before importing, and use update logic for customers who already exist.
Additional Resources
Platform Documentation:
- Shopify — Export Customer and Order Data — Official Shopify data export guide
- WooCommerce — CSV Import Suite — WooCommerce product and order export formats
Technical Standards:
- RFC 4180: CSV Format Specification — Standard CSV structure
- ISO 8601: Date and Time Format — Shopify's timestamp format standard
Privacy & Compliance:
- GDPR Article 5: Principles of Data Processing — Data minimization for customer data handling
Tested: Shopify customer and order export formats, WooCommerce CSV exports. Validated against Salesforce, HubSpot, and Zoho CRM import behavior. March 2026.
PLATFORM SPECIFICATION SOURCE
Platform: Shopify, WooCommerce → Salesforce, HubSpot, Zoho CRM
Sources: Shopify Help Center — Exports; WooCommerce Documentation; CRM import guides
URLs: help.shopify.com | woocommerce.com/document
Verified: March 2026
Next re-verify: June 2026
Shopify and WooCommerce export formats change with platform updates.
Verify timestamp format and field structure against current documentation
before large data migrations.