Bulk import contacts from spreadsheets, other CRMs, or databases with intelligent duplicate handling.
Prerequisites #
- CSV file with UTF-8 encoding
- Unique identifier field (email, phone, or custom)
- Administrator permissions
- Database backup (critical for large imports)
Preparing Your CSV #
Format Requirements #
- UTF-8 encoding
- Comma-separated (.csv)
- Headers in first row
- One contact per row
<span class="hljs-selector-tag">email</span>,<span class="hljs-selector-tag">first_name</span>,<span class="hljs-selector-tag">last_name</span>,<span class="hljs-selector-tag">phone</span>,<span class="hljs-selector-tag">city</span>,<span class="hljs-selector-tag">company</span>
<span class="hljs-selector-tag">john</span>@<span class="hljs-keyword">example</span>.<span class="hljs-keyword">com</span>,<span class="hljs-keyword">John</span>,<span class="hljs-keyword">Doe</span>,+<span class="hljs-keyword">1</span>-<span class="hljs-keyword">555</span>-<span class="hljs-keyword">0123</span>,<span class="hljs-keyword">New</span> York,Acme Inc

Supported Fields #
- Standard: email, first_name, last_name, phone, city, state, country, postal_code
- Custom: Any custom field slug
- Special: lists, tags (comma-separated in quotes)
Data Formatting #
| Field | Valid | Invalid | |
|---|---|---|---|
| [email protected] | john@example | ||
| Phone | +1-555-0123 | 555-CALL-NOW | |
| Dates | 2026-02-03 | 03-Feb-2026 | |
| Lists/Tags | “Newsletter, VIP” | Newsletter\ | VIP |
Import Process #
1. Access Import Tool #
PloverCRM → Contacts → Import/Export → Import tab

2. Upload CSV #
Click Choose File → Select CSV → Upload and Analyze
3. Map Fields #
Auto-detected mappings shown. Manually map unmapped columns:
CSV <span class="hljs-keyword">Column</span> → PloverCRM Field
fname → <span class="hljs-keyword">First</span> Name
organization → Company (Custom)
notes → -- <span class="hljs-keyword">Skip</span> --

4. Configure Options #
Duplicate Handling:
- Skip: Don’t import if exists (safest)
- Update: Update with new data (most common)
- Create Anyway: Not recommended
Assign Lists/Tags: Optionally assign all imports to specific lists/tags
5. Review & Start #
Review summary → Click Start Import
<span class="hljs-string">Total:</span> <span class="hljs-number">1</span>,<span class="hljs-number">250</span> rows
Mapped <span class="hljs-string">fields:</span> <span class="hljs-number">8</span>
Duplicate <span class="hljs-string">handling:</span> Update Existing

6. Monitor Progress #
Import runs in batches (50 at a time). Don’t close browser.
<span class="hljs-keyword">Progress: </span>250/1,250 (20%)
Created: 180 | Updated: 65 | Skipped: 5 | Errors: 0
7. Review Results #
✓ <span class="hljs-keyword">Import</span> completed!
Total: <span class="hljs-number">1</span>,<span class="hljs-number">250</span> | <span class="hljs-type">Created</span>: <span class="hljs-number">1</span>,<span class="hljs-number">100</span> | <span class="hljs-type">Updated</span>: <span class="hljs-number">120</span> | <span class="hljs-type">Errors</span>: <span class="hljs-number">5</span>
View error log for details. Fix and re-import failed rows.

Advanced Options #
Custom Fields #
- Create fields first (PloverCRM → Custom Fields)
- Use exact field slug as CSV header
- Match field types
Lists and Tags #
In CSV:
<span class="hljs-selector-tag">email</span>,<span class="hljs-selector-tag">lists</span>,<span class="hljs-selector-tag">tags</span>
<span class="hljs-selector-tag">john</span>@<span class="hljs-keyword">example</span>.<span class="hljs-keyword">com</span>,"<span class="hljs-keyword">Newsletter</span>, VIP<span class="hljs-string">","</span>Hot Lead, Enterprise<span class="hljs-string">"</span>
Or: Assign during import wizard Or: Use IDs: "1,3,5"
Large Imports (10,000+) #
- Split into 5,000-row files
- Contact your hosting provider to increase server limits if needed
- Import off-peak hours
- Consider using WP-CLI for massive imports
Duplicate Handling #
- Skip: Safest, leaves existing unchanged
- Update: Updates only fields in CSV, doesn’t clear empty fields
- Create Anyway: Use with caution
Troubleshooting #
| Problem | Solution |
|---|---|
| Import fails | Check field mapping, verify required field, test small file |
| Invalid format | Check UTF-8 encoding, headers in row 1, remove blank rows |
| High errors | Review error log, check email formats, verify field slugs |
| Timeout | Split file, increase PHP limits, import off-peak |
| Duplicates created | Verify unique field mapping, check value matches |
Best Practices #
Before:
- Backup database
- Clean data (remove duplicates, validate emails)
- Test with 10-20 row sample
- Create custom fields first
During:
- Monitor progress
- Don’t interrupt (1,000 contacts ≈ 2-3 min)
After:
- Review error log
- Re-import failed rows
- Spot-check contacts
- Verify lists/tags
Export-Edit-Reimport #
- Export contacts
- Edit CSV
- Re-import with “Update Existing”
Useful for bulk updates and corrections.
Last updated: February 3, 2026