Skip to main content

#Salesforce Field Service60 debatiendo

Hi everyone,

I am trying to remove/replace a button (specifically the native Add Products Consumed / Products tab action) from the Salesforce Field Service (SFS) Mobile App, but none of my changes are taking effect on the mobile app.   

Here is what I have tried so far:   

  1. Page Layouts: I edited the assigned Work Order and Service Appointment page layouts via Object Manager, removed the related action/buttons from the Salesforce Mobile and Lightning Experience Actions section, and saved.
  2. Salesforce Article Workaround: Followed the official SF documentation (removing Products Consumed and Required Products related lists from Page Layouts), but the button/tab still appears on the mobile app.
  3. Field Service Mobile Settings: Checked Setup > Field Service Mobile Settings, but we are currently using the default system configuration (no custom Mobile Setting record exists yet, and I would prefer not creating a new one if possible).
  4. Mobile Cache: Forced a full Data Sync and cleared cached metadata on the technician's mobile device (and re-logged).

Questions: 

 

  1. Is there a specific hidden dependency or Page Layout assignment required to override standard mobile actions on Service Appointments / Work Orders?
  2. Can native SFS mobile buttons/tabs be hidden or swapped without creating a custom Field Service Mobile Setting record?
  3. Has anyone successfully removed/replaced this button recently on the SFS Mobile App?

Any advice or pointers would be greatly appreciated!

Thanks in advance!    @* Salesforce Field Service * 

1 respuesta
0/9000

Hi, 

 

I have a Service Appointment in Greenville, SC. I have two techs one in Atlanta, GA and the other one is in Schenectady, NY. When I use "Candidates" option, using my custom Scheduling policy where Minimize Travel carry the high weightage compared to ASAP, first it showed the tech from Atlanta , GA which is the closest to the appointment. I switched the addresses of the techs, but this time still it showed the tech who had Atlanta GA earlier but now he has Schenectady as his address. Shouldn't it look at the resource which is closest? 

 

Thanks, 

Michel

6 respuestas
  1. 10 ago, 04:17

    Gday, 

     

    Minimize travel doesn' work that way :) 

     

    Minimize travel looks at the team's collective travel time on a given day. It then prioritizes who ever has the least amount of travel on, NOT which is the shortest distance. 

     

    TECH A = 5 minutes to the job + already doing 60 minutes of other travel 

    TECH B = 50 minutes from job + no other travel 

     

    Minimize travel actually books on TECH B based off the policy.

0/9000

We want to use the mileage in FSL to assign a cost. Is there anything in FSL currently to do this? I have had a look at the Assigned resource? Are there definitions for these fields and whether they are in Miles or KM and Minutes, hours or seconds?

 

EstimatedTravelTime FSL__calculated_duration__c  FSL__EstimatedTravelDistanceFrom__c  FSL__EstimatedTravelDistanceTo__c  FSL__EstimatedTravelTimeFrom__c

4 respuestas
  1. 13 ago, 22:42

     FSL__calculated_duration__c  = SA.FSL__Sheduled_Duration * SR.Efficiency__c

0/9000

Hi everyone,

I’m working on a custom LWC in Salesforce Field Service Mobile and have two related requirements.

1. Trigger LWC JavaScript when Standard Data Sync runs

I have a Work Order in Field Service, and based on that Work Order I need to fetch dynamic data from an external API.

My current flow is roughly:

Work Order → LWC → External API → Build data packet → Download packet → Store in IndexedDB

I would like to know if there is any supported way to trigger/execute my LWC JavaScript automatically when Field Service Mobile’s standard offline data sync runs or completes.

For example:

Field Service Standard Data Sync

          ↓

      Work Order synced

          ↓

   Trigger my LWC JS

          ↓

 Start external API process

Is there a supported Field Service Mobile event, hook, callback, or extension point that allows an LWC JavaScript process to be triggered by the standard data sync?

