Skip to content

Account Check Builder Guide: configuration and results

Detailed page. Use “On this page” to jump directly to the section you need.

Review the 25 Account examples, compare their configuration with Salesforce Setup, and adapt them to your own requirements. The examples retain their existing API names for package upgrades; their titles and Evaluation Order describe the current rules.

Find each Check’s configuration, Found and Expected values, demo result, and steps for testing it in your sandbox.

These examples match the Check definitions in this checkout; use the matching scratch-org setup before comparing exact results.

Acme Corporation has incomplete Case details, missing Opportunity Contact Roles, and Opportunities without Products. The Check Set starts with Account fields, then uses related records to show which requirements pass and which need attention.

Use Formula for Account fields and parent Account fields, Query for one set of related Salesforce records, Compare Two Queries when two related-record results must agree, and Apex only when the supported Formula and Query settings cannot safely express the requirement.

Setup fieldValue
Check SetAccount Check Builder Guide
Base ObjectAccount
ActiveSelected
Found and Expected displayShow on demand
Unable to Evaluate guidanceConfirm that the Check is configured correctly and that the running user can read every object and field used by the formula, SOQL query, or Apex class. Then run the Check again.
Action-link ruleOpen the related Account, Opportunities, Cases, Contacts, or new Task page needed to review the result.
Test usersTest with the intended Salesforce user and assigned permission sets, not only a System Administrator.

The standard Unable to Evaluate guidance above applies unless a Check below provides a more specific message. It is not repeated in every row.

Check fieldValue
Check API nameExample_Website_URL_Valid (existing identity retained for upgrades)
Evaluation Order10
Evaluation TypeFormula
DescriptionThe formula checks the standard Account Type picklist. It passes when Type has a value and fails when Type is blank.
Applies WhenAll records; a blank Type fails rather than skips.
Pass FormulaNOT(ISBLANK(TEXT(Type)))
Found FormulaIF(ISBLANK(TEXT(Type)), "Not set", TEXT(Type))
Expected Formula"An Account Type is selected"
Demo resultPass. Acme’s Type is Customer.
Failure SeverityWarning
Failure Message{!record.Name fallback="This Account"} has no Account Type selected.
Fix InstructionsSelect the Type that describes the Account’s relationship to your business.
ActionSet Account Type → edit the Account

Check 20: Account has a phone number or website

Section titled “Check 20: Account has a phone number or website”
Check fieldValue
Check API nameExample_Segregation_Of_Duties (existing identity retained for upgrades)
Evaluation Order20
Evaluation TypeFormula
DescriptionThe formula checks the standard Account Phone and Website fields. It passes when either field has a value and fails when both are blank. This checks completeness, not whether the number or website is valid.
Applies WhenAll records; two blank fields fail rather than skip.
Pass FormulaOR(NOT(ISBLANK(Phone)), NOT(ISBLANK(Website)))
Found Formula"Phone: " & BLANKVALUE(Phone, "Not set") & "; Website: " & BLANKVALUE(Website, "Not set")
Expected Formula"A phone number or website is provided"
Demo resultPass. Acme has both a Phone and a Website.
Failure SeverityWarning
Failure Message{!record.Name fallback="This Account"} has neither a phone number nor a website.
Fix InstructionsAdd a business phone number or website so users can contact or research the business.
ActionAdd Phone or Website → edit the Account

Check 30: Billing address matches the parent bill-to Account

