---
# === IDENTITY ===
id: business/lead-generation/lead-list-output-formatting/2026
canonical_question: "How do I format lead lists — standardized schema, CRM import formatting per platform, personalization angles?"
aliases:
  - "How to format lead lists for CRM import"
  - "Standardized lead list schema for Salesforce and HubSpot"
  - "Lead data formatting and CRM-ready export with personalization columns"
entity_type: execution_recipe
domain: business > lead-generation > lead list output formatting
region: global
jurisdiction: global
temporal_scope: 2024-2026

# === VERIFICATION ===
last_verified: 2026-03-11
confidence: 0.88
version: 1.0
first_published: 2026-03-11

# === TEMPORAL VALIDITY ===
temporal_validity:
  status: evolving
  last_breaking_change: null
  next_review: 2026-09-07
  change_sensitivity: medium

# === CONSTRAINTS ===
constraints:
  - "CRM field mapping varies by platform — Salesforce requires exact API names, HubSpot maps by header"
  - "Email must be the deduplication key for all CRM platforms"
  - "HubSpot free: 15M records max, 512MB upload. Salesforce: 50,000 records per batch via Data Loader"
  - "Date fields must match target CRM format — Salesforce uses YYYY-MM-DD, HubSpot accepts multiple formats"
  - "Personalization columns must not contain PII that violates GDPR if targeting EU contacts"

# === SKIP CONDITIONS ===
skip_this_unit_if:
  - condition: "Leads not yet scraped or enriched"
    use_instead: "Search knowledgelib.io for lead list scraping then enrichment — no combined unit"
  - condition: "Need outreach sequence setup, not just formatting"
    use_instead: "business/lead-generation/outreach-sequence-loading/2026"

# === AGENT HINTS ===
inputs_needed:
  - key: target_crm
    question: "Which CRM will receive the leads?"
    type: choice
    options: ["Salesforce", "HubSpot", "Pipedrive", "Apollo.io", "No CRM — CSV only"]
  - key: outreach_tool
    question: "Which outreach tool will consume the list?"
    type: choice
    options: ["Instantly", "Lemlist", "Apollo", "HubSpot Sequences", "No outreach tool"]
  - key: lead_count
    question: "How many leads in the list?"
    type: choice
    options: ["Under 200", "200-1,000", "1,000-10,000", "10,000+"]

# === EXECUTION METADATA ===
execution:
  required_inputs:
    - name: "Raw lead data"
      source: "lead-scraping-enrichment-pipeline or manual list"
      format: "CSV or spreadsheet with at minimum: name, email, company"
    - name: "ICP definition"
      source: "agents/startup/persona-builder"
      format: "structured data"
  outputs:
    - name: "CRM-ready lead file"
      format: "CSV"
      description: "Deduplicated, validated lead list with CRM-specific column headers and formatting"
    - name: "Outreach-tool import file"
      format: "CSV"
      description: "Subset with personalization columns mapped to outreach tool variables"
    - name: "Quality report"
      format: "JSON"
      description: "Completeness scores, duplicate count, format validation results"
  tools_required:
    - name: "Google Sheets or Excel"
      purpose: "Data cleaning and column mapping"
      tier: free
      cost: "$0"
      alternatives: ["Python pandas", "OpenRefine"]
    - name: "NeverBounce or ZeroBounce"
      purpose: "Email verification before import"
      tier: paid
      cost: "$0.008/email (NeverBounce) or $0.01/email (ZeroBounce)"
      alternatives: ["MillionVerifier ($0.0005/email)", "Reoon (free tier: 100/day)"]
  credentials_needed:
    - service: "Target CRM"
      type: "API key or login"
      where_to_get: "CRM admin settings"
      free_tier_limits: "HubSpot free: 15M records; Salesforce: requires paid license"
    - service: "Email verification service"
      type: "API key"
      where_to_get: "https://neverbounce.com or https://zerobounce.net"
      free_tier_limits: "NeverBounce: 1,000 free; ZeroBounce: 100 free"
  estimated_duration: "20-45 minutes for 200-500 leads"
  estimated_cost: "$0-$10 depending on email verification volume"

# === DISTRIBUTION ===
canonical_source: "https://knowledgelib.io/business/lead-generation/lead-list-output-formatting/2026"
suggested_citation: "Source: knowledgelib.io — AI Knowledge Library (verified 2026-03-11)"

