Friday, 24 January 2020

Enforce Security With the stripInaccessible Method


In this post we will talk about the new way to enforce the security in apex with stripInaccessible() method. From Winter 20, stripInaccessible() security feature for field-level data protection is available for beta in production. In winter 20 Salesforce extended the feature and added enum value UPSERTABLE to System.AccessType.

stripInaccessible() is useful to strip the field that current user don't have access from query and sub-query. We can use it to remove inaccessible field from sObjects before DML operation to avoid exceptions. This method also provides the option an option to enforce the Object level access check.

Syntax :- 


public static System.SObjectAccessDecision stripInaccessible(System.AccessType accessCheckType,
                                                             List<SObject> sourceRecords,
                                                             Boolean enforceRootObjectCRUD )
  • accessCheckType : This parameter determines the type of field-level access check to be performed
  • sourceRecords : A list of sObjects to be checked for fields that aren’t accessible in the context of the current user’s operation
  • enforceRootObjectCRUD : Indicates whether an object-level access check is performed
 

Use Case 1: No access on Field

In this example, User don't have access on field called accountNumber on Account Object.

        List<Account> accounts =[SELECT Id, Name,AccountNumber
                                 FROM Account limit 2];
         
        // Strip fields that are not readable
        SObjectAccessDecision decision = Security.stripInaccessible(
                                               AccessType.READABLE,
                                               accounts);
        
        // Print stripped records
        for (Integer i = 0; i < accounts.size(); i++) {
              System.debug('Insecure record access: '+accounts[i]);
              System.debug('Secure record access: '+decision.getRecords()[i]);
        }
        
        // Print modified indexes
        System.debug('Records modified by stripInaccessible: '+decision.getModifiedIndexes());
        
        // Print removed fields
        System.debug('Fields removed by stripInaccessible: '+decision.getRemovedFields());             
In above example user dont have access on accountNumber field. After using the Security.scripInaccessible method we can simply strip out the same field. Which all field are removed we can check with "getRemovedFields" method. Here is output of above code.



Use Case 2: No access on sObject

Let see another example when user don't have access on object itself. For demo I simply removed the access from Account object. Then we got the below exception.


 System.NoAccessException: No access to entity: Account
we have "enforceRootObjectCRUD" optional parameter which is true by default we can set that as false to get null value.


Use Case 3: SubQuery.

What about if you are try to access field from subquery ?

 List<Account> accountsWithContacts =
    [SELECT Name, AccountNumber,
        (SELECT LastName, Phone FROM Account.Contacts)
    FROM Account  limit 2];
 
// Strip fields that are not readable
   SObjectAccessDecision decision = Security.stripInaccessible(
                                       AccessType.READABLE,
                                       accountsWithContacts);

// Print stripped records
   for (Integer i = 0; i < accountsWithContacts.size(); i++)
  {
      System.debug('Insecure record access: '+accountsWithContacts[i]);
      System.debug('Secure record access: '+decision.getRecords()[i]);
   }

// Print modified indexes
   System.debug('Records modified by stripInaccessible: '+decision.getModifiedIndexes());

// Print removed fields
   System.debug('Fields removed by stripInaccessible: '+decision.getRemovedFields());
  This will remove the field on which user dont have access.



Use Case 4: DML.


What about if use dont have access on AccountNumber field and we will try to add value of AccountNumber by DML ?

public static void testDML(){
    Account acc = new Account(Name='Test', AccountNumber ='TestRating');
    insert acc ;
    System.debug('---->'+acc );
}   
This will insert the record with AccountNumber value in same user context even user dont have access on same field. How we can stop the same with Security.stripInaccessible. Let see

public static void testDML()
{  
    Account acc = new Account(Name='Test' ,AccountNumber ='Demo');
    System.debug('---->'+acc );
    List<Account> lstAcc = new List<Account>();
    lstAcc.add(acc);
   
    SObjectAccessDecision securityDecision = Security.stripInaccessible(
                                                AccessType.CREATABLE,
                                                lstAcc );
    System.debug('---ecurityDecision.getRecords()->'+securityDecision.getRecords());                                           
    insert securityDecision.getRecords();
    System.debug(securityDecision.getRemovedFields().get('Account'));
}      
here is output


You can also use the method to sanitize sObjects that have been deserialized from an untrusted source





Further Reading
  1. https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_with_security_stripInaccessible.htm
  2. https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Security.htm#topic-title


Sunday, 19 January 2020

