Pages

Wednesday, August 26, 2026

MCAE and Salesforce Email in Data 360

In this blog, we discussed Email Activity DLO, or Email Engagement DMO. This blog will continue with how the MCAE and Salesforce email information is stored in Data 360.

We can get information from 3 objects related here; ideally, this should be done in DMO.

1. Email Engagement DMO / Email Activity DLO

This is the base object that stores all emails sent from MCAE. This object can be related to the Bulk Email Message DMO with key: Email Engagement object (field Bulk Email Message) related to Bulk Email Message object (field Bulk Email Message Id). The relationship needs to be set up from the child object, which is the Email Engagement DMO.

A few important fields from this object:

  • Bulk Email Message Id starts with the prefix 0XB
  • Engagement Date Time: when the record is created
  • Individual information starts with the prefix 003 (contact) or 00Q (lead)
  • Engagement Channel Action: SEND_STATUS, CLICK, and OPEN
  • Email Recipient Send Status: SENT or blank

Again, you can check all other fields in this object from this blog.


2. Bulk Email Message DMO / List Email DLO

We can treat this as the parent object, Email Engagement; the data is coming from both emails sent from Salesforce List Email and from MCAE, which is synced from data stored in the ListEmail object in Salesforce.

We can create a Salesforce report using the "Bulk Email Message with Email Engagement" report type; however, because of the "with", this means only Bulk Email Message has child records of Email Engagement DMO, which also means the results are ListEmail sent from MCAE only.

Because the Campaign ID field is in this object, we can relate it to the Campaign DMO. The relationship needs to be created from this object to Campaign. 


The 1st relationship is the Bulk Email Message object with key field = Campaign, related to the parent object Campaign with key field = Campaign ID.