# === RELATED UNITS ===
related_kos:
  feeds_into:
    - id: "business/lead-generation/outreach-sequence-loading/2026"
      label: "Outreach sequence loading"
  related_to:
    - id: "business/customer-research/ideal-customer-profile-framework/2026"
      label: "ICP framework — firmographic/demographic criteria, behavioral signals, disqualifiers, and a weighted scoring model"
  alternative_to: []

# === SOURCES ===
sources:
  - id: src1
    title: "Format import files — HubSpot Knowledge Base"
    author: HubSpot
    url: https://knowledge.hubspot.com/import-and-export/set-up-your-import-file
    type: official_docs
    published: 2025-06-01
    reliability: authoritative
  - id: src2
    title: "Prepare a CSV File for Import in Salesforce"
    author: Salesforce
    url: https://help.salesforce.com/s/articleView?id=000381876&language=en_US&type=1
    type: official_docs
    published: 2025-01-01
    reliability: authoritative
  - id: src3
    title: "Import CSV to Salesforce: The Ultimate Guide"
    author: Skyvia
    url: https://blog.skyvia.com/import-csv-into-salesforce/
    type: technical_blog
    published: 2025-09-15
    reliability: high
  - id: src4
    title: "Instantly.ai API V2 — Schemas"
    author: Instantly
    url: https://developer.instantly.ai/api/v2/schemas
    type: official_docs
    published: 2025-12-01
    reliability: authoritative
  - id: src5
    title: "Lemlist Campaign Import — Help Center"
    author: Lemlist
    url: http://help.lemlist.com/en/articles/4452686-create-a-lemlist-campaign
    type: official_docs
    published: 2025-08-01
    reliability: authoritative
  - id: src6
    title: "HubSpot CRM Imports API Reference"
    author: HubSpot
    url: https://developers.hubspot.com/docs/api-reference/crm-imports-v3/guide
    type: official_docs
    published: 2025-10-01
    reliability: authoritative
---

# Lead List Output Formatting

## Purpose

This recipe transforms raw lead data into CRM-ready and outreach-tool-ready import files with standardized schemas, platform-specific column mappings, and personalization angles. The output is a validated, deduplicated CSV file that can be directly imported into Salesforce, HubSpot, Pipedrive, or outreach tools (Instantly, Lemlist, Apollo) without manual field mapping.

## Prerequisites

- [ ] **Raw lead data** — CSV or spreadsheet with minimum columns: first_name, last_name, email, company_name
- [ ] **ICP definition** — to filter and tag leads by fit score
- [ ] **Target CRM credentials** — login or API key for the destination platform
- [ ] **Email verification account** — NeverBounce, ZeroBounce, or MillionVerifier (free tier sufficient for <1,000 leads)
- [ ] **Google Sheets, Excel, or Python 3.10+** — for data transformation

## Constraints

- CRM field names are case-sensitive in Salesforce. Use exact API names (e.g., `FirstName`, `LastName`, `Email`, `Company`) — not display labels. [src2]
- HubSpot accepts `.csv`, `.xlsx`, or `.xls` files up to 512MB for paid accounts, 20MB for free. The first row must contain headers matching HubSpot property internal names. [src1]
- Email addresses serve as the universal deduplication key. Every CRM and outreach tool uses email to detect and merge duplicates. [src6]
- Date fields: Salesforce requires `YYYY-MM-DD`. HubSpot accepts `MM/DD/YYYY`, `YYYY-MM-DD`, or Unix timestamp (midnight UTC). [src3]
- Outreach tools require specific variable names — Instantly uses `{{firstName}}`, Lemlist uses `{{firstName}}`, Apollo uses `{{first_name}}`. [src4][src5]

## Tool Selection Decision

```
Which path?
├── Leads < 200 AND non-technical
│   └── PATH A: Google Sheets manual mapping
├── Leads 200-1,000 AND semi-technical
│   └── PATH B: Google Sheets with formulas + templates
├── Leads 1,000-10,000 AND developer
│   └── PATH C: Python pandas script
└── Leads 10,000+ OR recurring pipeline
    └── PATH D: Python + CRM API direct push
```

| Path | Tools | Cost | Speed | Output Quality |
|------|-------|------|-------|---------------|
| A: Manual Sheets | Google Sheets | $0 | 30 min | Medium |
| B: Sheets + Templates | Google Sheets + formulas | $0 | 20 min | High |
| C: Python Script | Python + pandas | $0 | 15 min | High |
| D: API Pipeline | Python + CRM API | $0 | 10 min | Excellent |

## Execution Flow

### Step 1: Audit and Clean Raw Data

**Duration**: 5-10 minutes
**Tool**: Google Sheets or Python

