offdataai
Salesforce · data model template

Salesforce Core Objects Source Replica data model

Faithful 3NF replica of core Salesforce objects with the native 18-char Id as the business key and full platform/connector metadata (CreatedDate, SystemModstamp, IsDeleted, audit Ids, connector sync time) for incremental, soft-delete-aware loading. Mirrors how Fivetran/Airbyte land Salesforce; serves as the raw schema beneath the Salesforce analytics marts.

A normalized (3NF) landing replica of the core Salesforce Sales and Service Cloud objects exactly as an ELT connector (Fivetran/Airbyte/Stitch) replicates them into the warehouse: User, Account, Contact, Lead, Opportunity, OpportunityLineItem, Product2, Pricebook2, PricebookEntry, Campaign, CampaignMember, Case, Task, Event, RecordType, and OpportunityFieldHistory — the raw layer that staging models and marts build on. It is a normalized (3NF) relational model that mirrors the source system, suited to operational databases and to landing source data faithfully.

3NFSalesforceGDPRCCPA
16
tables
284
columns
35
relationships
15
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: Snowflake). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

platformcrm_coresalesmarketingserviceactivity

Design decisions

  • Native 18-char Id retained as the business key on every table

    ELT connectors replicate Salesforce keyed on the 18-char Id; keeping it as the business key (alongside a warehouse surrogate) preserves lineage to the source org and lets every relationship resolve on the same key the API exposes.

  • SystemModstamp and IsDeleted on every object

    Incremental syncs filter on SystemModstamp and must honour the recycle bin via IsDeleted; carrying both on every replicated table is what makes the landing layer reloadable and soft-delete-aware.

  • Polymorphic WhoId/WhatId resolved to typed FKs

    Task and Event use polymorphic WhoId/WhatId; the replica exposes the common targets as explicit nullable FKs (Contact, Account) so activity can be joined without parsing key prefixes, while rarer targets stay addressable by Id.

  • OpportunityFieldHistory kept as an append-only table

    Salesforce overwrites Opportunity fields in place; replicating OpportunityFieldHistory preserves stage-entry timestamps and close-date changes that the marts need to reconstruct deal velocity.

  • Self-references modelled by Id, not FK

    Account.ParentId, Campaign.ParentId, and User.ManagerId are kept as raw Id columns rather than enforced FKs to avoid load-order cycles, matching how connectors land hierarchical references.

Tables in the Salesforce Core Objects Source Replica model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Tables (15)

sf_user

Grain: one row per User

ColumnTypeKeys
user_keybigintPK
salesforce_idvarcharBK
usernamevarcharPII
namevarcharPII
emailvarcharPII
user_role_namevarchar
manager_user_idvarchar
profile_namevarchar
departmentvarchar
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_account

Grain: one row per Account

ColumnTypeKeys
account_keybigintPK
salesforce_idvarcharBK
account_namevarchar
account_typevarchar
industryvarchar
annual_revenuedecimal
number_of_employeesinteger
phonevarcharPII
websitevarchar
billing_countryvarchar
billing_statevarchar
parent_account_idvarchar
owner_user_keybigint
record_type_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_contact

Grain: one row per Contact

ColumnTypeKeys
contact_keybigintPK
salesforce_idvarcharBK
account_keybigint
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
phonevarcharPII
titlevarchar
departmentvarchar
mailing_countryvarchar
lead_sourcevarchar
has_opted_out_of_emailboolean
owner_user_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_lead

Grain: one row per Lead

ColumnTypeKeys
lead_keybigintPK
salesforce_idvarcharBK
first_namevarcharPII
last_namevarcharPII
companyvarchar
emailvarcharPII
phonevarcharPII
titlevarchar
lead_sourcevarchar
lead_statusvarchar
ratingvarchar
industryvarchar
is_convertedboolean
converted_datedate
converted_account_keybigint
converted_contact_keybigint
converted_opportunity_keybigint
owner_user_keybigint
record_type_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_product

Grain: one row per Product2

ColumnTypeKeys
product_keybigintPK
salesforce_idvarcharBK
product_codevarchar
product_namevarchar
product_familyvarchar
descriptionvarchar
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_pricebook

Grain: one row per Pricebook2

ColumnTypeKeys
pricebook_keybigintPK
salesforce_idvarcharBK
pricebook_namevarchar
descriptionvarchar
is_standardboolean
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_pricebook_entry

Grain: one row per PricebookEntry

ColumnTypeKeys
pricebook_entry_keybigintPK
salesforce_idvarcharBK
pricebook_keybigint
product_keybigint
unit_pricedecimal
currency_iso_codevarchar
use_standard_priceboolean
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_opportunity

Grain: one row per Opportunity

ColumnTypeKeys
opportunity_keybigintPK
salesforce_idvarcharBK
opportunity_namevarchar
account_keybigint
stage_namevarchar
amountdecimal
probabilitydecimal
close_datedate
opportunity_typevarchar
lead_sourcevarchar
forecast_categoryvarchar
is_closedboolean
is_wonboolean
campaign_keybigint
pricebook_keybigint
owner_user_keybigint
record_type_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_opportunity_line_item

Grain: one row per OpportunityLineItem

