How unification works
Connect data sources
Connect integrations (HubSpot, Salesforce, LinkedIn, etc.) that sync data models into your warehouse. Each integration model declares which unification type it participates in —
account, contact, accountEvent, or contactEvent.Map references
Each source model maps its columns to unification references — shared identifiers like
domain, email, or linkedinId. Cargo uses these references to determine which records across different sources represent the same entity.Resolve canonical IDs
Cargo builds a mapping table that groups records sharing the same reference values under a single canonical ID. If a HubSpot company and a Salesforce account share the same domain, they receive the same canonical ID.
Unified models
Account
The Account model merges company records from all connected integrations into a single, deduplicated table. Each row represents a unique company, identified by a canonical ID computed from shared references.| Column | Type | Description |
|---|---|---|
id | string | Canonical account ID — unique identifier for this unified company |
domain | string | Company website domain |
linkedin_id | string | LinkedIn company numeric ID |
linkedin_handle | string | LinkedIn company vanity URL slug |
crunchbase_uuid | string | Crunchbase organization UUID |
crunchbase_permalink | string | Crunchbase organization permalink |
twitter_handle | string | X / Twitter company handle |
sales_navigator_id | string | LinkedIn Sales Navigator account ID |
ids | object | Map of source connector models to their original record IDs |
Reference columns (
domain, linkedin_id, etc.) are resolved by taking the highest-priority non-null value across all source records that share the same canonical ID.Contact
The Contact model merges people records from all connected integrations into a single, deduplicated table. Each row represents a unique person, linked to their parent Account viaaccount_id.
| Column | Type | Description |
|---|---|---|
id | string | Canonical contact ID — unique identifier for this unified person |
email | string | Generic email address |
personal_email | string | Personal email address |
work_email | string | Work / professional email address |
linkedin_id | string | LinkedIn member numeric ID |
linkedin_handle | string | LinkedIn member vanity URL slug |
twitter_handle | string | X / Twitter personal handle |
sales_navigator_id | string | LinkedIn Sales Navigator lead ID |
account_id | string | Foreign key to the unified Account id |
ids | object | Map of source connector models to their original record IDs |
The
account_id is resolved through the parent unification mapping — if a source contact model declares a parent relationship to an account model, Cargo automatically links the unified contact to the correct unified account.Account Event
The Account Event model aggregates event data from all connected integrations into a single timeline, where each event is linked to its parent Account.| Column | Type | Description |
|---|---|---|
id | string | Composite event ID (<database_slug>__<model_slug>__<record_id>) |
account_id | string | Foreign key to the unified Account id |
occurred_at | date | Timestamp when the event occurred (from the source time column) |
event_name | string | Name of the event, derived from the source model name |
properties | object | Original column values from the source record, keyed by slug |
database_slug | string | Slug of the source database / dataset |
model_slug | string | Slug of the source model within the dataset |
Contact Event
The Contact Event model aggregates event data from all connected integrations into a single timeline, where each event is linked to its parent Contact.| Column | Type | Description |
|---|---|---|
id | string | Composite event ID (<database_slug>__<model_slug>__<record_id>) |
contact_id | string | Foreign key to the unified Contact id |
occurred_at | date | Timestamp when the event occurred (from the source time column) |
event_name | string | Name of the event, derived from the source model name |
properties | object | Original column values from the source record, keyed by slug |
database_slug | string | Slug of the source database / dataset |
model_slug | string | Slug of the source model within the dataset |
References
References are the shared identifiers Cargo uses to match records across integrations. Each unification type supports a specific set of references. Event models inherit the references of their parent type.Account references
Used by the Account and Account Event models.| Reference | Description |
|---|---|
| Domain | Company website domain (e.g. acme.com) |
| LinkedIn ID | LinkedIn company numeric ID |
| LinkedIn Handle | LinkedIn company vanity URL slug |
| Crunchbase UUID | Crunchbase organization UUID |
| Crunchbase Permalink | Crunchbase organization permalink |
| Twitter Handle | X / Twitter company handle |
| Sales Navigator ID | LinkedIn Sales Navigator account ID |
Contact references
Used by the Contact and Contact Event models.| Reference | Description |
|---|---|
| Generic email address | |
| Personal Email | Personal email address |
| Work Email | Work / professional email address |
| LinkedIn ID | LinkedIn member numeric ID |
| LinkedIn Handle | LinkedIn member vanity URL slug |
| Twitter Handle | X / Twitter personal handle |
| Sales Navigator ID | LinkedIn Sales Navigator lead ID |
Reference priority
When multiple references match, Cargo uses an ordered reference list to determine which reference takes priority for deduplication. You can configure this order per unified model in the workspace settings. For example, with the default account reference order[domain, linkedinId, linkedinHandle, ...], two records sharing the same domain will be merged even if their linkedinId values differ.
Relationships
The four unified models form a connected graph:| Relationship | Column | Type | Description |
|---|---|---|---|
| Contact → Account | account_id | Many-to-one | Each contact is linked to one unified account |
| Account Event → Account | account_id | Many-to-one | Each account event is linked to one unified account |
| Contact Event → Contact | contact_id | Many-to-one | Each contact event is linked to one unified contact |
Source tracking
Every unified record includes anids column — a JSON object that maps back to the original records from each contributing integration:
id itself is a composite key that encodes the source: <database_slug>__<model_slug>__<original_record_id>.
The properties column on event models preserves all original columns from the source record as a JSON object, so no data is lost during unification.