Order of execution in Salesforce

We did one session in apex hours of How to become an Order of Execution Hero. In that session we did one deep drive in Salesforce Order of execution and covered some interview question on order of execution. Save Order of Execution is the most important factor in designing sustainable and scalable applications.
When you save a record with an insert, update, or upsert statement, Salesforce performs the following events in order. Here is cheat-sheet of Order of execution.

Order of Execution

  1. Loads Initial record.
  2. If the request came from a standard UI edit page, Salesforce runs system validation to check the record for page layout specific rules, field definition, Maximum field length.
  3. Executes  flows that make before-save update. (New Change in Winter 20)
  4. Executes all before triggers. 
  5. Runs most Custom validation.
  6. Executes duplicate rules. 
  7. Saves the record to the database, but doesn't commit yet. 
  8. Executes all after triggers. 
  9. Executes assignment rules. 
  10. Executes auto-response rules. 
  11. Executes workflow rules. 
  12. If there are workflow field updates, updates the record again.
  13. If workflow field updates introduced new duplicate field values, executes duplicate rules again. If the record was updated with workflow field updates, fires before update triggers and after update triggers one more time (and only one more time), in addition to standard validations. Custom validation rules are not run again.
  14. Executes processes and flow. 
  15. Executes escalation rules. 
  16. Executes entitlement rules. 
  17. If the record contains a roll-up summary field or is part of a cross-object workflow, performs calculations and updates the roll-up summary field in the parent record. Parent record goes through save procedure. 
  18. If the parent record is updated, and a grandparent record contains a roll-up summary field or is part of a cross-object workflow, performs calculations and updates the roll-up summary field in the grandparent record. Grandparent record goes through save procedure. 
  19. Executes Criteria Based Sharing evaluation. 
  20. Commits all DML operations to the database. 
  21. Executes all after-commit logic, such as sending email.

What is part of the after commit logic?

  1. All email sends
  2. Asynchronous Apex: @future methods
  3. Async Sharing Rule processing (for >25,000 records)
  4. Outbound Messages placed on queue
  5. Calculate Index, such as Search Index
  6. Render File Previews
  7. Publication of Platform Events (if configured)
NOTE: The order of execution isn’t guaranteed when having multiple triggers for the same object due to the same event. For example, if you have two before insert triggers for Case, and a new Case record is inserted that fires the two triggers, the order in which these triggers fire isn’t guaranteed.

Check this post for more detail Triggers and Order of Execution.

How deep is your knowledge of the Order of Execution ?

There's a lot more to know than triggers run before workflows. Dig deeper, understand the logic flow and your apps will scale better and run more reliably. Become an Order of Execution hero and walk away with an understanding of how to design robust apps optimized for scale and how to control recursion and remedy typical problems.  

What kind of issues did you experience ?

  • Unexpected Outcomes
    •  Missing or duplicate records
    •  Blank or “wrongly” populated fields
  • Hitting Limits
    •  CPU Time Limit Exception
    •  Too many SOQL Queries


Here is recording of our Apex Hour session.


 

Further Reading:

 https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm 


Thanks,
Amit Chaudhary

Friday, 3 January 2020

Lightning Datatable Sorting in Lightning Web Components

Lightning Datatable Sorting in Lightning Web Components
Last time we talk about Lightning Datatable in Lightning Web Components (LWC). In this post we will talk about lightning datatable example with sorting. We know lightning-datatable component displays in tabular data and each column can be displayed based on the data type. We can also achieve the column sorting with the help of onsort attribute in datatable. I hope VsCode is already setup on you machine and you know how to create Lightning Web Component. If not please check our Get started with Salesforce lightning web components post.

Lightning-datatable

Lightning datatable provides an onsort attribute which allow us to implement the sorting in lightning datatable. To enable the sorting on row you need to set sortable to true for the column and set sorted-By to match the fieldName attribute on the column. 

Use onsort event handler to update the table with the new column index and sort direction. The sort event returns the following parameter.
  1. fieldName    The fieldName that controls the sorting.
  2. sortDirection    The sorting direction. Valid options include 'asc' and 'desc'.
 You can implement sorting locally or via apex call.

Local Sorting:

We mostly implement this type of sorting when we know data elements in lightning datatable is small and limited.

1) Create Apex Class. 

To select certain contacts using SOQL, use an Apex method. Check this post to learn about how to Call Apex Methods in LWC.

