Skip to main content
10 min read

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:

Canonical Fields

90 standardized fields

Transformations

Format, concat, split

CRM Properties

HubSpot, Salesforce, etc.

Bidirectional Sync

Field mappings work in both directions. When you enrich from a CRM contact, we read existing data using the same mappings to provide context for enrichment.

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 FieldHubSpotSalesforce
emailemailEmail
first_namefirstnameFirstName
last_namelastnameLastName
titlejobtitleTitle
companycompanyCompany
phone_numberphonePhone
professional_profile_urllinkedin_urlLinkedIn_URL__c
office_locationcityMailingCity

Company/Account Fields

Canonical FieldHubSpotSalesforce
firm_namenameName
website_urlwebsiteWebsite
industryindustryIndustry
employeesnumberofemployeesNumberOfEmployees
citycityBillingCity
country_regioncountryBillingCountry
descriptiondescriptionDescription
revenueannualrevenueAnnualRevenue

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, 2024

Concat

Combine multiple fields into one

first_name + last_name → full_name

Split

Decompose a field into multiple values

San Francisco, CA → city: San Francisco, state: CA

Format

Pattern-based string formatting

+1-555-0123 → (555) 012-3123

Uppercase/Lowercase

Case conversion for consistency

engineering → ENGINEERING

Trim

Remove leading/trailing whitespace

Jane Smith → Jane Smith

Custom Field Mappings

Map canonical or org-defined custom fields to CRM properties via the destinations API:

Creating destination mappings
// 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:

Creating two destinations for the same CRM property
// 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

Canonical fields take precedence over custom fields in writeback when both destinations target the same CRM property. Define your org custom fields at/dashboard/fields to extend the canonical set.

Related Guides