Review raw lead data for completeness and quality. Remove rows missing email. Standardize name capitalization. Split full names into first_name and last_name if combined.

Required column audit checklist:
- email (required, unique) — validate format with regex
- first_name (required) — Title Case
- last_name (required) — Title Case
- company_name (required)
- job_title (recommended)
- linkedin_url (recommended)
- phone (optional) — E.164 format (+1XXXXXXXXXX)
- location (optional) — City, State/Country

**Verify**: Zero rows with empty email. All names in Title Case. No obvious test/spam entries.
**If failed**: Use formula `=PROPER(TRIM(A2))` for name cleanup. Delete rows with invalid emails.

### Step 2: Verify Emails

**Duration**: 5-15 minutes depending on volume
**Tool**: NeverBounce, ZeroBounce, or MillionVerifier

Upload email column to verification service. Remove emails scoring below 90% confidence. Mark catch-all domains for manual review.

- NeverBounce: Upload CSV, map email column, download results with `result` column
- ZeroBounce: Bulk upload, returns `status` (valid/invalid/catch-all/unknown)
- MillionVerifier: Upload, filter to `ok` status only

**Verify**: Verification rate > 85%. If below, data source quality is suspect.
**If failed**: Remove all `invalid` and `unknown` results. Review `catch-all` manually — keep only if company domain is recognizable.

### Step 3: Map Columns to Target CRM Schema

**Duration**: 5-10 minutes
**Tool**: Google Sheets or Python

Rename columns to match target platform's required field names.

**Salesforce field mapping:**
| Your Column | Salesforce API Name |
|-------------|-------------------|
| first_name | FirstName |
| last_name | LastName |
| email | Email |
| company_name | Company |
| job_title | Title |
| phone | Phone |
| linkedin_url | Website or Custom Field |

**HubSpot field mapping:**
| Your Column | HubSpot Internal Name |
|-------------|---------------------|
| first_name | firstname |
| last_name | lastname |
| email | email |
| company_name | company |
| job_title | jobtitle |
| phone | phone |
| linkedin_url | hs_linkedin_url |

**Outreach tool variable mapping:**
| Your Column | Instantly | Lemlist | Apollo |
|-------------|-----------|---------|--------|
| email | Email (required) | email | email |
| first_name | First Name | firstName | first_name |
| last_name | Last Name | lastName | last_name |
| company_name | Company Name | companyName | organization_name |
| job_title | Job Title | jobTitle | title |
| custom_1 | Personalization | customAttribute1 | custom_field_1 |

**Verify**: All required columns present for target platform. No column name typos.
**If failed**: Re-check against official documentation. CRM import wizards will show unmapped columns — fix before confirming import.

### Step 4: Add Personalization Columns

**Duration**: 5-10 minutes
**Tool**: Google Sheets formulas or manual review

Add 2-3 personalization columns used in outreach templates:

- `personalization_line` — One sentence referencing something specific about the lead (recent company news, shared connection, relevant content they posted)
- `pain_point` — Mapped from ICP definition to their industry/role
- `value_prop` — One-liner value proposition tailored to their segment

For batch personalization at scale, use this formula pattern:
`=IF(job_title contains "VP", "As a VP of {department}, you likely...", IF(job_title contains "Director", "Directors in {industry} often face...", "default angle"))`

**Verify**: Every lead has at least one non-empty personalization column. No placeholder text remaining.
**If failed**: Use fallback personalization based on company industry or size.

### Step 5: Deduplicate and Generate Final Files

**Duration**: 5 minutes
**Tool**: Google Sheets (Remove Duplicates) or Python

Remove duplicates by email. Sort by lead score or company name. Split into separate files if needed (one per CRM, one per outreach tool).

Generate three output files:
1. `leads_crm_import_{platform}_{date}.csv` — Full lead data in CRM format
2. `leads_outreach_{tool}_{date}.csv` — Outreach subset with personalization columns
3. `quality_report.json` — Stats: total leads, verified %, completeness %, duplicate count

**Verify**: File row counts match expected totals. No duplicate emails. All date fields in correct format.
**If failed**: Re-run deduplication. Check for email variants (name@company.com vs name@company.co).

## Output Schema

