Skip to main content

#Answers7 debatiendo

Setup

Enterprise Territory Management, Unlimited Edition. ~59K Accounts across 16 regions. Account OWD is open and must stay open — reps need to find and identify any account.

This applies to our Sales User profile only (~150 users). Support, Customer Success, SE, Deal Desk, Finance and leadership keep full visibility through an exemption.

The requirement

Accounts stay visible to everyone, but a set of sensitive revenue fields — Acc ACV, ARR, TBookings, Soft ACV, Dec ACV Rollup, VEc counts — must be visible only to sales users in that account's own region. That includes list views, reports, search and the API, not just the record page.

All of them are Currency or Number. Some are stored, some are formulas, two are roll-up summaries from Opportunity.

The problem

Field-level security is resolved per user, not per record. A field is visible to a user on every Account or none. Nothing in the sharing model makes a field's visibility depend on the record being viewed — and I can't restrict the record itself, because the account has to stay globally visible.

What I'm currently considering

Hide the real fields with FLS from the Sales User profile, then expose one formula field per metric that only returns a value when the user's region matches:

 

Account_ARR_Regional__c  (Currency)  =    IF( $User.Region__c = Region__c, Account_Arr__c, NULL )

User.Region__c would be read-only for sales users and populated from our territory roster. This needs ~15 fields and keeps everything native, but it leans on $User inside a formula, which makes the field non-deterministic and non-indexable — and I'm not sure how that holds up at 59K records.

I've also looked at a child object with its own private sharing, and at per-region or per-geo shadow columns. Each trades away something different — list views, reports, search, or field count.

My question

How would you approach this? I'd genuinely rather hear what people have actually built than have my own idea validated.

Specifically, if you've solved per-record field confidentiality in a real org — what did you land on, and what did it cost you a year later in maintenance?

And if the $User formula approach is a bad idea for reasons I haven't hit yet, I'd like to know before I build 15 of them. 

 

#Answers  #Salesforce Developer  #Metadata  #Territory Modeling  #Sales Cloud

0/9000

Setup

Enterprise Territory Management, one active model: 3 Geography nodes → 16 Region nodes → ~50 Territory → ~19 Sub-Territory. ~ Opportunities, ~ Accounts, 99.96% of which are assigned to a territory.

Opportunity OWD is already Private, but View All is granted on ~ profiles, so everyone effectively sees every region. We're removing it and replacing it with region-scoped access.

Phase one targets our Sales User profile only (~155 users). Sales managers sit on that same profile, so manager visibility has to come from the territory hierarchy rather than a separate profile. Everyone else keeps View All via a bypass permission for now.

Where I've got to

My plan was:

  1. Stamp a stored field Visibility_Region__c on Opportunity before save.
  2. Create 16 criteria-based sharing rules — Visibility_Region__c = 'X' → share with Territory X and Subordinates.
  3. Check UserTerritory2Association before letting a sales user create an opportunity out of region.

Then I noticed our territories already have OpportunityAccessLevel set, and accounts are almost fully assigned — so native ETM territory sharing would already give us region-scoped access once users are assigned, without any of the above.

The reason I'd built the stamped-field approach is that our region isn't always the account's region: an opportunity can carry an MSP end-user region or a manual override that should win. Native ETM only keys off the account. But that's 1.8% of our opportunities — the other 98% would be handled natively.

My questions

1. Is the stamped field + 16 sharing rules the right call here, or am I overbuilding? Would you lean on native ETM territory access for the 98% and handle the override cases some other way — manual shares, apex sharing, an opportunity team — rather than building a parallel mechanism for all records?

2. How would you handle lead conversion? Conversion creates Opportunities too, and the only hook is Opportunity beforeInsert. addError() there rolls back the entire conversion, destroying the Account and Contact the user just created. What I want is to let the conversion complete but withhold only the Opportunity, then route it to the account owner. I'm considering a screen flow replacing the standard Convert button with createOpportunity = false on the out-of-region branch — is that what people actually do?