LWCDataTableSortingExample:
public with sharing class LWCDataTableSortingExample {
    @AuraEnabled(Cacheable=true)
    public static List <Contact> getContacts() {
        List<Contact> contList = [ SELECT Id, FirstName, LastName, Phone, Email
                                   FROM Contact
                                   LIMIT 10 ];
        return contList;
    }     
}

2) Create Lightning web component.

dataTableSortingLWC.html
<template>
    <lightning-card title="Data Sorting in Lightning Datatable in LWC" icon-name="standard:contact" >
        <br/>
        <div style="width: auto;">
            <template if:true={data}>
                <lightning-datatable data={data}
                                     columns={columns}
                                     key-field="id"
                                     sorted-by={sortBy}
                                     sorted-direction={sortDirection}
                                     onsort={doSorting}
                                     hide-checkbox-column="true"></lightning-datatable>
            </template>
        </div>
    </lightning-card>
</template>


dataTableSortingLWC.js
import {LightningElement, wire, track} from 'lwc';
import getContacts from '@salesforce/apex/LWCDataTableSortingExample.getContacts';

// datatable columns with row actions. Set sortable = true
const columns = [ { label: 'FirstName', fieldName: 'FirstName', sortable: "true"},
                  { label: 'LastName', fieldName: 'LastName', sortable: "true"},
                  { label: 'Phone', fieldName: 'Phone', type: 'phone', sortable: "true"},
                  { label: 'Email', fieldName: 'Email', type: 'email', sortable: "true" },];

export default class DataTableSortingLWC extends LightningElement {
    @track data;
    @track columns = columns;
    @track sortBy;
    @track sortDirection;
  
    @wire(getContacts)
    contacts(result) {
        if (result.data) {
            this.data = result.data;
            this.error = undefined;
        } else if (result.error) {
            this.error = result.error;
            this.data = undefined;
        }
    }

    doSorting(event) {
        this.sortBy = event.detail.fieldName;
        this.sortDirection = event.detail.sortDirection;
        this.sortData(this.sortBy, this.sortDirection);
    }

    sortData(fieldname, direction) {
        let parseData = JSON.parse(JSON.stringify(this.data));
        // Return the value stored in the field
        let keyValue = (a) => {
            return a[fieldname];
        };
        // cheking reverse direction
        let isReverse = direction === 'asc' ? 1: -1;
        // sorting data
        parseData.sort((x, y) => {
            x = keyValue(x) ? keyValue(x) : ''; // handling null values
            y = keyValue(y) ? keyValue(y) : '';
            // sorting values based on direction
            return isReverse * ((x > y) - (y > x));
        });
        this.data = parseData;
    }      
}

dataTableSortingLWC.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" fqn="dataTableSortingLWC">
    <apiVersion>46.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__AppPage</target>
        <target>lightning__RecordPage</target>
        <target>lightning__HomePage</target>
    </targets>
</LightningComponentBundle>

 

Sorting by Apex Call:

We also have another way of data sorting with Apex class.

1) Create Apex Class. 

LWCDataTableSortingExample:
public with sharing class LWCDataTableSortingExample {
    @AuraEnabled(Cacheable=true)
    public static List <Contact> getContacts(String field, String sortOrder) {
        String query;
        query  = 'SELECT Id, FirstName, LastName, Phone, Email FROM Contact';
        if(field != null && sortOrder !=null){
            query += ' ORDER BY '+field+' '+sortOrder;
        }
        return Database.query(query);
    }
}

2) Create Lightning web component.

dataTableSortingLWC.html
<template>
    <lightning-card title="Data Sorting by Apex" icon-name="standard:contact" >
        <br/>
        <div style="width: auto;">
            <template if:true={data}>
                <lightning-datatable data={data}
                                     columns={columns}
                                     key-field="id"
                                     sorted-by={sortBy}
                                     sorted-direction={sortDirection}
                                     onsort={doSorting}
                                     hide-checkbox-column="true"></lightning-datatable>
            </template>
        </div>
    </lightning-card>
</template>

dataTableSortingLWC.js
import {LightningElement, wire, track} from 'lwc';
import getContacts from '@salesforce/apex/LWCDataTableSortingExample.getContacts';

// datatable columns with row actions
const columns = [ { label: 'FirstName', fieldName: 'FirstName', sortable: "true"},
                  { label: 'LastName', fieldName: 'LastName', sortable: "true"},
                  { label: 'Phone', fieldName: 'Phone', type: 'phone', sortable: "true"},
                  { label: 'Email', fieldName: 'Email', type: 'email', sortable: "true" },];

