Loading...
Loading...
Use this skill when users need to create, generate, or validate Salesforce Custom Report Type metadata. Trigger when users mention custom report types, report types, CRTs, reporting frameworks, cross-object reports, report builder data sources, or ask to expose fields for reporting across related objects. Also use when users mention primary and related objects for reports, inner vs outer joins in reports, report type categories, or encounter deployment errors for .reportType-meta.xml files. Do NOT trigger for: running, editing, or filtering existing reports; creating report folders, dashboards, or list views; or general reporting questions that don't involve authoring a .reportType-meta.xml file.
npx skill4agent add forcedotcom/sf-skills platform-custom-report-type-generate.reportType-meta.xmlAccountsWithProjects.reportType-meta.xml<ReportType>| Element | Required | Notes |
|---|---|---|
| Yes | API identifier; must match the file name. Letters, numbers, underscores; must begin with a letter; no spaces; no trailing underscore; no consecutive underscores |
| Yes | Human-friendly name shown in the report type picker |
| Recommended | State the business "why" — who uses this and what they learn |
| Yes | API name of the primary object (e.g. |
| Recommended | Report builder category — see |
| Yes | |
| Conditional | Adds a related object and its join behavior. Nest further |
| Recommended | Groups of columns available to the report type. Though not strictly required, a report without columns isn't useful |
<sections>| Element | Required | Notes |
|---|---|---|
| Yes | Section heading shown in the report builder |
| Conditional | One per field exposed in the section |
<columns>| Element | Required | Notes |
|---|---|---|
| Yes | Field API name (or dotted lookup-traversal path) |
| Yes | The object the field belongs to — base object name or dotted relationship path |
| Yes | |
| No | Custom column label shown in the report builder, overriding the field's default label |
<fullName>fullNameMetadata<fullName><fullName>.reportType-meta.xml<fullName>account_projects.reportType-meta.xml<fullName>AccountProjects</fullName>account_projectsAccountProjects<fullName>AccountProjects.reportType-meta.xml<fullName>AccountProjects</fullName>outerJoin<join><outerJoin> | Behavior | Report Builder Label |
|---|---|---|
| Inner join — only primary records that HAVE at least one related record | "Each 'A' record must have at least one related 'B' record" |
| Outer join — all primary records, with or without related records | "'A' records may or may not have related 'B' records" |
truefalse<sections><sections><masterLabel><columns><field><table><field>Owner.Name<table>NameCreatedDateOwnerIdField__c__c<field>Account Name</field><field>Name</field><table>Account</table><join><relationship>__r<relationship>Project</relationship><relationship>Projects__r</relationship><relationship>Contacts</relationship><join><outerJoin>true</outerJoin><join>
<outerJoin>true</outerJoin> <!-- outer join first -->
<relationship>Contacts</relationship>
<join>
<outerJoin>false</outerJoin> <!-- WRONG: inner join after outer -->
<relationship>Assets</relationship>
</join>
</join><join>
<outerJoin>true</outerJoin>
<relationship>Contacts</relationship>
<join>
<outerJoin>true</outerJoin> <!-- outer stays outer -->
<relationship>Assets</relationship>
</join>
</join><table><sections><table>Account| Object in chain | |
|---|---|
| Base (Account) | |
| First join (Account → Contacts) | |
| Nested join (Account → Contacts → Assets) | |
<field>Owner.EmailReportsTo.CreatedBy.Contact.Owner.MobilePhone<table>_hsttrackTrending=true<field><table>_hst<columns>
<checkedByDefault>false</checkedByDefault>
<field>Field2__c_hst</field>
<table>CustomTrendedObject__c.CustomTrendedObject__c_hst</table>
</columns><baseObject>autogenerated<autogenerated>AccountProject__cdeployed=truedeployed=falsefullNamelabelbaseObjectdeployedexamples/examples/AccountsWithIndustry.reportType-meta.xmlexamples/AccountsWithProjects.reportType-meta.xmlexamples/AccountProjectsWithTasks.reportType-meta.xml<DeveloperName>.reportType-meta.xmlxmlns="http://soap.sforce.com/2006/04/metadata".reportType-meta.xml<fullName><fullName><baseObject><relationship>__r<sections><field><table><category><deployed>true| File | When to read |
|---|---|
| Step 2 / Step 4 — primary-object-only template |
| Step 2 / Step 4 — outer-join template (primary included even without children) |
| Step 2 / Step 4 — nested inner-join template (every level requires children) |
| Step 3 — to choose a valid |
| When fields don't appear in the report builder or join requirements conflict |
.reportType-meta.xml<fullName><label><description><baseObject><category>ReportTypeCategory<deployed>truefalse<autogenerated><join>__r<outerJoin>truefalse<outerJoin>false</outerJoin><sections><masterLabel><columns><field><table><checkedByDefault><table>Account<table>Account.Projects__rAccount.Projects__r.Tasks__r__cOwner.Email<table>_hst<field><table>