I am specifically looking for a solution using LWC/JavaScript, without requiring a native SDK if possible.

 

2. Continue processing when the user closes Field Service Mobile

The external API takes some time to build the data packet. Once the packet is ready, my LWC downloads it and stores it in IndexedDB for offline use.

The problem is that the API processing/download can take a significant amount of time.

Ideally I want:

User starts sync

      ↓

API starts building packet

      ↓

User closes/minimizes Field Service Mobile

      ↓

API continues processing

      ↓

Packet becomes available

      ↓

Packet is downloaded/stored

      ↓

User opens Field Service again

      ↓

LWC detects that the data is ready

I understand that an LWC/Web Worker cannot necessarily remain alive after the mobile application is completely closed, but I’m wondering if there is any Field Service Mobile-specific mechanism that can support this use case.

I have considered using a Web Worker for the API polling/download process, but I understand that a Web Worker is still subject to the mobile WebView lifecycle and may be terminated when the application is closed or suspended.

Questions

  1. Is there a supported way to hook into Field Service Mobile Standard Data Sync from an LWC?
  2. Can an LWC JavaScript process be triggered automatically when offline sync completes?
  3. Is there any supported mechanism for executing JavaScript/background processing when the Field Service Mobile app is closed?
  4. Can a Web Worker be used reliably for this scenario?
  5. Is there a recommended Field Service Mobile architecture for downloading external API data into IndexedDB based on Work Order data?

Any guidance or examples would be greatly appreciated.

 

@* Salesforce Developers * @* Salesforce Field Service * 

1 respuesta
  1. Heiko Lindner (Privat) Forum Ambassador
    Ayer, 05:43

    To be honest I cannot anwser these questions. I assume it's not possible. The question is, what is your  business requirement to do it?  

    There is an option in field service mobile settings to automatically change the status of an appointment. Maybe this can be used to trigger your automations.

0/9000

We are using Enhanced Scheduling and Optimization and are trying to make customer appointments schedule earlier within their respective arrival windows, ahead of most non-customer work when feasible.  

 

Our customer appointment windows are generally: 

  • 8:00 AM to 12:00 PM
  • 12:30 PM to 5:00 PM
  • 8:00 AM to 5:00 PM

 

For example, if a customer has an 8:00 AM to 12:00 PM window, we would prefer the optimizer to schedule the appointment closer to 8:00 AM rather than 12:00 PM, provided the earlier placement is feasible. 

  

The business reason is that non-customer work is generally more flexible. If an emergency such as a gas leak or damaged gas line occurs later in the day, we would like more customer appointments to have already been completed, allowing non-customer work to move later or remain unscheduled. 

  

It would also improve customer satisfaction because customers would be less likely to wait until the end of their appointment windows while technicians perform non-customer-facing work, such as reading meters or disconnecting service. 

  

We understand that prioritizing customer appointments in this way will probably increase overall travel, may cause technicians to backtrack when returning to non-customer work, and could reduce the total amount of work scheduled. Management understands and accepts those potential tradeoffs. We are specifically looking for technical solutions that will favor earlier customer appointments, even when the resulting schedule is not the most travel-efficient option. 

  

What we have tried

 

We created a customer-specific ASAP objective using a Service Appointment relevance group based on IsCustomerAppointment__c = TRUE. 

  

Our current pilot policy includes approximately: 

 

  • Customer Appointment ASAP: 90
  • General ASAP: 10
  • Same Site: 15
  • Preferred Resource: 10
  • Minimize Travel: 5

 

We have significantly increased the customer-specific ASAP weight and reduced Minimize Travel, but customer appointments are still frequently scheduled near the end of their arrival windows, after several non-customer appointments. 

  

In a sandbox, we also created an additional Boolean formula field named IsNotCustomerAppointment__c, which identifies non-customer appointments. We then created a separate ASAP objective using that field in a relevance group and assigned the non-customer ASAP objective a much lower weight than the customer-specific ASAP objective. The intention was to give customer appointments a much stronger ASAP preference while still giving non-customer work some scheduling importance. We did not see significant improvement from that configuration either. 

  

