Tag Archive for: Salesforce

Standard Omni-Channel End of Life: Your Questions Answered

If you’ve been hearing about Standard Omni-Channel going End of Life (EOL) – good! We’ve included this in our monthly emails since June 2025, but in case you’ve missed it and this is the first you’re hearing – Standard Omni-Channel is going end of life at the Summer ’26 major release. With the Summer ’26 release coming up in June, it’s time to make the switch to Enhanced Omni-Channel. But here’s the good news: this is nothing to be afraid of. Enhanced Omni-channel has been GA for nearly 3 years, and over 50% of our traffic and 35% of our customers are already running on Enhanced Omni-Channel successfully!

Let’s answer some common questions to make this transition as smooth as possible.

When is Standard Omni-Channel going End of Life?

Standard Omni-Channel will reach its end of life with the Summer ’26 release. For Production orgs, that is on or around June 13th, 2026 depending on your instance. For Sandbox this is on or around May 8th, 2026. After this date, Standard Omni-Channel will no longer be supported, and all orgs will be moved to Enhanced Omni-Channel.

Why is Standard Omni-Channel going EOL?

Enhanced Omni-Channel runs on modern infrastructure built for scale on Hyperforce. By consolidating on Enhanced Omni-Channel, we can:

  • Move faster on new features
  • Reduce maintenance overhead
  • Deliver better performance and reliability
  • Unlock innovation that benefits all customers

In short – we can provide you more value for your investment – faster!

All future Omni-Channel features and improvements will only be available on Enhanced Omni-Channel – that includes all new features we’ve delivered in the last 2 years (2024 & 2025).

What’s different between Standard and Enhanced Omni-Channel?

The good news? Virtually nothing! Enhanced Omni-Channel includes all the features of Standard Omni-Channel, plus:

  • Enhanced Agent Experience with the new Inbox view
  • Enhanced Supervisor Experience with the Wallboard view
  • Improved Status-Based Capacity with Paused work states
  • Route by SLA with Acceptance Due Date
  • All future innovations and features

For a detailed comparison, check out our help documentation.

What do I lose when I upgrade?

For most customers: absolutely nothing! Your routing rules, queue configurations, and agent setups will continue to work exactly as they do today.

The only notable exception is the ‘Transfer Skills’ button on the Omni-Channel widget, which isn’t available in Enhanced. You can easily replace this with the out of the box transfer action for records, or create your own Flow if needed.

What do I need to do before the upgrade?

The only action required beforehand is to make sure that the SCRT2 domain (*.salesforce-scrt.com) is an allowed domain within your network. See Allow the Required Domains for more information.

All existing functionality will continue as it was before, with no setup changes necessary.

Do I need to migrate off legacy channels first?

Yes! If you’re using legacy Chat (formerly LiveAgent) or Standard Messaging channels (e.g. SMS, WhatsApp), you’ll need to upgrade to their Enhanced equivalents before moving to Enhanced Omni-Channel:

  • Legacy Chat → Enhanced Chat (formally known as Messaging for In-App & Web, or MIAW)
  • Standard Messaging → Enhanced Messaging

In saying that, the End of Life date for these channels is in February 2026, so a whole release before the Standard Omni-Channel End of Life, so in all likelihood you will already be upgraded before the Summer ’26 release.

How hard is it to manually upgrade?

It couldn’t be simpler! Navigate to ‘Omni-Channel Settings’ and click the toggle. Accept the terms and conditions, and you’re done! Have your agents log out of Omni-Channel and back in, refresh their screens, and they’ll see the new experience.

That’s it. Really!

What if I don’t upgrade manually before June?

We’ll be running automatic migrations for orgs that haven’t upgraded yet, in multiple waves leading up to the EOL date. However, we strongly encourage you to upgrade proactively yourself so you can:

  • Choose the timing that works best for your team
  • Test the new experience on your schedule
  • Start benefiting from Enhanced features immediately

These automatic migrations and beginning this month, and will happen during maintenance windows. Emails will be sent out to administrations a month ahead of the upgrade, if your org is included in the automatic upgrades.

What happens after June 13th, 2026?

After the Summer ’26 release, Standard Omni-Channel will no longer be available. All orgs will be upgraded to Enhanced Omni-Channel when the org is upgraded to the Summer ’26 version.

The only exclusions are those with an exemption for the EOL for legacy chat, or don’t agree to the AWS terms and conditions of Hyperforce.

The only exclusions are those with an exemption for the EOL for legacy chat, or don’t agree to the AWS terms and conditions of Hyperforce.

Where can I learn more?

For more information and detailed comparisons:

The Bottom Line

Enhanced Omni-Channel is already powering the majority of our routing traffic, and thousands of customers are successfully using it today. The upgrade is straightforward, and you’ll gain access to new features while maintaining all your existing functionality. Don’t wait until the last minute – make the switch today and join the Enhanced Omni-Channel community!

Questions? Drop a comment below or reach out to your Salesforce team.

Grow Smart with Agentforce: Treat Your AI Like a Teammate—Not Just a Tool

Part 4 of our Agentforce Series

In Part 1, we helped you launch fast with FAQs.
In Part 2, we showed you how to scale smart using escalations.
In Part 3, we boosted accuracy with advanced grounding.

Now it’s time for the next evolution: making your AI agent a true member of your service team.
Because when you treat your AI like a teammate—not just another automation tool—you unlock collaboration, trust, and efficiency at scale.