export default class DataTableSortingLWC extends LightningElement {
    // reactive variable
    @track data;
    @track columns = columns;
    @track sortBy='FirstName'
    @track sortDirection='asc';
  
    // retrieving the data using wire service
    @wire(getContacts,{field : '$sortBy',sortOrder : '$sortDirection'})
    contacts(result) {
        if (result.data) {
            this.data = result.data;
            this.error = undefined;
        } else if (result.error) {
            this.error = result.error;
            this.data = undefined;
        }
    }

    doSorting(event) {
        // calling sortdata function to sort the data based on direction and selected field
        this.sortBy = event.detail.fieldName;
        this.sortDirection = event.detail.sortDirection;
        this.sortData(this.sortBy, this.sortDirection);
    }

    sortData(fieldname, direction) {
        let parseData = JSON.parse(JSON.stringify(this.data));
        // Return the value stored in the field
        let keyValue = (a) => {
            return a[fieldname];
        };
        // cheking reverse direction
        let isReverse = direction === 'asc' ? 1: -1;
        // sorting data
        parseData.sort((x, y) => {
            x = keyValue(x) ? keyValue(x) : ''; // handling null values
            y = keyValue(y) ? keyValue(y) : '';
            // sorting values based on direction
            return isReverse * ((x > y) - (y > x));
        });

        // set the sorted data to data table data
        this.data = parseData;
    }      
}


Please check below post on Lightning Web Components:-

Thanks
Amit Chaudhary

Saturday, 28 December 2019

Salesforce Admin Training | Become a Salesforce Administrator

We are glad that we did Free Salesforce Admin Training in 2019 at ApexHours. Good news is that we recorded all sessions and uploaded all Salesforce training videos on our YouTube Channel. We created this Training program for a Student and new System admin to becoming a Salesforce Administrator.
Salesforce Administrator

This Salesforce Administrator Training for Beginners covered the all below topics:-
  1. Introduction to Cloud Computing and Salesforce
  2. Modelling Data in Salesforce
  3. Customizing the User Interface
  4. Aggregating & Validating Salesforce Data
  5. Automating Business Processes - Part 1(Process Builder and Workflow)
  6. Automating Business Processes - Part 2 (Flow)
  7. Automating Business Processes - Part 3 (Approval process)
  8. Managing Data Access
  9. Who Sees What in Salesforce?
  10. Auditing & Troubleshooting Errors
  11. Data Management with Salesforce
  12. Making Sense of your Salesforce Data

Episode 1 – Introduction to Salesforce


In this episode we learned about what is Cloud computing and Introduction to Salesforce. In Episode 1, we covered the following topics :-
  1. Fundamentals of Cloud Computing
  2. Customer Relationship Management Basics
  3. Creating your first Salesforce org
  4. Salesforce Classic Vs Lightning Experience
  5. Q & A
Here is recording of "Introduction to Salesforce" episode recording.

Episode 2 – Model your Salesforce Data


In this episode we covered data model in Salesforce, Difference between Master-detail and Lookup fields. We also talk about depended picklist and schema builder. Here is agenda of session Episode 2.

  1. Conventional Database Tables Vs Objects
  2. Standard and Custom Objects
  3. Datatypes
  4. Relational Data Modelling
  5. Schema Builder
  6. Q & A
 Here is recording of "Salesforce Data Model" episode recording.

Episode 3 – Customize the Salesforce User Interface


In this episode we talk about customizing Salesforce user interface to improve user experience. After checking this recording you will learn how to create Application & Tab in Salesforce, What is record Types and App Builder. In Episode 3, we covered the following topics :-
  1. App Manager & Tabs
  2. Customizing Page Layouts using Record Types
  3. List Views & Related Lists
  4. Mini & Compact Page Layouts
  5. App Builder
  6. Q & A
 Here is recording of "Customize Salesforce User Interface" episode recording.

Episode 4 – Aggregating & Validating Data


Aggregating and validating data is fundamental for all Salesforce application. This episode talks about putting validations, Duplicate Rules within Salesforce to enforce data integrity and aggregating relational records. In Episode 4, We will cover the following topics :-
  1. Formula field
  2. Data Aggregation using Roll-up Summaries
  3. Validation Rules
  4. Duplicate Rules
  5. Q & A
 Here is recording of "Aggregating & Validating Data" episode recording.

Episode 5 – Automating Business Process with Workflow, Email Template and Process Builder.


