Not verified hands-on. This article was written from primary documentation rather than reproduced in an org, so it carries no tested-release badge. If you run it and something differs, say so in the comments and it gets tested and corrected.

Straight answer: a list view has three independent controls, and confusing them is why list views misbehave. Visibility decides who can select the view. Scope decides which records are considered before any filter runs. Filters narrow what is left. A user seeing an empty list view usually has a scope problem. A user who cannot find the view at all has a visibility problem.

Scope is not a filter

Scope is the “Filter by Owner” setting: All records, My records, or records owned by a queue. It runs first and it is not expressible in the filter grid.

“All records” does not mean all records in the org. It means all records the running user can see under the sharing model. Two users on the same list view with the same filters routinely see different rows, and neither the view nor the filter is wrong. This is worth saying out loud to anyone who reports that a colleague has records they cannot see.

Filter logic

Filters default to AND across every row. Filter logic replaces that with an expression referencing the row numbers:

1 AND (2 OR 3) AND NOT 4

Rules that trip people up:

  • Every filter row must be referenced in the logic. A row you leave out is ignored entirely rather than treated as AND.
  • Deleting a row renumbers the rest, and the logic string does not follow. Re-read it after any deletion.
  • NOT applies to a single row reference or a bracketed group, and misplacing the brackets changes the result without any warning.

Visibility

Three options when you save a view:

  • Only I can see this list view. Private to the creator.
  • All users can see this list view. Everyone with object access, including partner and customer portal users if they have the object.
  • Share list view with groups of users. Available on Enterprise and above, sharing to public groups, roles, or roles and subordinates.

Sharing a view grants access to the view definition, not to records. A user shared into a view still sees only records their sharing gives them, which is the correct behaviour and a frequent surprise.

Why a user cannot see a list view

Work through these in order:

  • The view is private to its creator.
  • The view is shared to a group the user is not in.
  • The user lacks Read on the object, so the tab and every view on it are gone.
  • The tab is hidden in the user’s app or profile, so the view exists but is unreachable.
  • The view is visible but empty, because scope is “My records” or the user’s sharing returns nothing. Empty and missing look similar in a hurry and have completely different causes.
  • The view filters on a field hidden from the user by field-level security. The rows come back, the column does not.

Things list views do that reports do not

Inline editing, including mass inline edit on a selection. Mass actions on selected records. List view charts. Kanban. Filtering on a lookup by typing the name. These are the reasons to keep list views around instead of replacing them all with reports.

What they do not do: grouping, summary rows beyond the simple charts, cross-object criteria more than one level away, subscriptions, and history. When a request needs any of those, build a report.

Maintenance

List views accumulate. An object with 90 views, most of them one person’s experiment from 2021, makes the selector unusable and slows the page. There is no owner report built into Setup, but list views are queryable and the object’s Setup listing shows creator and visibility, which is enough to run a cleanup.

Frequently asked

Can I filter a list view on a field from a related record? Only through fields available on the object, which includes cross-object formula fields you have created. The filter grid itself does not traverse relationships.

Can a list view be filtered by record type? Yes, Record Type is available as a filter field where the object has record types.

Why does my filter on a picklist return nothing? Picklist filters compare against the value, and a renamed label with an unchanged API value is the usual explanation. Pick the value from the list rather than typing it.

Can I deploy a list view? Yes, list views are metadata and deploy with the object. Private views belong to their creator and are not generally included, so shared views are the ones to put in source control.