Whether you’re just starting to see AI’s potential or you’re ready to take it to the next level, this post will give you the mindset and steps to get there.

In this post, you’ll learn how to:

🤝 Foster a collaborative relationship between agents and AI
🧩 Define roles and responsibilities for your human + AI team
📈 Measure and improve the AI’s performance like any team member

Why Thinking “Teammate” Changes the Game

When AI is seen only as a tool, it risks becoming a black box—used occasionally, understood rarely, and trusted even less.
When AI becomes a teammate, it:

  • Builds trust by showing work and reasoning
  • Reduces burnout by taking repetitive tasks off human plates
  • Levels up your team’s expertise with consistent, context-rich answers
  • Drives continuous improvement through feedback and coaching loops

Just like a new hire, your AI needs:

  • Clear expectations
  • Ongoing training
  • Feedback on performance
  • Access to the same resources your human agents use

What Does AI-as-a-Teammate Look Like in Practice?

  1. Give Your AI a Role and Scope
    • Define what your AI owns vs. what humans own.
    • Example: AI drafts responses for Tier 1 inquiries, humans approve or escalate.
  2. Coach and Retrain Regularly
    • Use post-interaction reviews to flag where the AI nailed it—or missed the mark.
    • Feed that back into your grounding sources and escalation rules.
  3. Promote Transparency
    • Let your AI show its sources or reasoning in drafts so agents can quickly validate accuracy.
  4. Encourage Two-Way Learning
    • Just like a teammate, your AI learns from human input.
    • Leverage “accept” or “edit” actions as signals for future improvement.
  5. Track Metrics That Matter
    • Measure CSAT, first-response accuracy, and escalation rates for AI-handled interactions.
    • Review these in the same cadence you’d review team performance.

The AI-Teammate Mindset Shift

When you start thinking of AI as part of your service org, you stop asking “What can AI replace?” and start asking:

“How can AI help my team do their best work?”

This shift:
✅ Strengthens agent trust in AI-generated responses
✅ Increases adoption and consistency in use
✅ Improves customer outcomes without overburdening agents

Continuous Collaboration = Continuous Growth

The best teams grow together. That means:
📌 Including AI performance in team retros
🧠 Giving your AI “training data” like you’d give a teammate onboarding materials
📥 Updating its knowledge and role as your business evolves
🧪 Experimenting with new use cases to expand impact

It’s a loop: better AI collaboration → happier agents → better customer experiences → stronger business results.

What’s Next: Scaling AI Across Channels

Now that your AI is an active, trusted teammate, it’s time to see where else it can shine.
In our next post, we’ll explore:
⚡ Orchestrating consistent customer experiences across touchpoints

✉️ Struggling to make your customer service emails hit the mark?

Discover why they’re falling short—and how AI can turn them into powerful customer moments.

👉 Read the full guide here

How is AI changing the way you handle customer service emails—and where do you see the biggest opportunity to improve?

Share your perspective below. 👇

Grow Smart with Agentforce: Boost Accuracy with Advanced Grounding

Part 3 of Our Agentforce Series

In Part 1, we helped you launch fast with FAQs.

In Part 2, we showed you how to scale smart using escalations.

Now we’re diving into the next phase: getting your AI agent to respond with confidence—and precision—by improving how it finds and uses information.

Whether you’re just getting up and running or refining your AI agent’s performance, this post is for you.

In this post, you’ll learn how to:
🔗 Connect your AI agent to deeper, structured sources of truth
📚 Ground responses in accurate, real-time data
⚙️ Set up scalable systems that grow with your content

Why Accuracy Matters—Especially Now

As your AI agent takes on more complex questions, expectations go up.

Customers don’t just want answers.
They want the right answers—immediately and consistently.

That’s where grounding comes in.

A confident, useful response depends on trusted content. And not just generic help articles or static FAQs. You need to connect to the live, structured sources your teams already use:

  • Knowledge bases
  • Internal help docs
  • Product catalogs
  • Policy databases
  • Field-level case data

What Is Advanced Grounding?

Think of grounding as the process of anchoring your AI agent to facts.

Basic grounding starts with FAQs or email templates.
Advanced grounding goes further—linking your agent to dynamic, structured content across your org.

Done well, advanced grounding helps your AI:
✅ Find the most up-to-date answer
✅ Reduce hallucinations or vague responses
✅ Boost agent and customer trust
✅ Cut down on unnecessary escalations

How to Set It Up: From Content Chaos to Connected Confidence

1. Take Inventory of What’s Working Today
Your teams are already using reliable content sources—bring those into the mix:

  • Salesforce Knowledge Articles
  • Salesforce record data (like case, account, or entitlement fields)
  • Uploaded internal documentation and structured files
  • Help center content
  • Public site information
  • High-performing responses like macros, flows, and templates

2. Prioritize Based on Gaps and Volume
Use your escalation review loop to find where your agent struggles.
Is it with pricing? Returns? Coverage details?
Identify high-volume topics where grounding would have the biggest impact.

3. Make It Structured and Searchable
AI agents love structure. Use tags, metadata, and organized formats (like lists, tables, or field references) to make it easier for the model to retrieve and reference relevant content.

4. Build Your Context Variables
Agentforce lets you pass structured context into your email responses—like CaseId and ContactId.
This helps your agent tailor answers more accurately by grounding in the right version of content.

Continuous Grounding = Continuous Growth

