A poorly formatted contact list breaks imports, corrupts personalizations, and inflates bounce rates. This guide covers the column structure that works across every major platform, the cleaning steps every list needs before upload, and how to move data between tools without losing anything along the way.
Standard column schema
Column naming inconsistencies are the most common cause of failed imports. A column named First Name in one export becomes first_name in one tool, FirstName in another, and fname in a third. Standardizing to snake_case before any upload eliminates the mapping problem entirely.
The schema below is compatible with SmartLead, Instantly, HubSpot, Salesforce, Airtable, and most common databases without any column remapping.
| Column | Format | Example | Notes |
|---|---|---|---|
first_name | Text | Ethan | Title case. Check for ALL CAPS entries. |
last_name | Text | Choi | Title case. |
email | Text | ethan@simplesend.io | Always lowercase. No trailing spaces. |
company | Text | SimpleSend | Standardize variations (Google vs Google LLC). |
title | Text | Founder | Job title as listed on LinkedIn. |
industry | Text | SaaS | Use consistent categories across the list. |
website | Text | simplesend.io | No trailing slash. Omit https:// unless required. |
linkedin_url | Text | linkedin.com/in/ethanchoi | Profile URL without parameters. |
city | Text | San Francisco | |
state | Text | CA | 2-letter US state codes. |
country | Text | US | ISO 3166-1 alpha-2 codes. |
phone | Text | +14155551234 | E.164 format for international compatibility. |
status | Text | active | Values: active, unsubscribed, bounced. |
tags | Text | warm-lead;enterprise | Semicolon-delimited for multi-value fields. |
source | Text | apollo | Where the contact originated. |
date_added | Date | 2026-06-01 | ISO 8601 format only (YYYY-MM-DD). |
firstname), their import mapper handles the conversion. Starting from snake_case gives you something clean to map from in all directions.Cleaning your list before upload
Raw lists from Apollo, LinkedIn exports, or purchased data sources are almost always inconsistent. Running through the steps below before any upload will prevent the majority of import errors and deliverability problems.
Step 1: Deduplicate on email
Email address is your primary key. Two rows with the same email will result in one contact receiving your sequence twice, often from different campaign steps. This looks unprofessional and burns reply opportunities.
In Excel or Google Sheets: Data > Remove Duplicates with email as the only selected column.
In Python (pandas):
df = df.drop_duplicates(subset='email', keep='first')If you are merging multiple list exports, deduplicate after combining them all into a single file rather than deduplicating each file separately.
Step 2: Normalize email case and trim whitespace
Email addresses should always be lowercase. Ethan@SimpleSend.IO and ethan@simplesend.io are the same address, but most platforms treat them as separate contacts.
In Excel: use =LOWER(TRIM(A2)) in a helper column, then paste-as-values over the original. The TRIM removes leading or trailing spaces, which are invisible and commonly cause silent send failures.
JOHN@COMPANY.COM
user@domain.co
john@company.com
user@domain.co
Step 3: Verify emails before sending
Never upload a raw list directly to a sending platform. Hard bounce rates above 2% signal poor list quality to inbox providers and can result in account-level deliverability penalties or suspension. This threshold is enforced at the ESP level by platforms including SendGrid and Mailchimp.
Verification services check whether an email address actually exists before you send to it. The result categories are:
| Result | Meaning | Action |
|---|---|---|
| Valid | Address exists and will accept mail | Safe to send |
| Invalid | Address does not exist | Remove immediately |
| Catch-all | Server accepts all addresses, real or not | Send cautiously or skip for cold outreach |
| Disposable | Temporary or throwaway address | Remove |
| Unknown | Server did not respond to verification | Send cautiously, monitor bounces closely |
Catch-all addresses are worth special attention. They verify as "valid" because the server accepts the connection, but many of those addresses do not map to a real inbox. For cold outreach, removing catch-alls from your initial list is conservative but safe.
Recommended verification tools:
- NeverBounce: bulk verification, integrates directly with most ESPs.
- ZeroBounce: also detects spam traps and abuse emails.
- Bouncer: strong catch-all detection.
- Kickbox: developer-friendly API with real-time and bulk options.
Handling personalization fields
Personalization variables are only reliable if the underlying data is clean. Before running a campaign that uses {{first_name}}, {{company}}, or any custom variable, the fields need a quick audit.
Setting fallback values
Any contact with a blank personalization field will produce broken output if fallbacks are not configured. A sequence opening with "Hey ," is an immediate credibility problem.
The cleanest approach is to add a display column for each variable you plan to use, with a fallback baked in:
=IF(TRIM(A2)="","there",TRIM(A2))This produces "there" when first_name is blank, so your opener becomes "Hey there," instead of "Hey ,". Use the display column in your sequences, not the raw data column.
Common fallbacks by field:
| Field | Fallback | Example output |
|---|---|---|
first_name | "there" | Hey there, |
company | "your team" | How is your team handling… |
title | "your role" | Given your role… |
Name casing
ALL CAPS names or all-lowercase names look off in a personalized opener. In Excel, =PROPER(A2) fixes most cases, but it handles names like "McDonald" or "O'Brien" incorrectly. For a large list, sort the first_name column A to Z and quickly scan for outliers.
Special characters and encoding
Names with accented characters (é, ñ, ü) or apostrophes can break in tools that are not configured for UTF-8. Always save CSV files as UTF-8 encoded, not the default Excel format.
In Excel: File > Save As > select "CSV UTF-8 (Comma delimited)" from the format dropdown. The option labeled simply "CSV" uses a different encoding that drops international characters.
Platform-to-platform data transfers
General rules for any transfer
- Always export as CSV, not XLSX. Excel files carry formatting metadata that can corrupt on import. CSV is universally clean.
- Use ISO 8601 for all dates: YYYY-MM-DD. Date formats like "06/01/2026" parse differently across regions.
- Test with 10 contacts first. Import a small sample, verify personalizations display, and check no fields got dropped before importing your full list.
- Archive raw files before modifying. Keep a copy named with the date (
prospects_2026-06-01_raw.csv) before any cleaning.
Exporting from Apollo
Apollo exports use its own column naming convention. Before importing anywhere else, rename columns to match your standard schema. Drop Apollo-specific columns you will not use. Remove contacts flagged "Do Not Contact" before export, or filter immediately after.
Exporting from LinkedIn Sales Navigator
LinkedIn's native export is limited to basic profile data. For more complete contact data, tools like PhantomBuster or Evaboot extract structured data from Sales Navigator searches.
Importing into SmartLead
SmartLead accepts CSV uploads. Requirements: email column is mandatory, column headers should be snake_case without special characters, file must be UTF-8 encoded. Custom variables you define in SmartLead (like {{custom_line}}) need matching columns in your CSV.
Importing into HubSpot or Salesforce
HubSpot deduplicates on email by default. Salesforce deduplicates based on your configured matching rules. In both cases, clean your email column thoroughly before import. Duplicate contact records created during import require manual cleanup and can corrupt reporting.
Tools reference
| Tool | Purpose | Link |
|---|---|---|
| NeverBounce | Bulk email verification | neverbounce.com |
| ZeroBounce | Verification + spam trap detection | zerobounce.com |
| Bouncer | Strong catch-all detection | usebouncer.com |
| Kickbox | Real-time API verification | kickbox.com |
| Apollo | B2B contact data and enrichment | apollo.io |
| Clay | Multi-source enrichment with AI | clay.com |
| OpenRefine | Advanced data cleaning (free, open source) | openrefine.org |
| Evaboot | LinkedIn Sales Navigator export | evaboot.com |
Troubleshooting common import problems
| Problem | Likely cause | Fix |
|---|---|---|
| Columns do not map on import | Non-standard column names | Rename all headers to snake_case before upload |
| Personalization shows blank | Empty cells in data columns | Add fallback display columns; fill missing values |
| High bounce rate after send | Unverified list | Run through NeverBounce or ZeroBounce first |
| Same contact receives email twice | Duplicate email rows | Deduplicate on email column before upload |
| Characters display as question marks | Wrong CSV encoding | Save as UTF-8, not Latin-1 or Windows-1252 |
| Date fields do not import correctly | Non-standard date format | Convert all dates to YYYY-MM-DD before export |
| Import creates duplicate CRM contacts | Inconsistent email casing | Normalize all emails to lowercase before import |