platform-report-generate
Use when users create, generate, or validate Salesforce Lightning Report metadata (.report-meta.xml) — tabular, summary, matrix, or joined reports with columns, groupings, filters, charts, cross-filters, buckets, formulas, or time-frame filters. Triggers on "create a report", "build a report", "add a chart", or .report-meta.xml deploy errors. Do NOT trigger for Custom Report Type metadata (use platform-custom-report-type-generate), dashboards, list views, running reports in the UI, or SOQL.
Try your first task
A source-grounded starter task has not been verified for this skill yet.
SKILL.md
name: platform-report-generatedescription: "Use when users create, generate, or validate Salesforce Lightning Report metadata (.report-meta.xml) — tabular, summary, matrix, or joined reports with columns, groupings, filters, charts, cross-filters, buckets, formulas, or time-frame filters. Triggers on \"create a report\", \"build a report\", \"add a chart\", or .report-meta.xml deploy errors. Do NOT trigger for Custom Report Type metadata (use platform-custom-report-type-generate), dashboards, list views, running reports in the UI, or SOQL."metadata: version: "1.0" domains: ["Platform"] minApiVersion: "60.0" relatedSkills: - "platform-custom-report-type-generate" mcpTools: salesforce-api-context: tools: ["get_metadata_type_context", "get_metadata_type_sections", "get_metadata_type_shape"] semver: ">=1.0.0"Overview
Lightning Reports define how Salesforce data is queried, grouped, filtered, and displayed. Each report is a single .report-meta.xml file placed under reports/<FolderName>/ within the project's source directory (check sfdx-project.json → packageDirectories[].path for the source root).
Critical Rules (Read First)
TOP DEPLOYMENT KILLERS — check these BEFORE generating any report:
- Grouping fields in columns — Fields in
<groupingsDown>or<groupingsAcross>must NEVER also appear in<columns> - Wrong column names (REQUIRED lookup) — Before writing any
<columns>,<groupingsDown>,<groupingsAcross>, filter<column>, or chart<groupingColumn>, take every name from the table for the chosen<reportType>inreferences/column-names.md, or confirm it withget_metadata_type_sections. NEVER derive a column name from the field's API name:CASENUMBER,ISCLOSED,PHONE,MAILING_CITYall fail (useCASE_NUMBER, aSTATUSfilter,PHONE1,ADDRESS2_CITY) - Wrong scope — LeadList uses
org, notorganization - Filter column dot notation — Filter
<column>values use FLAT names (INDUSTRY,TYPE) NOT dot notation (ACCOUNT.INDUSTRYis INVALID) - Multi-value picklist filters — Use ONE
<criteriaItems>with comma-separated<value>(e.g.,Technology,Financial Services). Do NOT split into multiple criteriaItems with booleanFilter - Report
<name>over 40 characters — Count the characters before writing.Opportunities by Stage with Avg Deal Size(41 characters) fails withValue too long for field: Name maximum length is:40; use something likeOpps by Stage - Avg Deal Size - Bare
NAME/USERS.NAME— Never use a bareNAMEorUSERS.NAMEin columns or groupings; they are invalid on every standard report type. Look up the name column for the report type inreferences/column-names.md(e.g.OPPORTUNITY_NAME,FULL_NAMEfor the opportunity owner,OWNERfor Case/Lead owner,FIRST_NAME+LAST_NAME) - Unrequested or invalid
<params>— Do NOT add<params>the request didn't ask for. On Opportunity reports the only acceptedprobabilityvalue is>0(0,all,>50fail withis not one of the picklist choices); for a probability threshold, filter onPROBABILITYinstead RowCountas a column —RowCountis NOT a report column:<columns><field>RowCount</field></columns>fails withcolumns-field: Invalid value specified: RowCount. It is valid ONLY as<chartSummaries><column>RowCount</column>, as a<sortByName>value, or inside a custom summary formula's<calculatedFormula>(e.g.AMOUNT:SUM / RowCount). When the request asks for a record count, a Summary/Matrix report already shows the count per grouping — add no column; chart it withRowCountin<chartSummaries>if a chart is requested
Rule 1: Format Determines Required Elements
| Format | <groupingsDown> | <groupingsAcross> | <block> |
|---|---|---|---|
Tabular | Not allowed | Not allowed | No |
Summary | At least 1 (max 3) | Not allowed | No |
Matrix | At least 1 (max 3) | At least 1 (max 3) | No |
Joined | Not at top level | Not at top level | At least 2 (max 5) |
Rule 2: Use Platform Column Names
Report metadata uses platform report column names, NOT raw API field names. ALWAYS call get_metadata_type_sections or get_metadata_type_context to confirm valid column names. See references/column-names.md for common mappings per report type.
Rule 3: Valid Report Type Required
<reportType> must be a standard API name (e.g., Opportunity, AccountList, CaseList, LeadList, AccountContactRole for "Accounts with Contacts" — there is no AccountContact; see the label → API name table in references/column-names.md) or a deployed custom report type developer name with a __c suffix (Accounts_with_Projects.reportType-meta.xml → <reportType>Accounts_with_Projects__c</reportType>; without the suffix the deploy fails with invalid report type). Custom report type columns use $ paths, not platform names: Account$Name for the base object, Account.Projects__r$Budget_Amount__c for a joined object. See the Custom Report Types section in references/column-names.md.
Rule 4–5: Chart & Aggregates Require Summary/Matrix
Charts and <aggregateTypes> (Sum, Average, etc.) only work in Summary and Matrix reports. Use only the <chart> child elements listed in references/chart-types.md — invented elements such as <summaryAxisManualRangeEnabled> or <showInlineChart> fail parsing. Use <legendPosition> ONLY on grouped/stacked chart types (Right or Bottom) or on Pie, Donut, Funnel, Scatter; on a single-series HorizontalBar, VerticalColumn, Line, or LineCumulative any value fails with chart-legendPosition: Invalid value specified: Right — omit it. A record-count chart summary is <chartSummaries><column>RowCount</column></chartSummaries> with NO <aggregate> (Sum/Count with RowCount fails).
Rule 6–8: Limits
- Max 3 cross-filters per report, each with up to 5 criteria items
<filterLogic>must reference all filters sequentially (e.g.,1 AND (2 OR 3))- Joined reports: 2–5 blocks, each block format must be Summary or Matrix (not Tabular)
Rule 9: Folder Structure
Reports must live inside a folder with a corresponding folder metadata file:
<sourceDir>/reports/<FolderName>/<ReportName>.report-meta.xml
<sourceDir>/reports/<FolderName>-meta.xml
Determine <sourceDir> from sfdx-project.json (commonly force-app/main/default, but this is configurable).
Rule 10–11: Date Columns & Scope
- Date columns use platform names (
CLOSE_DATE, notCloseDate) - LeadList scope is
org; Opportunity/AccountList/CaseList useorganization
Rule 12–13: Description & Groupings
<description>max 255 characters- Grouping fields must NOT appear in
<columns>— automatic deployment failure - Each
<columns>element holds exactly ONE<field>— repeat<columns>per field (multiple<field>s fail withElement field is duplicated)
Rule 14: Folder Metadata Requires <sharedTo>
<?xml version="1.0" encoding="UTF-8"?>
<ReportFolder xmlns="http://soap.sforce.com/2006/04/metadata">
<folderShares>
<accessLevel>Manage</accessLevel>
<sharedTo>AllInternalUsers</sharedTo>
<sharedToType>Group</sharedToType>
</folderShares>
<name>My Report Folder</name>
</ReportFolder>
Rule 15: Valid Date Intervals Only
Use INTERVAL_CURRENT for "this quarter", INTERVAL_CURY for "this year", INTERVAL_LAST30 for last 30 days. Do NOT use INTERVAL_CURQ — it is not valid. See references/date-intervals.md for the full list.
Top-Level Elements
| Element | Required | Notes |
|---|---|---|
<name> | Yes | Report name (max 40 chars) |
<reportType> | Yes | Report type API name |
<format> | Yes | Tabular, Summary, Matrix, or Joined |
<scope> | Recommended | organization (or org for LeadList) |
<columns> | Yes | Field columns — each has <field> and optional <aggregateTypes> |
<filter> | No | Contains <criteriaItems> with <column>, <operator>, <value> |
<groupingsDown> | Conditional | Row groupings: <field>, <dateGranularity>, <sortOrder> |
<groupingsAcross> | Conditional | Column groupings (Matrix only) |
<timeFrameFilter> | Recommended | <dateColumn>, <interval>, optional <startDate>/<endDate> |
<chart> | No | See references/chart-types.md |
<buckets> | No | Bucket field definitions |
<crossFilters> | No | Cross-object filters (with/without) |
<showDetails> | Recommended | true/false |
<showGrandTotal> | Recommended | true/false |
<showSubTotals> | Recommended | true/false |
<description> | Recommended | Business purpose (max 255 chars) |
<block> | Conditional | Joined format blocks |
Filter Syntax
<filter>
<criteriaItems>
<column>STAGE_NAME</column>
<operator>equals</operator>
<value>Closed Won</value>
</criteriaItems>
</filter>
Multi-value picklist: Use ONE criteriaItem with comma-separated values:
<criteriaItems>
<column>INDUSTRY</column>
<operator>equals</operator>
<value>Technology,Financial Services</value>
</criteriaItems>
Common operators: equals, notEqual, lessThan, greaterThan, contains, startsWith, includes, excludes, isBlank, notBlank. Full list in references/filter-operations.md.
Generation Workflow
- Gather Requirements — object, fields, groupings, filters, chart needs
- Determine Format — no groupings → Tabular; row groupings → Summary; row + column → Matrix; multiple objects → Joined
- Look Up Every Column Name (required) — list every field the report needs, then take each name from the
references/column-names.mdtable for the chosen<reportType>or confirm it withget_metadata_type_sections. Do not write XML until every column, grouping, filter column, and chart grouping column is looked up - Author Metadata — start from closest example in
examples/and adapt - Create Folder — generate folder directory +
<FolderName>-meta.xmlwith<folderShares> - Validate — run through
references/verification-checklist.md
Reference File Index
| File | When to read |
|---|---|
references/column-names.md | Step 3 — column name mappings per report type |
references/date-intervals.md | When setting timeFrameFilter intervals |
references/chart-types.md | When adding a chart — all 17 types + legendPosition rules |
references/filter-operations.md | When building filters — complete operator reference |
references/verification-checklist.md | Step 6 — pre-deploy validation |
references/errors-and-troubleshooting.md | When fields are missing or deployment fails |
examples/TabularOpportunitiesReport.report-meta.xml | Tabular report template |
examples/OpportunitiesByStageReport.report-meta.xml | Summary report with chart |
examples/OpportunitiesByStageAndQuarter.report-meta.xml | Matrix report template |
examples/AccountsCreatedThisYear.report-meta.xml | Filtered report with time frame |