Your AI agent isn’t static—and your content shouldn’t be either.

Make grounding part of your sprint cycle:
📌 Review new escalations
🧠 Identify what content was missing
📥 Add or update structured sources
🧪 Re-test and measure impact

It’s a flywheel: better grounding → better answers → fewer escalations → more scale.

What’s Next: AI as a Channel

Now that your AI agent is accurate, responsive, and scalable—it’s time to go bigger.

In our next post, we’ll explore:
💬 What it means to treat your AI like a teammate, not just a tool

🚀 Ready to see what’s new in Agentforce?

Check out the Summer ’25 Release Readiness Highlights for Service Cloud to get a look at the latest updates.

👉 Watch here

How are you grounding your AI agent today—and where are you seeing the biggest wins or challenges?
Let’s learn from each other.👇

Grow Smart with Agentforce: Turn Escalations into Your Enablement Engine

Part 2 of our Agentforce Series
In Part 1, we covered how to get your AI agent live fast with FAQs. Now, we’re moving beyond launch.

In this post, you’ll learn how to:
🔍 Analyze escalations to uncover what your agent should learn next
🧠 Use real case data to expand your AI’s knowledge
🔁 Set up a repeatable process to improve performance every sprint

If you’ve gone live—this is your roadmap for scaling thoughtfully (and ROI-positive).

The Opportunity: Your AI Agent Is Talking—Are You Listening?

You launched with FAQs. You went live fast. You’re seeing value.

But now your AI agent is hitting edge cases. It’s handing off emails it can’t resolve.

That’s not a sign to stop.
It’s your next roadmap.

Escalations aren’t failures. They’re feedback. And they’re your biggest unlock for scaling your AI agent beyond the basics.

Why Escalations? Because They Show You What’s Next

Every time your AI agent hands off a message, it’s telling you something:

  • “I don’t understand this request.”
  • “This topic isn’t in my training set.”
  • “I need better grounding data to respond confidently.”

These patterns are gold.

The best teams don’t ignore escalations—they analyze them.
They turn confusion into clarity, and handoffs into high-impact training data.

Train Smarter: Use Real Cases to Build Real Capability

If FAQs are your training wheels, escalations are your upgrade path.

Here’s how to use them to expand agent coverage:

  1. Find the themes. Are cases escalating around order changes, subscription adjustments, or loyalty programs? Tag and group them.
  2. Source your content. Pull from agent macros, email templates, flows, and internal KBs already in use.
  3. Feed your AI what works. Use real examples from high-performing agents who’ve answered these questions well.

You’re not building from scratch—you’re building from success.

Build the Feedback Loop: Escalation → Enablement → Impact

With every iteration, your agent gets better. And so does your process.

Set a rhythm:

  • Review escalations weekly or every sprint
  • Prioritize high-volume or repeatable intents
  • Add grounding data and test again
  • Measure agent performance and customer outcomes

This isn’t one big launch.
It’s a flywheel of continuous improvement.

Measure When You’re Ready to Expand

How do you know your agent is maturing?

Look for signals:

✅ Lower escalation rates in key categories
✅ Faster case resolution times
✅ Higher agent satisfaction (they’re focused on complex work)
✅ Better customer feedback (and fewer “please clarify” loops)

When you see those signs—it’s time to unlock new categories.

Real Scale, Real Impact

The most successful Agentforce teams don’t automate everything at once.
They automate what matters—and scale with intention.

By listening to what your AI agent can’t do, you’ll figure out exactly what it should do next.

It’s not about doing more. It’s about doing the right next thing.

Real Scale, Real Impact

The most successful Agentforce teams don’t automate everything at once.
They automate what matters—and scale with intention.

By listening to what your AI agent can’t do, you’ll figure out exactly what it should do next.

It’s not about doing more. It’s about doing the right next thing.

What’s Next: Beyond Email—The Future of AI as a Channel

You’ve launched. You’ve scaled.
Now it’s time to think bigger.

Next up? We’ll dive into boosting accuracy with advanced grounding—exploring how to enrich your AI agent’s responses by connecting deeper into trusted, structured sources across your org.

👉 Ready to start or scale? Check out the Help Guide to connect your Agentforce Service Agent to email.

What’s the most surprising thing your AI agent has escalated—and how did it help you improve?

Let’s learn from each other.👇

Grow Smart with Agentforce: Train Your Agent Like a Human

Part 1 of our Agentforce for Service Email Series

In this post, you’ll learn how to:

  • ✅ Launch your AI fast using what you already have
  • 📚 Train it like a human service rep
  • 🔁 Create a foundation you can grow and scale

The Problem: AI Projects Stall Before They Start

You’ve invested in the platform. You’ve got the data. Leadership is on board. But your AI initiative still isn’t live.

Why?

Because most teams get stuck trying to launch the “perfect” use case.
They overthink. They overbuild. And they delay deployment—turning what could’ve been a quick win into a 6-month experiment with little to show for it.

Sound familiar?

If you want to move fast, deliver ROI, and start making real impact, there’s one proven place to begin:
👉 Start with your FAQs.

Why FAQs? Because They Just Work.

Launching Agentforce for Service Email doesn’t require a massive overhaul. You already have what you need:

  • A robust knowledge base
  • Common, repeatable inquiries
  • High-volume case categories perfect for automation

Think about how you onboard a new rep. You start with the basics:

  • “How do I reset my password?”
  • “Where’s my order?”
  • “What’s your return policy?”