Section titled “Check 30: Billing address matches the parent bill-to Account”
Check fieldValue
Check API nameExample_Guide_Industry_Manufacturing (existing identity retained for upgrades)
Evaluation Order30
Evaluation TypeFormula
DescriptionFormula evaluation compares the Account and parent Account billing street, city, state, postal code, and country. It passes only when all five values match.
Applies WhenParent Account is selected.
Applicability FormulaNOT(ISBLANK(ParentId))
Pass FormulaAND(BillingStreet = Parent.BillingStreet, BillingCity = Parent.BillingCity, BillingState = Parent.BillingState, BillingPostalCode = Parent.BillingPostalCode, BillingCountry = Parent.BillingCountry)
FoundComplete Account billing address
Found FormulaBillingStreet & ", " & BillingCity & ", " & BillingState & " " & BillingPostalCode & ", " & BillingCountry
ExpectedComplete parent Account billing address
Expected FormulaParent.BillingStreet & ", " & Parent.BillingCity & ", " & Parent.BillingState & " " & Parent.BillingPostalCode & ", " & Parent.BillingCountry
Demo resultPass. Found and Expected both show 2400 West Fulton Street, Chicago, Illinois 60612, United States.
Failure SeverityInformation
Failure Message{!record.Name fallback="This Account"} does not match the parent Account's complete bill-to address.
Skipped Message{!record.Name fallback="This Account"} has no parent bill-to Account to compare.
Fix InstructionsConfirm the legal bill-to location with finance. Correct the Account or parent Account only after the difference is verified.
ActionReview bill-to address → edit the Account

The Verify with Query examples progress from counts with fixed thresholds (40–50), to checking fields across rows (60–80), returning only exceptions (90), related Contact Roles (100–110), finding a value in a list (120), and calculating the expected value with another query (130).

Found and Expected show the value and comparison only. The title and description provide the context; row checks add a short qualifier such as “missing” or “inactive.”

