-
1
Map every seat to a business function before building roles
Before you create a single role in the CRM, pull the org chart and group every seat by what the person actually does with revenue data. Reps need to work their book. Managers need to coach and forecast on their team. Executives need rolled-up visibility across teams. Marketing needs campaign objects and attribution. Finance needs closed revenue and little else. Customer success needs post-sale accounts and tickets. Operations needs admin-level access to configure the system but should not be routinely editing live deals. Write each group on paper with a one-line description of what they do all day. The common failure here is building roles that mirror HR titles instead of CRM behavior. "Director" is not a CRM role. "Manager who sees direct reports plus skip-levels in forecast" is. Resist the temptation to clone one role per title. You want five to eight role shapes for most companies, not twenty. Fewer roles mean fewer edge cases, faster onboarding, and audits you can actually finish in an afternoon.
- List every seat that will log into the CRM including contractors, partners, and read-only executives
- Group seats by what they actually do with the data, not by HR title
- Write a one-sentence job-to-be-done for each group so you can test role boundaries later
- Keep the role count between five and eight; collapse anything more granular into field-level or ownership rules
Tip: If two roles differ by only one or two permissions, they are the same role with a field-level override. Do not create a second role for that.
-
2
Define role scope using object permissions and tenant boundaries
Every role gets a scope expressed in three dimensions: which objects it can touch, which actions it can take on those objects, and which records inside each object it can see. Objects are the nouns in the system: accounts, contacts, leads, opportunities, products, cases, forecasts. Actions are create, read, edit, delete, share, export, and administer. Record visibility is the hard part. Most CRMs default to one of three patterns: private (only owner and their management chain see it), public read (everyone can see, only owner edits), or public read-write (everyone can edit). Pick private as the default for opportunities, forecasts, and anything with pricing. Pick public read for accounts, contacts, and products so the whole team can look up a customer without filing a request. Reserve public read-write for shared operational data like territories, campaign responses, or ticket queues. Document which object sits in which pattern before you touch the admin console. If you cannot explain the default visibility of each object in one sentence to a new hire, the model is already too complex.
- List every object the role can see; everything else should be hidden entirely, not just read-only
- For each object, decide read, create, edit, delete, share, and export permissions independently
- Choose a visibility default per object: private, public read, or public read-write
- Document the matrix in a shared doc that is version-controlled, not a wiki page that drifts
-
3
Lock down field-level security for sensitive data
Object-level permissions are the floor, not the ceiling. Most of the risk lives at the field level. A rep who can see an account should probably not see the current ARR, the churn risk score, or the discount floor negotiated with legal. A manager who can see opportunities might not need to see the executive sponsor comments or the custom field marked "internal only." Walk every object and mark each field with one of three states per role: visible and editable, visible but read-only, or hidden entirely. Pricing fields almost always want visible-but-read-only for reps and hidden for everyone outside the deal team. Forecast categories should be editable by managers, read-only for reps, and visible to finance. Health scores and churn probabilities should be hidden from reps who might try to coach the number instead of the customer. Field-level security is tedious to set up and painful to maintain, but it is where most permission failures become breach-worthy incidents. Treat it as a first-class concern, not an afterthought.
- List every field on every object and categorize it as safe, sensitive, or confidential
- For each role, mark each sensitive field as editable, read-only, or hidden
- Pay special attention to pricing, discount floors, forecast overrides, and personal contact details
- Add a "last reviewed" timestamp to each field policy so the next audit can tell what has drifted
Tip: If a field is marked hidden for a role but the record is otherwise visible, test that the field does not leak through list views, exports, or API responses. Most leaks happen there, not in the detail page.
-
4
Build the record ownership model that matches how deals really move
Ownership is the second lever after roles. Every account, contact, lead, and opportunity has an owner, and that owner usually drives who can edit the record and who sees it in private-mode objects. Decide how ownership assignment works at creation and how transfer happens when a rep leaves or a territory changes. For new leads, assignment should be deterministic: a routing rule that respects territory, segment, round-robin fairness, and vacation coverage. Manual assignment is the exception, not the default. For account ownership, decide whether a sales rep owns the account for life, loses it after a defined period of inactivity, or hands it off to customer success at close. Each choice has downstream effects on commission plans, forecast ownership, and the conflicts that explode in Q4. Opportunity ownership typically follows the deal: whoever drives the active cycle owns the record, and ownership transfer requires a logged reason and manager approval. Do not let ownership drift. A deal with no owner is invisible; a deal with the wrong owner forecasts wrong.
- Define the assignment rule for every object at creation, including the tiebreaker when two rules match
- Decide the retention rule for accounts: perpetual, time-boxed, or reassigned on inactivity
- Require a logged reason and approver for every manual ownership change on opportunities
- Build a daily report of records with missing or inactive owners and auto-notify the admin
-
5
Layer in sharing rules and team access for the exceptions
Default visibility covers eighty percent of the needs. The remaining twenty percent is the long tail of exceptions: a specialist pulled into one deal, a partner rep co-selling with the owner, a leader stepping in for a cross-regional review. Model this with explicit sharing rules and deal teams instead of promoting people to broader roles. A sharing rule says "members of this group get read access to records matching this filter." A deal team says "these named individuals get edit access to this one record." Both are reversible and auditable. Avoid two tempting shortcuts. First, do not grant broad role access just to solve one person's problem; one leak outlives the problem it solved. Second, do not let managers add their reports to deal teams freely; require a logged business reason. Over time the deal-team feature becomes a side channel for undocumented access unless you keep the gate narrow. Review all active sharing rules quarterly, retire any that no longer match live data, and keep the total under thirty for most companies. More than that and the model has become unmanageable.
Tip: If a rep asks for "just this one deal" access three times in a quarter, their role is probably wrong. Fix the role before adding another one-off share.
-
6
Scope service accounts and integration tokens the same way as humans
Every CRM integration ships with a service account, an API key, or an OAuth token. Each of those behaves like a human user with permissions, and each is a common breach vector when it goes unaudited. Create a dedicated service account per integration, never reuse a human admin account to run API traffic, and scope each service account to the smallest permission set that makes the integration work. A marketing automation sync usually needs read on accounts and contacts, write on leads, and nothing else. A finance system typically needs read on closed opportunities and nothing else. A data enrichment tool needs write on specific contact fields and read on account URLs. Document what each service account can touch, store the credentials in a secrets manager that is not the CRM, and rotate tokens on a schedule that matches your human password policy. When an integration is retired, retire its service account the same day. The orphan service account with full write permissions is the single most common pattern behind quiet CRM data corruption.
- Create one dedicated service account per integration; never share accounts across integrations
- Scope each service account to the minimum objects and fields its integration actually needs
- Store credentials in a secrets manager outside the CRM; never leave tokens in integration configuration UIs
- Rotate every service-account token on a defined cadence and retire the account the day its integration retires
-
7
Instrument the admin audit log and a weekly review cadence
Permissions drift. A role gets a one-off expansion for a VP who never had it reverted. A field flips from hidden to visible because someone was debugging a report and did not change it back. An integration adds a scope during an upgrade and nobody notices. The only defense is a logged audit of every permission change and a disciplined review of that log. Make sure the CRM is set to log role creation, role modification, field-level security changes, ownership transfers, sharing rule changes, and service-account scope changes. Pipe the log to a system that cannot be edited by CRM admins so the record is tamper-evident. Review the log weekly for the first ninety days after launch, then monthly once the system stabilizes. Each review asks three questions: what changed, who changed it, and does the business reason still apply. Record the answer. The reviewed log is the artifact that passes a SOC 2 audit, satisfies a customer security questionnaire, and tells you honestly whether your model is holding or decaying.
- Confirm the CRM logs role changes, field-level security edits, ownership transfers, and sharing rule changes
- Pipe the audit log to a tamper-evident store that CRM admins cannot edit
- Review the log weekly for the first ninety days post-launch, then shift to monthly
- Record a business reason for every retained change and reverse anything with no documented reason
Tip: The point of the audit log is not catching bad actors, who are rare, but catching accidental drift, which is constant. Treat every unexplained change as a drift signal, not an accusation.
-
8
Document the model, train the team, and schedule the recertification
A permissions model that lives in one admin head is a permissions model with a bus number of one. Write it down. A single document should describe every role, every object visibility rule, every field-level override, the ownership and sharing rules, the service-account inventory, and the audit cadence. Store it in version control so changes have a diff. Train every manager on how the model works, how to request changes, and what the review cadence will catch. Schedule a formal recertification once a quarter where every role owner confirms their team still needs the access they have and every sensitive-field policy gets a thumbs-up from the data owner. Recertification sounds bureaucratic until the first time a departing executive takes a full data export with them because nobody noticed their access was never scoped back down. The quarterly cadence is also the right time to retire users who left, reclaim licenses, and check that offboarding actually revoked the access it promised to revoke. Permissions are a product, not a project. Treat them that way.
- Write a single source-of-truth document covering roles, visibility, field security, ownership, sharing, and service accounts
- Store the document in version control so every change produces a reviewable diff
- Train managers on how to request changes and what the review cadence catches
- Run a quarterly recertification: role owners confirm access, data owners confirm field policies, admins reclaim orphan licenses