In episode 5 we talks about the declarative tools available on Salesforce to automate business processes using workflow and process builder. In this episode we talk about what is the difference between Workflow and Process Builder. And when we should use Process Builder over the workflow. In Episode 5, we will cover the following topics :-
  1. What is a Business Process?
  2. Automating Processes using
    1. Workflow Rule
    2. Process Builder
    3. Email Templates
  3. Q & A

Here is recording of "Workflow, Email Template and Process Builder" episode recording.

Episode 6 – Automating Business Processes with Flow.


In this episode we talk about how to automate your business process with flow, Difference between Workflow Vs Process Builder Vs Lightning Flow, Know the Nomenclature between Lightning flow Vs Flow Builder Vs Flow Interview. In Episode 6, we will cover the following topics :-
  1. Declarative Tools for Business Process Automation
  2. Assignment Rules
  3. Flow Builder
  4. Q & A
Here is recording of "Basic of Lightning Flow and Assignment Rule in Salesforce" episode recording.


Episode 7 – Automating Business Processes with Approval Process.


In this episode we talk about how to setup the Approval process in Salesforce and what is delegated Approver in Salesforce. In Episode 7, we coverd the following topics :-
  1. Declarative Tools for Business Process Automation
  2. Approval Process
  3. Q & A
Here is recording of "Setup Approval process in Salesforce" episode recording.

Episode 8 – Managing Data Access in Salesforce


In this episode we talk about what is the difference between Profiles and role and Permission Sets. How to enforce field level security and User Management. In Episode 8, we covered the following topics :-
  1. Profiles & Permission Sets
  2. Enforcing Field Level Security
  3. User Management
  4. Q & A
Here is recording of "Difference between Profiles and Role and Permission Sets" episode recording.


Episode 9 – Who Sees What in Salesforce


In this session we talk about Organization Wide Defaults(OWD) in salesforce and Sharing Setting. Difference between Record Ownership and Record Sharing and Profile Vs Roles. In Episode 9, we will cover the following topics :-
  1. OWD & Sharing Settings
  2. Record Ownership
  3. Record Sharing
  4. Profiles Vs Roles
  5. Q & A
Here is recording of "OWD & Sharing Setting" episode recording.

Episode 10 – Audit & Troubleshoot Salesforce Data


In this session we talk about audit logs and field history Tracking include debug logs. In Episode 10, we will cover the following topics
  1. Audit Logs & Field History Tracking
  2. Debug Logs
  3. Email Logs
  4. Login History & IP Whitelisting
  5. Q & A
Here is recording of "Audit & Troubleshooting of Salesforce Data" episode recording.


Episode 11 – Data Management in Salesforce


In Episode 11, we will cover the following topics :-
  1. Data Loader
  2. Uploading Relational Data in Salesforce
  3. Best Practices for Data Management
  4. Q & A

Here is recording of "Data Loader & Import Wizard" episode recording.

Episode 12 – Reports & Dashboards.


This episode talks about the tools available to effectively report on the data within Salesforce to measure performance in Key Business Areas. In Episode 12, we will cover the following topics :-
  1. Report Types
  2. Standard & Custom Report Types
  3. Dashboards
  4. Share and Schedule Report/Dashboard
  5. Q & A
Here is recording of "Lightning Report and Dashboards" episode recording.









All the best for your Salesforce certifications.


We did 12+ sessions with our 5 speakers ( Jigar Shah, Amit Singh, Atul Rajguru and Purushottam Bhaigade , Jayesh) and we got 1300+ registration.

Thank you so much for all our Apex Hours Speaker to help all Student.

Here is some more useful playlist for New Salesforce Developer or Admin.
1) Setup Salesforce Community
2) Basic of Java Script.
3) Marketing Cloud.




Thanks,
Amit Chaudhary

Saturday, 14 December 2019

Introduction to Salesforce Marketing Cloud

In this post we will talk about what is Salesforce marketing cloud and how to get started with Marketing cloud email Studio. Salesforce Marketing Cloud is a provider of digital marketing automation and analytics software and services. Marketing cloud is the platform for delivering relevant, personalized journeys across channels and devices – enabling marketers to deliver the right messages to the right people via the right channel

Introduction to Salesforce Marketing Cloud

