A few years ago we were setting up a sales dashboard for a manufacturing client — about 200 reps across four regions — and their admin had built every pipeline report as Tabular. Flat lists, clean columns, easy to export. Looked reasonable until the sales director asked to see total pipeline by stage, broken out by region. We could not add that grouping without rebuilding every report from scratch. Two days of rework, entirely preventable, because the format decision happened at the wrong time — after the columns, not before the question.
That experience is now the first thing we bring up when onboarding a new admin: the format decision should come before you open Report Builder, not after. Salesforce's four report formats are not cosmetic choices. Each one is designed around a different question structure, and the constraints are real — you cannot add groupings to a Tabular report, you cannot use a Joined report as a dashboard source, and you cannot get a cross-tab breakdown out of a Summary report no matter how many grouping levels you add.
Here is how we think through each format.
Tabular: when a flat list is exactly what you need
Tabular is the simplest format — rows and columns, no grouping, no subtotals. We use it whenever the request is genuinely "give me the records," not "summarize the records." A daily export of all open cases for a support team to triage, a one-off list of contacts in a specific city for an event invite, a raw dump of closed opportunities before a finance reconciliation — these are Tabular use cases. The format does exactly what it promises.
The mistake we see most often is using Tabular as a default because it builds fastest, then discovering the constraint that stings the most: Tabular reports cannot be used as dashboard chart sources. You cannot drop a Tabular report onto a dashboard component and get a bar chart out of it. If the requirement even hints at "and we want this on the dashboard," build in Summary from the start. Retrofitting is not hard, but it is avoidable friction.
We also never build Tabular reports when someone is going to ask for subtotals. The format cannot calculate them. If the first question is "how many open cases are there?" and the follow-up will be "broken down by priority?" — start with Summary.
Summary: the workhorse for almost everything else
Summary reports group rows by one or more fields and calculate subtotals per group. This is the format we default to for the vast majority of operational reports — pipeline tracking, activity counts, case volume by queue, campaign performance. It handles the question "how much / how many, grouped by X" cleanly, and it supports dashboard charts.
The structure is straightforward: you pick one or more grouping fields, and the report collapses rows into sections. Each section shows aggregate metrics — sum, count, average, min, max — and the grand total appears at the bottom. You can stack groupings: group by Region, then within each region group by Stage, and you get a nested breakdown with subtotals at every level.
On a recent project for a retail distribution company, we built a Summary report grouped by Sales Owner, then by Opportunity Stage, with Amount summed. The sales director could see each rep's pipeline broken down by stage, collapse or expand individual reps, and the same report fed a bar chart on the executive dashboard showing total pipeline per stage across the whole team. One report, two uses — that's the efficiency you get when you start with the right format.
The rule we follow: if the question has one analytical dimension ("by Stage", "by Owner", "by Month"), Summary is almost certainly the right choice.
Matrix: when the question has two dimensions
Matrix reports add column groupings on top of row groupings, creating a cross-tab grid where every cell shows the aggregated value for a row-group and column-group intersection. You cannot replicate this in Summary — stacking more row groupings is not the same thing.
The typical scenario we encounter: a sales director wants to see total opportunity amount broken out by both Industry (rows) and Stage (columns). The grid makes the pattern visible at a glance — which industries have pipeline concentrated in early stages, which are heavy in negotiation, which are winning consistently.
| Qualification | Proposal | Negotiation | Closed Won | |
|---|---|---|---|---|
| Banking | $2.5M | $4M | $6M | $1M |
| Manufacturing | $3M | $5M | $2M | $1.5M |
| Retail | $1.8M | $2M | $1.2M | $800K |
We built exactly this for a technology distributor in Ho Chi Minh City — their regional managers had been asking for this view for months but their previous admin had been layering Summary groupings trying to approximate it. The Matrix report took twenty minutes to configure and solved the problem completely.
One nuance worth knowing on the dashboard side: Matrix reports can feed dashboard charts, but the chart will render the row groupings, not the full grid. If stakeholders want the actual cross-tab visual, it is usually better to link directly to the report rather than trying to force the grid into a dashboard component. We tell clients this upfront so they set the right expectations.
Our shorthand: if the question is "X by Y" and both X and Y need their own subtotals, you need Matrix.
Joined: comparing apples and oranges in one view
Joined reports let you combine multiple report blocks — each sourced from a different report type — into a single view. Each block keeps its own filters, groupings, and columns, but they share a common grouping field and render together on one screen.
We reach for Joined reports in a specific situation: a stakeholder wants to see data from two objects that do not have a direct relationship, side by side, in a single report. The classic example is accounts with open cases next to accounts with open opportunities. Cases and Opportunities do not share a parent-child relationship in Salesforce's standard data model, so you cannot get both onto a standard report. A Joined report puts a Cases block and an Opportunities block next to each other, both filtered to the same set of accounts, and the shared grouping by Account Name lets you scan across.
We are honest with clients about the tradeoffs. Joined reports have a hard limitation: they cannot be used as dashboard chart sources. This catches admins by surprise more than almost any other format constraint, because it is not obvious from the UI until you try to add the report to a dashboard component and find it grayed out. If a dashboard component is part of the requirement, Joined is off the table and you need to find a different approach — typically two separate reports on the same dashboard, laid out to tell the same story.
Joined reports are also more fragile than Summary or Matrix when report type structures change, and they tend to be slower to build for admins who do not use them regularly. We use them when the business need is clear and no simpler alternative exists — not as a default.
Custom Report Types: when the standard objects are not enough
Sitting below the format choice is a separate decision: which report type to use. Standard report types — Accounts with Opportunities, Cases with Contacts, and so on — cover most common scenarios. But we regularly run into situations where the standard types do not surface the fields a report needs.
Custom Report Types are configured in Setup, not in Report Builder. You define which objects are included, what relationship connects them, and which fields should be available when someone builds a report from that type. The most frequent reason we create them: a client has custom fields on a child object that need to appear alongside parent-object data, and no standard report type exposes the combination. Contacts with Activities is a common one — you want to see Contact fields and Activity fields together, filtered in a specific way that the default type does not support.
The practical note we give every admin we train: Custom Report Types are created once and reused across many reports. Time spent getting the object relationships and field availability right at the type level saves time on every individual report built from it afterward. We always create them before building the reports that depend on them, never mid-build.
How we approach this on every project
Before opening Report Builder, we ask three questions: Does this need to be on a dashboard? (If yes, rule out Tabular and Joined immediately.) Does the question have two analytical dimensions that both need subtotals? (If yes, Matrix.) Is the question comparing data from two unrelated objects? (If yes, evaluate Joined with the client understanding the dashboard limitation.)
Everything else is Summary. And if the requirement is genuinely just "export the records" — Tabular, built in five minutes, job done.
The rework from picking the wrong format is always more expensive than the thirty seconds it takes to ask these questions upfront. We learned that the hard way years ago, and now it is the first thing on our report-building checklist.








