CRM Sync Pattern
Keep your CRM up to date with enriched company data from Vera. Today there are two ways to sync: CSV export/import (no code) and the Bulk API (programmatic).
Direct Salesforce and HubSpot integrations are on the roadmap. For now, use one of the two methods below.
Method 1: CSV Export/Import (No Code)
The fastest way to get Vera data into your CRM — no developer needed.
Workflow
- Export your accounts/leads from your CRM as CSV (most CRMs support this)
- Upload the CSV to the Vera Dashboard — Vera extracts domains and enriches each company
- Export the enriched results as CSV from the Dashboard
- Import the enriched CSV back into your CRM, mapping Vera columns to your CRM fields
Field Mapping Reference
When importing the enriched CSV back into your CRM, map these Vera columns:
| Vera CSV Column | Salesforce Field | HubSpot Property | What It Contains |
|---|---|---|---|
domain | Website | Company domain name | Match key — use this to link records |
name | Account Name | Company name | Company legal/brand name |
industry | Industry | Industry | Industry classification |
employeeCount | Employees | Number of employees | Range like "50-100" or "1000-5000" |
location | Billing Address | City | Headquarters location |
businessStage | Type | Lifecycle stage | startup, growth, scaleup, enterprise, public |
fundingStatus | Custom field | Custom property | Latest funding round (e.g., "Series B") |
description | Description | Description | Company summary |
confidence | Custom field | Custom property | Data quality score (0-100) |
Create custom fields in your CRM for Vera-specific data like confidence, fundingStatus, and businessStage before importing. This keeps your CRM schema clean and avoids overwriting existing fields.
How Often to Sync
| Team Size | Suggested Cadence | Method |
|---|---|---|
| Small (< 500 accounts) | Weekly or ad-hoc | CSV export/import |
| Medium (500-5,000) | Weekly | CSV or API |
| Large (5,000+) | Daily via API | API with scheduling |
Method 2: Bulk API (Programmatic)
For teams that want automated, recurring sync without manual CSV steps.
Architecture
1. Export domains from CRM (via CRM API)
2. Deduplicate and submit to Vera Bulk API
3. Poll for batch completion
4. Map enriched fields to CRM schema
5. Update CRM records via CRM API
Step 1: Submit Domains
Extract domains from your CRM and submit them to Vera. See the Bulk Enrichment Guide for full API details.
const headers = {
'Authorization': `Bearer ${process.env.VERA_API_KEY}`,
'Content-Type': 'application/json'
};
// Submit batch
const response = await fetch('https://api.veraenrich.com/enrich/bulk', {
method: 'POST',
headers,
body: JSON.stringify({
domains: ['stripe.com', 'shopify.com', 'vercel.com']
})
});
const { batchId, totalDomains } = await response.json();
console.log(`Batch ${batchId}: ${totalDomains} domains`);
Step 2: Poll and Collect Results
// Poll until complete
const maxAttempts = Math.ceil((totalDomains * 3) / 5) + 20;
for (let i = 0; i < maxAttempts; i++) {
const status = await fetch(
`https://api.veraenrich.com/enrich/bulk/${batchId}`,
{ headers: { 'Authorization': headers.Authorization } }
).then(r => r.json());
console.log(`Progress: ${status.processedCount}/${status.totalDomains}`);
if (status.status === 'completed') {
// Results ready — proceed to CRM update
break;
}
await new Promise(r => setTimeout(r, 5000));
}
Step 3: Map to CRM Fields
Map Vera fields to your CRM's custom fields. Adapt the field names for your CRM:
// Generic pattern — adapt for your CRM SDK
const updates = enrichedResults
.filter(r => r.status === 'success')
.map(result => ({
id: crmIdMap[result.domain], // your CRM record ID
fields: {
vera_industry: result.data.industry,
vera_employee_count: result.data.employeeCount,
vera_business_stage: result.data.businessStage,
vera_funding: result.data.fundingStatus,
vera_confidence: result.data.confidence,
vera_enriched_at: new Date().toISOString()
}
}));
// Update in batches (respect your CRM's API limits)
for (let i = 0; i < updates.length; i += 200) {
await crm.bulkUpdate(updates.slice(i, i + 200));
}
For domain extraction from email addresses, see the helper in Integration Patterns.
Scheduling
The Bulk API counts each domain as one enrichment against your monthly quota. A Free plan has 250/month (50/day, 5 requests/minute) — submitting 500 domains in one batch will return a 429 error. Design your sync to stay within your plan limits.
A quota-aware sync processes a chunk of domains per run, then stops until the next scheduled window:
const cron = require('node-cron');
const PLAN_LIMITS = {
free: { monthlyQuota: 250, batchSize: 50 },
starter: { monthlyQuota: 1000, batchSize: 200 },
growth: { monthlyQuota: 10000, batchSize: 500 },
};
const plan = PLAN_LIMITS[process.env.VERA_PLAN || 'free'];
// Run daily at 2 AM — process one batch per run
cron.schedule('0 2 * * *', async () => {
const allDomains = await getUnenrichedDomainsFromCRM();
// Only process what fits in today's budget
const batch = allDomains.slice(0, plan.batchSize);
if (batch.length === 0) {
console.log('No unenriched domains remaining');
return;
}
console.log(`Enriching ${batch.length} of ${allDomains.length} domains`);
const results = await bulkEnrich(batch);
await updateCRM(results);
console.log(`Done. ${allDomains.length - batch.length} domains remaining for next run.`);
});
This pattern spreads enrichment across multiple days. For example, a Free plan syncing 50 domains/day can enrich ~250 accounts over 5 days without hitting quota limits. Upgrade to a paid plan for larger volumes — see Pricing.
You can also use GitHub Actions, AWS Lambda, or any scheduler that can run your sync script on a schedule.
Best Practices
- Deduplicate domains before enriching to avoid wasting quota
- Batch in groups of 500 for optimal processing speed
- Retry failures — collect failed domains and re-submit in a follow-up batch
- Incremental sync — only enrich new or updated records, not your entire CRM each time
- Use
confidenceto flag low-quality records for manual review before importing
Production Checklist
- Custom fields created in CRM for Vera data (industry, confidence, etc.)
- Domain deduplication before enrichment
- Decided on sync method (CSV or API) and cadence
- Error tracking for failed domains
- Incremental sync logic (only new records)
- Cost monitoring (track enrichment quota usage)
Need Help?
- Support Guide
- Email: hi@veraenrich.com
- In-app chat (bottom right in dashboard)