Field Mapping
ABM.dev maps enriched data from canonical fields to your CRM's native properties. Customize mappings and transformations to match your data model.
How Field Mapping Works
When enrichment completes, ABM.dev translates the standardized canonical fields into your CRM's property format:
90 standardized fields
Format, concat, split
HubSpot, Salesforce, etc.
Bidirectional Sync
Default Mappings
ABM.dev includes sensible defaults for common CRM platforms. These work out of the box with no configuration required.
Person/Contact Fields
| Canonical Field | HubSpot | Salesforce |
|---|---|---|
email | ||
first_name | firstname | FirstName |
last_name | lastname | LastName |
title | jobtitle | Title |
company | company | Company |
phone_number | phone | Phone |
professional_profile_url | linkedin_url | LinkedIn_URL__c |
office_location | city | MailingCity |
Company/Account Fields
| Canonical Field | HubSpot | Salesforce |
|---|---|---|
firm_name | name | Name |
website_url | website | Website |
industry | industry | Industry |
employees | numberofemployees | NumberOfEmployees |
city | city | BillingCity |
country_region | country | BillingCountry |
description | description | Description |
revenue | annualrevenue | AnnualRevenue |
Transformations
When canonical field values need to be modified before writing to your CRM, transformations handle the conversion:
DateFormat
Parse and format dates between systems
2024-01-15 → Jan 15, 2024Concat
Combine multiple fields into one
first_name + last_name → full_nameSplit
Decompose a field into multiple values
San Francisco, CA → city: San Francisco, state: CAFormat
Pattern-based string formatting
+1-555-0123 → (555) 012-3123Uppercase/Lowercase
Case conversion for consistency
engineering → ENGINEERINGTrim
Remove leading/trailing whitespace
Jane Smith → Jane SmithCustom Field Mappings
Map canonical or org-defined custom fields to CRM properties via the destinations API:
// Map canonical fields to HubSpot properties via destinations
// POST /v2/destinations
// Map a canonical field (mode: route + source_canonical_field)
const dest1 = await fetch("https://api.abm.dev/v2/destinations", {
method: "POST",
headers: { "Authorization": "Bearer YOUR_JWT", "Content-Type": "application/json" },
body: JSON.stringify({
mode: "route",
source_canonical_field: "job_title", // canonical field name
crm_property: "jobtitle", // HubSpot property
object_type: "contact",
integration_id: "550e8400-e29b-41d4-a716-446655440000"
})
});
// Map an org custom field (mode: route + source_custom_field)
const dest2 = await fetch("https://api.abm.dev/v2/destinations", {
method: "POST",
headers: { "Authorization": "Bearer YOUR_JWT", "Content-Type": "application/json" },
body: JSON.stringify({
mode: "route",
source_custom_field: "matched_persona", // org custom field key
crm_property: "abm_persona", // HubSpot property
object_type: "contact",
integration_id: "550e8400-e29b-41d4-a716-446655440000"
})
});
// List the org's canonical-field config (with current destination assignments)
// GET /v2/config/fields
const fields = await fetch("https://api.abm.dev/v2/config/fields", {
headers: { "Authorization": "Bearer YOUR_JWT" }
});Mapping Directions
Write (ABM.dev → CRM)
Enriched data flows from ABM.dev to your CRM. Use this for fields you want to populate or update in your CRM after enrichment.
Read (CRM → ABM.dev)
Existing CRM data is read into ABM.dev to provide context during enrichment. Useful for using CRM data as enrichment input.
Bidirectional
Data flows both ways. CRM data is read for context, and enriched data is written back. This is the most common configuration for core fields.
Destination Ordering
Each destination maps one source field to one CRM property. To control which value lands when multiple sources could populate the same property, create separate destinations and manage precedence through your enrichment logic or org custom-field definitions:
// Two destinations both writing to the "email" HubSpot property.
// The enrichment worker uses the first populated source field it finds.
// POST /v2/destinations
await fetch("https://api.abm.dev/v2/destinations", {
method: "POST",
headers: { "Authorization": "Bearer YOUR_JWT", "Content-Type": "application/json" },
body: JSON.stringify({
mode: "route",
source_canonical_field: "email", // primary source
crm_property: "email",
object_type: "contact",
integration_id: "550e8400-e29b-41d4-a716-446655440000"
})
});
await fetch("https://api.abm.dev/v2/destinations", {
method: "POST",
headers: { "Authorization": "Bearer YOUR_JWT", "Content-Type": "application/json" },
body: JSON.stringify({
mode: "route",
source_custom_field: "secondary_email", // org custom field fallback
crm_property: "email",
object_type: "contact",
integration_id: "550e8400-e29b-41d4-a716-446655440000"
})
});Source Precedence
/dashboard/fields to extend the canonical set.