These are your agent’s training wheels—and they’re your fastest path to value.

Train Your Agent Like You Would a Human Service Representative 

The most successful teams don’t treat AI like a black box.
They treat it like a teammate. Here’s how:

  • Use what you already have—macros, quick texts, and KB articles.
  • Model the best—feed in examples from high-performing agents.
  • Ground in real data—Salesforce cases, flows, and templates.

With Agentforce, your AI agent can start handling email in weeks, not months.
This isn’t about perfection. It’s about progress. 🚀

Escalations = Your Roadmap to Scale

Once your agent is live, you’ll start seeing what it can’t handle. That’s not failure—that’s opportunity.

Use escalations to:

  • Spot gaps in your content or logic
  • Identify new areas for grounding
  • Prioritize your next round of automation

Every escalation tells you where to go next.

The Flywheel of AI Service Maturity

Here’s how the most successful support orgs scale Agentforce:

  • ✅ Launch with FAQs
  • 📊 Track what gets escalated
  • 🔍 Expand training and grounding data
  • 🔁 Iterate and deploy again

This “rinse, learn, repeat” model drives continuous improvement—without burning time or resources.

Real Impact in Real Time

Teams with Agentforce for Service Email are seeing:

  • ⏱️ Faster resolution for common questions
  • 🎯 More time for agents to focus on high-value issues
  • 🚀 Deployments in weeks, not quarters

And the best part? It all starts with the content you already have.

If you’re stuck or waiting for the “perfect” use case—don’t be.

Start with FAQs. Get your agent into production.
And let the results speak for themselves.

Let’s get you live.

Progress Over Perfection

Your AI doesn’t need to handle every edge case on day one.
It just needs to start helping.

And once it’s live, you’ll start learning fast.
In Part 2, we’ll show you how to use escalations to identify gaps and scale intelligently.

🎥 Want to see it in action?
Check out our quick demo of Agentforce for Service on Email:
👉 Watch the video

🤔 What’s the one service question you wish your AI could handle today?
Let us know in the comments—we’re building this together.

Report on Abandoned Conversations with Salesforce Channels

One important piece of information for Service centers is related to abandoned conversations – that is how many people that really wanted to talk to you, gave up while they were waiting for a rep to talk to them. This primarily applies to real-time communication channels like web chat and voice calls, where a customer may abandon the interaction while waiting in queue before being connected to a service rep. This could also include after being handed off from a Bot or AI Agent conversation, to connect with a human.

Why is Abandoned Reporting Important?

This is a hugely important metric, but you probably know that already, that’s why you’re here. But just as a reminder, here are a few key reasons why:

  • Understanding Customer Frustration: High abandonment rates can indicate long wait times or other issues causing customer frustration.
  • Optimizing Resource Allocation: Tracking abandonments helps determine staffing levels and potential bottlenecks in customer service.
  • Improving Customer Experience: Identifying reasons for abandonments leads to process improvements and better overall customer experience.

Great – we know it’s a gap, we know it’s important, how do we solve it?

How to report on Abandoned

First – we are planning an out of the box solution for this (on Enhanced Omni only) where we will write a new ‘AgentWork’ record, with the ‘Status’ of ‘Abandoned’ – but ahead of that change coming in the Winter ‘26 release (October 2025), here are some ways to report on it.

I will go through a simple option, followed by a more complex one the captures more scenarios, but is a lot more difficult to implement and track. The scope of this is to solve it for Enhanced Chat (formally known as Messaging for In-app and Web) and Voice calls.

Step 1 – Add new fields to the objects

Both options involve adding these 3 fields to both the ‘MessagingSession’ and ‘VoiceCall’ records:

  1. Num Times queued (Number) – default 0
  2. Num Agent accepts (Number) – default 0
  3. Was abandoned (Formula (Checkbox)). This formula compares the two values above, plus that the conversation was ended by the end customer/visitor, as opposed to an agent or the application:
    1. For MessagingSession:
      ISPICKVAL(EndedByType, "End User") && ( Num_Times_queued__c > Num_agent_accepts__c)
    2. For VoiceCall:
      DisconnectReason = "CUSTOMER_DISCONNECT" && ( Num_Times_queued__c > Num_Agent_accepts__c)

Step 2 – Update on each accept

Now we need to increment the two counters in the appropriate places – for the number of accepts that is relatively straightforward:

  1. Create a Record Triggered Flow on ‘AgentWork’, and configure the start conditions in this way:
    1. Trigger is ‘A record is created or updated’
    2. Trigger condition for ‘Status’ equals ‘Opened’ and ‘Bot ID’ is Null equals ‘true’ (ignore any time the bot accepts work)
    3. Ensure you select ‘Only when a record is updated to meet the condition requirements’
  2. Add a decision node to check the type of work that was accepted. That decision node should check the ‘Starts With’ of the ‘WorkItemId’ matches the appropriate prefix for the objects we care about:
    1. MessagingSession: 0Mw
    2. VoiceCall: 0LQ
  3. Within each outcome, you’ll add 3 elements
    1. Get Records – load the appropriate record
    2. Assignment – ‘Add’ 1 to the ‘Num agent accepts’ field
    3. Update Records – save the updated value

Step 3 – Update on each routing request