OrderCheck and installed API nameFound in AcmeExpected in AcmeOutcome
40High-priority open Cases stay within the limit
Example_Fewer_Than_Ten_Open_Cases
4at most 1Fail (Critical)
50At least one open Opportunity is Commit
Example_Significant_Open_Opp
0at least 1Fail (Info)
60Every open Case has a Contact
Example_Open_Cases_Have_Contacts
6 of 12 missingNone missingFail (Critical)
70Every escalated open Case has a Description
Example_Guide_Contacts_Have_Email
1 of 1 missingNone missingFail (Warning)
80Every open Opportunity has an active owner
Example_High_Value_Open_Opp
0 of 2 inactiveNone inactivePass
90No proposal has a missing or low Amount
Example_Open_Opps_Have_Amount
0 exceptionsNo exceptionsPass
100Open Opportunities include a Decision Maker
Example_Has_At_Least_One_Contact
1at least 1Pass
110Contacts on open deals have Email or Phone
Example_Contact_States_Match_Billing
1 missing bothNone missing bothFail (Warning)
120Open-deal Contact Roles include Technical Buyer
Example_Billing_State_In_Contacts
Technical Buyerto be one of [Decision Maker, Executive Sponsor, Executive Sponsor, Business User]Fail (Info)
130Cases closed keep pace with Cases created
Example_Contacts_Cover_Open_Cases
4at least 16Fail (Warning)
OrderConfigurationWhat this teaches
40Source query: SELECT COUNT() FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND Priority = 'High'
Expected value source: FIXED_VALUE
Fixed expected value: 1
Result handling: ONE_RESULT
Comparison: LESS_THAN_OR_EQUAL
No rows: FAIL
The Query check counts open Cases with Priority High. It passes when no more than one high-priority Case requires Account-level escalation at the same time.
50Source query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false AND ForecastCategoryName = 'Commit'
Expected value source: FIXED_VALUE
Fixed expected value: 1
Result handling: ONE_RESULT
Comparison: GREATER_THAN_OR_EQUAL
No rows: FAIL
The Query check counts open Opportunities with Forecast Category Commit. It passes when at least one open deal is included in the committed forecast.
60Source query: SELECT ContactId FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false
Result handling: ALL_ROWS_PASS
Comparison: IS_NOT_BLANK
No rows: PASS
The Query check reads Contact on each open Case. It passes only when every returned Case has a Contact. With no open Cases, it passes.
70Source query: SELECT Description FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND IsEscalated = true
Result handling: ALL_ROWS_PASS
Comparison: IS_NOT_BLANK
No rows: SKIP
The Query check reads Description on each escalated open Case. It passes only when every Description has a value. No escalated open Cases skips the check. It does not assess the quality of the text.
80Source query: SELECT Owner.IsActive FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
Expected value source: FIXED_VALUE
Fixed expected value: true
Result handling: ALL_ROWS_PASS
Comparison: EQUALS
No rows: PASS
The Query check verifies Active on the owner of every open Opportunity. It passes only when every Opportunity owner is an active Salesforce user.
90Source query: SELECT Name FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote' AND (Amount = null OR Amount < 25000)
Result handling: ALL_ROWS_PASS
Comparison: IS_BLANK
No rows: PASS
The Query check returns only proposal-stage Opportunities whose Amount is blank or below $25,000. It passes when the query returns no Opportunity names.
100Source query: SELECT COUNT() FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false AND Role = 'Decision Maker'
Expected value source: FIXED_VALUE
Fixed expected value: 1
Result handling: ONE_RESULT
Comparison: GREATER_THAN_OR_EQUAL
No rows: FAIL
The Query check counts Decision Maker Contact Roles across open Opportunities. It passes when at least one role exists. This checks the recorded role, not whether the person has verified buying authority.
110Source query: SELECT COUNT() unreachableStakeholders FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false AND ContactId != null AND Contact.Email = null AND Contact.Phone = null
Expected value source: FIXED_VALUE
Fixed expected value: 0
Result handling: ONE_RESULT
Comparison: EQUALS
No rows: PASS
The Query check counts Contact Roles on open Opportunities whose Contact has neither Email nor Phone. It passes when the count is zero. It checks presence, not whether the contact details are valid.
120Comparison query: SELECT Role FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false AND Role != null
Find value formula: "Technical Buyer"
Result handling: COMPARE_AS_LISTS
Comparison: LIST_CONTAINS_ANY
Applies when this count is greater than zero: SELECT COUNT() FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false
No rows: FAIL
The Query check searches the Role values on open Opportunities for Technical Buyer. It passes when the role appears. Found shows the value being sought; Expected shows the returned list to search.
130Source query: SELECT COUNT() FROM Case WHERE AccountId = {!record.Id} AND IsClosed = true AND ClosedDate = LAST_N_DAYS:30
Comparison query: SELECT COUNT() FROM Case WHERE AccountId = {!record.Id} AND CreatedDate = LAST_N_DAYS:30
Expected value source: COMPARISON_QUERY
Result handling: ONE_RESULT
Comparison: GREATER_THAN_OR_EQUAL
No rows: FAIL
The Query check compares 30-day Case resolution throughput with intake and passes when closures meet or exceed new demand, making backlog direction visible at the Account level.

Start with two counts on the same object: Amount, Next Step, and Campaign field coverage (140–160). Then add a date range (170), related Contact Role coverage (180–190), currency totals (200–210), and finally list overlap, containment, and exact matching (220–240).

OrderCheck and installed API nameFound in AcmeExpected in AcmeOutcome
140Every won Opportunity has an Amount
Example_Parent_Cities_Require_Data
0to equal 1Fail (Warning)
150Every proposal has a Next Step
Example_Contact_Vs_Open_Opp_Count
0to equal 1Fail (Warning)
160Every proposal has a Primary Campaign Source
Example_Guide_Open_Deals_Have_Contacts
0to equal 1Fail (Critical)
170Open Opportunity Close Dates are in range
Example_Distinct_Cities_Vs_Contacts
1to equal 2Fail (Info)
180Every open Opportunity has a Contact Role
Example_Oldest_Contact_City_Matches
1to equal 2Fail (Critical)
190Every won Opportunity has a primary Contact
Example_Earliest_Vs_Latest_Close
Not producedNot producedFail (Warning)
200New pipeline value covers recently lost value
Example_Open_Pipeline_Covers_Revenue
$600,000.00at least $760,000.00Fail (Critical)
210Total proposal Amount matches total Product value
Example_Average_Deal_Vs_Largest
Not producedNot producedUnable to Evaluate
220Sales and service share a Contact name
Example_Contact_Cities_Overlap_Parent
[Jae Kim, Irene Kowalski, Mei Choi, Marcus Reed, Owen Murphy, Lucas Baker]to overlap with [Thomas Gallagher, Sarah Bennett, Elena Ramirez, Gavin Scott]Fail (Warning)
230Sales Contact names cover priority Case Contacts
Example_Parent_Covers_Contact_Cities
[Thomas Gallagher, Sarah Bennett, Elena Ramirez, Gavin Scott]to contain all of [Jae Kim, Irene Kowalski, Mei Choi]Fail (Warning)
240Open Opportunity names match those with Products
Example_Contact_Cities_Exact_Parent
[Acme Corporation Plant Modernization Expansion, Acme Corporation Managed Services Add-On]to exactly match (none)Fail (Warning)

