Import, enrich, validate contacts for Salesforge sequences. Manage DNC (Do Not Contact) lists. Supports CSV import, Clay enrichment mapping, and bulk operations. Use before enrolling contacts into sequences.
Import contacts, validate emails, and manage DNC lists.
Before proceeding: Invoke the
salesforgereference skill to load API rules and field mappings.
Ask user for contact source:
| Source | Action |
|---|---|
| Local CSV file | User provides a file path. Read with Read tool, auto-detect columns. |
| Clay export (CSV) | User provides Clay export path or pastes Clay table URL. Columns are pre-enriched — map directly. |
| Apollo export | Map Apollo fields to Salesforge format |
| Manual paste | Parse structured text (name, email, company) |
| Salesforge search | Search and import directly |
If user provides a file path (e.g., /path/to/leads.csv):
Example:
User: "import contacts from /Users/artyom/clients/galley/lists/galley-tier1.csv"
→ Read file → detect headers → map → validate → import
Clay exports come as CSV with enriched columns. Two input methods:
Method A — Local file: User exports from Clay to CSV, provides local path. Same flow as Local CSV but with Clay-specific column names:
| Clay Column | Salesforge Field |
|---|---|
| First Name | first_name |
| Last Name | last_name |
| Work Email / Email | |
| Company Name / Company | company |
| Job Title / Title | job_title |
| LinkedIn URL / Person LinkedIn URL | linkedin_url |
| Phone / Work Phone | phone |
| (any other column) | custom variable |
Method B — Paste from Clay: User copies rows from Clay table. Parse tab-separated or comma-separated text. First row = headers.
Clay-specific handling:
Map source columns to Salesforge contact fields:
| Salesforge Field | Required | Common Source Names |
|---|---|---|
email | YES | Email, Email Address, email_address |
first_name | Yes | First Name, firstName, first |
last_name | Yes | Last Name, lastName, last |
company | Recommended | Company, Company Name, company_name |
job_title | Recommended | Title, Job Title, job_title, Position |
industry | Optional | Industry, Vertical |
linkedin_url | Optional | LinkedIn, LinkedIn URL, linkedin |
phone | Optional | Phone, Phone Number, mobile |
Custom variables (for personalization):
Any additional columns become custom variables automatically.
Examples: pain_point, competitor_tool, custom_first_line, tech_stack
Show the mapping to user and ask for confirmation before importing.
Before import, check:
Report:
Total rows: [N]
Valid: [N] (ready to import)
Invalid email: [N] (skipped)
Duplicates: [N] (first occurrence kept)
On DNC list: [N] (skipped)
Missing required fields: [N] (skipped)
Ask user to confirm before proceeding.
1. Verify workspace (GET /workspaces/current)
2. Import contacts:
- If ≤ 50 contacts: individual POST /contacts for each
- If > 50 contacts: POST /contacts/bulk (batch import)
3. Track results:
- Imported: [N]
- Skipped (already exists): [N]
- Failed: [N] with reasons
4. Return imported contact IDs for enrollment
If user requests enrichment via Salesforge:
1. For each contact missing key fields:
- Use Salesforge enrichment API (endpoint TBD)
- Fields to enrich: email, phone, linkedin_url, company size, industry
2. Cost estimation before running:
- "[N] contacts × [cost/credit] = estimated [total] credits"
- Ask user to confirm
3. Update contacts with enriched data
POST /dnc
{
"type": "email" | "domain",
"value": "[email protected]" | "example.com"
}
Read from CSV or paste:
Before any import:
| Error | Response |
|---|---|
| 409 Contact exists | Skip, count as "already imported" |
| 422 Invalid email | Skip row, add to error report |
| 429 Rate limited | Wait 60s, retry batch |
| Bulk import partially fails | Report which rows failed, offer retry for failed subset |
| Enrichment credit insufficient | Show remaining credits, ask user to top up or skip |