Now we get to the trickier part – updating the record to count each time a routing request was made for the record. For efficiency and ensuring that the work gets delivered, we prevent a lot of automation on the ‘Pending Service Routing’ object, as any errors could cause systems to get out of sync, calls dropped or work not actioned as expected. However, that creates some issues when trying to catch a new routing request of a record – so I have 1 simple, and 1 more complex solution for this.

Simple solution

This involves simply updating the record each time you attempt to route it to a human service rep (don’t do this when routing to a bot or Agentforce Agent) – in the most basic case, this is incrementing the counter within the Omni Flow that you route the object in, similar to the screen shot on the right (this one assumes we’ve previously loaded the Voice Call record in the Flow). 

Assuming you know all the places that you are routing Voice Calls and Messaging Sessions, and when you transfer between users you are using an Omni Flow, then this should lead to an accurate count of routing requests, and therefore abandonments.

More complex solution

A more complex solution is to use ‘Change Data Capture’. You can enable this in Setup, and add the ‘Pending Service Routing’ object to the ‘Selected Entities’ – you can only enable 5 entitles without purchasing an add-on for more. This will then allow you access to the ‘PendingServiceRoutingChangeEvent’, which you can add an Apex Trigger to – yep we’re going to need to write Apex for this one, hence the added complexity.

trigger PSR_CDC_Trigger on PendingServiceRoutingChangeEvent (after insert) {
    // Iterate through each event message.
    for (PendingServiceRoutingChangeEvent event : Trigger.New) {
    // Get some event header fields
        EventBus.ChangeEventHeader header = event.ChangeEventHeader;
        List<String> recordIds = event.ChangeEventHeader.getRecordIds();
        System.debug('Received change event for ' + header.entityName + ' for ' + header.recordIds + ' of type ' + header.changeType + ' operation.');
        if (header.changetype == 'CREATE')
        {
            // New PSR record created - check the object type for the work item
            System.debug('event.WorkItemId: ' + event.WorkItemId);            
            // Ensure we aren't routing to a Bot/AI Agent
            if (event.BotId == null) {
            	for (String recordId : recordIds) {
                    if (event.WorkItemId.getSobjectType() == Schema.VoiceCall.SObjectType)
                    {
                        // VoiceCall - load record and increment num times queued.
                        System.debug('PSR for a Voice Call created.');
                        VoiceCall call = [SELECT Id, Num_Times_queued__c from VoiceCall where Id = :event.WorkItemId LIMIT 1];
                        call.Num_Times_queued__c++;
                        update call;
                    }
                    else if (event.WorkItemId.getSobjectType() == Schema.MessagingSession.SObjectType)
                    {
                        // MessagingSession - load record and increment num times queued.
                        System.debug('PSR for a Messaging Session created.');
                        MessagingSession ms = [SELECT Id, Num_Times_queued__c from MessagingSession where Id = :event.WorkItemId LIMIT 1];
                        ms.Num_Times_queued__c++;
                        update ms;
                    }
                }
            }
        }
    }
}

This is an example of the Apex Trigger that would increment the value – you can copy and paste this into the ‘Developer Console’ after going to ‘File’ → ‘New’ → ‘Apex Trigger’. Name it ‘PSR_CDC_Trigger’, and select the ‘PendingServiceRoutingChangeEvent’ object.

That should capture all creations of PSR records, and increment the routing requests as appropriate. 

Step 4 – Create the report

To keep this post a reasonable length, I’m not going to go into details on how to create reports, but it should be pretty straightforward to create a report for each object to report on this, and there is lots of helpful content out there. Follow the usual reporting steps to create a ‘Report Type’, ensuring it has the ‘Was Abandoned’ field included, and then create a report using the report type. You will need to create two separate reports, 1 per object – but I suggest dropping them both onto a single dashboard. You likely also want an abandonment rate – you can use a summary level formula to calculate this in standard reporting for a time period – below is an example of how you might do this, if you grouped by date:

Limitations

There will be a few limitations to this solution, particularly with regards to the Voice channel:

  • The ‘Disconnected Reason’ needs to come from the telephony system. With the ‘AWS Connect’ integration, this can take a while after the call disconnects before it is populated. It may also be populated differently (or not at all) by other telephony providers.
  • To use the Omni Flow solution, you will need to be calling Omni-Flow from your telephony provider.
  • Transfers may need some thought, and you’ll need to decide if you want to count conversations that drop when being transferred between teams or service reps as abandoned or not.
  • Only unauthenticated Messaging Sessions can be ended/abandoned, so may not totally cover all abandoned scenarios related to web chats.
  • There will be some edge cases, error scenarios etc. that may not be captured by this setup

Conclusion

While out of the box Salesforce does not track abandoned yet, this custom solution can fill the gap. By implementing appropriate methods and metrics, organizations can effectively measure and analyze abandonments in both Messaging and Voice channels, leading to improved customer service and operational efficiency. Let me know how you get on, and if there are any issues or remaining gaps this misses.

One Engine to Route Them All:Unified Voice Arrives in Omni-Channel!

It’s official: Omni-Channel can now route voice calls end-to-end! 🎉

For the first time, Salesforce Omni-Channel is the single routing engine for all supported channels — including voice. That means all customer interactions — from phone calls, chats, emails, leads — are routed through one unified routing engine. Until now, voice routing lived in a separate engine — causing complexity, sync issues, and routing conflicts — especially when blending voice with channels like chat.