“Not produced” means this run did not produce a display value. Check 190 fails under its configured no-row behavior before producing Found and Expected. Check 210 returns Unable to Evaluate because no Opportunity Product total is available. Neither result implies that the missing value is zero.

The final three examples compare names, so duplicate names can hide differences between records. Use record IDs when identity matters. Check 210 compares Account-wide totals: offsetting differences between individual proposals can cancel each other out.

OrderConfigurationWhat this teaches
140Source query: SELECT COUNT() valuedDeals FROM Opportunity WHERE AccountId = {!record.Id} AND IsWon = true AND Amount != null
Comparison query: SELECT COUNT() allDeals FROM Opportunity WHERE AccountId = {!record.Id} AND IsWon = true
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsWon = true
No rows: FAIL
The Compare Two Queries check compares won Opportunities with won Opportunities whose Amount is not blank. It passes when both counts match.
150Source query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote' AND NextStep != null
Comparison query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote'
Result handling: ONE_RESULT
Comparison: EQUALS
No rows: FAIL
The Compare Two Queries check counts proposals with Next Step and all proposals. It passes when the counts match. This checks that Next Step has text, not whether the action has been agreed.
160Source query: SELECT COUNT() coveredDeals FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote' AND CampaignId != null
Comparison query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote'
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
No rows: FAIL
The Compare Two Queries check counts proposals with a Primary Campaign Source and all proposals. It passes when the counts match. This checks the Campaign link, not the accuracy of attribution.
170Source query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false AND CloseDate = NEXT_N_DAYS:180
Comparison query: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
No rows: FAIL
The Compare Two Queries check passes when every open Opportunity has a Close Date from today through the next 180 days, detecting both stale dates and dates outside the operating forecast horizon.
180Source query: SELECT COUNT_DISTINCT(OpportunityId) coveredDeals FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false
Comparison query: SELECT COUNT() allDeals FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
No rows: FAIL
The Compare Two Queries check compares open Opportunities with open Opportunities represented by at least one Opportunity Contact Role. It passes when both counts match.
190Source query: SELECT COUNT_DISTINCT(OpportunityId) coveredDeals FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsWon = true AND IsPrimary = true
Comparison query: SELECT COUNT() allDeals FROM Opportunity WHERE AccountId = {!record.Id} AND IsWon = true
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsWon = true
No rows: FAIL
The Compare Two Queries check passes when every won Opportunity retains a primary Contact Role, preserving buyer history for implementation handoff, renewal planning, and expansion.
200Source query: SELECT SUM(Amount) newPipeline FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false AND CreatedDate = LAST_N_DAYS:90 AND Amount != null
Comparison query: SELECT SUM(Amount) recentLosses FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = true AND IsWon = false AND CloseDate = LAST_N_DAYS:90 AND Amount != null
Result handling: ONE_RESULT
Comparison: GREATER_THAN_OR_EQUAL
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = true AND IsWon = false AND CloseDate = LAST_N_DAYS:90 AND Amount != null
No rows: FAIL
The Compare Two Queries check compares Amount from open Opportunities created in the last 90 days with Amount from Opportunities closed lost in the same period. It passes when new pipeline value equals or exceeds lost value.
210Source query: SELECT SUM(Amount) proposalAmount FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote' AND Amount != null
Comparison query: SELECT SUM(TotalPrice) productTotal FROM OpportunityLineItem WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.StageName = 'Proposal/Price Quote'
Result handling: ONE_RESULT
Comparison: EQUALS
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND StageName = 'Proposal/Price Quote' AND Amount != null
No rows: UNABLE_TO_EVALUATE
The Compare Two Queries check sums proposal Amounts and Product Total Prices across the Account. It passes when the totals match. Differences between individual proposals can cancel out; this is an Account-level reconciliation.
220Source query: SELECT Contact.Name FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND ContactId != null
Comparison query: SELECT Contact.Name FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false AND ContactId != null
Result handling: COMPARE_AS_LISTS
Comparison: LISTS_OVERLAP
Applies when this count is greater than zero: SELECT COUNT() FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND ContactId != null
No rows: SKIP
The Compare Two Queries check compares Contact names on open Cases with names on open Opportunities. It passes when the lists overlap. Matching names do not prove Contact identity; use IDs when distinct people can share a name.
230Source query: SELECT Contact.Name FROM OpportunityContactRole WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false AND ContactId != null
Comparison query: SELECT Contact.Name FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND Priority = 'High' AND ContactId != null
Result handling: COMPARE_AS_LISTS
Comparison: LISTS_CONTAIN_ALL
Applies when this count is greater than zero: SELECT COUNT() FROM Case WHERE AccountId = {!record.Id} AND IsClosed = false AND Priority = 'High' AND ContactId != null
No rows: SKIP
The Compare Two Queries check compares Contact names on open Opportunities with names on high-priority open Cases. It passes when the first list contains every name in the second. Shared names can represent different Contacts.
240Source query: SELECT Name FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
Comparison query: SELECT Opportunity.Name FROM OpportunityLineItem WHERE Opportunity.AccountId = {!record.Id} AND Opportunity.IsClosed = false
Result handling: COMPARE_AS_LISTS
Comparison: LISTS_MATCH_EXACTLY
Applies when this count is greater than zero: SELECT COUNT() FROM Opportunity WHERE AccountId = {!record.Id} AND IsClosed = false
No rows: FAIL
The Compare Two Queries check compares open Opportunity names with names represented by Products. It passes when the lists match exactly. Duplicate names can hide missing Product coverage; use IDs when names are not unique.