```json
{
  "output_type": "lead_import_files",
  "format": "CSV",
  "crm_file_columns": [
    {"name": "email", "type": "string", "description": "Primary email address — dedup key", "required": true},
    {"name": "first_name", "type": "string", "description": "Lead first name", "required": true},
    {"name": "last_name", "type": "string", "description": "Lead last name", "required": true},
    {"name": "company_name", "type": "string", "description": "Company or organization name", "required": true},
    {"name": "job_title", "type": "string", "description": "Current job title", "required": false},
    {"name": "phone", "type": "string", "description": "Phone in E.164 format", "required": false},
    {"name": "linkedin_url", "type": "string", "description": "LinkedIn profile URL", "required": false},
    {"name": "lead_source", "type": "string", "description": "How this lead was sourced", "required": false},
    {"name": "lead_score", "type": "number", "description": "ICP fit score 0-100", "required": false}
  ],
  "outreach_file_columns": [
    {"name": "email", "type": "string", "description": "Primary email", "required": true},
    {"name": "first_name", "type": "string", "description": "For greeting personalization", "required": true},
    {"name": "company_name", "type": "string", "description": "For company mention in body", "required": true},
    {"name": "personalization_line", "type": "string", "description": "Custom opening line", "required": true},
    {"name": "pain_point", "type": "string", "description": "Mapped pain point for their role/industry", "required": false},
    {"name": "value_prop", "type": "string", "description": "Tailored value proposition", "required": false}
  ],
  "expected_row_count": "100-5000",
  "sort_order": "lead_score descending",
  "deduplication_key": "email"
}
```

## Quality Benchmarks

| Quality Metric | Minimum Acceptable | Good | Excellent |
|---------------|-------------------|------|-----------|
| Email verification rate | > 80% | > 90% | > 95% |
| Data completeness (all fields) | > 60% | > 80% | > 95% |
| Personalization coverage | > 50% | > 80% | 100% |
| Duplicate rate post-dedup | < 3% | < 1% | 0% |
| CRM import success rate | > 90% | > 95% | 100% |

**If below minimum**: Re-run email verification with a different provider. For low completeness, run enrichment via Apollo or Clearbit before formatting.

## Error Handling

| Error | Likely Cause | Recovery Action |
|-------|-------------|----------------|
| CRM import rejects file | Column headers don't match CRM field names | Check mapping table in Step 3, rename headers exactly |
| Duplicate detection blocks import | Email already exists in CRM | Use CRM's "update existing" option instead of "create new" |
| Date format errors | Wrong date format for target CRM | Convert all dates to YYYY-MM-DD (Salesforce) or Unix timestamp (HubSpot) |
| Character encoding issues | Non-UTF-8 characters in names | Re-save CSV as UTF-8 with BOM |
| Outreach tool rejects personalization | Variable names don't match tool's syntax | Check variable syntax — Instantly: `{{var}}`, Lemlist: `{{var}}` |
| Phone number validation fails | Missing country code or wrong format | Convert all to E.164 format: +{country}{number}, no spaces or dashes |

## Cost Breakdown

| Component | Free Tier | Paid Tier | At Scale |
|-----------|-----------|-----------|----------|
| Data cleaning (Sheets) | $0 | $0 | $0 |
| Email verification | 100-1,000 free credits | $0.003-$0.01/email | $0.001-$0.005/email |
| CRM import | Free (HubSpot) | $0 (included) | $0 (included) |
| Personalization enrichment | Manual ($0) | $0.05-$0.15/lead | $0.02-$0.08/lead |
| **Total for 500 leads** | **$0** | **$5-$15** | **$10-$40** |

## Anti-Patterns

### Wrong: Importing unverified emails directly into CRM
Importing emails without verification leads to 15-30% bounce rates, damages sender reputation, and can get your domain blacklisted. [src2]

### Correct: Verify all emails before import
Run every email through a verification service. Remove invalid addresses. Flag catch-all domains for manual review. Aim for >90% verified before loading into any system.

### Wrong: Using display names as CRM field headers
Headers like "First Name" or "Company" may not match CRM API field names. Salesforce rejects imports with mismatched column names silently — leads appear to import but land in wrong fields. [src3]

### Correct: Use exact API field names from documentation
Map columns to the platform's internal field names: `FirstName` (Salesforce), `firstname` (HubSpot). Always test with a 5-row sample import first.

## When This Matters

Use this recipe after lead scraping and enrichment is complete and before loading outreach sequences. The quality of CRM data directly impacts deliverability, personalization effectiveness, and sales team trust in the pipeline.

## Related Units

- [Lead Scraping & Enrichment Pipeline](/business/lead-generation/lead-scraping-enrichment-pipeline/2026)
- [Outreach Sequence Loading](/business/lead-generation/outreach-sequence-loading/2026)
- [ICP Definition Template](/business/customer-research/icp-definition-template/2026)