Our understanding is that when multiple appointments are evaluated during optimization, the ASAP objective scores candidate times across a range of up to 30 days. On that scale, the scoring difference between scheduling an appointment at 8:00 AM and 12:00 PM is extremely small. Even a low-weight objective such as Minimize Travel can outweigh several hours of earlier placement. 

  

We are also testing a Match Time rule that prevents a customer appointment’s Scheduled End (SchedEndTime) from being later than 30 minutes before ArrivalWindowEndTime. This eliminates some very late placements, but because it is a rule, it is a hard constraint rather than a preference. We are concerned that tightening it further could cause otherwise schedulable customer appointments to remain unscheduled. 

  

Dynamic Priority appears useful for determining which appointments are included when capacity is limited, but we have not found evidence that it controls where an appointment is placed within its arrival window. Based on our understanding and testing, it primarily influences which Service Appointments make it onto the Gantt, not the chronological order in which the scheduled appointments are placed. 

  

Questions

 

  1. Has anyone successfully configured Global or In-Day Optimization to prefer customer appointments earlier within their individual arrival windows?
  2. Is there an out-of-the-box objective, work rule, scheduling-policy configuration, or ESO setting that we may have overlooked?
  3. Can the ASAP objective’s 30-day scoring range be shortened or customized, perhaps through Salesforce Support?
  4. Has anyone successfully used multiple customer-specific ASAP objectives to amplify the ASAP score beyond the normal maximum weight of 100?
  5. Is the FSL__Service_Goal__c Custom Objective record type supported for customer configuration? When we attempt to create one, Salesforce requires FSL__Custom_Logic_Data__c and FSL__Custom_Type__c, but we cannot find documentation explaining the supported format or authoring process.
  6. If Custom Objectives are supported, can they evaluate each hypothetical candidate’s scheduled start time? We would like to calculate something similar to:

 

WindowPosition = (CandidateStart - ArrivalWindowStartTime) / (ArrivalWindowEndTime - ArrivalWindowStartTime)

  

A candidate at the beginning of the window would receive the best score, while a candidate at the end would receive the worst score. The important requirement is access to the optimizer’s hypothetical CandidateStart, not the Service Appointment’s currently persisted SchedStartTime. 

 

  1. Are there other successful approaches, such as staged optimization, separate policies, tighter preferred subwindows, or another method that favors an earlier placement while still allowing a later placement when no reasonable early option is available?

 

We would appreciate hearing from anyone who has solved a similar requirement, especially with Enhanced Scheduling and Optimization. We are open to an out-of-the-box configuration, a Salesforce-supported custom objective, or another practical design. 

  

We recognize the travel and productivity tradeoffs, so our primary question is not whether customer-first sequencing is the most efficient routing strategy. We are looking for ways to configure or extend the optimizer to accomplish this stated business requirement. 

2 respuestas
  1. Heiko Lindner (Privat) Forum Ambassador
    Ayer, 05:35

    Hey @Mark Pennel lot of questions and I mean there is not that one option, rule or objective. You have to combine, play a bit and test. You could also think about the option to book over lower priority  "Prioritize Field Service Appointments for Optimization" details you find here

     

     

0/9000

Hello everyone, good morning! 

 

I'm using the Overlapping Flow, but I've noticed that when the overlap is caused by an absence, the flow doesn't run. Does anyone know if this is expected behavior or if there is any configuration required for it to work with absences?

I've already handled the logic in the Flow. We have the Absence Type

variable available in the Flow, so if the overlap is caused by an absence, I would like the Flow to execute as well. However, it only runs when the overlap is caused by another appointment. 

 

Thanks in advance!  

 

@* Salesforce Field Service *

5 respuestas
0/9000

Hi everyone,