Check 250: Account activity meets the operating cadence

Section titled “Check 250: Account activity meets the operating cadence”
Check fieldValue
Check API nameExample_Guide_Recent_Activity
Evaluation Order250
Evaluation TypeApex
DescriptionThe Apex reference declares typed parameters, counts completed Tasks and Events in the 60-day period, isolates per-record evaluation, and returns typed evidence plus safe display guidance. It passes at two activities; the class does not decide whether an activity was meaningful.
Apex ClassAccountHasRecentActivityCheck
Apex Parameters{"daysBack": 60, "minimumActivities": 2}
Applies WhenEvery Account
FoundCompleted activities: 2
ExpectedMinimum: 2 in 60 days
Demo resultPass
Failure SeverityWarning
Failure MessageFewer than two completed Account activities are documented for {!record.Name fallback="this Account"} in the last 60 days.
Fix InstructionsReview the completed Tasks and Events and their outcomes. The metadata fallback contains an inline Account link. Log only work that occurred, or change the approved cadence.
ActionThe Apex display hook opens the Account; metadata retains the create-Task fallback

The demo setup includes a ready Account that passes, a needs-review Account that fails, and an empty Account that fails with Found 0. See Recent Account activity for the exact positive, negative, boundary, permission, and unsafe-link checks.