ColumnTypeKeys
opportunity_line_item_keybigintPK
salesforce_idvarcharBK
opportunity_keybigint
pricebook_entry_keybigint
product_keybigint
quantitydecimal
unit_pricedecimal
total_pricedecimal
list_pricedecimal
discountdecimal
service_datedate
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_campaign

Grain: one row per Campaign

ColumnTypeKeys
campaign_keybigintPK
salesforce_idvarcharBK
campaign_namevarchar
campaign_typevarchar
statusvarchar
start_datedate
end_datedate
budgeted_costdecimal
actual_costdecimal
expected_revenuedecimal
number_of_leadsinteger
parent_campaign_idvarchar
owner_user_keybigint
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_campaign_member

Grain: one row per CampaignMember

ColumnTypeKeys
campaign_member_keybigintPK
salesforce_idvarcharBK
campaign_keybigint
lead_keybigint
contact_keybigint
member_statusvarchar
has_respondedboolean
first_responded_datedate
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_case

Grain: one row per Case

ColumnTypeKeys
case_keybigintPK
salesforce_idvarcharBK
case_numbervarchar
account_keybigint
contact_keybigint
subjectvarcharPII
statusvarchar
priorityvarchar
originvarchar
case_typevarchar
reasonvarchar
is_closedboolean
is_escalatedboolean
closed_datetimestamp
owner_user_keybigint
record_type_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_task

Grain: one row per Task (logged activity)

ColumnTypeKeys
task_keybigintPK
salesforce_idvarcharBK
subjectvarcharPII
activity_typevarchar
statusvarchar
priorityvarchar
activity_datedate
is_closedboolean
owner_user_keybigint
who_contact_keybigint
what_account_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_event

Grain: one row per Event (calendar activity)

ColumnTypeKeys
event_keybigintPK
salesforce_idvarcharBK
subjectvarcharPII
activity_datedate
start_datetimetimestamp
end_datetimetimestamp
duration_minutesinteger
locationvarchar
owner_user_keybigint
who_contact_keybigint
what_account_keybigint
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

sf_opportunity_field_history

Grain: one row per field change on an Opportunity (OpportunityFieldHistory)

Append-only field-change log; reconstructs stage-entry timestamps and close-date slippage.

ColumnTypeKeys
opportunity_field_history_keybigintPK
salesforce_idvarcharBK
opportunity_keybigint
field_namevarchar
old_valuevarchar
new_valuevarchar
changed_datetimestamp
created_by_user_keybigint

Lookup tables (1)

sf_record_type

Grain: one row per RecordType

ColumnTypeKeys
record_type_keybigintPK
salesforce_idvarcharBK
sobject_typevarchar
record_type_namevarchar
developer_namevarchar
is_activeboolean
created_datetimestamp
created_by_idvarchar
last_modified_datetimestamp
last_modified_by_idvarchar
system_modstamptimestamp
is_deletedboolean
fivetran_syncedtimestamp

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • sf_account.owner_user_key → sf_user (many-to-one)
  • sf_account.record_type_key → sf_record_type (many-to-one)
  • sf_contact.account_key → sf_account (many-to-one)
  • sf_contact.owner_user_key → sf_user (many-to-one)
  • sf_lead.owner_user_key → sf_user (many-to-one)
  • sf_lead.converted_account_key → sf_account (many-to-one)
  • sf_lead.converted_contact_key → sf_contact (many-to-one)
  • sf_lead.converted_opportunity_key → sf_opportunity (many-to-one)
  • sf_lead.record_type_key → sf_record_type (many-to-one)
  • sf_pricebook_entry.pricebook_key → sf_pricebook (many-to-one)
  • sf_pricebook_entry.product_key → sf_product (many-to-one)
  • sf_opportunity.account_key → sf_account (many-to-one)
  • sf_opportunity.campaign_key → sf_campaign (many-to-one)
  • sf_opportunity.pricebook_key → sf_pricebook (many-to-one)
  • sf_opportunity.owner_user_key → sf_user (many-to-one)
  • sf_opportunity.record_type_key → sf_record_type (many-to-one)
  • sf_opportunity_line_item.opportunity_key → sf_opportunity (many-to-one)
  • sf_opportunity_line_item.pricebook_entry_key → sf_pricebook_entry (many-to-one)
  • sf_opportunity_line_item.product_key → sf_product (many-to-one)
  • sf_campaign.owner_user_key → sf_user (many-to-one)
  • sf_campaign_member.campaign_key → sf_campaign (many-to-one)
  • sf_campaign_member.lead_key → sf_lead (many-to-one)
  • sf_campaign_member.contact_key → sf_contact (many-to-one)
  • sf_case.account_key → sf_account (many-to-one)
  • sf_case.contact_key → sf_contact (many-to-one)
  • sf_case.owner_user_key → sf_user (many-to-one)
  • sf_case.record_type_key → sf_record_type (many-to-one)
  • sf_task.owner_user_key → sf_user (many-to-one)
  • sf_task.who_contact_key → sf_contact (many-to-one)
  • sf_task.what_account_key → sf_account (many-to-one)
  • sf_event.owner_user_key → sf_user (many-to-one)
  • sf_event.who_contact_key → sf_contact (many-to-one)
  • sf_event.what_account_key → sf_account (many-to-one)
  • sf_opportunity_field_history.opportunity_key → sf_opportunity (many-to-one)
  • sf_opportunity_field_history.created_by_user_key → sf_user (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time