The 2nd relationship is the same as mentioned in the Email Engagement DMO relationship above.

    A few important fields from this object:

    • Send Method Type: List Email or Automated Email
    • Sent Via: Salesforce or Pardot
    • Email stat fields such as: Total Sent, Total Delivered, Total Hard/Soft Bounces, Unique Opens, and Unique Clicks
    • Subject
    • From Name and From Address
    • Name, which is the List Email name
    Creating a Salesforce report using the Bulk Email Message report type will return all records for emails sent from Salesforce and MCAE, similar to a query to Salesforce's ListEmail object.


    3. Campaign

    As the objects have been linked, we can use Query Editor to run SQL to get the results as needed. So, instead of showing Campaign ID, we can get the campaign name, owner, start date, end date, etc. 




    Monday, August 24, 2026

    Salesforce: Sales Engagement email

    A few out-of-the-box custom report types are created when you enable Sales Engagement (pka High Velocity Sales) in your Salesforce org.

  • Cadences & Steps
  • Cadences & Steps with Monthly Metrics
  • Cadences & Trackers

  • Each report type produces different results; for example, Cadences & Steps uses Cadences as the primary object, with or without related records from Cadence Steps. This report will produce the effectiveness of cadences and cadence steps, all the metrics about the Cadence and its Steps—one cadence usually has many steps. The Step Cadence object gives all information related to the step; for the email step cadence, it will contain: 
    • All Email Sent Count
    • All Email Delivered Count
    • All Email Bounced Count
    • All Email Opened Count 
    • All Email Link Clicked Count
    and many more. Check this article: Asset Engagement Reports for Sales Engagement. To see all out-of -the-box Sales Engagement reports, look for the report folder 'Sample Sales Reports' or 'High Velocity Sales Dashboard Reports'.

    Sample report: As you can see from the screenshot, the Step Name is auto-generated and doesn't really tell anything, but the Step Title and Type from Cadence Step are useful.



    If we group the report by Type, here are a few values available:
    • Root
    • Make A Call
    • Send An Email
    • AutoSendAnEmail
    • Create Task
    • LinkedInMail
    • LinkedInConnection
    For email, there are Type = Send An Email and Auto Send An Email. As per the name, AutoSendAnEmail will let the system automatically send the email, while Send An Email is for the user to review and send the personalized email. Both are still available in the Cadence Builder Classic and Cadence Builder 2.0.



    Dive deeper if you need to understand how the data/metric is stored; they are stored in 2 different objects: ListEmail or ActionCdncStpMonthlyMetric. Check the Type field on the ActionCadenceStep object:
    • Step Type = AutoSendAnEmail >> ListEmail 
    • Step Type = SendAnEmail >> ActionCdncStpMonthlyMetric 

    ListEmail (0XB)
    Sample SOQL: 
    SELECT Id, Name, CreatedDate, TotalSent, TotalDelivered, ActionCadenceStepId, ActionCadenceStep.ActionCadenceId, ActionCadenceStep.Type, ActionCadenceStep.TypeDetail, ActionCadenceStep.MessageType FROM ListEmail WHERE CreatedDate = last_month AND ActionCadenceStepId <> '' ORDER BY CreatedDate 

    Items to note from the above query:
    • ActionCadenceStepId filter with NOT BLANK; this is to get only list emails sent from Sales Cadence, and not from MCAE or Contact list view, Lead list view, or Campaign Members list view.
    • Even if ActionCadenceStepId is not blank, ActionCadenceStep.ActionCadenceId can be blank. To overcome this, you can look into the ActionCadenceStepTracker object.
    • For the same list email Name, the ActionCadenceStepId can be duplicated with different create dates.
    • Total email metrics can be grouped by ActionCadenceStepId

    ActionCadenceStep (8C8)
    Sample SOQL:
    SELECT Id, CreatedDate, StepName, StepTitle, Type, TypeDetail, ActionCadenceId, AllEmailsSentCount, AllEmailsDeliveredCount FROM ActionCadenceStep WHERE CreatedDate = last_month ORDER BY CreatedDate 

    Check this and this article for reference.

    Items to note from the above query:
      • TypeDetail: If the step is a cadence step flow, this field contains the flow name. Otherwise, this field contains the same value as the Type field. 
      • StepName will contain the step Name, such as 2a92c03f-c1f9-4b2c-9548-42c0c564ec34, bacb7132-e45f-42cf-94f8-85ccef2515a6; unless Type = Root, this name will be 'RootNode'.
      • Step Title usually has values such as: Day 1: Email, Day 9: Make a Call, Day 6: Send Connection Request, but the cadence creator can type in anything as their preferred, but a good practice to enter a meaningful step name; this will help any user understand the step more easily.
      • This object is a child of ActionCadence, so you will have multiple records with the same ActionCadenceId.
      • The email metrics starting with AllEmails* are available for SendAnEmail and AutoSendAnEmail.

      ActionCadence (77C)
      Sample SOQL:
      SELECT Id, CreatedDate, Name, Type, TotalSteps, TotalTargets, ActiveTargets, ActivatedDate, FolderName FROM ActionCadence WHERE CreatedDate = last_month ORDER BY CreatedDate 

      Items to note from the above query:
        • Type: this may contain Standard, Quick, or SDR -- using cadence builder will be Standard
        • FolderName: where the cadence is stored
        • ActiveTargets: the total number of active targets that are currently assigned to this cadence; you will see this number when you open the Cadence Targets in the user interface.
        • TotalTargets: the total number of targets that have been assigned to this cadence.
        • ActivatedDate is usually the same as CreatedDate, but with only date information
        Check out this article for reference.


        ActionCadenceStepTracker (8HF)
        Represents a step in an active cadence for a specific cadence target. An ActionCadenceStepTracker record is created when a target moves to a new step in a cadence. Use ActionCadenceStepTracker to find information such as the step's current state, the reason it completed, and its type.

        Sample SOQL:
        SELECT Id, CreatedDate, ActionCadenceId, ActionCadenceName, ActionCadenceStepId, StepTitle, StepType, TargetId FROM ActionCadenceStepTracker WHERE ActionCadenceStepId = '8C8xxxx' ORDER BY CreatedDate 

        Items to note from the above query:
          • TargetId: this is a Lead or Contact ID
          •  You can get the Cadence Name, Step Title, and Step Type without needing to get it from their object
          One interesting thing about querying this object: you will get ActionCadenceId and ActionCadenceName, even though they are not/no longer visible when querying the ActionCadenceStep object.

          Check out this article for reference.


          ActionCdncStpMonthlyMetric (0gk)
          Sample SOQL:
          SELECT Id, CreatedDate, ActionCadenceStepId, ActionCadenceStep.ActionCadenceId,  AllEmailsSentCount, AllEmailsDeliveredCount, AllEmailsHardBouncedCount, AllEmailsSoftBouncedCount, AllEmailsOpenedCount, AllEmailsLinkClickedCount FROM ActionCdncStpMonthlyMetric WHERE CreatedDate = this_month

          If the ActionCadenceStepId is recorded in this object, it will not be available in the ListEmail object. As mentioned earlier, record in this object only for SendAnEmail, not from AutoSendAnEmail.  



          Unfortunately, some of these objects, such as ActionCdncStpMonthlyMetric, are not available in the CRMA dataflow/recipe. But Salesforce provides 3 out-of-the-box CRMA dashboards; check this article.





          Monday, August 3, 2026

          Salesforce Opportunity: Primary Campaign Source, Opportunity Contact Role and Campaign Influence

          Opportunity Created from Lead Conversion

          Out-of-the-box Salesforce behavior during Lead Conversion (when creating a new Opportunity) is:

          Primary Campaign Source
          If the Lead is a member of one or more campaigns, Salesforce populates the Opportunity's Primary Campaign Source with the campaign most recently associated with the Lead, no matter what the Campaign detail or Campaign Member status.

          Opportunity Contact Role (OCR)
          Salesforce automatically creates the converted Contact and associates it to the new Opportunity as an Opportunity Contact Role (marked as the Primary).

          Campaign Influence
          Campaign Influence relies on both Campaign Membership and Opportunity Contact Roles. When the converted Contact has campaign memberships and is related to the Opportunity through an OCR, Salesforce creates Campaign Influence records according to auto-association rules and model settings. But it only shows in the Campaign Influence related list for the Default Model.


          Opportunity Created from Opportunity tab or from Account record

          Primary Campaign Source
          Blank by default. Salesforce does not automatically populate it because there is no Lead conversion context.

          Opportunity Contact Role (OCR)
          No OCR is created automatically. The user must manually add one or more Contact Roles.

          Campaign Influence
          • No Campaign Influence records are created initially.
          • Campaign Influence can only be generated after:
            • A Contact is added as an OCR, and
            • That Contact is a member of one or more Campaigns, and
            • The Campaign Influence model criteria are met.

          Opportunity Created from a Contact Record

          Primary Campaign Source
          Salesforce automatically populates the Primary Campaign Source with the most recently associated Campaign of that Contact. Users can see and can change the value before creating the Opportunity.
           
          Opportunity Contact Role (OCR)
          Salesforce automatically adds that Contact to the Opportunity as an OCR.

          Campaign Influence
          If the Contact is a Campaign Member, Campaign Influence records will be created automatically according to the enabled influence model(s).


          Enabling Customizable Campaign Influence

          When enabling Customizable Campaign Influence, the Auto-Association Rules are enabled with the Time Frame of X days. Salesforce will evaluate existing opportunities and create Campaign Influence records for historical opportunities, including closed opportunities, as long as they meet the criteria:
          • The Opportunity must have at least one Opportunity Contact Role (OCR).
          • The Contact in the OCR must be a Campaign Member.
          • The Campaign Member engagement date must fall within x days before the Opportunity Created Date.
          After enabling Campaign Influence, Salesforce does not necessarily create all historical influence records immediately. Background processing evaluates opportunities and campaign memberships and creates influence records for qualifying opportunities.

          Also note that Primary Campaign Source is not backfilled by Customizable Campaign Influence; the existing opportunities may receive Campaign Influence records, but the Opportunity's Primary Campaign Source field remains whatever value it already has (or blank if never populated).




          Tuesday, July 21, 2026

          Salesforce: Member Status Updated

          What is Member Status Updated in the Campaign History of a Contact or Lead?



          As per the Salesforce article, Member Status Update Date Behaves as Last Modified Date on Campaign Members.



          Example

          In the above example, the field would show 6-Jul-2026 14:00, even though the status itself remained Opened


          Tuesday, June 30, 2026

          Salesforce: SOQL Knowledge

          Before we start, let us put a few notes related to Salesforce knowledge:

          • You can create a multi-level category: parent, child, grandchild, etc.
          • You can assign multiple categories in an article, including ones that are not from the same hierarchy
          • You can assign the article to the parent only (not including the child)

          There are 2 special keywords to query the knowledge object, but you can't get the data category in the query result. 

          1. WITH DATA CATEGORY
          2. AT, BELOW, ABOVE, ABOVE_OR_BELOW

          Sample: SELECT Id, Title FROM Knowledge__kav WITH DATA CATEGORY Product__c AT Laptop__c

          You must use the API Name in the query such as: All_Product__c, not the label: All Product

          1. AT (Exact match only)


          2. BELOW (Category + all children)


          3. ABOVE (Category + all parents)


          4. ABOVE_OR_BELOW (Everything around it)


          Tips:

          You can use the AND logical operator, but not the OR logical operator. Example: you have article with two Category Groups, sample: SELECT Id, Title FROM Knowledge__kav where PublishStatus = 'Online' WITH DATA CATEGORY Region__c AT Singapore__c AND Product__c AT Mobile__c

          To query with more than one Category Name, use parentheses and a comma, sample: SELECT Id, Title FROM Knowledge__kav where PublishStatus = 'Online' WITH DATA CATEGORY Region__c AT (Singapore__c, Malaysia__c)


          Reference



          Saturday, June 13, 2026

          CRM Analytics: Multi Currencies

          When we pull data from Salesforce with multi-currency enabled, what will the value be in the CRM Analytics dataset? We usually find this in the Opportunity Amount.

          Answer: It would be in the Corporate currency.


          Sample of an Opportunity in EUR:


          Result CRM Analytics:



          How about enabling the Dated Exchange Rate?

          Answer: It would be in the Corporate currency and follow the exchange rate as per the date range.



          Sample of Opportunities in EUR:




          Result in CRM Analytics:





          Page-level ad