The current demo produces 7 Passed, 17 Failed, 0 Skipped, and 1 Unable to Evaluate.

Salesforce dataRequired demo valueChecks proved
Account Type, Phone, and WebsiteType is Customer; Phone and Website are populatedChecks 10 and 20 pass the basic field examples.
One open CaseEscalated selected and Description blankCheck 70 identifies a blank Description.
Recently lost Opportunity AmountsCombined Amount of $760,000Check 200 shows $600,000 of new pipeline does not replace recently lost value.
Historical won OpportunityAmount remains blankCheck 140 fails without a supported won Amount.
Opportunity ProductsNoneCheck 210 returns Unable to Evaluate and Check 240 fails product coverage.

This table contains the Check-specific response. It does not repeat the shared Unable to Evaluate guidance.

OrderWhen the Check failsAdministrator responseAction link
40More than one high-priority Case is open.Review Case ownership, customer impact, and recovery plans. Escalate excess work; do not lower Priority only to pass.Account Cases
50No open Opportunity is included in the Commit forecast category.Review forecast judgment with the Opportunity owners. Update Forecast Category only when the current customer commitment supports it.Account Opportunities
60One or more open Cases have no Contact.Add the customer Contact who can confirm impact and resolution, or close Cases that no longer require work.Account Cases
70An open escalated Case has no Description.Add a concise, verified explanation of the customer impact and current recovery work. Do not add generic text only to pass.Account Cases
80An open Opportunity is owned by an inactive Salesforce user.Transfer the Opportunity through the approved ownership process and confirm that forecasts, activities, and access remain correct.Account Opportunities
90A proposal-stage Amount is blank or below the approved floor.Validate scope, pricing, and commercial fit. Requalify the deal or return it to an earlier Stage; do not inflate Amount.Account Opportunities
100No Decision Maker Contact Role exists on an open Opportunity.Confirm buying authority with the customer and add the verified Contact Role. Do not infer authority from job title.Account Opportunities
110An open-deal Contact has neither email nor phone.Confirm permitted contact information with the customer. Remove obsolete Contact Roles when appropriate.Account Contacts
120No open-deal Contact Role is Technical Buyer.Confirm who evaluates the solution and add the verified Contact Role.Account Opportunities
130Case closures are lower than Case intake.Review staffing, Case ownership, repeated causes, and aged work before changing the target.Account Cases
140A won Opportunity has no Amount.Recover the Amount from approved sales records when evidence exists. Do not invent historical value.Account Opportunities
150A proposal-stage Opportunity has no Next Step.Confirm the next customer action, owner, and timing, then update Next Step.Account Opportunities
160A proposal-stage Opportunity has no Primary Campaign Source.Confirm the originating Campaign and populate Primary Campaign Source only when attribution is supported.Account Opportunities
170An open Opportunity has a past Close Date or a date beyond 180 days.Reconfirm customer timing and update only Close Dates supported by the current plan.Account Opportunities
180An open Opportunity has no Opportunity Contact Role.Add a verified customer Contact Role to each open deal. Do not use an unrelated or placeholder Contact.Account Opportunities
190A won Opportunity has no primary Contact Role.Identify the primary buyer from supported history and mark that Contact Role as primary.Account Opportunities
200New open pipeline Amount does not replace recently lost Amount.Review loss reasons, deal value, and the Account plan. Create only Opportunities supported by a real customer initiative.Account Opportunities
210Proposal Amount and Opportunity Product Total Price do not match, or no Product total is available.Confirm products, quantities, prices, discounts, and the Opportunity Amount before correcting either total.Account Opportunities
220Open sales and service work have no Contact name in common.Confirm whether the teams should share a stakeholder. Change the Check if separate Contacts are intentional.Account record
230A priority service Contact name is absent from open sales work.Decide whether sales needs that Contact represented. Add a legitimate Contact Role or change the handoff rule.Account record
240The open Opportunity name list differs from the names represented by Products.Confirm whether the sales process uses Products. Add verified Products and prices, or deactivate the Check.Account record

