fsl-reporting-data-model
Use this skill when building Salesforce reports and dashboards on FSL operational data: job completion metrics, travel time analytics, first-time fix rate, utilization, and service performance. Trigger keywords: FSL reporting, ServiceAppointment reports, ActualDuration ActualTravelTime, first-time fix rate custom field, FSL utilization metrics. NOT for CRM Analytics / Field Service Intelligence (Einstein Analytics), ServiceReport PDF generation, or non-FSL service reporting.
Best use case
fsl-reporting-data-model is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Use this skill when building Salesforce reports and dashboards on FSL operational data: job completion metrics, travel time analytics, first-time fix rate, utilization, and service performance. Trigger keywords: FSL reporting, ServiceAppointment reports, ActualDuration ActualTravelTime, first-time fix rate custom field, FSL utilization metrics. NOT for CRM Analytics / Field Service Intelligence (Einstein Analytics), ServiceReport PDF generation, or non-FSL service reporting.
Teams using fsl-reporting-data-model should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/fsl-reporting-data-model/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How fsl-reporting-data-model Compares
| Feature / Agent | fsl-reporting-data-model | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Use this skill when building Salesforce reports and dashboards on FSL operational data: job completion metrics, travel time analytics, first-time fix rate, utilization, and service performance. Trigger keywords: FSL reporting, ServiceAppointment reports, ActualDuration ActualTravelTime, first-time fix rate custom field, FSL utilization metrics. NOT for CRM Analytics / Field Service Intelligence (Einstein Analytics), ServiceReport PDF generation, or non-FSL service reporting.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# FSL Reporting Data Model This skill activates when a Salesforce administrator or developer needs to build native Salesforce reports and dashboards on Field Service operational data. FSL's reporting model has several non-obvious behaviors: key metrics like ActualTravelTime only populate when mobile check-in is used, first-time fix rate has no native field and requires custom logic, and the ServiceReport object is a customer-facing PDF — not a standard Salesforce Report. --- ## Before Starting Gather this context before working on anything in this domain: - Determine whether FSL Mobile check-in is consistently used by technicians. `ActualDuration` and `ActualTravelTime` on ServiceAppointment are only populated when technicians use the mobile app check-in workflow — orgs that don't enforce mobile usage will have empty travel time data. - Confirm whether CRM Analytics / Field Service Intelligence is licensed. This skill covers native Salesforce Reports; FSI/Einstein Analytics is out of scope. - Understand what "first-time fix rate" means in the business context — FSL does not have a native FTF field. It must be calculated from appointment statuses (no "Cannot Complete" predecessor). - Identify whether reporting needs to be at the Work Order level, ServiceAppointment level, or both. --- ## Core Concepts ### ServiceAppointment — Primary Reporting Object `ServiceAppointment` is the core FSL reporting object. Key fields for operational reporting: | Field | Populated When | Notes | |---|---|---| | `ActualDuration` | Technician checks out via FSL Mobile | Null if mobile check-in not used | | `ActualTravelTime` | Technician checks in via FSL Mobile | Null if mobile check-in not used | | `ArrivalWindowStart/End` | Appointment booked with arrival window | When customer was told to expect technician | | `SchedStartTime/EndTime` | Scheduled by FSL engine | When FSL assigned the technician | | `Status` | Lifecycle transitions | Completed, Cannot Complete, etc. | | `ServiceTerritoryId` | Territory assignment | For territory-level reports | | `ActualStartTime/EndTime` | Mobile check-in/check-out | Real start/end times | ### First-Time Fix Rate — No Native Field FSL has no native "first-time fix rate" field or formula. FTF must be calculated as the percentage of Work Orders completed with only one ServiceAppointment that did not have a predecessor "Cannot Complete" appointment. **Pattern 1 (custom formula):** Add a custom formula field on WorkOrder: `IF(COUNT(ServiceAppointments) = 1 AND ServiceAppointments[0].Status = 'Completed', 1, 0)`. Note: formula fields cannot directly access child record sets — this requires a Rollup Summary or Flow. **Pattern 2 (Flow + custom field):** A record-triggered Flow on ServiceAppointment fires when Status = 'Completed'. The Flow checks whether any predecessor SA on the same WO has Status = 'Cannot Complete'. If none, it stamps a `First_Time_Fix__c = true` checkbox on the WorkOrder. **Pattern 3 (SOQL-based report metric):** Build a report using the ServiceAppointment report type with a cross-filter: "ServiceAppointments where WorkOrder has no other ServiceAppointment with Status = Cannot Complete." This is the most practical for a standard report. ### ServiceReport — NOT a Standard Report `ServiceReport` is a Salesforce object representing a customer-facing PDF work completion document (similar to a field service delivery receipt). It is NOT a Salesforce Report object and does not appear in the standard Reports tab. Operational metrics are not in ServiceReport — they are in ServiceAppointment and WorkOrder. ### Travel Analytics — Mobile Dependency `ActualTravelTime` is populated only when: 1. The technician uses FSL Mobile 2. The technician clicks "En Route" (check-in start) and "On Site" (arrival) in the mobile app Orgs that allow technicians to update ServiceAppointment status without the mobile app will have null `ActualTravelTime` for those records. Travel analytics in such orgs will be systematically incomplete. --- ## Common Patterns ### Resource Utilization Report **When to use:** Operations manager needs to see scheduled hours vs. available hours per technician per week. **How it works:** Create a custom report type joining ServiceResource → AssignedResource → ServiceAppointment. Include fields: ServiceResource Name, SchedStartTime, SchedEndTime, ActualStartTime, ActualEndTime. Add formula columns for scheduled duration and actual duration. Group by ServiceResource + week. ### On-Time Arrival Report **When to use:** Measuring whether technicians arrive within the committed arrival window. **How it works:** ServiceAppointment report with calculated field: `IF(ActualStartTime <= ArrivalWindowEnd, 'On Time', 'Late')`. This requires ActualStartTime to be populated — again, requires FSL Mobile check-in. --- ## Decision Guidance | Metric | Object | Source Fields | Gotcha | |---|---|---|---| | Job duration | ServiceAppointment | ActualDuration | Only populated with mobile check-in | | Travel time | ServiceAppointment | ActualTravelTime | Only populated with mobile check-in | | On-time arrival | ServiceAppointment | ActualStartTime vs. ArrivalWindowEnd | Requires mobile check-in | | First-time fix rate | WorkOrder + ServiceAppointment | Custom Flow field | No native field | | Customer work report PDF | ServiceReport | Not a standard Report | Different object entirely | --- ## Recommended Workflow 1. **Identify required metrics** — Catalog each metric, its data source field, and whether mobile check-in is a prerequisite. 2. **Verify mobile check-in adoption** — Query `SELECT COUNT() FROM ServiceAppointment WHERE ActualDuration = null AND Status = 'Completed'`. High count means mobile check-in is not consistently used — flag this as a data quality issue before reporting. 3. **Build FTF rate mechanism** — Choose Pattern 2 (Flow + custom field) for real-time FTF tracking. Deploy Flow, backfill historical data. 4. **Create report types** — Use the ServiceAppointment report type as the primary type for all job-level metrics. Use Work Order for WO-level aggregation. 5. **Build dashboards** — Use chart components for FTF trend, utilization by territory, and on-time arrival rate. Add metric components for weekly/monthly totals. 6. **Document data quality dependencies** — Note explicitly in dashboard documentation that travel time and duration metrics require FSL Mobile check-in usage. --- ## Review Checklist - [ ] Mobile check-in adoption rate verified before building travel time reports - [ ] ServiceReport object understood as customer-facing PDF, not operational report source - [ ] FTF rate custom logic (Flow + field) deployed and backfilled - [ ] Report type correctly joins ServiceAppointment to ServiceResource for utilization - [ ] ActualDuration vs. SchedDuration fields compared to measure schedule accuracy - [ ] Dashboard documentation notes mobile check-in data dependency --- ## Salesforce-Specific Gotchas Non-obvious platform behaviors that cause real production problems: 1. **ActualDuration and ActualTravelTime are null without mobile check-in** — These fields are only populated when technicians use the FSL Mobile app's En Route and On Site status transitions. Reports built on these fields will show blank data for orgs not enforcing mobile usage. 2. **ServiceReport is a customer-facing PDF object — not a standard report** — Accessing work completion data for operational reporting requires ServiceAppointment and WorkOrder, not ServiceReport. 3. **First-time fix rate has no native FSL field** — Building FTF without a custom field or Flow produces no real-time metric. The custom logic must be deployed before FTF trend reporting is meaningful. 4. **Reporting on travel time across districts is unreliable without full mobile adoption** — Even 10% non-mobile usage in a territory creates systematic gaps in travel analytics, making territory-level comparisons misleading. --- ## Output Artifacts | Artifact | Description | |---|---| | FTF rate Flow design | Record-triggered Flow on ServiceAppointment for first-time fix rate calculation | | FSL operational report list | Standard report types and field selections for key FSL metrics | --- ## Related Skills - architect/fsl-optimization-architecture — Understanding scheduled vs. actual time to measure optimization effectiveness - data/fsl-resource-and-skill-data — Resource data context for utilization reporting
Related Skills
sandbox-data-masking
Use this skill when configuring or reviewing Salesforce Data Mask to protect PII/PHI in partial or full copy sandboxes after a refresh. Trigger keywords: data mask, sandbox masking, PII in sandbox, GDPR sandbox, HIPAA non-production, mask contacts, obfuscate fields non-production. NOT for sandbox refresh mechanics (use sandbox-refresh-and-templates), NOT for production data anonymization, NOT for Shield Platform Encryption at rest.
gdpr-data-privacy
Use this skill when implementing GDPR or CCPA data privacy controls in Salesforce: Individual sObject linkage, consent tracking, Right to Be Forgotten (RTBF) requests, data subject request handling, and Privacy Center configuration. Trigger keywords: GDPR, data privacy, consent management, right to erasure, Individual object, ContactPointConsent, ShouldForget, data subject request, Privacy Center, data portability. NOT for general data quality cleanup, duplicate management, field-level encryption (see platform-encryption skill), or sandbox data masking (see sandbox-data-masking skill).
data-classification-labels
Classify Salesforce fields by data sensitivity and compliance category using the four built-in classification attributes (SecurityClassification, ComplianceGroup, BusinessOwnerId, BusinessStatus). Covers Metadata API deployment, Tooling API querying, and Einstein Data Detect recommendations. NOT for data masking, Shield Platform Encryption, or runtime access control enforcement.
customer-data-request-workflow
Implement GDPR/CCPA data subject rights (access, deletion, rectification) using Salesforce Privacy Center and/or custom workflow. NOT for general backup or org-level data retention policy.
omnistudio-deployment-datapacks
Use when exporting, importing, or version-controlling OmniStudio components using DataPacks via the OmniStudio DataPacks tool or vlocity CLI. Covers DataPack export/import, Git version control integration, CI/CD for OmniStudio. NOT for SFDX-based metadata deployment of non-OmniStudio components.
omnistudio-asynchronous-data-operations
Use Integration Procedures queues, DataRaptor Chain, and Remote Actions with async patterns for long-running OmniStudio flows. NOT for simple DataRaptor reads.
dataraptor-transform-optimization
Use when DataRaptor Transform operations are slow, hit governor limits, or use Apex where formula fields would suffice. Covers formula vs Apex expressions, bulk transform sizing, and chained transform composition. Triggers: 'dataraptor transform slow', 'dataraptor formula vs apex', 'dataraptor bulk transform', 'dr governor limit'. NOT for DataRaptor Extract or Load performance.
dataraptor-patterns
Use when designing or reviewing OmniStudio DataRaptors, especially Extract versus Turbo Extract versus Transform versus Load, field mapping strategy, performance tradeoffs, and when to move work into Integration Procedures or Apex. Triggers: 'DataRaptor Extract', 'Turbo Extract', 'DataRaptor Load', 'DataRaptor Transform', 'OmniStudio data mapping'. NOT for overall OmniScript journey design or Integration Procedure sequencing when the main question is not the DataRaptor shape itself.
lwc-datatable-advanced
Advanced lightning-datatable patterns — inline edit + draftValues, custom cell types via extending LightningDatatable, sortable columns, infinite scroll with onloadmore, row-level errors, and the cost of large data sets. NOT for read-only display of small lists (plain lightning-datatable suffices) or fully custom grids (use a third-party library).
lwc-data-table
Use when designing or reviewing `lightning-datatable` usage in Lightning Web Components, including column configuration, stable `key-field` values, inline editing, row actions, infinite loading, and custom cell types. Triggers: 'lightning datatable inline edit', 'row actions in lwc datatable', 'key field missing', 'infinite loading in datatable'. NOT for highly custom virtualized grids or broad page-performance work outside the datatable boundary.
lwc-custom-datatable-types
Use when you need to extend `lightning-datatable` with custom cell renderings: status pills, progress bars, image thumbnails, action cells, editable pickliststo, rich-text, or any column that `lightning-datatable` does not ship out of the box. Triggers: 'custom cell type lightning datatable', 'progress bar column', 'image column', 'inline edit picklist in datatable', 'rich text column'. NOT for basic datatable usage (see `lwc-data-table`) and NOT for tree-grid or large-dataset virtualization (see `virtualized-lists`).
sustainability-reporting
Producing regulatory and voluntary sustainability disclosures from Salesforce Net Zero Cloud (formerly Sustainability Cloud) — the native ESRS / CSRD / SASB / GRI / CDP report builders, the Carbon Accounting Manager data model (Stationary Asset, Vehicle Asset, Scope 3 procurement items, Energy Use Records), the double-materiality assessment prerequisite for CSRD, the MSESRSMainDataraptor Data Mapper for ESRS reports, and the Sustainability Scorecard. NOT for Net Zero Cloud feature setup / emissions-source configuration (see integration/net-zero-cloud-setup), NOT for general CRM Analytics dashboards (Net Zero Cloud's report builders are a separate surface).