3. One factual check: when addError() fires on the Opportunity during convertLead, does the whole transaction roll back cleanly, or can it orphan the Account/Contact?

Any views on territory assignment level — region node versus the specific territory a rep owns — would also be welcome. 

 

#Answers  #Salesforce Developer  #Territory Management  #Object Permissions  #Sales Cloud  #Salesforce Admin

0/9000
5 comentarios
0/9000

Hi all, 

 

I'm trying to figure out the best way to track gifts that come in via a DAF when multiple donors are connected, ensuring each donor's giving history is accurate and up-to-date. 

 

I have a couple of thoughts and was curious about the following:

  1. Does Salesforce allow more than one Contact Role to be assigned Hard Credit? Or is it limited to one, with the rest needing to be Soft Credit?
  2. If we have multiple donors associated with an Opportunity, can they all be listed as Donor? If so, would that allow the gift to be associated with each donor's record?

Thanks in advance! 

 

#Answers

1 respuesta
  1. 27 ago, 06:16

    For DAF gifts the cleanest model is hard credit to the DAF, soft credit to the individuals — and that also matches the legal picture: the donor's tax-deductible gift happened when they funded the DAF, so the grant to you legally comes from the sponsoring organization. 

     

    On your two questions: 

     

    1) Hard credit isn't multi-contact. In NPSP a gift's hard credit is tied to the Opportunity's Account (and its primary contact) — effectively one payer. So set the Opportunity's Account to the DAF sponsor (e.g., Fidelity Charitable), which hard-credits the DAF, and give each individual a Soft Credit. Hard-crediting the individuals would overstate their deductible giving and muddy audit reconciliation. 

     

    2) Yes — add each individual as an Opportunity Contact Role with a soft-credit role, and NPSP creates a Partial Soft Credit for each. The soft-credit rollups then reflect the gift on every donor's record, so their giving history stays accurate without double-counting the hard credit. Which Contact Role values count as soft credit is configurable in NPSP Settings (Donations, Contact Roles). 

     

    Tip: add an Affiliation between each advisor Contact and the DAF Account (role e.g. DAF Donor) so the relationship shows on both sides. 

     

    if this helps, please mark it as the Best Answer so it helps the next person — thanks 🙂

0/9000

Hi Everyone,

We are currently evaluating a significant change to our Salesforce data model and would appreciate guidance from anyone who has implemented a similar solution in a large enterprise environment.

Current Situation

The Account object is our primary master data entity.

 Looking for Experience and Best Practices: Splitting Salesforce Account into Separate Business Entities (Commercial Account vs Legal Entity) 

If your organisation has implemented a similar transformation, we would greatly appreciate insights on:

  1. Recommended target architecture.
  2. Expected level of effort.
  3. Biggest implementation risks.
  4. Business processes that were unexpectedly impacted.
  5. Integration challenges discovered after design.
  6. Impact on CPQ, contracts, billing, and reporting.
  7. Data migration strategy and lessons learned.
  8. Account Hierarchy Impact  

    How did the change affect:

    • Parent Account hierarchies
    • Rollup reporting
    • Account Teams
    • Territory Management
    • Enterprise Account structure
  9. How were Opportunities handled?  

    Did Opportunities relate to:

    • Commercial Account
    • Legal Entity

Any reference architectures, lessons learned, implementation patterns, anti-patterns, or best practices would be extremely valuable.

Thank you in advance for sharing your experience and recommendations. 

 

#Answers #Salesforce Admin #Sales Cloud

4 respuestas
  1. 20 ago, 10:25

    Good - since it is CPQ, that actually settles the design. Keep the Commercial (operating) account as the transactional account CPQ points its Quotes, Contracts and Orders to, and use the Legal Entity as a bill-to / contract-party lookup rather than moving the transactions onto it. 

     

    The reason: CPQ hangs Contracts, Subscriptions and Assets off the account, and renewals, amendments and asset combination ('Combine Asset Quantities' is an Account field) all key off that same account. So for existing customers, if you migrate them onto a new Legal Entity account you risk breaking the renewal and contracted-price lineage. Safest pattern: apply the two record types from day one for net-new, and for existing accounts keep CPQ pointed at the Commercial account and just add the Legal Entity link. 

     

    If this helps, please mark it as the Best Answer - thanks :)