we are currently using Salesforce Field Service to manage preventive and corrective maintenance for a large number of photovoltaic plants across multiple regions.  After several months of adoption, we have realized that our current configuration — with very granular Contract Line Items (one for each maintenance activity) — does not fit well with our operational model.

We are now trying to redesign the process for ordinary (preventive) maintenance, with the following business goals:

  • Each plant should have two main maintenance appointments per year, where the majority of service contract items (including semi-annual ones) are grouped together.
  • During these aggregated interventions, the technician on the FSL Mobile App should:
    • see a checklist containing all the contract line items to be worked on;
    • easily check off completed items, add notes, and attach photos, while keeping full traceability for each activity.
  • The contract line items excluded from these aggregated visits — as well as any not completed during the intervention — should be automatically rescheduled or combined with:
    • other service appointments created from incidents or corrective tickets, or
    • planned extraordinary maintenance appointments when compatible.
  • The Dispatcher, when creating a new Work Order, should be able to:
    • instantly see all unscheduled or pending contract line items, and
    • receive automatic suggestions of items that can be scheduled together with new service appointments for the same site/asset.

Our current setup generates one work order per contract line item, which results in excessive volume and poor visibility for dispatchers.

👉 Question:  What would be the most effective way — using Salesforce Field Service best practices — to achieve this aggregated scheduling model?  Is it feasible to handle this through standard objects and Flows (e.g., using flags, maintenance plans, or grouped service appointments), or would this scenario require a more advanced custom implementation?

Any advice, examples, or Trailhead resources related to similar use cases (preventive maintenance aggregation or smart rescheduling) would be highly appreciated.

Thank you!

@* Salesforce Field Service * 

3 respuestas
  1. Heiko Lindner (Privat) Forum Ambassador
    3 ago, 15:43

    Hey @Andrea Donzelli Víctor Márquez (CYMAQ)  I mean there are standard option/ features within field service which can be used. 

0/9000

While trying to login into FSL Mobile App (Android), the user is getting the message "Manifest was malformed" and is not able to proceed further.     We have tried cleaning the storage and cleaning the cache, also tried re-installing the app from Google Play Store, however the issue still remains.    Can someone advice how this issue can be resolved.  Appreciating the help.

 

@* Salesforce Field Service * 

8 respuestas
  1. 29 jul, 22:54

    I might be a bit late here, but I had faced the same issue.  SF Support helped me out. I had to change the ' Session Security Level Required at Login ' option under Profile from 'High Assurance' to None. This resolved it for me.

0/9000

Hello team,  I keep getting a toast message saying 'Manifest was malformed' when I try to login to the Field Service Mobile app for a user on our Dev Sandbox environments. I don't get the same error when using another QA Sandbox environment. I have attached a snippet of the error log (Copilot says the server is getting HTML response instead of javascript) but it doesn't give a stack trace from which I could figure out where exactly the failure lies.   Following are my troubleshooting steps so far:

  • Uninstall and re-install the app from Playstore for my Android device
  • Clear Cache and cookies, hard close, and re-open app and re-login
  • Deactivate and Re-activate the Service Resource, ensure it is linked to the correct User
  • Create a new Service Resource linked to a new user
  • Check the Field Service Mobile app builder config and compare it with the config on the QA Sandbox
  • Check the Field Service Mobile settings and compared it to the settings on QA Sandbox