With Unified Voice Routing (GA for Amazon Connect), voice is now fully native to Omni-Channel — enabling seamless channel blending through a single routing engine. It also unlocks skills-based and direct-to-agent routing for voice, leveraging Omni-Channel’s CRM-powered, channel-agnostic design to deliver smarter and more consistent customer experiences.


Why This Matters: One Engine to Route It All

Here’s what Unified Voice Routing brings to the table:

Omni-Channel routes voice calls directly, delivering consistent routing across all channels
Simplified setup experience — no more juggling complex configurations across two platforms; all routing rules live in one place
Improved channel blending, especially between voice and chat, for smoother work distribution
Skills-based and direct-to-agent routing support now extended to voice calls
Elimination of race conditions and presence conflicts — one routing engine rules them all
Flexible push timeout configuration, removing the frustrating 20-second push time out for SCV Amazon Connect agents


What a Smarter Voice Routing Experience Looks Like

What makes Unified Voice Routing stand out is how naturally voice now fits into the Omni-Channel experience — using the same routing logic you rely on for other channels — including skills based routing!

Shareable Link: https://salesforce.vidyard.com/watch/bNZrwRjpDe6ABiTSa1jNdY

In this demo:

  • A customer calls about a billing issue
  • IVR inputs are captured and passed from Amazon Connect to Salesforce
  • Omni-Channel Flow determines how the work should be routed
  • The voice call is routed using skills-based logic and placed in the Supervisor skill backlog
  • An agent is matched and offered the call based on their skill proficiency
  • The experience mirrors routing across all other channels — cases, leads, messaging, and chat — and now, voice!

You’ll see a real-world scenario where a customer calls in with a technical support issue, and the system routes the call directly to the most skilled available agent — automatically, seamlessly, and in real time. Omni-Channel Routing is CRM-powered and channel-agnostic — routing decisions are based on rich Salesforce context and applied consistently across every channel. This is voice routing — the Salesforce Omni-Channel way.


Let’s Get Technical: How Unified Voice Routing Works

Here’s how it all comes together under the hood:

  • Amazon Connect handles the IVR and the physical phone call connection.
  • When a call arrives, Amazon notifies Salesforce, passing along the IVR inputs and other call attributes (e.g. number dialled menu selections, customer responses).
  • Salesforce Omni-Channel uses those inputs to make CRM-powered routing decisions using Unified Routing.
  • While Salesforce determines the best agent, Amazon holds the call in a temporary queue.
  • Omni-Channel selects the right agent — based on skills, queue logic, or direct-to-agent routing — and sends which agent is the best person for the call
  • Amazon then connects the caller to the selected agent.

The result: voice, chat, email, and other work items are now routed, prioritised, and distributed through a single intelligent engine.


Who Should Adopt Unified Voice Routing?

Unified Voice Routing is ideal for:

  • Existing Omni-Channel customers already using channels like messaging or email who want to bring voice into the same routing engines
  • Existing Amazon Connect SCV Customers prioritising seamless channel blending and aiming to eliminate routing conflicts and sync issues
  • Customers looking to scale Omni-Channel across sales and service teams, simplifying routing management across multiple channels. One of Omni-Channel value is routing over 25 objects — including leads and custom object — meaning that sales and service users can have consistent routing rules

⚠️ What’s Not Supported (Yet)

  • Queued Callbacks
  • Scheduled Callbacks / Scheduled Work
  • Telephony partners outside of Amazon Connect
    • We are currently working with several partners to enable them to also support Unified Routing. Check with your Bring Your Own Telephony partner whether they will support Unified Routing in the future. Or work with your Account Team to identify the right Bring Your Own Telephony partner for your use-case. For partners looking to implement Unified Routing, have a look at the Bring Your Own Telephony developer guide.


Try It Out and Help Shape What’s Next!

One engine. Every channel. Unified at last.

I hope this article has you as excited to try Unified Voice Routing as the Omni & Voice teams were to help bring it to life. We’d love for you to give it a try — and let us know how it’s working for you! Your feedback is key to shaping what we build next. Share your thoughts and enhancement ideas on the IdeasExchange, tag us on LinkedIn, or drop a comment below. We’re here to help you get the most out of this powerful new capability.

👉 Get started with our help docs
👉 Explore best practices for your routing strategy

Reporting on Service Cloud channels

Reporting on Salesforce Service Cloud can sometimes feel like navigating a labyrinth. While the platform offers immense flexibility, it often leaves users yearning for more guidance. This blog aims to demystify the process, providing you with the insights and tools needed to harness the full power of Salesforce Service Cloud reporting.

Simplifying the Complexity

Historically, we’ve made it challenging for our customers by offering a plethora of reporting options without clear direction, or even making them aware of the options out there. Many customers will start with a single channel and build reports on that single object with some success. However, what happens when you add more channels and want consistent reporting across them all? The flexibility is there in the application, but the guidance on how to do it has been lacking. This blog, and future ones coming, are intended to help bridge that gap, making it easier for you to create meaningful reports and understand the data at your fingertips.

Harnessing the Power of Omni-Channel

One of the most powerful features of Salesforce Service Cloud is Omni-Channel. This tool is not only a powerhouse for work classification and routing, but also allows you to report consistently across all channels using a unified object model.

There are 2 objects that are critical to this consistent reporting:
1. AgentWork Object: This object is your go-to for tracking all the work assigned to agents and their performance. By analyzing the AgentWork object, you can gain insights into how efficiently your agents are handling their tasks, and the volumes you are handling.