What is Marketing Cloud ?

  1. Marketing Cloud is comprised of a suite of studios and builders (Email Studio, Journey Builder, etc.).
  2. The platform lets you manage messaging through multiple channels: email, sms, ads, and push.
  3. Automation Studio and Journey Builder allow customers to automate their marketing programs to increase reach and efficiency.
  4. Tracking and reports provide analytics that allow customers to measure and improve their programs.
  5. The API and SFTP enable integration with any external system. Customers use these to integrate with web analytics, data warehouses, CRM systems, POS systems, custom apps, and more.



Product
Description
Audience Studio
Capture data from any source and device, then unify, segment, and activate audiences to create valuable customer experiences
Data Studio
Expand your reach with a data sharing platform where publishers can share 2nd party data with marketers in a trusted and transparent way
Google Analytics 360 Gain cross-channel insights for seamless customer journeys with Google Analytics 360 + Marketing Cloud.
Social Studio
Listen, publish, and engage to create customer advocates. Connect social to marketing, sales, and service in one platform powered by AI.
Journey Builder
Deliver cross-channel personalized experiences at every step of the customer lifecycle with campaign
Interaction Studio
Visualize, track, and manage customer experiences with real-time interaction management—driving valuable engagement at the right moment
Email Studio
Use data from every department to build smarter email—from basic marketing campaigns to sophisticated 1-to-1 messages
Mobile Studio
Send consistent SMS, push, and chat app messages in real-time
Advertising Studio
Use CRM to securely power 1-to-1 advertising across Google, Facebook, LinkedIn, Twitter, Pinterest, and Display at scale




Check this recording to learn about basic of Marketing Cloud. We did the session in ApexHours. The aim of this session was to conduct a basic introduction of the different studios and builders in Marketing Cloud and demonstrate a live walkthrough of setting up a campaign which will touch on data design and automation best practices.


Development Process




Marketing Cloud – Email Studio

Email Studio Create 1-to-1 customer journeys with personalized email marketing at scale. Email studio is great channel for reaching customers, email is better in conversions, Customers trust email It’s easy to track customer behavior —like which emails they open, which links they click, which offers they redeem, and on which devices. With Email Studio you can build great emails, segment and target your audience, and send with confidence—all without any coding. Share content development across channels: Easily tag, search, and share content across distribution channels—including email, social, and mobile using Content Builder—for content creation and management at scale.

Subscriber

A subscriber List is a Collection Of Subscribers Who Opted-in to receive email communication from marketing cloud. Subscriber automatically belong the standard all subscriber list, and additional subscriber list an be created to segment subscriber for targeted email communication.


Data Modeling & Segmentation

 

List

  1. Lists are the default method of storing subscriber data in the Email application.
  2. They require minimal configuration and setup.
  3. They are used for sending. You send to a list in your account.
  4. Lists use the standard profile and subscription centers.
  5. Email address and Subscriber Key attributes are required.
  6. Limited Field Types
  7. Less than 500,000 Subscribers

Data Extension

  1. A data extension is a flat file of data that you can relate to another data extension via AMPscript.
  2. All data extensions are custom tables. They provide a flexible data model, and they tend to run faster and handle larger loads of data.
  3. Data extensions can contain subscriber data, just like a list. If they contain data about subscribers and are marked as used for sending, they are called Sendable Data Extensions.
  4. Data extensions can also contain other data, like purchases, web analytics, and even URLs to images that you want to display. These are called Non-Sendable Data Extensions.
  5. More than 500,000 Subscribers
  6. Complex Relationships
  7. Triggered Sends
  8. SOAP and REST APIs
  9. More Field Types

 

Tracking

Tracking is a result of your email send. Within tracking, you can view critical elements, such as email opens, clicks, and other metrics online.

 

Send Flow

  1. Properties: Email, Subject Line, Send Classification, etc.
  2. Audience: Target, Exclusion, Suppression, etc.
  3. Delivery: Schedule, Send Throttling, Advanced Properties
  4. Review: Check and correct errors before sending
  5. Increase Confidence: See what you’re sending and reduce errors.

 

A/B Testing

  1. Simple tool used to optimize email campaigns.
  2. Used to market test two versions of an email to two audiences.
  3. Automatically splits audience, calculates winner, and can send winner to remainder.
  4. Uses the email's engagement data to automatically determine and distribute the winning email.
  5. Perform A/B Testing on:
  6. Subject Lines, Emails, Content Areas, From Names, Send Dates and Times, Preheaders

Please check this apex hours session to learn about marketing cloud email studio.



Please share your feedback if you like this post.

Thanks,
Amit Chaudhary