Persona And Journey Mapping (Salesforce-Anchored)
This skill activates when an admin, BA, or architect needs to define who actually
uses the org and how, in a way that drives concrete Salesforce configuration
decisions rather than abstract UX deliverables. Every persona must anchor to org
artifacts the platform exposes — Permission Set Groups, record types, list views,
dashboards, automation — and every journey must walk a real task with measured
friction so the output feeds downstream auditing and design agents.
Before Starting
Gather this context before producing any persona artifact:
- The list of in-scope roles and their headcount. Roles without users are noise.
- The target Permission Set Group(s) for each role — if the PSG does not yet
exist, flag it; do not invent one. Personas without a PSG anchor become opinion
pieces.
- The primary record types each role touches and the list views they live
in. These are observable, not invented.
- Mobile vs desktop usage, ideally measured (Lightning Usage app, login
history, EventLogFile UriEvent / LightningPerformance) — never assumed.
- Dashboards the role consumes daily/weekly. If a dashboard is named in a
persona but does not exist in the org, it is a hallucination — flag it.
- The automation that fires for the role (record-triggered Flow, validation
rules, assignment rules, approval processes, Agentforce topics) — captured by
metadata, not memory.
Core Concepts
Persona = User × Org Artifacts
A Salesforce-anchored persona is the join between a user population and the
concrete artifacts the platform uses to constrain and serve them. The five
anchors are non-negotiable: PSG (what they can do), record types (what they
work on), list views (what they see), dashboards (how they measure success),
automation (what fires for them). A persona missing any anchor cannot drive a
configuration decision.
Mobile vs Desktop Posture
Salesforce mobile (the Salesforce app) and Lightning Experience desktop are
different products with different UX rules: mobile favors Compact Layouts,
mobile-only Quick Actions, and brief related-list summaries; desktop favors
Dynamic Forms, multi-tab record pages, and dense related lists. The
mobile_pct / desktop_pct split — measured, not guessed — is what tells you
which surface to optimize. A 70% mobile field rep persona and a 95% desktop
SDR persona need very different record pages even on the same object.
Journey Map vs Process Flow
A journey map is persona-first: one persona, one task, every step
they take, with friction tagged. A process flow is system-first: the
sequence of system events regardless of who triggers them. Journey maps drive
UX decisions (Dynamic Forms, Quick Actions, page redesign, path); process
flows drive automation decisions (Flow vs Apex, callouts, approvals). Do not
conflate them. If you find yourself describing a callout, you are writing a
process flow — stop and switch artifacts (admin/process-flow-as-is-to-be).
Friction Taxonomy (Fixed Enum)
Every friction point must be tagged from this enum so downstream agents can
route work:
| Friction Tag |
Meaning |
Typical Fix |
cognitive_load |
Too many fields, sections, or related lists in view at once |
Dynamic Forms, conditional visibility, page redesign |
click_count |
Task takes more navigation clicks than necessary |
Quick Action, Path step, list view inline edit, related list tuning |
mode_switch |
Forces user from mobile→desktop or app→browser mid-task |
Mobile-friendly Quick Action, mobile-aware Lightning page, offline-capable LWC |
data_input |
Repeated typing, no defaults, no picklist where appropriate |
Default field values, validation rule with a useful message, picklist conversion |
search |
User cannot find a record, list view, or related item |
List view tuning, search layout, pinned list views, Einstein Search config |
Common Patterns
Pattern: PSG-First Persona Sketch
When to use: brand-new persona work, or when an existing persona doc has
drifted from org reality.
How it works: start from the PSG (or planned PSG) — extract assigned
object permissions, record types, layouts, and tabs. Bind that to a named
persona. Every claim in the persona profile must trace back to a PSG, a
record type, a list view, a dashboard, or an automation in the org.
Why not the alternative: title-based personas ("Sales Rep") describe a
stereotype, not a user. They drift, they collide, and they cannot be audited.
Pattern: One Task Per Journey Map
When to use: every primary persona task — captured one task per journey
artifact, not bundled.
How it works: the journey artifact has a single task (e.g. "Log a
visit", "Triage an inbound case", "Update opportunity stage to Negotiation"),
the frequency (daily / weekly / monthly / quarterly), the steps in order,
the friction tag on each problematic step, and the next task the persona
moves to (so the journey doesn't end at "saves record").
Why not the alternative: combining tasks into a single map produces a
deliverable nobody reads and a friction list nobody can route.
Decision Guidance
| Situation |
Recommended Approach |
Reason |
| Asked for personas with no PSG roadmap yet |
Flag the gap. Do not write personas; write a PSG sketch first. |
Personas without PSG anchors cannot be audited or kept current. |
| Asked to map mobile vs desktop and no measurement exists |
Flag the gap. Pull from Lightning Usage app or EventLogFile, then resume. |
Inventing mobile_pct corrupts every downstream UX decision. |
| Persona task ends at "record saved" |
Extend it — what task does the persona do next, on what surface? |
A journey that ends at save misses the most common friction (mode switch to next task). |
| 9+ personas in a single phase |
Reduce to ≤7 by merging adjacent personas. |
More than 7 personas is noise; signal-to-decision ratio collapses. |
| Persona references a dashboard nobody can find in the org |
Remove or replace with a real dashboard |
Hallucinated artifacts make the persona untrustworthy. |
| Friction tag does not fit the taxonomy |
Either re-frame to fit the enum or capture as notes |
Free-text tags break the routing handoff. |
Recommended Workflow
- Identify personas from PSG roadmap. Pull the planned (or current) Permission
Set Groups; one persona per distinct user population the PSGs serve. If a
PSG covers two distinct populations with different journeys, split it.
- Anchor each persona to org artifacts. Fill the canonical schema:
psg_assigned, primary_record_types[], primary_list_views[],
dashboards[], automation_touched[], and the measured mobile_pct /
desktop_pct. No anchor → not a persona.
- Build a journey map per primary task. One task per artifact. Record
frequency, every step in order, friction points tagged from the fixed
taxonomy, and the next task the persona transitions to.
- Flag friction that needs UI work.
cognitive_load, click_count, and
mode_switch typically route to record-page redesign, Quick Actions, Path,
or Dynamic Forms — handed off to lightning-record-page-auditor.
- Flag friction that needs automation.
data_input and some click_count
friction routes to Flow, defaults, validation rules, or assignment rules —
handed off to the automation agents.
- Hand off to downstream agents. Emit the handoff JSON: persona id, anchor
artifacts, friction backlog, and target agents
(
lightning-record-page-auditor, list-view-and-search-layout-auditor,
path-designer, plus UAT test design which runs each case as a persona).
- Revisit per release. Personas drift as PSGs and record types change;
re-run the anchor check every release train.
Canonical Persona Schema
{
"persona_id": "outside_sales_rep",
"name": "Outside Sales Rep",
"headcount": 42,
"psg_assigned": "PSG_Sales_Field",
"primary_record_types": ["Account.Customer", "Opportunity.Field_Deal", "Visit__c.Standard"],
"primary_list_views": ["My_Open_Opps_This_Week", "Visits_Due_Today"],
"dashboards": ["Field_Sales_Daily"],
"mobile_pct": 70,
"desktop_pct": 30,
"automation_touched": [
"Flow:Visit_After_Save",
"ValidationRule:Opp.Field_Stage_Required_Fields",
"AssignmentRule:Lead_Field_Territory"
]
}
Canonical Journey Schema
{
"persona_id": "outside_sales_rep",
"task": "Log a customer visit between meetings",
"frequency": "daily",
"steps": [
{"step": "Open Salesforce mobile app", "surface": "mobile"},
{"step": "Tap Visits Due Today list view", "surface": "mobile"},
{"step": "Open visit, tap Log Visit Quick Action", "surface": "mobile"},
{"step": "Enter notes, attendees, next step", "surface": "mobile", "friction": "data_input"},
{"step": "Save", "surface": "mobile"},
{"step": "Move to next visit on list", "surface": "mobile"}
],
"friction_points": [
{"step_index": 3, "tag": "data_input", "note": "No default for Visit Type; user retypes territory each time"}
],
"desired_outcome": "Visit logged in <60s without leaving the mobile app",
"next_task": "Drive to next account and repeat"
}
Handoff JSON Shape
{
"personas": [ /* persona records */ ],
"journeys": [ /* journey records */ ],
"friction_backlog": [
{
"persona_id": "outside_sales_rep",
"task": "Log a customer visit between meetings",
"friction_tag": "data_input",
"recommended_target": "lightning-record-page-auditor",
"recommended_intervention": "Default Visit Type from territory; review mobile compact layout"
}
]
}
Review Checklist
Salesforce-Specific Gotchas
- PSG drift after release. PSGs change between releases as new objects ship; re-run anchor checks every release train or personas go stale silently.
- Mobile usage measurement gaps. Lightning Usage app shows desktop-only by default; you must enable Mobile App usage and EventLogFile UriEvent to get the real split.
- List view personalization invisible to admins. Users create personal list views the admin never sees; persona list-view anchors should bias to shared list views or you misread the journey.
Output Artifacts
| Artifact |
Description |
personas.json |
Array of persona records following the canonical schema. |
journeys.json |
Array of journey records, one per persona-task pair. |
friction_backlog.json |
Routed friction items with target agent and recommended intervention. |
handoff.json |
Combined handoff envelope consumed by downstream auditing agents. |
Related Skills
admin/stakeholder-raci-for-sf-projects — Use for stakeholder authority and decision rights, not user-facing persona work.
admin/process-flow-as-is-to-be — Use for system-side process flows; this skill stays user-facing.
admin/lightning-app-builder-advanced — Use for the actual record page build once friction is identified.
agents/lightning-record-page-auditor — Downstream audit agent that consumes per-persona record page friction.
agents/list-view-and-search-layout-auditor — Downstream agent for search and list-view friction.
agents/path-designer — Downstream agent for per-record-type path design driven by journey stages.
1---2name: persona-and-journey-mapping-sf3description: Build Salesforce-anchored personas and journey maps where every persona ties to a Permission Set Group, primary record types, list views, dashboards, automation, and a measured mobile/desktop posture, and journeys walk each task end-to-end with friction tags that drive UX decisions. NOT for stakeholder authority / RACI (use admin/stakeholder-raci-for-sf-projects), NOT for system-side process flows (use admin/process-flow-as-is-to-be), NOT for Lightning page design itself (use admin/lightning-app-builder-advanced or the lightning-record-page-auditor agent), NOT for pure design / UX research disconnected from org artifacts.4---56# Persona And Journey Mapping (Salesforce-Anchored)78This skill activates when an admin, BA, or architect needs to define **who actually9uses the org and how**, in a way that drives concrete Salesforce configuration10decisions rather than abstract UX deliverables. Every persona must anchor to org11artifacts the platform exposes — Permission Set Groups, record types, list views,12dashboards, automation — and every journey must walk a real task with measured13friction so the output feeds downstream auditing and design agents.1415---1617## Before Starting1819Gather this context before producing any persona artifact:2021- The **list of in-scope roles** and their headcount. Roles without users are noise.22- The **target Permission Set Group(s)** for each role — if the PSG does not yet23 exist, flag it; do not invent one. Personas without a PSG anchor become opinion24 pieces.25- The **primary record types** each role touches and the **list views** they live26 in. These are observable, not invented.27- **Mobile vs desktop usage**, ideally measured (Lightning Usage app, login28 history, EventLogFile UriEvent / LightningPerformance) — never assumed.29- **Dashboards** the role consumes daily/weekly. If a dashboard is named in a30 persona but does not exist in the org, it is a hallucination — flag it.31- The **automation** that fires for the role (record-triggered Flow, validation32 rules, assignment rules, approval processes, Agentforce topics) — captured by33 metadata, not memory.3435---3637## Core Concepts3839### Persona = User × Org Artifacts4041A Salesforce-anchored persona is the join between a *user population* and the42*concrete artifacts* the platform uses to constrain and serve them. The five43anchors are non-negotiable: PSG (what they can do), record types (what they44work on), list views (what they see), dashboards (how they measure success),45automation (what fires for them). A persona missing any anchor cannot drive a46configuration decision.4748### Mobile vs Desktop Posture4950Salesforce mobile (the Salesforce app) and Lightning Experience desktop are51different products with different UX rules: mobile favors Compact Layouts,52mobile-only Quick Actions, and brief related-list summaries; desktop favors53Dynamic Forms, multi-tab record pages, and dense related lists. The54mobile_pct / desktop_pct split — **measured, not guessed** — is what tells you55which surface to optimize. A 70% mobile field rep persona and a 95% desktop56SDR persona need very different record pages even on the same object.5758### Journey Map vs Process Flow5960A journey map is **persona-first**: one persona, one task, every step61they take, with friction tagged. A process flow is **system-first**: the62sequence of system events regardless of who triggers them. Journey maps drive63UX decisions (Dynamic Forms, Quick Actions, page redesign, path); process64flows drive automation decisions (Flow vs Apex, callouts, approvals). Do not65conflate them. If you find yourself describing a callout, you are writing a66process flow — stop and switch artifacts (`admin/process-flow-as-is-to-be`).6768### Friction Taxonomy (Fixed Enum)6970Every friction point must be tagged from this enum so downstream agents can71route work:7273| Friction Tag | Meaning | Typical Fix |74|---|---|---|75| `cognitive_load` | Too many fields, sections, or related lists in view at once | Dynamic Forms, conditional visibility, page redesign |76| `click_count` | Task takes more navigation clicks than necessary | Quick Action, Path step, list view inline edit, related list tuning |77| `mode_switch` | Forces user from mobile→desktop or app→browser mid-task | Mobile-friendly Quick Action, mobile-aware Lightning page, offline-capable LWC |78| `data_input` | Repeated typing, no defaults, no picklist where appropriate | Default field values, validation rule with a useful message, picklist conversion |79| `search` | User cannot find a record, list view, or related item | List view tuning, search layout, pinned list views, Einstein Search config |8081---8283## Common Patterns8485### Pattern: PSG-First Persona Sketch8687**When to use:** brand-new persona work, or when an existing persona doc has88drifted from org reality.8990**How it works:** start from the PSG (or planned PSG) — extract assigned91object permissions, record types, layouts, and tabs. Bind that to a named92persona. Every claim in the persona profile must trace back to a PSG, a93record type, a list view, a dashboard, or an automation in the org.9495**Why not the alternative:** title-based personas ("Sales Rep") describe a96stereotype, not a user. They drift, they collide, and they cannot be audited.9798### Pattern: One Task Per Journey Map99100**When to use:** every primary persona task — captured one task per journey101artifact, not bundled.102103**How it works:** the journey artifact has a single `task` (e.g. "Log a104visit", "Triage an inbound case", "Update opportunity stage to Negotiation"),105the frequency (daily / weekly / monthly / quarterly), the steps in order,106the friction tag on each problematic step, and the **next task** the persona107moves to (so the journey doesn't end at "saves record").108109**Why not the alternative:** combining tasks into a single map produces a110deliverable nobody reads and a friction list nobody can route.111112---113114## Decision Guidance115116| Situation | Recommended Approach | Reason |117|---|---|---|118| Asked for personas with no PSG roadmap yet | Flag the gap. Do not write personas; write a PSG sketch first. | Personas without PSG anchors cannot be audited or kept current. |119| Asked to map mobile vs desktop and no measurement exists | Flag the gap. Pull from Lightning Usage app or EventLogFile, then resume. | Inventing mobile_pct corrupts every downstream UX decision. |120| Persona task ends at "record saved" | Extend it — what task does the persona do next, on what surface? | A journey that ends at save misses the most common friction (mode switch to next task). |121| 9+ personas in a single phase | Reduce to ≤7 by merging adjacent personas. | More than 7 personas is noise; signal-to-decision ratio collapses. |122| Persona references a dashboard nobody can find in the org | Remove or replace with a real dashboard | Hallucinated artifacts make the persona untrustworthy. |123| Friction tag does not fit the taxonomy | Either re-frame to fit the enum or capture as `notes` | Free-text tags break the routing handoff. |124125---126127## Recommended Workflow1281291. **Identify personas from PSG roadmap.** Pull the planned (or current) Permission130 Set Groups; one persona per distinct user population the PSGs serve. If a131 PSG covers two distinct populations with different journeys, split it.1322. **Anchor each persona to org artifacts.** Fill the canonical schema:133 `psg_assigned`, `primary_record_types[]`, `primary_list_views[]`,134 `dashboards[]`, `automation_touched[]`, and the measured `mobile_pct` /135 `desktop_pct`. No anchor → not a persona.1363. **Build a journey map per primary task.** One task per artifact. Record137 frequency, every step in order, friction points tagged from the fixed138 taxonomy, and the next task the persona transitions to.1394. **Flag friction that needs UI work.** `cognitive_load`, `click_count`, and140 `mode_switch` typically route to record-page redesign, Quick Actions, Path,141 or Dynamic Forms — handed off to `lightning-record-page-auditor`.1425. **Flag friction that needs automation.** `data_input` and some `click_count`143 friction routes to Flow, defaults, validation rules, or assignment rules —144 handed off to the automation agents.1456. **Hand off to downstream agents.** Emit the handoff JSON: persona id, anchor146 artifacts, friction backlog, and target agents147 (`lightning-record-page-auditor`, `list-view-and-search-layout-auditor`,148 `path-designer`, plus UAT test design which runs each case as a persona).1497. **Revisit per release.** Personas drift as PSGs and record types change;150 re-run the anchor check every release train.151152---153154## Canonical Persona Schema155156```json157{158 "persona_id": "outside_sales_rep",159 "name": "Outside Sales Rep",160 "headcount": 42,161 "psg_assigned": "PSG_Sales_Field",162 "primary_record_types": ["Account.Customer", "Opportunity.Field_Deal", "Visit__c.Standard"],163 "primary_list_views": ["My_Open_Opps_This_Week", "Visits_Due_Today"],164 "dashboards": ["Field_Sales_Daily"],165 "mobile_pct": 70,166 "desktop_pct": 30,167 "automation_touched": [168 "Flow:Visit_After_Save",169 "ValidationRule:Opp.Field_Stage_Required_Fields",170 "AssignmentRule:Lead_Field_Territory"171 ]172}173```174175## Canonical Journey Schema176177```json178{179 "persona_id": "outside_sales_rep",180 "task": "Log a customer visit between meetings",181 "frequency": "daily",182 "steps": [183 {"step": "Open Salesforce mobile app", "surface": "mobile"},184 {"step": "Tap Visits Due Today list view", "surface": "mobile"},185 {"step": "Open visit, tap Log Visit Quick Action", "surface": "mobile"},186 {"step": "Enter notes, attendees, next step", "surface": "mobile", "friction": "data_input"},187 {"step": "Save", "surface": "mobile"},188 {"step": "Move to next visit on list", "surface": "mobile"}189 ],190 "friction_points": [191 {"step_index": 3, "tag": "data_input", "note": "No default for Visit Type; user retypes territory each time"}192 ],193 "desired_outcome": "Visit logged in <60s without leaving the mobile app",194 "next_task": "Drive to next account and repeat"195}196```197198## Handoff JSON Shape199200```json201{202 "personas": [ /* persona records */ ],203 "journeys": [ /* journey records */ ],204 "friction_backlog": [205 {206 "persona_id": "outside_sales_rep",207 "task": "Log a customer visit between meetings",208 "friction_tag": "data_input",209 "recommended_target": "lightning-record-page-auditor",210 "recommended_intervention": "Default Visit Type from territory; review mobile compact layout"211 }212 ]213}214```215216---217218## Review Checklist219220- [ ] Every persona is anchored to a real PSG (planned or existing).221- [ ] Every persona lists ≥1 record type, ≥1 list view, and ≥1 dashboard from the org.222- [ ] `mobile_pct + desktop_pct ≈ 100` (within ±2 for rounding) and the source of the measurement is named.223- [ ] Every primary task has its own journey artifact with ≥3 steps.224- [ ] Every friction point uses a tag from the fixed enum.225- [ ] Every journey names the `next_task`; none end at "save".226- [ ] Persona count for the phase is ≤ 7.227- [ ] Friction backlog routes each item to a downstream agent.228229---230231## Salesforce-Specific Gotchas2322331. **PSG drift after release.** PSGs change between releases as new objects ship; re-run anchor checks every release train or personas go stale silently.2342. **Mobile usage measurement gaps.** Lightning Usage app shows desktop-only by default; you must enable Mobile App usage and EventLogFile UriEvent to get the real split.2353. **List view personalization invisible to admins.** Users create personal list views the admin never sees; persona list-view anchors should bias to shared list views or you misread the journey.236237---238239## Output Artifacts240241| Artifact | Description |242|---|---|243| `personas.json` | Array of persona records following the canonical schema. |244| `journeys.json` | Array of journey records, one per persona-task pair. |245| `friction_backlog.json` | Routed friction items with target agent and recommended intervention. |246| `handoff.json` | Combined handoff envelope consumed by downstream auditing agents. |247248---249250## Related Skills251252- `admin/stakeholder-raci-for-sf-projects` — Use for stakeholder authority and decision rights, not user-facing persona work.253- `admin/process-flow-as-is-to-be` — Use for system-side process flows; this skill stays user-facing.254- `admin/lightning-app-builder-advanced` — Use for the actual record page build once friction is identified.255- `agents/lightning-record-page-auditor` — Downstream audit agent that consumes per-persona record page friction.256- `agents/list-view-and-search-layout-auditor` — Downstream agent for `search` and list-view friction.257- `agents/path-designer` — Downstream agent for per-record-type path design driven by journey stages.