This is where you find key performance indicators like average handle time, wait time (speed to answer) and wrap up time (after conversation time). For a work focused view, remember to group by the WorkItemId to find all the work performed for a given case or conversation, or alternatively for a service rep focused view, group by the UserId to find all the important metrics for your team.

For those with more advanced routing configurations, this object joins to the AgentWorkSkill object, where you can find if additional skills were dropped or not, and the relevant performance per skill.

2. UserServicePresence Object: To monitor user presence and capacity throughout each day, the UserServicePresence object is invaluable. It helps you keep track of when agents were available, busy, or offline, providing a clear picture of your team’s capacity and workload over time.

This contains important information related to how busy your team was, and how they are spending their time while logged in. You’ll want to group by user, presence status and date, to identify how long they are in each status each day, as well as analyze their idle time and average capacity, to see where you are potentially over or under staffed.

Recent Reporting Enhancements

We’ve recently enhanced our reporting capabilities to make it even easier to join Omni-Channel data with channel-specific data in Custom Report Types. For example, you can now join the AgentWork object with Case, MessagingSession, and VoiceCall objects (amongst others). This capability allows for a more comprehensive view of your service operations, enabling you to make data-driven decisions with greater confidence, and create consistent reports across channels.

This allows more in-depth analysis per channel, for instance determining which Case Types have a higher average handle time than others, or which customers you are spending the most time supporting. You will need to create separate reports for each object you want to join, but you will then be able to put them all on the same dashboard with common filters, allowing you to identify trends around volume or performance.

Existing Reporting Gaps

While we’ve made some strides in improving our reporting capabilities, we acknowledge that there are still some gaps that you can’t report accurately on (or at all) without customization. Two of the most common gaps we hear about are related to abandoned and transferred work – stay tuned for future blogs in this series, where we’ll provide tips and tricks to help you navigate these gaps until we can address them natively in the product.

In the Summer ’25 release we are going to be adding some reports and dashboards that you can install from the Setup screens, with the intention of giving you some basic reporting right away, with the flexibility to customize and enhance to your hearts desire – we’d love you feedback on those once they are available.

Future Topics

This blog is largely an introduction and some high level guidance, with some extra posts planned in the coming weeks, including more in depth guides on building these reports, as well as work arounds to address the known gaps. I’ll also call attention to these two new help docs related to reporting on Messaging:

Future blog topics include:

  • Step by step instructions on how to report on the AgentWork object
    • Extra: How to report on Skills
  • Step by step instructions on how to report on the UserServicePresence object
    • Extra: Utilization & Concurrency
  • How to report on Transfer
  • How to report on Abandoned

Let me know if there is something else I’m missing that you’re wanting to learn more about – these aren’t in a particular order, so those that are most desired I can start with.

What’s new for Datatable and other UnofficialSF components

I’ve released a new version of the Datatable component (4.3.5).

In addition to the Remove Row Action, I’ve added a new Standard Row Action and improved reactivity with a new single “Actioned Row” output.  When a row is “actioned”, you can fire off other reactive screen components like Flow Launcher or Screen Actions.  This lets you now do almost anything you want when clicking on a row action.

The action can be configured as a clickable icon or a full button and can be put in the first or last column of the datatable.

Some flow elements such as Transform and Filter are still not directly referenceable in the resource picker so I’ve updated the picker and the Datatable CPE to allow manual entry of flow attributes for the record and pre-selected record collections.  For example: “{!MyFilter}”

Other Datatable changes include increasing the maximum column width from 1000px to 1500px.

