Stood Flows · reading the matrix

One row per record type, because that is where the org actually splits

An Opportunity object can hide six businesses. Stood Flows gives each of them its own row, so complexity, usage, cost and stage health are read on the unit a team actually owns.

statusshipped · matrix since 1.0ghost split · 1.3.0drill-downs · 1.2.8docsKPI Table Volumes and Complexity Objects, record types and lineageCapability atlas

Why the unit is the record type, not the object

Almost everything that makes a Salesforce org heavy is scoped to a record type: page layouts, profile visibility, record-triggered flows with their entry conditions, validation rules that test a status, the picklist a process offers. Counted on the object, these pile into one number nobody can act on. Sliced by record type and business process, each piece lands on the process it serves, and the row that says this process is complex also says this is who can touch it, how often it moves and how much it costs.

Process slicing · one object, three rowsSTOOD
Opportunity object · 4,153,111 records · 1 of 6 backbone objects 55 profiles see it 42 page layouts 87 stage values 16 validation rules 43 triggered flows 1 Apex trigger One pile of numbers. Which business owns which part? Nobody can say from here. Residences Sales record type · 2,803,110 records 38 rules · 6 layouts · 9 flows Marina Concierge Booking record type · 64,953 records 0 rules · 6 layouts · 0 flows Eco Loyalty Booking record type · 11 records 0 rules · 6 layouts · 0 flows Master row what no record type can claim slicing key Layout, profile, pagerecord-type visibility Validation ruleformula parsed → stage ref Record-triggered flowentry filter → RT / stage Record & stage countsRecordTypeId × picklist Related custom objectslookup back-reference Logins, actors, licencesRT visibility × active users stays on the master row Triggered flows with no RT filterrun for every process Apex triggersobject scoped by nature Assignment rules, FlexiPagesobject level Records with no record type"no record type" bucket Profiles with object read onlyno explicit RT visibility a crowded master row = automation that is not process-specific The matrix process · total · ghosts · active · score · … Opportunity 4,153,11114987 One row. Score 149 on the object. Impossible to tell the business that needs 38 rules from the one with 11 records. Opportunity4,153,11114987 Residences Sales2,803,1108217 Marina Concierge Booking64,953245 Eco Loyalty Booking11225 recordsscorestages Same object, three answers. Eco Loyalty carries a score of 22 for 11 records: that is a finding.
record-type specificattributed by parsingmaster fallback
Illustrative — Meridian Hospitality Group, synthetic demonstration estate. Record types shown are 3 of 108 processes.

Anatomy of a row

Every column group answers one question about the same process. Click a group to see what the columns mean and where the number comes from.

KPI matrix · column groupsSTOOD
Process TotalGhostsActive1 … N ModifiedActors ScoreStagesProfilesTriggered flowsRules ObjectsItems AllowedVisibleUnused
Opportunity 4,153,111581,4882,419,74735 cols 311,2071,214 1493555116 211 4121883/4
Residences Sales 2,803,11070,1221,902,34017 cols 288,004906 821712938 141 38014131 (22)
Marina Concierge Booking 64,9539156,1965 cols 4,81163 245600 31 3806212 (8)
Eco Loyalty Booking 11275 cols 00 225600 00 38062—

Volume. Total is the exact record count per record type. The numbered columns are the stages this record type's process offers, in picklist order. Active is the sum of the non-final stage columns. Ghosts are the records the stage columns cannot account for, so stages + Ghosts = Total, always, by construction.

Illustrative — Meridian Hospitality Group. Usage over 12 months; Fields threshold 5% on records created in the window. The real table carries more columns; this is the reading order.

How to read the stages column

Stage columns are numbered 1 … N and sized to the widest record-type process, never to the master picklist. Columns are ordered open stages, then positive finals, then negative finals, so the shape of a healthy process is a slope that ends on the right. The numbers under each stage are records resting there now; the Time toggle swaps them for the average days a record spends in that stage, computed from field history over a sliding year.

Stages column · Concierge Intake CaseSTOOD
Concierge Intake Case case record type · 36,492 records · 7 stages offered by its business process openfinal +final − New In Progress Pending Franchise Pending Staff Under Review Closed Invalid 32,768 0 2 0 3 2 392 90% rest here never used never used 2 ever closed Read left to right. A healthy lifecycle slopes toward the positive final on the right. Here 32,768 of 36,492 cases rest in New, three stages have never held a record, and only 2 cases ever reached Closed. The process exists in configuration, not in the business. files to the epics qualify stage concentration fix process stage configuration Σ stage columns33,167 + Ghosts3,325 = Total36,492 holds by construction ghosts, three kinds — hover the header in the app to see the split Off-process · 2,901 status exists in the picklist but this record type's business process does not offer it. Someone bypassed the process. Retired · 398 status was removed from the picklist; the records kept it. They can never move again. Unattributed · 26 blank status, or query residual on a 10,000+ capped count. Small by nature; large means a data problem. Ghosts are not "lost" cases: they are the records the process can no longer explain. A record type with 97% ghosts (a sync that writes a status the process never offered) is a cleanup epic, not a reporting issue. 214 d — 6 d — 11 d · · average dwell Time 1 … N replaces counts with the average days a record spent in each stage, from CaseHistory transitions over a sliding year. Fetched incrementally by monthly cohort, so a re-run only reads what is new. Not computed for Account and Contact, which have sources instead of stages. what to look for A stage with a long dwell and a tiny count is a bottleneck. A stage with a short dwell for everyone is a formality worth removing from the picklist, with the validation rules that guard it.
Illustrative — Meridian Hospitality Group, Hospitality Operations Hub org. Counts are records resting in each stage at the last refresh; the identity stages + ghosts = total is enforced by the app, not by rounding.
What this means on Monday. Open the matrix, sort by Score, and look at the Total next to it. Every row with a two-digit score and a two-digit record count is a candidate before anyone opens Setup.

Account and Contact: same row, no stages

Account and Contact get the same scaffolding (record types, profiles, layouts, flows, triggers, rules, related objects, licence allocation) with a different mental model. They classify rather than progress, so their process column holds sources and the Stages, Active and Ghosts columns stay empty. The matrix separates them from the four lifecycle objects with a thicker border, and a custom object that behaves like a backbone object can be promoted to get identical rows.

In the app

Captured from the application itself, built from the current source tree and opened read-only on the Meridian demonstration workspace.

The matrix on the Meridian flagship org: Volume group open, stage columns 1…10, master rows tinted. 118 rows, 108 processes.
The matrix on the Meridian flagship org: Volume group open, stage columns 1…10, master rows tinted. 118 rows, 108 processes.
Lifecycle → Time swaps the counts for the average days a record spends in each stage.
Lifecycle → Time swaps the counts for the average days a record spends in each stage.