Integration controls at a glance
The first CRM integration often looks simple: connect companies, contacts, leads, and opportunities. That simplicity disappears in a real enterprise environment.
Large organizations adapt their CRM to the way they sell, onboard, support, renew, report, and govern customer relationships. They add fields, create objects, rename labels, introduce approval states, restrict permissions, and build relationships that reflect years of operational decisions.
A product serving multiple enterprise customers is therefore not integrating with one universal Salesforce or HubSpot schema. It is integrating with a different effective schema for every connected account.
At enterprise scale, custom objects and field mappings are not exceptions. They are the operating model of the integration.
The architectural objective is not to eliminate customer variation. It is to contain that variation inside a controlled integration capability so the core product does not become a collection of customer-specific conditionals.
Every tenant has its own effective CRM schema
A tenant-aware schema includes more than object and field names. It includes the constraints required to read, transform, and write data safely:
- Standard and custom objects.
- Stable API identifiers and current user-facing labels.
- Data types, formats, lengths, and calculated status.
- Create, read, update, archive, and search capabilities.
- Required and nullable fields.
- Picklist or enumeration values.
- Lookup, parent-child, and many-to-many relationships.
- Permission restrictions and validation rules.
This information should live in a tenant metadata registry. Each snapshot should be time-stamped, hashable, and associated with the provider account and API version used to retrieve it.
The product itself should still operate on a stable canonical model. An internal customer.status property should not change because one tenant stores it in an account field, another in a custom profile object, and a third derives it from a contract stage.
What this looks like in Salesforce and HubSpot
The architecture is provider-neutral, but implementation cannot be provider-vague. Metadata discovery, relationships, validation, and change delivery must use the mechanisms each CRM actually exposes.
Salesforce
- Use
Describe Globalto list objects visible to the authenticated user. - Use
sObject Describeto inspect fields, labels, types, create/update capabilities, picklists, references, and child relationships for one object. - Use stable API names such as
Renewal__candStage__cas mapping identifiers; display labels separately. - Use Metadata API when the integration must retrieve or manage customization definitions rather than business records.
- Use Change Data Capture and Pub/Sub API for record-change delivery where the required objects and org configuration support it.
HubSpot
- Use the Properties API to retrieve internal property names, labels, types, field types, options, and modification metadata.
- Use the Schemas API to define or inspect custom object schemas and their associations.
- Use the Associations APIs to read and write record relationships and to inspect association definitions and labels.
- Use the Property Validations API where validation rules are available to the account and property type.
- Use webhook subscriptions for supported events, while accounting for differences between current project-based apps and legacy public app configuration.
Record-change events do not replace metadata refresh. Webhooks and Change Data Capture tell the integration that records changed; a separate metadata process is still needed to detect deleted fields, type changes, renamed labels, new enumeration values, and permission drift.
Concrete discovery calls
A Salesforce connector can enumerate available objects and then describe only the objects selected for mapping:
# List objects available to the integration user GET /services/data/v67.0/sobjects/ # Retrieve complete metadata for one object GET /services/data/v67.0/sobjects/Renewal__c/describe
For HubSpot's current date-versioned API, property and custom-object schema discovery can be performed with endpoints such as:
# Retrieve properties for a CRM object GET /crm/properties/2026-03/{objectTypeId} # Retrieve custom object schemas with property and association definitions GET /crm-object-schemas/2026-03/schemas ?includePropertyDefinitions=true &includeAssociationDefinitions=true &includeAuditMetadata=true
Provider versions should be configuration, not scattered string literals. A connector should expose its supported provider version, persist the version used for each metadata snapshot, and make upgrades testable per tenant.
The mapping is a versioned data contract
A field mapping should not be stored as two strings in a database. It is a contract that defines identity, direction, transformation, validation, and failure behavior.
A useful mapping record typically includes:
- Tenant and provider connection.
- Provider object and stable field identifier.
- Canonical entity and property.
- Read, write, or bidirectional direction.
- Transformation rule and null behavior.
- Enumeration map.
- Conflict policy.
- Unknown-value policy.
- Source metadata snapshot and mapping version.
- Draft, active, deprecated, or blocked state.
{
"tenantId": "northstar-eu",
"provider": "salesforce",
"providerVersion": "67.0",
"source": {
"objectApiName": "Renewal__c",
"fieldApiName": "Stage__c"
},
"target": {
"entity": "renewal",
"property": "status"
},
"direction": "bidirectional",
"transform": {
"type": "enum",
"values": {
"Discovery": "open",
"Commercial Review": "qualified",
"Contract Signed": "won"
},
"onUnknown": "quarantine"
},
"metadataSnapshotId": "md_01J...",
"mappingVersion": 12
} Stable API identifiers must be separated from labels. If an administrator renames “Annual Contract Value” to “Committed ARR” but the underlying API name remains unchanged, the mapping can stay active while the UI refreshes the displayed label.
Custom objects turn a field map into a relationship graph
Custom fields extend an existing record. Custom objects introduce new entities such as subscriptions, properties, installations, service agreements, partner programs, or compliance reviews.
For each custom object, the integration must define more than individual properties:
- The canonical entity represented by the object.
- The unique or external identifier used for idempotent upserts.
- The parent records required before a write.
- The lookup and association mechanism used by the provider.
- Relationship cardinality and labels.
- Creation order and missing-parent policy.
- Archive, deletion, merge, and reassignment behavior.
Salesforce exposes reference targets and child relationships through object description metadata. HubSpot separates record associations from association schema definitions, so the connector must preserve both the relationship between records and the type or label that gives that relationship meaning.
A synchronization planner should topologically order writes where dependencies are known. If a subscription requires an account and contract, the runtime must resolve or create those records first instead of relying on incidental queue ordering.
Enumerations require semantic mapping
Field compatibility does not imply value compatibility. Two properties may both be enumerations while representing different business states.
A product may use open, qualified, won, and lost. One customer may use six sales stages; another may use localized labels; a third may encode stages as internal values that differ from visible labels.
Enumeration mapping should support:
- Internal values separated from display labels.
- Many source values mapped to one canonical value.
- Different inbound and outbound maps.
- Inactive, hidden, or newly introduced options.
- An explicit policy for unknown values.
Unknown values should never be silently coerced. Rejecting, quarantining, preserving the raw value, or applying an approved fallback are all valid policies. The correct choice depends on the business impact and must be visible in the mapping configuration.
Validation belongs before publication and inside the runtime
Configuration-time validation
Before a mapping becomes active, validate that the object exists, the field is accessible, types are compatible, required enumerations are mapped, relationship dependencies are resolvable, and the integration user has the necessary operation permissions.
Runtime validation
A structurally valid mapping can still receive a value that violates current provider constraints. The runtime must handle maximum lengths, numeric ranges, required values, duplicate unique identifiers, inactive options, missing parents, and provider-side business rules.
HubSpot exposes dedicated property-validation APIs for supported property types. Salesforce object descriptions provide field-level characteristics, but org-specific validation rules and automation can still reject a record at write time. The connector should therefore normalize provider errors into an internal error taxonomy rather than exposing an opaque raw response.
Return the tenant, provider, object, record identifier, mapping version, field, rejected value category, provider correlation or request ID, retryability, and a remediation message. “Invalid request” is not an operable enterprise error.
Schema drift is a continuous operating condition
CRM administrators change schemas independently of the connected product team. Fields are added, renamed, deleted, made required, converted to another type, or removed from the integration user's permission set. Picklist values and relationships change as workflows evolve.
A practical drift process compares metadata snapshots and classifies the impact on active mappings:
Refresh metadata on connection, on a schedule, after relevant provider errors, and before publishing a mapping that was drafted against an old snapshot. For large tenant portfolios, prioritize objects referenced by active mappings rather than repeatedly describing every object.
The mapping interface is part of the integration architecture
If every field change requires a database edit or engineering ticket, the integration has not reached enterprise scale. Authorized administrators need a controlled operating interface.
The interface should provide:
- Searchable standard and custom object discovery.
- Labels and stable API identifiers displayed together.
- Types, required status, permissions, and allowed values.
- Compatibility filtering for destination properties.
- Enumeration and relationship mapping.
- Sample input and transformed-output preview.
- Draft, review, publish, and rollback states.
- Schema-drift warnings linked to affected mappings.
- Role-based access and approval controls.
- Change history with actor, timestamp, and version diff.
The UI should not merely expose provider metadata. It should translate that metadata into decisions a customer administrator can safely make. An incompatible field should be disabled with an explanation; an unmapped option should be visible before publication; a breaking schema change should link directly to the configuration that needs attention.
A practical operating flow
Instead of organizing the system as a generic list of architectural layers, define the lifecycle that every tenant mapping must pass through.
Discover
Authenticate with tenant-scoped credentials and retrieve only the metadata visible to that connection.
Snapshot
Normalize provider metadata, retain raw payloads for diagnosis, and persist provider and schema versions.
Configure
Create object, field, relationship, enumeration, direction, and conflict mappings in a draft version.
Validate
Check compatibility, permissions, required dependencies, uniqueness, and unresolved values.
Test
Run representative records through a dry-run transformation and provider validation path without changing production data.
Publish
Activate an immutable mapping version through an approval-controlled release.
Synchronize
Apply idempotency, dependency ordering, retry policies, rate-limit handling, and tenant-level isolation.
Observe and adapt
Monitor record outcomes, refresh metadata, classify drift, and roll forward or back through mapping versions.
Operational metrics that matter
- Success, rejection, retry, and quarantine rate by tenant and mapping version.
- Unmapped enumeration values and type mismatches by field.
- Metadata snapshot age and drift events by severity.
- Provider rate-limit consumption and webhook or event-delivery lag.
- Records blocked by missing relationships or permission changes.
- Time from breaking drift detection to published remediation.
Common failure patterns
Hardcoding labels
Labels are editable and localized. Persist stable provider identifiers and keep the latest label as presentation metadata.
Using one global mapping
A global mapping ignores tenant-specific fields, values, relationships, and permissions. Scope configuration and metadata by connected account.
Calling webhooks a schema-drift solution
Record events improve freshness but do not remove the need for metadata snapshots and compatibility checks.
Supporting custom fields without relationship semantics
Custom object records often depend on parents, association types, and provider-specific identifiers. A flat field map cannot represent that graph.
Editing active mappings in place
Without immutable versions, teams cannot reproduce past behavior, run controlled releases, or roll back safely.
Building the connector but not the operating product
Without a mapping UI, audit history, observability, and remediation workflows, enterprise variation becomes a permanent engineering support queue.
Frequently asked questions
01Which Salesforce APIs are relevant to schema-aware mapping?
Use REST API discovery resources such as Describe Global and sObject Describe for runtime object metadata. Use Metadata API for customization definitions and deployment-oriented metadata operations. For supported real-time record changes, evaluate Change Data Capture and Pub/Sub API.
02Which HubSpot APIs are relevant?
Use the Properties API for property definitions, the Schemas API for custom objects, the Associations APIs for relationships, and the official webhook configuration appropriate to the app model. Date-versioned endpoints should be centralized in connector configuration.
03Should mappings use labels or internal names?
Use stable internal or API identifiers for execution and current labels for presentation. A label rename can then update the UI without invalidating a technically compatible mapping.
04How often should metadata be refreshed?
Refresh on connection, on a risk-based schedule, before publishing against an old snapshot, and after provider errors that suggest a schema or permission change. High-impact objects referenced by active mappings should be prioritized.
05Should customers configure mappings themselves?
Authorized customers can manage mappings when the product provides compatibility filtering, previews, validation, approval, immutable versions, audit history, and rollback. Self-service without governance simply moves integration risk into the UI.
Final perspective
There is no universal enterprise CRM schema. Each customer brings its own objects, labels, values, relationships, permissions, and validation behavior.
The scalable response is a tenant-aware integration product: discover the provider's current metadata, normalize it into an internal registry, configure mappings as versioned contracts, validate before and during synchronization, and give administrators a safe interface for change.
Provider mechanics also evolve. Salesforce and HubSpot publish versioned documentation and introduce new API capabilities over time. A production connector should pin supported versions, keep provider knowledge behind clear adapter boundaries, and treat official Salesforce and HubSpot documentation as part of its maintenance process.
The result is not a collection of field mappings. It is an integration capability that can absorb enterprise variation without turning every customer implementation into custom product code.
Official technical references
These links document the provider mechanisms mentioned in this article. They are included for implementation verification and may change as provider APIs evolve.
Build the integration as a product
Make customer-specific CRM complexity operable.
Tespir designs enterprise software as one connected system: canonical data models, provider adapters, mapping and validation services, administrative interfaces, integration testing, observability, and controlled production delivery.
For CRM-connected SaaS products, portals, and operational platforms, this means the customer variation is planned into the architecture and the user experience from the beginning—not handled later through one-off scripts and support tickets.