Pages

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:





          Monday, May 25, 2026

          Architecture Email Sent from Salesforce and Account Engagement

          1. Account Engagement Emails & Account Engagement Email Templates datasets

          In this blog, we discussed Account Engagement Emails and the Account Engagement Email Templates datasets from the B2B Marketing Analytics app in CRM Analytics. Each row represents one day of statistics for an individual list email or an individual email template

          AE Email + AE Email Template Dataset Fields
          Type Account Engagement Emails Account Engagement Email Templates
          MeasuresClick To Open Ratio
          Delivery RateDelivery Rate
          Opt Out RateOpt Out Rate
          Spam Complaint RateSpam Complaint Rate
          Total Bounced
          Total ClicksTotal Clicks
          Total CTRTotal CTR
          Total DeliveredTotal Delivered
          Total Hard BouncedTotal Hard Bounced
          Total HTML OpensTotal HTML Opens
          Total Opt OutsTotal Opt Outs
          Total QueuedTotal Queued
          Total SentTotal Sent
          Total Soft BouncedTotal Soft Bounced
          Total Spam ComplaintTotal Spam Complaint
          Unique ClicksUnique Clicks
          Unique CTRUnique CTR
          Unique HTML Open Rate
          Unique HTML OpensUnique HTML Opens
          Unique HTML Opens*
          DatesCreated At DateCreated At Date
          Sent On DateStats Date
          Stats Date
          Updated At DateUpdated At Date
          DimensionsCampaign ID (CRM)Campaign ID (CRM)
          Campaign ID (external)Campaign ID (external)
          CampaignCampaign
          Created ByCreated By - User ID (CRM)
          Email IDEmail Template ID
          NameName
          SenderSent To
          Stats IDStats ID
          SubjectSubject
          Suppressed From
          TagsTags
          Type
          Updated ByUpdated By - User ID (CRM)

          Look at the Salesforce article B2B Marketing Analytics Datasets; there is a slight difference, as some fields are not available, such as bounce rate. Even between the email and email template datasets, there are slight differences in the field availability; see the blank values in the Account Engagement Emails and Account Engagement Email Templates columns.

          There are 2 major challenges/issues with the email template dataset:

          1. There is no Sent on Date, although we can use Stats Date and Total Sent
          2. *Unique HTML Opens always show 0; this is a bug and has been captured as a known issue.

          As you read above, there is no detail on who the email is sent to in the Account Engagement Emails and the Account Engagement Email Templates datasets.


          2. Prospect and Activity dataset 

          The Prospect and Activity dataset is another dataset provided by the B2B Marketing Analytics app. Each row represents a unique engagement activity and data related to the prospect who performed it. So, if a prospect performs multiple activities, such as list email click, list email open, landing page view, etc., they will appear as multiple rows with different activity dates (including timestamps). Here is the Salesforce article: Prospect and Activity Dataset.

          The screenshot below filters the prospect and activity by ID (using Lead ID)


          Here are the fields and the types available in this dataset:

          Prospect and Activity Dataset
          MeasuresScore
          DatesActivity Date
          Prospect Assigned Date
          Prospect Created At Date
          Prospect CRM Last Activity Date
          Prospect Last Activity Date
          Prospect Updated At Date
          DimensionsAccount
          Account ID
          Account Name
          Activity
          Activity Campaign ID
          Activity Campaign Name
          Address One
          Address Two
          Annual Revenue
          Archived
          Asset Activity
          Asset ID
          Asset Name
          Asset Type
          Assigned User First Name
          Assigned User Full Name
          Assigned User Last Name
          CRM Contact FID
          CRM Lead FID
          CRM Owner FID
          City
          Comments
          Company
          Country
          Created By First Name
          Created By Full Name
          Created By Last Name
          Department
          Employees
          Email
          External ID
          Fax
          First Name
          Full Name
          ID
          Grade
          Industry
          Is Do Not Call
          Is Do Not Email
          Job Title
          Last Name
          Month
          Name
          Opted Out
          Pardot Account ID (external)
          Pardot Activity ID
          Pardot Asset ID
          Phone
          Prospect Archived
          Prospect ID (external)
          Prospect Job Title
          Prospect Pardot Campaign Id
          Prospect Type
          Salutation
          Source
          Source Campaign
          State
          Tags
          Territory
          Updated By First Name
          Updated By Last Name
          Website
          Years In Business
          Zip


          We can relate the Pardot Asset ID in this dataset to the Email ID in the Account Engagement Emails and Account Engagement Email Templates datasets.

          ID (API Name: ActorID) in this dataset is the Salesforce Lead ID or Contact ID.

          Prospect Type will contain 'Lead' or 'Contact' only.


          3. Pardot Engagement History dataset

          This is another CRMA dataset, but provided by the B2B Marketing Engagement History app, not the B2B Marketing Analytics app, where the datasets mentioned above are.

          ✔ 1 row = 1 activity event (per prospect per interaction)

          I see this dataset is almost similar to the Prospect and Activity dataset, but lighter. It contains many similar fields, such as: ID (API Name: ActorID, which is Lead ID or Contact ID), Activity, Asset Activity, Asset ID, Asset Name, Asset Type, Prospect ID, Prospect Type, Pardot Activity ID, and Pardot Asset ID. But does not contain detailed information about the Prospect, such as Job Title, Address, Annual Revenue, Company, etc. -- this information can be retrieved from the Account Engagement Prospects dataset in the B2B Marketing Analytics app.

          Pardot Engagement History Dataset
          DatesActivity Date
          DimensionsAccount
          Account ID
          Activity
          Activity Campaign ID
          Activity Campaign Name
          Activity Date (Month Name)
          Asset Activity: Priority Page View, Landing Page View
          Asset ID
          Asset Name
          Asset Type:
          External ID
          ID
          Name
          Pardot Account ID
          Pardot Activity ID
          Pardot Asset ID
          Pardot Prospect Archived
          Pardot Prospect Job Title
          Prospect Pardot Campaign Id
          Prospect Type (Lead or Contact)


          Sample values of the Activity and Asset fields:



          Asset Activity, in short, is Asset Type + Activity.

          4. ListEmail object

          This is not a CRM Analytics dataset; it is a Salesforce object. Each record in the ListEmail object represents a list email sent from Salesforce or sent from Account Engagement. However, this object does not include emails sent manually from Salesforce; those records are stored in the EmailMessage object.

          The ListEmail record prefix is 0XB, while the EmailMessage record prefix is 02s.

          The email sent via Sales Cadence will have the ActionCadenceStepId set to the prefix 8C8; the Type will be "List Email" and SentVia will be "Salesforce".

          The ListEmailIndividualRecipient object links the List Email to recipients, represented by the Lead or Contact ID. Check the ListEmailId and RecipientId fields. The documentation does not mention whether the data includes emails sent from Account Engagement -- Salesforce confirms that email from MCAE is not added to this object.

          The ListEmailRecipientSource object connects the List Email with the source, such as Campaign or List View. SourceListId will be either the List View ID or the Campaign ID. The documentation does not mention whether the data includes emails sent from Account Engagement.

          The ListEmailSentResult is another object related to ListEmail; check the ListEmailId and RecipientId fields. As per the documentation, this object represents the results of a list email sent from Salesforce, but not emails sent from MCAE.

          Back to the ListEmail object, for emails sent from MCAE, the record creator will be the user who connects Salesforce with MCAE, such as B2BMA Integration and SentVia = Pardot, while the list email sent from Salesforce (including Sales Cadence) will have SentVia = Salesforce. For Pardot Email, Type = List Email for AE Email and Type = Automated Email for AE Email Template.

          There is no Sent Date in this object, but look into the ScheduledDate

          Salesforce ListEmail Fields
          API NameTypeRefers To
          ActionCadenceStepIdLookupActionCadenceStep
          CampaignIdLookupCampaign
          ClickThroughRatePercent
          ClickToOpenRatioPercent
          DeliveryRatePercent
          EmailContentIdLookup
          FromAddressTextarea
          FromNameString
          HasAttachmentBoolean
          HtmlBodyTextarea
          IsTrackedBoolean
          LastReferencedDateDateTime
          LastViewedDateDateTime
          NameString
          OpenRatePercent
          OptOutRatePercent
          OwnerIdLookupGroup, User
          ProgramNameString
          ScheduledDateDateTime
          SentViaPicklist
          SpamComplaintRatePercent
          StatusPicklist
          SubjectTextarea
          TextBodyTextarea
          TotalDeliveredInt
          TotalHardBouncedInt
          TotalOpensInt
          TotalOutOfOfficeInt
          TotalRepliesInt
          TotalSentInt
          TotalSoftBouncedInt
          TotalSpamComplaintsInt
          TotalTrackedLinkClicksInt
          TypePicklist
          UniqueOpensInt
          UniqueOptOutsInt
          UniqueRepliesInt
          UniqueTrackedLinkClicksInt


          5. Engagement Metrics on List Emails

          Check out this article: Five recommended custom report types for Account Engagement's Engagement History, and create the "Engagement Metrics on List Emails" report type. There is a known issue related to this report.

          This report will show each email as a single record in the aggregate data. Compared to the (1) Account Engagement Emails & Account Engagement Email Templates datasets, the datasets use the Stats Date, which shows email stats for each day, such as how many emails were sent, delivered, opened, etc., on 1-Jun, 2-Jun, etc. While this report includes Created Date and Scheduled Date, in the email template, the Scheduled Date is the creation date, so this does not reflect the daily activity details as offered by the Account Engagement Email Templates datasets.



          6. Email Activity DLO or Email Engagement DMO

          If you have Data 360 ingested data from MCAE, look for the out-of-the-box Email Activity DLO. I can't find any official documentation published by Salesforce, but here is the data gathered:
          • externalId__c = this is the unique key 
          • polymorphicListEmailId__c = 0XB << this is ListEmail Id
          • eventType__c = BOUNCE, CLICK, OPEN, SEND_STATUS, SUBSCRIBE, UNSUBSCRIBE
          • prospectEmail__c = email address
          • prospectSalesforceId__c = 003xxx or 00Qxxx
          • redirectURL__c = for CLICK
          • sendStatus__c = SENT for SEND_STATUS
          • emailBounceType__c = SOFT or HARD for BOUNCE
          • emailBounceReason__c = for BOUNCE with description, such as: Soft bounce - Other [5.4.0 5.4.0 Error: too many hops]
          You can query in Data 360 to retrieve the Campaign and List Email Type. The example below is a query to the DLO
          SELECT
              ea."externalId__c", ea."prospectSalesforceId__c", ea."polymorphicListEmailId__c",
              le."Type__c", le."Name__c"
          FROM "EmailActivity__dll" ea
          LEFT JOIN "ListEmail_Home__dll" le
              ON ea."polymorphicListEmailId__c" = le."Id__c"



          Reference



          Page-level ad