Error log snippet:  2026-07-27T01:55:51.708Z W/BootstrapHostApp: Failed to downloadApp  com.salesforce.lightning.mobileruntime.download.DownloaderException$InvalidData: Manifest was malformed  at com.salesforce.lightning.mobileruntime.download.ManifestDownloader.fetchManifest(Unknown Source:128)  at com.salesforce.lightning.mobileruntime.download.ManifestDownloader$fetchManifest$1.invokeSuspend(Unknown Source:12)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Unknown Source:10)  at kotlinx.coroutines.UndispatchedCoroutine.afterResume(Unknown Source:30)  at kotlinx.coroutines.AbstractCoroutine.resumeWith(Unknown Source:13)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Unknown Source:46)  at kotlinx.coroutines.UndispatchedCoroutine.afterResume(Unknown Source:30)  at kotlinx.coroutines.AbstractCoroutine.resumeWith(Unknown Source:13)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Unknown Source:46)  at kotlinx.coroutines.DispatchedTask.run(Unknown Source:128)  at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(Unknown Source:3)  at kotlinx.coroutines.scheduling.TaskImpl.run(Unknown Source:2)  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(Unknown Source:0)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(Unknown Source:33)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(Unknown Source:28)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(Unknown Source:0)  Caused by: kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 2: Expected start of the object '{', but had '<' instead at path: $  JSON input:   <!DOCTYPE HTML PUBLIC "-//W3C/.....  at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(SourceFile:3)  at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(SourceFile:10)  at kotlinx.serialization.json.internal.AbstractJsonLexer.fail(Unknown Source:51)  at kotlinx.serialization.json.internal.AbstractJsonLexer.fail$default(Unknown Source:14)  at kotlinx.serialization.json.internal.AbstractJsonLexer.unexpectedToken(Unknown Source:103)  at kotlinx.serialization.json.internal.StringJsonLexer.consumeNextToken(SourceFile:14)  at kotlinx.serialization.json.internal.StreamingJsonDecoder.beginStructure(Unknown Source:22)  at com.salesforce.lightning.mobileruntime.bootstrap.json.BootstrapManifest$$serializer.deserialize(SourceFile:1)  at com.salesforce.lightning.mobileruntime.bootstrap.json.BootstrapManifest$$serializer.deserialize(SourceFile:2)  at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(Unknown Source:314)  at kotlinx.serialization.json.Json.decodeFromString(SourceFile:3)  at com.salesforce.lightning.mobileruntime.bootstrap.json.BootstrapManifest$Companion.fromJson(Unknown Source:20)  at com.salesforce.lightning.mobileruntime.download.ManifestDownloader.fetchManifest(Unknown Source:104)  ... 15 more    2026-07-27T01:55:51.713Z E/LdsEnvironmentManagerImpl: LDS bootstrap failed  com.salesforce.lightning.mobileruntime.download.DownloaderException$InvalidData: Manifest was malformed  at com.salesforce.lightning.mobileruntime.download.ManifestDownloader.fetchManifest(Unknown Source:128)  at com.salesforce.lightning.mobileruntime.download.ManifestDownloader$fetchManifest$1.invokeSuspend(Unknown Source:12)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Unknown Source:10)  at kotlinx.coroutines.UndispatchedCoroutine.afterResume(Unknown Source:30)  at kotlinx.coroutines.AbstractCoroutine.resumeWith(Unknown Source:13)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(Unknown Source:46)    Thanks in advance team, any help is greatly appreciated.    - Swapnil    @* Salesforce Field Service * 

1 respuesta
  1. 29 jul, 22:52

    Hello team, I got help from Salesforce Support regarding this.  I had to change the 'Session Security Level Required at Login' option under Profile from 'High Assurance' to None. The Desktop login worked fine for the user, just the app login kept failing. 

0/9000

Hello all, we had an issue with settings being reset and the root cause was identified to be a user restored default settings by logging into Field Service. They were met with the error page that the dispatch console was not available and it provided a link to Field Service Settings. Despite this user not having access to that app, nor did they have any Admin permissions. Has anyone encountered this problem, and is there some way to disable that link?   

 

 

Field Service Settings on Console Error Page

 

 

5 respuestas
  1. Heiko Lindner (Privat) Forum Ambassador
    14 jul, 07:17

    Hey @Rob Lewicke you should double check the general permissions for the user via profile and permission sets. Even if the don't see the tab, they can open data or settings, if they have permissions for it.

0/9000