
From prospect to alumni: unifying the student lifecycle with Dynamics 365 CRM and ERP
Higher education institutions face increasing complexity in managing the student lifecycle. Recruitment, admissions, academics, finance, and...
To all the Salesforce enthusiasts, we’re excited to share the latest innovations, enhancements, and upgrades in the Spring ’25 Release across the Salesforce Lightning Platform. This release is packed with powerful new tools designed to streamline operations and enhance the overall development and admin experience. This blog post highlights crucial features from a refreshed Advanced Lookup UI to real-time previews for Lightning Web Components, and new visual indicators in Screen Flows designed for increased flexibility, speed, and efficiency for users across the board.
Whether you’re an admin looking to simplify workflows or a developer aiming to build with more precision and speed, the Spring ’25 updates deliver the capabilities you need to work
smarter and faster. Let’s explore what’s new in this exciting release and how it can enhance your Salesforce journey.
To support users that block third-party cookies, test custom functionality and code that uses a Salesforce session cookie. To test, enable the My Domain setting, “Require first-party use of Salesforce cookies.” Salesforce plans to enforce that setting in a future release.
Where: This change applies to Lightning Experience and Salesforce Classic (not available in all orgs) in Group, Essentials, Professional, Enterprise, Performance, Unlimited, and Developer editions.
Visually guide your users through the stages of your screen flows by using the built-in progress indicator—no more writing custom code to create your own. Your users see which stage they’re on and how many stages remain. Configure whether you want to show the progress indicator at the top of the screen or in the footer. Pick from a simple-style or a path-style progress indicator. Path-style progress indicators are supported only at the top of the screen.
How: Progress indicators use stage variables to determine what stage the user is on. When a screen loads, $Flow.CurrentStage is automatically updated to the stage that’s associated with the screen, and the stage is added to the end of $Flow.ActiveStages if it isn’t an active stage already. Create stage resources and define the stage label, order, and whether the stage is active by default or not. Then, select the stage resource under the Stage field of the Screen element, or assign the stage resources manually by using assignment elements.
Finally, to show a visual progress indicator, open the flow version properties. Then, select Show a progress indicator on screen elements and then select the progress indicator type.
The user sees their progress on the page at run time.
Enhance your Flow Builder emails by sharing documents or files with your recipients by using Send Email action. To attach a file, provide the ID of a file to the Send Email action. The maximum size of the email created, including attachments, is 35 MB.
Where: This change applies to Lightning Experience and Salesforce Classic (not available in all orgs) in Essentials, Professional, Enterprise, Performance, Unlimited, and Developer editions.
How: In Flow Builder, in the element menu, search for and select Send Email. When you set input values, turn on the Attachment ID field, and then add the ID of the attachment. The ID can be of a Document, Content Version, or Attachment items. If you want to add more attachment IDs, enter them as a comma-delimited list.
Note Using attachments in the Send Email action changes the API called by the action, which changes the daily email send limit to the General Email Limit instead of the Daily Workflow Email Limit.
We reorganized the flow creation window to help you create the automation you need quickly and more efficiently. Flows are separated into four main categories, and you can filter and search to find the automation you need.
Where: This change applies to Lightning Experience and Salesforce Classic in all editions.
How: To access the new flow creation experience, click New Flow from the Automation Lightning app.
You can now run autolaunched flows automatically in the background when the input values associated with screen actions change. Previously, the only way to trigger a screen action was with the click of a button by using the Action Button component. The output can be displayed on the same screen, so your users can see the results of their actions on the same screen without clicking any buttons.
Where: This change applies to both Lightning Experience and Salesforce Classic (not available in all orgs) in Essentials, Professional, Enterprise, Performance, Unlimited, and Developer editions. It’s supported only in Lightning runtime for flows.
How: In Flow Builder, create an autolaunched flow that retrieves data and saves that data in output variables. Activate the autolaunched flow. Then, create a screen flow and add a Screen element. Next, add a screen action and select the autolaunched flow that you created. Configure the screen action, and set input values. After that, add another component to the screen element that uses the output of the autolaunched flow. To use the output from the autolaunched flow, in the screen component’s input, select the autolaunched flow, then Results, and finally the output variable from the autolaunched flow. You can see only the variables that were marked as Available for output. Then, save and run the flow.
For example, suppose you want to automatically show all contacts for a selected account record. Create an autolaunched flow that retrieves all contacts for an account. Activate the autolaunched flow. Then, create a Screen flow and add a screen element to it. Add a Lookup component so that users can select an account record. Add the activated autolaunched flow as a screen action and set the input values. This way, the autolaunched flow runs when the input values for the Lookup component change. Lastly, add a Data Table component, and add the Full Name, Email, and Business Phone columns. The output of the autolaunched flow automatically populates the Data Table when the lookup value changes.
At run time, when your user selects an account, they automatically see all the contacts for that account on the same screen—no button clicks required.
When you work with large datasets, you can hit performance issues or governor limits if you use the Get Records element to retrieve all records. If you set an upper limit to control data retrieval, you improve flow performance and reduce the risk of timeouts or errors. Use the All records, up to a specified limit option to set an upper limit on the number of records to retrieve.
Where: This change applies to Lightning Experience and Salesforce Classic (not available in all orgs) in Essentials, Professional, Enterprise, Performance, Unlimited, and Developer editions.
How: To set a limit on the number of records that the Get Records element retrieves, first add a Get Records element to your flow. Then, under How Many Records to Store, select All Records, up to a specified limit (1). Enter the maximum number of records to store (2). The Get Records element retrieves all the records that meet the criteria up to the specified limit.
To see your data in a more intuitive way and to make your list views more actionable, you can now sort list views on object home pages by up to five columns. Select the columns to sort by and whether to sort each column in ascending or descending order. To return to sorting by a single column, click a column header that isn’t included in your multiple column sort. Sorting by multiple columns affects only your user preferences, and you can’t save your multi-column sorting configuration as a default. We delivered this feature thanks to your ideas on IdeaExchange.
Where: This change applies to Lightning Experience in all editions, except Starter and Pro Suite.
How: To sort a list view by multiple columns, from a list view, click , and then select the columns to include in the sort. Click Apply.
For example, create a Cases list view that’s sorted by Contact Name, then by Priority, and then by Date/Time Opened. Or you can create an Opportunities list view sorted by Close Date and then by Amount.
Your list sort configuration is saved until you modify or clear it. To return to the default sort order, click , and then select Reset Column Sorting.
If you don’t see the option to sort list views by multiple columns yet, you can still enable the beta version of the feature. From Setup, in the Quick Find box, enter User Interface and select it. Then select Enable sort by multiple columns (Beta). After you opt in to use the beta feature, list views for all supported custom and standard objects are rendered with Lightning Web Components (LWC) instead of with Aura.
To organize and understand your data better, sort related lists by up to five columns. Quickly identify patterns and trends so that you can make informed decisions. Previously, you could sort a related list by only a single column. We delivered this feature thanks to your ideas on IdeaExchange.
Where: This change applies to Lightning Experience in all editions except Starter and Pro Suite.
How: To sort by multiple columns, from a related list, click View All, and then click . Select the columns to include in the sort, and then click Apply.
For example, let’s say that you have an Opportunities related list on the Account page. Sort the Opportunities related list by Stage and then by Amount.
Your list sort configuration is saved until you modify or clear it. To return to the default sort order, click , and then select Reset Column Sorting.
Sort by multiple columns affects only your user preferences. You can’t save your multi-column sorting configuration as a default.
Dynamic formulas in Apex support SObjects and Apex objects as context objects. Use the class methods in the FormulaEval namespace to build and evaluate dynamic formulas. This feature, now generally available, supports accessing polymorphic relationship fields. You can also reference standard lookups and custom lookups in formula fields. We delivered this feature thanks to your ideas on IdeaExchange.
Where: This change applies to all editions.
How: This example uses the build() and evaluate() methods to validate a formula instance, calculate the formula expression, and return the result.
Account myAcc = new Account(Name=’123′);
FormulaEval.FormulaInstance ff = Formula.builder()
.withType(Schema.Account.class)
.withReturnType(FormulaEval.FormulaReturnType.STRING)
.withFormula(‘name & ” (” & website & “)”‘)
.build();
//Use the list of field names returned by the getReferenced method to generate dynamic soql
String fieldNameList = String.join(ff.getReferencedFields(),’,’);
String queryStr = ‘select ‘ + fieldNameList + ‘ from Account LIMIT 1’; //select name, website from Account
Account s = Database.query(queryStr);
system.debug(ff.evaluate(s));
Local Dev is now generally available for Lightning apps. We made some changes since the beta release. By using Local Dev, you can develop your Lightning web components in a real-time preview of your Lightning app without deploying code or manually refreshing your browser. Local Dev is in beta for Lightning Web Runtime sites.
Where: This change applies to Lightning Experience and to all versions of the Salesforce mobile app in all editions.
How: To use this feature, first install Salesforce CLI. To turn on Local Dev for your org, from Setup, in the Quick Find box, enter Local Dev and then select Local Dev. To turn on Local Dev for all org users, select Enable Local Dev. Then, to install the Local Dev plug-in, run the CLI command:
sf plugins install @salesforce/plugin-lightning-dev
Now available in Spring ’25, SLDS 2 is the latest design system for Salesforce products on the Lightning Platform. Use SLDS 2 to build scalable and flexible user interfaces with themes that adapt to future changes, ensuring your code remains efficient and modern. The new design of SLDS 2 is achieved through CSS updates and the implementation of styling hooks, without changing the markup or structure of components. This approach allows for seamless UI changes while preserving the Lightning Experience.
How: If your components are built using SLDS development best practices, your existing org’s transition from SLDS to SLDS 2 is simple.
As a developer, transition your org to SLDS 2 using SLDS Validator or SLDS Linter (beta) to audit your code. SLDS Validator and SLDS Linter analyze your code, validate it against SLDS 2 guidelines, and identify custom components that need updates. Both tools also provide automated fixes and suggest improvements to ensure compliance with SLDS 2 standards. To learn how to support your custom components in SLDS 2, use Figma Kit: Components for Web | Lightning Design System v2 and Figma Kit: Style Guide – SLDS Web Components v2.
As an admin, use Themes and Branding to create a custom theme or use Salesforce Cosmos, a new SLDS 2 theme. To turn on the Cosmos theme, follow the directions in Explore Salesforce’s Refreshed Visual Style with Themes for SLDS 2 (Beta).
SLDS 2 doesn’t yet support component-level styling hooks. If you use –slds-c-* styling hooks to customize the styling of your components built from SLDS blueprints or base Lightning components, they might not work as expected when you use the Cosmos theme.
Use the Compression namespace and take advantage of a native Apex Zip library to compress and extract files. Easily compress files into a Zip file from blobs and directly decompress files stored in a Zip file to blobs. Optimize compression by specifying the compression method and level. You can compress multiple attachments or documents as an Apex blob in a Zip archive. You can also specify the data to extract from the Zip archive without uncompressing the entire Zip archive. We delivered this feature thanks to your ideas on IdeaExchange.
Where: This change applies to all editions.
How: To add zip entry details, such as an entry name, comment, and compression method, use the addEntry(String name, Blob data), addEntry(compression.ZipEntry prototype), and setMethod(compression.Method method) methods in the ZipWriter class. To generate a zipped archive and return the result as an Apex blob, use the getArchive() method. This code sample compresses email attachments into a single file.
Compression.ZipWriter writer = new Compression.ZipWriter();
List<id> contentDocumentIds = new List<id>();
// Add IDs of documents to be compressed to contentDocumentIds
for ( ContentVersion cv : [SELECT PathOnClient, Versiondata
FROM ContentVersion
WHERE ContentDocumentId IN :contentDocumentIds])
{
writer.addEntry(cv.PathOnClient, cv.versiondata);
}
blob zipAttachment = writer.getArchive();
Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
efa.setFileName(‘attachments.zip’);
efa.setBody(zipAttachment);
List<Messaging.EmailFileAttachment> fileAttachments = new List<Messaging.EmailFileAttachment>();
fileAttachments.add(efa);
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
// Set all the other email fields, such as addresses, subject, and body
email.setFileAttachments(fileAttachments);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { email });
Get zip entry details and extract the Zip file’s contents by using the getEntries(), getEntry(String name), extract(ZipEntry entry), and other methods in the ZipReader class. This code sample extracts the translation from a callout response.
HttpRequest request = new HttpRequest();
request.setEndpoint(‘callout:My_Named_Credential/translationService’);
request.setMethod(‘POST’);
// Set translation service request payload for input to translate
// The translation endpoint will return translations to the requested languages as JSON in a Zip archive
HttpResponse response = new Http().send(request);
Blob translationZip = response.getBodyAsBlob();
Compression.ZipReader reader = new Compression.ZipReader(translationZip);
ZipEntry frTranslation = reader.getEntry(‘translations/fr.json’);
Blob frTranslationData = reader.extractEntry(frTranslation);
When you create a new record by using a quick action, you can now quickly redirect to the newly created record by clicking default or custom toast messages. Previously, on desktop, you could only click the default toast message to be redirected to the newly created record.
Where: This change applies to Lightning Experience and Salesforce Mobile in Group, Essentials, Professional, Enterprise, Performance, Unlimited, and Developer editions.
Maintaining a flow can be challenging, especially if you didn’t create it. Without a detailed flow description, it can be tough to figure out what the flow does. Now you can use Einstein to summarize an existing flow or a new one as you create it. The summary describes all the flow steps and includes the input and output variables, the objects that the flow changes, and the subflows that the flow refers to. You can then add the generated summary to the flow description to keep everyone informed.
Where:This change applies to Lightning Experience in Enterprise, Performance, and Unlimited editions with the Einstein for Sales, Einstein for Service, or Einstein Platform add-on. Einstein generative AI is available in Lightning Experience. To purchase the Einstein for Sales, Einstein for Service, or Einstein Platform add-on, contact your Salesforce account executive.
How: Turn on Einstein generative AI in Setup. Next, from Setup, in the Quick Find Box, enter Flow Creation with Einstein, and activate it. To summarize a flow, open it in Flow Builder. In the Einstein panel, click Summarize Flow. The Einsten panel is open by default. If you don’t see it, click Einstein.
After you generate the summary, you can shorten or lengthen it (1). The standard summary provides a high-level overview and includes the objects that were modified in the flow. The shorter version summarizes the flow in one or two sentences.
For easier viewing, the Advanced Lookup window now lists possible matches under the search bar, not in a dropdown. To change the sorting parameter for search results, click the column titles. If you don’t find the proper result, create a record from the Lookup input field, not from the Advanced Lookup window.
Where: This change applies to objects that support Lightning Web Component (LWC). It is available in the Lightning Experience in all editions except Database.com.
Who: For custom components that use lightning-input-field, users with the target object create permission will continue to use the previous UI to accommodate the need to create records. The new lookup advanced search UI is available to all other users.
With the Spring ’25 Release, Salesforce continues to raise the bar with enhancements that accelerate development, simplify customization, and improve overall platform efficiency. From smarter design tools to more responsive interfaces, these updates are built to help teams move faster and deliver greater impact across every part of the organization.
Connect with our team of experts to explore how the latest Salesforce Spring ’25 features can unlock new possibilities for your business with LevelShift as your trusted partner
For enterprises with over $100 million in revenue, data is both a goldmine and a...
...
Microsoft Dynamics 365 brings together CRM and ERP capabilities under one roof, ...
From prospect to alumni: unifying the student lifecycle with Dynamics 365 CRM and ERP
Higher education institutions face increasing complexity in managing the student lifecycle. Recruitment, admissions, academics, finance, and...
Shaping the Future of Manufacturing: Why Salesforce CPQ Can Be Your Competitive Edge
In manufacturing, staying ahead isn’t just about what you make—it is about how quickly and efficiently you can bring it to market. For that,...
Upgrading CPQ to Revenue Cloud Advanced: A Complete Guide
Salesforce CPQ sets the stage for efficient quoting. Revenue Cloud Advanced takes it further by unifying quoting, billing, and revenue opera...