I’ve addressed a few bugs as well.

  • Date field values that get adjusted by the timzoneoffset now are stored as YYYY-MM-DD.  Prior versions stored these as a datetime which caused issues with collection processors and action buttons.
  • The SelectedRowKeyValue output now gets cleared when no rows are selected.
  • When both pagination and single row selection are enabled, the prior selection will be cleared before setting the new selection.
  • Fixed search/filter errors when using special characters by escaping special characters in filter and search terms.
  • The correct url for record hyperlinks will be generated when running in a playground org.
  • Edited ApexDefined rows will be output as soon as changes are saved.  (Issue #1565)  
  • If multiple preselected rows are provided and single row selection is enabled, only the first record in the collection will be marked as preselected.

It’s been a busy winter for updates on Unofficialsf.com.

I released an Auto-Navigate component for flow screens and added some new reactive collection processors.  By adding reactive conditional visibility to the Auto-Navigate component you gain full control over navigating between flow screens without the user needing to click a Next or Previous button.  The UpsertRecordByKey action lets one upsert a record into a record collection by matching the value of a key field.  

For certain types of reactive screens, some components are designed to react to the outputs of other components on the same screen. However, the first time a screen loads, these components may not have a value available. The Reactive Record and Reactive Record Collection components are designed to “seed” a component with a starting value before it can react to a change in another component. Think of these like the flow formula function BLANKVALUE where you can assign an optional value to use if the primary value is null or blank.

Updates to the Flow Screen Components Base pack include an updated combobox which means that Action Button and Screen Action outputs can now be directly referenced by other custom components from unofficialsf.com.  CPE developers can take advantage of a new feature that lets users manually reference flow attributes that can’t be selected natively by the component.  QuickChoice was updated to support default values for dependent picklists on initial screen load.  A Master Label and a Required attribute were added to the Object and Field picker.  The Rich Text Input screen component is now reactive.

The Flow Actions Base Pack and the Collection Actions were updated to have all entries be at API 45.0 or later which avoids any issues enabling the ICU Locale Formats which is being enforced in Spring ‘25.

New or updated Flow Actions include GetCaseThreadToken, GetPicklistValues and Base64ToFileConverter

Be sure to Subscribe to updates by clicking on any Blog post on this page and entering your email address and clicking Subscribe.

Datatable with Row Actions calling a pop-up Screen Flow

Datatable with Row Actions calling a pop-up Screen Flow

Recently I wrote an article on how datatable row actions could be used to execute a Screen Action.  This is a great feature if you need to perform some unattended actions on a record in the datatable.

But what if you need to provide some additional input or interact with the data in the actioned record?  Action Buttons and Screen Actions can only run auto-launched flows, not screen flows.

I was able to work with Josh Dayment to enhance his new Flow Launcher action to launch a screen flow reactively instead of just from a button.  We also added the capability of passing records and record collections in and out of the launched flow.

There will be many different use cases for this new capability, but this article highlights how you could combine Datatable and Flow Launcher to edit fields that aren’t natively supported for inline editing such as Lookup and Multi-Select Picklist fields.

Here’s the flow in action.  Each time the row action button is clicked, a screen flow pops up allowing the user to edit some of the fields in the actioned record.  When they click Save Changes, the datatable gets refreshed with the changed record.


This is a simple flow where you get a collection of Account records and present them in a Datatable on a reactive screen.

The reactive screen displays a Datatable with row actions enabled.  4 additional reactive actions are added to handle the additional processing.  Each of these will be explained in more detail later.

  1. CP – Get First Record
    Extract the single record from the collection of actioned rows provided by the datatable.
  2. Flow Launcher – Sobject
    Launch a screen flow that will allow the user to edit fields in the record provided by the Get First Record action.
  3. CP – Upset Record By Key
    Upsert the updated record from the screen flow into the current record collection.
  4. CP – Reactive Record Collection
    Provide the active record collection to be displayed in the Datatable and used by the Upsert action.  If nothing has been processed yet, seed the flow with the original Get Records collection.  Otherwise, return the collection provided by the Upsert Record By Key action.

When you first build this flow, set the input collection for the Datatable to be the collection of Accounts from the Get Records.  You will come back later and update this once you add the other reactive actions to the screen.

Next, define the Row Action for the Datatable.  Currently, there is only a Remove Row action so select that and restrict the number of actioned rows to 1.


The Remove Row action in the Datatable outputs a collection of records actioned by the user.  In this case, the Datatable is configured to restrict the user to a single action at a time.  The Get First Record component extracts the first record from the collection of Removed (Actioned) Rows from the Datatable so you have the single record you need to pass to the screen flow.


The Flow Launcher will fire by reacting to any changes in the record output by the Get First Record action which fires any time a new record is provided by the Datatable row action.

To configure the Flow Launcher component to launch the flow reactively, set the “Hide Launch Button” attribute to True (1).  To have the flow pop-up in front of the Datatable, set the “Show Flow in Modal” attribute to True (2).  You can select the size of the modal with the “Modal Size” attribute (3).  Identify the flow to be launched by providing the active flow’s API name in the “Flow API Name” attribute (4).  Identify which resource in the launched flow to pass the record to with the name of the input variable in “Subflow Input Variable Name” (5) and the record you are passing to that variable in “Launched Flow Input Attribute – Record” (6).  You can force the user to complete the called flow instead of closing the modal manually, by setting the “Disable Close Icon” attribute to True (7).


The flow being launched takes the values in the input record and displays a screen with inputs for some of the record’s fields.


The field values from the input record are used as defaults for the inputs on the screen.


The Flow Launcher action is looking for an output attribute from the flow with a special name of OUTPUT_Record.  You should create that as an output attribute in your screen flow and assign the values from the screen inputs to the OUTPUT_Record fields.


NOTE: You still want the calling flow to refresh even if the user doesn’t make any changes.  You can force this by having a custom checkbox field on your record.  The called flow will always change this value by setting it using this formula (fToggleChange).


The Upsert Record By Key component takes the modified record from the screen flow and upserts it back into the record collection by replacing the matching record in the collection with the new record values from the screen flow.  The key field API name defaults to Id.  Like you did with Datatable, you first need to configure this by referencing the original Get Records collection.  This will be changed after you add the Reactive Record Collection component to the screen.


Finally, the Reactive Record Collection component acts like a reactive BLANKVALUE function for record collections.  If the Input Record Collection hasn’t been populated yet, it uses the Alternate Record Collection to “seed” the original output from the component.  In this flow, the collection is first seeded with the results of the Get Records flow element.  After that, the record collection is the output from the Upsert Record By Key component. This output is used to provide the reactive record collection to both the Datatable component and the Upsert Record By Key component.


Now that the Reactive Record Collection component has been added to the screen, go back to the Datatable and Upsert Record By Key and change the Get Records collection to the output collection from the Reactive Record Collection component.


NOTE: CP – Get First Record, CP – Upsert Record By Key and CP – Reactive Record Collection are new actions I created and are available in version 1.0.3 or later of Reactive Screen Components.  These also require version 3.2.4 or later of the Collection Processors.


I hope this example gives you some ideas for some other use cases for components like Datatables with Row Actions or Autolaunched Screen Flows or Reactive Collection Processors.  Add your ideas to the comments.