SOQL and Apex read Salesforce data with the running user’s sharing, object access, and field access. A System Administrator can see more data than the intended user, so administrator-only testing does not prove that Found, Expected, or the final result is correct for production users.

Test each Check with the same Salesforce access assigned to its intended users.

Result to proveRequired test
PassCreate or select Account data that meets the stated requirement. Confirm Found and Expected show only the values in this page.
FailChange one relevant Salesforce value so the requirement is not met. Confirm severity, failure message, Fix Instructions, and Action link.
SkippedRemove the data named in Applies When. Confirm the skipped message explains why the Check does not apply.
Unable to EvaluateTest with a user who intentionally lacks access to one required object or field. Confirm the result gives administrator guidance without exposing data the user cannot read. Restore access after the test.
SharingKeep one relevant related record outside the test user’s sharing access. Confirm Found reflects only records that user can access.
API identityInstalled examples use stable API names. In Setup, use the Check title and description to identify the requirement. Copy the Qualified API Name rather than typing it from memory.
OrderSetting or requirement to consider
10Which Type values describe your Account relationships? This example accepts any populated Type, including values added by your org.
20Is either Phone or Website sufficient? This example checks presence, so decide separately whether format or reachability validation is needed.
30Does centralized billing require the child address to match its parent? Define how to handle legitimate address differences; a missing parent skips.
40Is one simultaneous high-priority Case the approved capacity, and should exceeding it be Critical for every Account segment?
50Does the sales organization use Forecast Category Commit, and is one Commit deal per Account a useful requirement?
60Should an Account with no open Cases Pass or Skip, and is Contact Name mandatory for every Case type and channel?
70Is Case Description the approved place for customer impact, or does the org use another standard or custom Case field?
80Confirm that all open Opportunities are user-owned and that Owner Active is readable by intended users. Define the approved transfer process for inactive owners.
90Confirm the proposal Stage value, $25,000 floor, currency behavior, and whether blank Amount should be treated the same as an Amount below the floor.
100Is one Decision Maker anywhere in open pipeline enough, or must every qualifying Opportunity have one? Confirm the exact Contact Role value.
110Is either Email or Phone sufficient, and may the intended users read both fields for every Contact Role they can see?
120Confirm the exact Technical Buyer Contact Role value and which Opportunity Stages require it.
130Is 30 days long enough for meaningful Account-level Case volume, and should the comparison use all Cases or only selected Case types?
140Must every won Opportunity have Amount, and how should migrated or confidential historical deals be handled?
150Does Next Step contain the agreed customer action, or does the sales process store mutual actions elsewhere?
160Does the organization consistently maintain Primary Campaign Source before proposal Stage, including Opportunities created without a Campaign?
170Is 180 days the approved planning horizon for every sales motion, and should overdue Close Dates be reported separately from dates beyond the horizon?
180Must every open Opportunity have a Contact Role, or only Opportunities at selected Stages?
190Must every won Opportunity retain a primary Contact Role, including renewals, channel deals, and migrated history?
200Confirm the 90-day period, currency handling, which open Stages count as replacement pipeline, and whether Amount is the approved measure of replaced value.
210Is Opportunity Amount expected to equal Opportunity Product Total Price, or can services, taxes, adjustments, or manual pricing create approved differences?
220Which Account segments require one Contact to connect open sales and service work? If separate Contacts are normal, deactivate or narrow this Check.
230Must every priority service Contact appear on an open Opportunity, or is sales awareness recorded through Account Teams, notes, or another Salesforce relationship?
240Does the sales process require Opportunity Products on every open Opportunity or only after a selected Stage?
250Which Task and Event types count toward the cadence? The current Apex class counts completed Account Tasks and Events but does not determine whether each activity was meaningful customer engagement.

Also identify every Flow, Apex class, report, integration, or saved reference that uses an existing Check Qualified API Name before changing an API name.