In this post, I am going to share how we can post the chatter from Apex code and mention the multiple users in the post.


Scenario: If the Account owner is changed, post a chatter and mention the “Account Reviewer “profile users based on old and new owner region. Account Reviewer from the old and new owner region should get notification of this change.

Solution: Create an Apex Trigger on Account object and a trigger helper class. Use ConnectApi to create the feedItem and mention the users in the post.


trigger AccountTrigger on Account (after update) {
    if(Trigger.isAfter && Trigger.isUpdate){
        list<Account> newAccountList = new List<Account>();
        for(Account acc:{
            if( Trigger.oldMap.get( ).ownerId != Trigger.newMap.get( ).ownerId ){
            AccountTriggerHelper.postChatterOnOwnerChange(Trigger.oldMap, Trigger.newMap,;


public with sharing class AccountTriggerHelper {
	//Post chatter on owner of Account gets changes and mention the Account reviewer users in the chatter based on old and new onwer region
    public static void postChatterOnOwnerChange(Map<Id,Account> oldAccounts, Map<Id,Account> newAccounts,List<Account> accList){
        //set to store the account owner Ids
        set<Id> newOwnerIds = new set<Id>();
        set<Id> oldOwnerIds = new set<Id>();
        //put account owner ids in set
        for(Account acc: accList){newOwnerIds.add(acc.ownerId);}
        // Map will store the account owner informations
        Map<Id,user> newOwnerMap = new Map<Id,user>([select id,Name,Region__c from user where id IN:newOwnerIds]);
        for(Account acct: oldAccounts.values()){oldOwnerIds.add(acct.ownerId);}
        Map<Id,user> oldOwnerMap = new Map<Id,user>([select Id,Name,Region__c from user where id IN:oldOwnerIds]);
        //This map will store the user region as key and list of account reviewer as value
        Map<String,List<User>> accountReviewerUsersMap = new Map<String,List<User>>();
        //iterate over users where profile = Account Reviewer and isActive = TURE
        for(User u:[select id,Region__c from user where Profile.Name='Account Reviewer' and isActive = true]){
            //get the list of account reviewer user from map
            List<User> userList = accountReviewerUsersMap.get(u.Region__c);
            if (userList == null) { // If List is null then put the value in the map
                userList = new List<User>();
                accountReviewerUsersMap.put(u.Region__c, userList); //put the region as key and list of user as value in the map
            //add the users in the list
        for(Account acc: accList){
            List<User> oldOwnerAccountReviewer = new List<User>();
            List<User> newOwnerAccountReviewer = new List<User>();
            //new owner account reviewer
            User newAccOwner = newOwnerMap.get(acc.OwnerId);
                newOwnerAccountReviewer = accountReviewerUsersMap.get(newAccOwner.Region__c);
            //old owner account reviewer
            User OldaAccOwner = oldOwnerMap.get(oldAccounts.get(acc.Id).ownerId);
                oldOwnerAccountReviewer = accountReviewerUsersMap.get(OldaAccOwner.Region__c);
            List<User> owners = new List<User>();

            ConnectApi.FeedItemInput feedItemInput = new ConnectApi.FeedItemInput();
            ConnectApi.MessageBodyInput messageBodyInput = new ConnectApi.MessageBodyInput();
            ConnectApi.TextSegmentInput textSegmentInput = new ConnectApi.TextSegmentInput();
            messageBodyInput.messageSegments = new List<ConnectApi.MessageSegmentInput>();
            // post body
            String postBody = '\'Account Owner\' has been changed field has been updated'+'\n\n';
            postBody += oldOwnerMap.get(oldAccounts.get( ).ownerId).Name + ' to '+ newOwnerMap.get(newAccounts.get( ).ownerId).Name + '\r\n\n';
            textSegmentInput.text = postBody;
            feedItemInput.body = messageBodyInput;
            //mention account reviewer from old and new onwer region
            for(user u: owners){
                ConnectApi.MentionSegmentInput mentionSegmentInput = new ConnectApi.MentionSegmentInput();
       = u.Id;
            feedItemInput.feedElementType = ConnectApi.FeedElementType.FeedItem;
            //post on Account record
            feedItemInput.subjectId =;
            //post the chatter
            ConnectApi.FeedElement feedElement = ConnectApi.ChatterFeeds.postFeedElement(Network.getNetworkId(), feedItemInput);  

Using this class ( ConnectApi.MentionSegmentInput) you can mention the user or group in the feed post or in the comments. We can include up to 25 users/group in the mention.


In this scenario, I have created/initialized the ConnectApi.MentionSegmentInput object in for loop so that multiple users can be mentioned in the chatter post.

//mention account reviewer from old & new owner region
 for(user u: owners){
          ConnectApi.MentionSegmentInput mentionSegmentInput = new 
 = u.Id;

Result: Update the Account owner and chatter will be posted on the Account record. You can see all the mentioned users will be from the new & old owner region who has the “Account Reviewer” profile.

Please click here to read the original article as posted on SFDC Lessons.

We source the web to bring you best Salesforce articles for our reader’s convenience. If you want to have this article removed, please follow guidelines at Digital Millennium Copyright Act (DMCA)..