Automatically roll up Salesforce enhanced notes to the relevant account

Salesforce’s Note object is being superseded by its ContentNote object. A limitation of the newer notes is that they don’t automatically roll up under the associated account when added to contacts and opportunities.

Here is some code I’ve written to solve this (also includes case notes):

Apex Trigger

trigger ContentDocumentLinkTrigger on ContentDocumentLink (after insert) {
    Set<ID> ids = Trigger.newMap.keySet();
    List <ContentDocumentLink> docLinks = [SELECT LinkedEntityId,ContentDocumentId,ContentDocument.FileType 
                                           FROM ContentDocumentLink WHERE Id IN: ids];
    for (ContentDocumentLink docLink : docLinks) {
        if (docLink.ContentDocument.FileType == 'SNOTE'){
            String linkedId = docLink.LinkedEntityId;
            if(!linkedId.startsWith('001') && !linkedId.startsWith('005')){
                String sNoteId = docLink.ContentDocumentId;

Apex Class

public class NoteLinkHelper {
    //helper method to get account ID related to non-account record from which note was created
    public static String getLinkedEntityAccount(String noteId, String linkedId) {
        String acctId;
        if (linkedId.startsWith('003')){
            List<Contact> contacts = [SELECT AccountId FROM Contact WHERE Id =: linkedId];
            if (!contacts.isEmpty()){
                if (contacts[0].AccountId != null) {
                    acctId = contacts[0].AccountId;
        else if (linkedId.startsWith('006')){
            List<Opportunity> opps = [SELECT AccountId FROM Opportunity WHERE Id =: linkedId];
            if (!opps.isEmpty()){
                if (opps[0].AccountId != null) {
                    acctId = opps[0].AccountId;
        else if (linkedId.startsWith('500')){
            List<Case> cases = [SELECT AccountId FROM Case WHERE Id =: linkedId];
            if (!cases.isEmpty()){
                if (cases[0].AccountId != null) {
                    acctId = cases[0].AccountId;
        return acctId;
    //helper method to link note to an account
    public static void linkToAcct(String sNoteId,String linkedId) {
        String acctToLink = getLinkedEntityAccount(sNoteId,linkedId);
        if (acctToLink != null) {
            ContentDocumentLink sNoteLink = new ContentDocumentLink();
            sNoteLink.ContentDocumentId = sNoteId;
            sNoteLink.LinkedEntityId = acctToLink;
            sNoteLink.ShareType = 'V';

I hope this helps your users get a more comprehensive view of their accounts.

3 thoughts on “Automatically roll up Salesforce enhanced notes to the relevant account

  1. djo22 says:

    Hello, verry good stuff… help me too much.
    But have some question. I Try to get Title and Note TextPreview (from contentNote) value to store in custom object, I can’t. Some time the title is trunced and TextPreview is alway null.How could I Fixe that


    Liked by 1 person

Leave a Reply

Please log in using one of these methods to post your comment: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s