0/9000

Hi,

I have some static field values created as custom metadata. Now i want to change the generic values, but not able to locate where its been maintained.

I went to setting > Custom metadata type> manage records.

Although i can see the field value name, i can't locate where the values are maintained , which need to be updated. Any suggestions ? #Sales Cloud

6 respuestas
  1. 27 jul, 16:28

    @Sourav P

      

    Yes. The answer is: 

    In Salesforce, Custom Metadata records are maintained under: 

    Setup → Custom Metadata Types → [Your Custom Metadata Type] → Manage Records 

    There are two different things: 

    • Custom Metadata Type → Defines the structure/fields. 
    • Custom Metadata Record → Stores the actual values. 

     

    If you can see the field name but not the actual value, click Edit on the specific metadata record. The values should be displayed there. 

      

    For example: 

      

    Custom Metadata Type: Application Settings 

     → Manage Records 

     → Default Settings 

     → Edit 

     → Update the field values. 

      

    If the value is still not visible or editable, it may be coming from another source, such as: 

     

    •  A Custom Label
    • Custom Setting
    • Custom Metadata referenced by Apex/Flow
    •  A Formula
    •  A Named Credential
    •  A value hard-coded in Apex/LWC 

     

    You can also check the Apex/Flow code that references the metadata to identify exactly where the value is being used. 

     

0/9000

Hey, newbie is here.

Absolute trivial situation, but didn't manage to handle it so far.

So, there are tables:

"users" (id, name, etc)

"questions" (id, answered_user_id, date)

"comments" (id, question_id, user_id, date)

What i need is to get ⌗answers and ⌗comments for particular user at particular time. I've create separated dimension "date" and made following joins:

users-questions (inner,by user_id)

questions-date (inner,by date)

date-comments (inner by date and user_id)

Looks right to me, but figures doesn't make any sense. Thank you in advance, any help is appreciated

5 respuestas
  1. 3 sept 2023, 09:04

    Hi Oraz,

     

    If you're comfortable with joins, you may want to prepare a Logical Table as follows:

     

    1) UNION the questions and comments tables (right in Tableau)

    2) 'ALIGN' the 'same entity' columns using the Tableau-generated [Table Name] as the anchor:

    // aligned_question_id

    CASE [Table Name]

    WHEN 'questions' THEN [id]

    WHEN 'comments' THEN [question_id]

    END

    // aligned_user_id

    CASE [Table Name]

    WHEN 'questions' THEN [answered_user_id]

    WHEN 'comments' THEN [user_id]

    END

    // aligned_date

    [date]

    3) JOIN the users table with the Unioned one by the [aligned_user_id] Join Calculation on the left

     

    Step 3 has to be prepend the step 2, I just show the calcs first to explain the Join to be made.

     

    Yours,

    Yuri

0/9000
3 respuestas
0/9000

I have a permission set that allows only assigned users to perform an "Unlock" action on a locked Order. So there is a custom button on the Order page that says "Unlock Order". That button executes a FLOW to unlock the order.

However, I only want certain users to be able to unlock Orders. 

Currently unauthorized users sometimes click on the button, and then they get an error and we admins get an error email. Waste of all of our time.

So only users that have the permission set assigned should be able to see that button. 

Is there any way to make the button only visible on the Lightning page layout to users with the permission set assigned?

All help greatly appreciated!

 

#Answers  #Lightning Experience

11 respuestas
0/9000

Making a text field dependent on a picklist

 

I am trying to make a new text field dependent on the Stage field. Quite simply, when a user selects the stage "Closed Lost" I want it to make it mandatory to enter the reason in free text.

I can't seem to find a way to do this. Is it possilbe? 

2 comentarios
0/9000