RACI for Salesforce Data Governance
Unclear ownership is why Salesforce data quality problems never get resolved. Use the RACI framework to remove ambiguity around ownership.
Joe Fusaro
Founder, Datachef
Finally ready to tackle data governance in Salesforce?
Use this framework to define each person's or group's roles and responsibilities.
Table of Contents
- What is the RACI framework?
- An example RACI Framework for Salesforce Data Governance
- Monitoring Data Governance in Salesforce
What is the RACI framework?
The RACI framework is a project management tool that clarifies team roles and responsibilities by assigning each member or group one of four roles for each task or decision: Responsible, Accountable, Consulted, or Informed.
Having clear roles and responsibilities for different tables/objects in Salesforce removes the ambiguity that typically comes along with data governance initiatives. Removing this ambiguity around ownership is the first step to actually solving this problem!
- Responsible: The person or people who do the work to complete the task. There should be at least one "R" for each task.
- Accountable: The person who must ensure the work is done correctly: that the requirements are accurate and documented, and that the deliverable or task gets completed. This person has the final sign-off and there should only be one "A" per task.
- Consulted: People whose opinions are sought before a decision or action is taken. This involves two-way communication.
- Informed: People who need to be kept up-to-date on progress, but are not involved in the decision-making or work. This is one-way communication.
An example RACI Framework for Salesforce Data Governance
This is a very simplistic example of a RACI framework for common Salesforce objects. Of course the roles and departments might be different in your case.
| Marketing | Sales | IT | Data Analysts | |
|---|---|---|---|---|
| Account | Consulted | Accountable | Responsible | Informed |
| Opportunity | Consulted | Accountable | Responsible | Informed |
| Contact | Accountable | Consulted | Responsible | Informed |
| Lead | Accountable | Consulted | Responsible | Informed |
| Campaign | Accountable | Informed | Responsible | Consulted |
Monitoring Data Governance in Salesforce
Documenting a RACI is a great start, but actively monitoring data health is crucial. In this next section, we'll give some examples of data governance data models that you can use in Datachef or in your data warehouse of choice to more actively monitor data governance.
Duplicate Leads in Salesforce
Two leads match when they share the same email address. The query below finds every such pair and includes both record IDs so a steward can review and merge.
-- Duplicate Lead records in Salesforce (matched by email)
SELECT
a.Id AS lead_id_a,
a.FirstName AS first_name_a,
a.LastName AS last_name_a,
a.Email,
a.CreatedDate AS created_a,
b.Id AS lead_id_b,
b.FirstName AS first_name_b,
b.LastName AS last_name_b,
b.CreatedDate AS created_b
FROM Lead a
JOIN Lead b
ON LOWER(a.Email) = LOWER(b.Email)
AND a.Id < b.Id -- prevent mirror rows
AND a.IsDeleted = FALSE
AND b.IsDeleted = FALSE
AND a.IsConverted = FALSE
AND b.IsConverted = FALSE
ORDER BY a.Email
Duplicate Contacts in Salesforce
Same logic for Contacts — typically the higher-risk duplicate because contacts are linked to Accounts and Opportunities.
-- Duplicate Contact records in Salesforce (matched by email)
SELECT
a.Id AS contact_id_a,
a.FirstName AS first_name_a,
a.LastName AS last_name_a,
a.Email,
a.AccountId AS account_a,
a.CreatedDate AS created_a,
b.Id AS contact_id_b,
b.FirstName AS first_name_b,
b.LastName AS last_name_b,
b.AccountId AS account_b,
b.CreatedDate AS created_b
FROM Contact a
JOIN Contact b
ON LOWER(a.Email) = LOWER(b.Email)
AND a.Id < b.Id
AND a.IsDeleted = FALSE
AND b.IsDeleted = FALSE
ORDER BY a.Email
Lead–Contact Duplicates (Cross-Object)
SOQL can't query Leads and Contacts together. SQL can. This query finds cases where the same email exists in both objects — common when leads are partially converted or when contacts are created outside the standard conversion flow.
-- Email addresses that exist as both a Lead and a Contact
SELECT
l.Id AS lead_id,
l.FirstName AS lead_first_name,
l.LastName AS lead_last_name,
l.Email,
l.CreatedDate AS lead_created,
l.IsConverted AS lead_is_converted,
c.Id AS contact_id,
c.FirstName AS contact_first_name,
c.LastName AS contact_last_name,
c.CreatedDate AS contact_created
FROM Lead l
JOIN Contact c
ON LOWER(l.Email) = LOWER(c.Email)
AND l.IsDeleted = FALSE
AND c.IsDeleted = FALSE
ORDER BY l.Email
This surfaces three actionable scenarios: the lead was converted but not merged, the contact was created without going through lead conversion, or both records are genuine (two different people sharing a corporate alias — worth reviewing manually).
Lead Field Completeness Over Time
Duplicate records are visible. Incomplete records are invisible — they don't throw errors, they just quietly degrade your segmentation and reporting. This query measures how many leads created each month have the four fields that matter most for qualification.
-- Lead completeness trend: % of new leads with Name, Title, Email, and Phone populated
SELECT
DATE_TRUNC('month', CreatedDate) AS month,
COUNT(*) AS total_leads,
SUM(CASE WHEN FirstName IS NOT NULL AND FirstName <> '' THEN 1 ELSE 0 END) AS has_first_name,
SUM(CASE WHEN LastName IS NOT NULL AND LastName <> '' THEN 1 ELSE 0 END) AS has_last_name,
SUM(CASE WHEN Title IS NOT NULL AND Title <> '' THEN 1 ELSE 0 END) AS has_title,
SUM(CASE WHEN Email IS NOT NULL AND Email <> '' THEN 1 ELSE 0 END) AS has_email,
SUM(CASE WHEN Phone IS NOT NULL AND Phone <> '' THEN 1 ELSE 0 END) AS has_phone,
ROUND(100.0 * SUM(CASE WHEN FirstName IS NOT NULL AND FirstName <> '' AND
LastName IS NOT NULL AND LastName <> '' AND
Title IS NOT NULL AND Title <> '' AND
Email IS NOT NULL AND Email <> '' AND
Phone IS NOT NULL AND Phone <> ''
THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_fully_complete
FROM Lead
WHERE IsDeleted = FALSE
AND CreatedDate >= DATEADD('month', -12, DATE_TRUNC('month', CURRENT_DATE))
GROUP BY DATE_TRUNC('month', CreatedDate)
ORDER BY month
If pct_fully_complete is trending down, your lead capture forms or data entry workflows need attention. If it's trending up, your governance efforts are working.
Putting It Together
Governance is not a one-time project. It's a recurring operating rhythm:
- Assign the RACI. Document owners, stewards, and custodians for every critical Salesforce object and policy.
- Instrument the controls. Wire each assignment to a Salesforce permission, validation rule, or approval process.
- Measure compliance. Schedule the SQL queries above to run weekly or monthly and deliver results to the relevant data steward.
- Review and update. Revisit RACI assignments when processes change — new campaigns, new objects, or new integrations all shift ownership.
Clean data doesn't happen by accident. It happens when the right person has the right access, the right responsibility, and a dashboard that tells them whether they're meeting the standard.
Want to run these queries against your own Salesforce and Marketo data? Watch a demo or try Datachef free for 30 days.