RAW: rarely load; Curated: drop/redact; Mart: never
Free text and web-case fields — often unchecked PII.
Task
Subject, Description, WhoId
Sensitive
RAW: rarely load; Curated: drop/redact; Mart: never
Activity bodies and polymorphic WhoId — PII path.
Event
Subject, Description, WhoId, Location
Sensitive
RAW: rarely load; Curated: drop/redact; Mart: never
Meeting notes and location can be personal.
Opportunity
Description, NextStep
Sensitive
RAW: rarely load; Curated: drop/redact; Mart: never
Free-text risk — do not push unchecked into marts.
CampaignMember
Email, FirstName, LastName, ContactId, LeadId
Direct
RAW: restrict access; Curated: hash/tokenize; Mart: no cleartext
Marketing join to Contact/Lead — second PII surface.
Custom / External Id
*Email* custom fields, External Id custom fields, National ID customs
Direct
RAW: restrict access; Curated: hash/tokenize; Mart: no cleartext
Inventory all custom fields with email/external id.
DSDR discovery
Where personal data can hide beyond obvious contact fields — warehouse copies included.
Focus
Notes
Match keys
Email, phone, Salesforce Id, external Id customs, MobilePhone.
Primary objects
Contact, Lead, person Account — plus any object with email/phone fields.
Warehouse copies
Landing/curated tables, activation/reverse-ETL, BI extracts, shared stages.
History objects
ContactHistory, LeadHistory, AccountHistory — old values remain PII.
Email & content bodies
EmailMessage, ContentNote, ContentVersion — bodies and headers.
Web-to-lead / forms
Lead-source forms and custom form fields without schema review.
Integration vs end user
Integration users see more fields — FLS ≠ warehouse policy.
Shared activities
Task/Event WhoId polymorphic — Contact and Lead in one column.
Sandbox & refresh
Do not mix sandbox/partial copies with prod marts.
Managed packages
Package objects with hidden PII fields — describe + sample.
Source-specific guidance: what goes wrong, how to prevent it, what staff must know — plus where metadata lives and how to access it.
Data quality guides8
Prevent issues in the source first. Warehouse checks are a safety net — not a substitute for staff habits.
HighWon without Amount
Problem
When opportunities close as Won with blank or zero Amount, revenue and forecast reports look too low or random. Leadership sees false performance — often noticed months later.
Prevent
Make Amount required before Closed Won (validation rule + required on layout/path). No sales bypass except a documented integration user. Regularly send a “Won without Amount” report to ops.
Staff must know
Sales: Won without an amount is not done. Enter the amount in deal currency before Closed Won. If unsure → manager; do not leave blank.
Checks
COUNT(*) WHERE IsWon AND (Amount IS NULL OR Amount = 0)
CREATE TABLE curated_fct_opportunity AS
SELECT
o.opportunity_id,
o.account_id,
o.owner_id,
o.amount,
o.currency_code,
o.stage_name,
o.is_won,
o.is_closed,
o.probability,
o.close_date,
o.created_at,
(o.amount * o.probability / 100.0) AS weighted_amount
FROM raw_opportunity o
WHERE COALESCE(o.is_deleted, FALSE) = FALSE;
-- Join dims in marts; keep RAW grants tighter than curated.
Curated dim account / owner
Dims without unnecessary address cleartext; owner without email in curated marts.
CREATE TABLE curated_dim_account AS
SELECT
account_id,
name,
billing_country AS region,
owner_id
-- omit billing_postal_code from default curated marts
FROM raw_account
WHERE COALESCE(is_deleted, FALSE) = FALSE;
CREATE TABLE curated_dim_owner AS
SELECT
user_id AS owner_id,
name AS owner_name
-- omit email from default analytics dims
FROM raw_user
WHERE is_active = TRUE;
Curated measure SELECTs
Example calculations — copy and adapt period filters.
-- Won revenue in period
SELECT SUM(amount) AS won_revenue
FROM curated_fct_opportunity
WHERE is_won = TRUE
AND close_date BETWEEN :period_start AND :period_end;
-- Customers with won opp
SELECT COUNT(DISTINCT account_id) AS customers_with_won
FROM curated_fct_opportunity
WHERE is_won = TRUE
AND close_date BETWEEN :period_start AND :period_end;
-- Won revenue by owner
SELECT owner_id, SUM(amount) AS won_revenue
FROM curated_fct_opportunity
WHERE is_won = TRUE
AND close_date BETWEEN :period_start AND :period_end
GROUP BY owner_id;
Tools
Open related Binom-Tools workflows to adapt formulas, PII and measures for this source.