Getting Started with Salesforce DX

What is Salesforce DX?
Salesforce DX is a way to shift your development lifecycle and to manage your source of truth. But don't consider Salesforce DX is going to do any magic, as a developer/release manager/lead you need to come up with your own strategy to manage your releases, other challenges like code conflict, urgent fix etc.

Why we need Salesforce DX?
I think the best way to answer this is with some real time scenarios.

Recently I was working with one of my customer who was having multiple sandboxes like DEV, SIT, QAT, UAT. A typical scenario. Now every time there was any kind of production issues, development team tried to find out the root cause and also tried to find out if the issue was due to some of the recent releases. But since all sandboxes were having the same code as Production, there was no way to find out previous code base. So in this situation normally developer request for a new sandbox with production code and fix the issue. This type of development is known as "Org Based Development".

But consider if the code was present in some source control repository then developer can easily get the previous code base, compare code between recent releases (basically comparing between master and branches). But does that really solve our problem? Somehow, but not fully. So basically we need to create an org from code present in source control repository(specifically from branches). Salesforce DX will provide us this option. This type of development is known as "Source Based Development".

Salesforce DX introduces a new type of org known as "Scratch Org" which can be created from source control repository.

What are Scratch Orgs?
Salesforce DX can be enabled for any Salesforce instance. They are known as Developer Hub. Winter'19 will provide us the option of enabling Salesforce DX even in developer org. From Developer Hub, we can create multiple scratch orgs. Scratch orgs are basically temporary org which can be created from source control repos and can be used to build some functionalities, perform proof of concept, test and finally create packages. Once done, developer can deploy the package into sandbox, push the code into repos and finally delete the scratch org.

Install Salesforce DX
Install Heroku CLI and then run the below command to install Salesforce CLI
heroku plugins:install salesforcedx

We need one repository to work with Salesforce DX. We will work with the this repository. So let's start by cloning the repository.
git clone https://github.com/forcedotcom/sfdx-simple
cd sfdx-simple/
You will see the code is being checkout in your local machine with below folder structure

Authorize Salesforce DX to login into Developer Hub
Execute the below command which will authorize Salesforce DX to login into Developer Hub. -d will make this as  the default org and -a will set Sudipta as the alias for this org. Setting alias is really helpful to execute the command without typing the username every time.
sfdx force:auth:web:login -d -a Sudipta
Now if you execute the below command, you will be able to see the list of orgs authorized with Salesforce DX
sfdx force:org:list
Here is the result. See the alias in set as Sudipta. D indicates this is my default org and status is Connected.

Let's create Scratch Org
The important file to create scratch project-scratch-def.json file. It will be stored inside the config folder. This is the place where you will put the configuration of your scratch org. Here is the documentation which lists all the scratch org definition configuration values. In Winter'19, you can specify scratch org settings or org preferences in this file , but not both. Since Salesforce is going to deprecate support for org preferences in this file from Spring'19, it is recommended to convert org preferences to scratch org settings. How to convert is documented here.

Below command is going to create the scratch org. -d specifies with configuration file, -a sets the alias as FirstScratchOrg and -s is making this is as the default scratch org
sfdx force:org:create -f config/project-scratch-def.json -a FirstScratchOrg -s
You will be given below information

Now running the command will display DevHub and newly create scratch org as -

Open the Scratch Org
Below command will open the scratch org in browser. See the beauty of alias as you don't need to remember the username and password to login to your scratch org.
sfdx force:org:open -u FirstScratchOrg

Push code into Scratch Org
To push code into scratch org, you need to configure sfdx-project.json file. This is the file where you will define Namespace, Package Directories, API Version etc. Once defined, the below command will push the code from your local  machine to scratch org
sfdx force:source:push -u FirstScratchOrg
You will find the confirmation message like -

Find out the differences between Scratch Org and Local
Below command will show the differences between your scratch org and Local
sfdx force:source:status -u FirstScratchOrg
Now I have created one custom field in Account object, updated FLS in few profiles, added the field in page layouts. I also have made some changes in DemoController.cls in my local machine. So the above command will give me the below result. Important column is STATE which will indicate where the changes happened.

Pull Changes from Scratch Org:
Below command will pull changes from your scratch org
sfdx force:source:pull -u FirstScratchOrg
Here is the outcome -

Running Test Classes
Execute the below command to run test classes in your scratch org. This will provide the job id which you can use to fetch the report of your test execution

sfdx force:apex:test:run -u FirstScratchOrg
Here is the screenshot from my scratch org -

Generate Password for Scratch Org
Below command will generate the password for your scratch org.
sfdx force:user:password:generate -u FirstScratchOrg
You will  get a message -
Successfully set the password "P7(pD|ca57" for user test-imv1gedrvlxi@example.com.

In future if you want to know the password, execute the below command -

sfdx force:org:display -u FirstScratchOrg
It will provide many informations including password -

Deleting Scratch Org:
Once you are done with scratch org, you can delete the same with below command -
sfdx force:auth:logout -u FirstScratchOrg
Here is the message -


Getting Started with Financial Services Cloud

One of the biggest advantages of being a consultant is that you will be able to play with new technologies/functionalities because each customer comes up with their unique requirements. This is how I was introduced to Salesforce's Financial Services Cloud (also known as FSC) recently. Today I am going to explain basics of FSC and how you can start exploring it.

Salesforce's Financial Services Cloud is basically having the similar concept of Non-Profit starter pack. It will be a combination of managed and unmanaged packages installed to your org. Focus here is to support Financial Services sector. FSC is only available in Lightning Experience.

The heart of FSC is the managed package - "Financial Services Cloud". Along with this, you will get two more unmanaged packages - "Financial Services Ext" and "Financial Services Referral Ext". There is another very important managed package which will be kind of differentiator and that is none other than "Financial Services Cloud - Einstein Analytics". Note - This is true as of today (Winter 18 release).

FSC will allow companies like wealth management, investment firms, banks, asset managements and other financial institutions to manage their customers, along with their assets, liabilities, financial accounts, and much more. With this high level description why FSC, let's dig into more unique terminologies now.

Let's start with Financial Services Cloud's building blocks - Clients and Relationship Groups/Households.

Clients - A client is anyone doing business with the advisor in the past, present or future. Clients include prospects, active or inactive clients, spouses, partners, and dependents. FSC implements clients in two different ways Individual or Person accounts. Don't worry, I am going to explain the differences between them very soon.

Relationship Groups/Households - A household represents a groups of clients and businesses whose financials are summarized at the group level. In FSC, each client or entity's role(s) within that household is tracked. With that financial for each client or entity who are part of the same household can be rolled up to the group level for an aggregate view.

Now Financial Services Cloud's data model is basically having two versions based on your org's requirement of managing individual accounts or person accounts.

Individual Model - This model uses the combination of standard Account and Contact object to represent a unified view of the customer.
In this model you should use Individual record type if the client is person, otherwise use Institutional record type when the client is business of institute.

Person Account Model - This model uses standard Account object to hold all the information about a person. 
In this model you should use Person record type if the client is person, otherwise use Institutional record type when the client is business of institute.

Now let me explain a little further. Below are the type of the accounts FSC represents -
Individual - This represents a person client. For example, if you are client of a financial planner or advisor or customer of a bank, then you are represented as Individual account.
Institution - This account record type represents business client. For example your employer.
Household - This record type is used to group multiple individual accounts under one roof. This is used to roll up their aggregated financial information at the group level. Consider this as your household where you have you, your wife, children all are individual accounts.
Business - This is the standard salesforce account record type.

Financial Accounts tab under Individual or Institution record will show all the assets, accounts owned by the client.

Financial Summary at the beginning of the page will show roll up data of all the information in the Financial Account related list. It provides a quick overview of the client's financial picture.

In Financial Industry, relationship is the key. It is very important to track every type of relationship between clients, non-clients. The Relationship tab will help advisors to understand how the clients and non-clients are related to each other.

As you see from the above picture, Rachel Adams is part of Adams Household as the Primary Member. Nigel Adams (Spouse) and Adams Charitable Trust (Trustee) is also part of the same household. At the same time Ivan M Kohl is also related to Adams Household as their lawyer.

There is rollup section below which is a snapshot of the household members and their relevant informations. So in a single snapshot, I can see relevant contact details, their last and next interaction.
That's a lot of backend processing. Thinking of how to do that. You know it's very easy. Clicking on +Add Relationship button will bring the below page where you can configure what to add, configure them as primary member/primary group, their role in this relationship, values to be considered during roll up etc.

We all have our financial goals. In Financial industry it is very important that advisors help their customers to reach their goals.  FSC will allow advisors to track client's progress towards their goals. Here a typical goal looks like -

As FSC adds some extra complexity to the data model, so it is very important to understand the data model first before start migrating data into Salesforce FSC. Like for Individual records, one should create either Account or Contact record, but not both, otherwise it will create duplicate records.

Trailhead should be the first stop for you. Below are the Trailhead modules you should explore -


Kitchener Developer Group: Everything you need to know about Einstein Bots by Shruti Sridharan

Special thanks to our speaker, Shruti Sridharan, for sharing her knowledge on Einstein Bots. 
Here comes the presentation and recording.



Kitchener Developer Group Event: Building Lightning Apps by Daniel Peter

Thank you to our guest speaker, Daniel Peter, Salesforce MVP, for his presentation on Building Lightning Apps. Here comes the presentation and recording.




Switch Statement in Apex - Long Pending Must To Have Feature

Finally we have Switch statement in Apex. Like me, I am very much sure there are many developers who were waiting for this feature. Salesforce introduced Switch statement in Winter'18 release.

In this post I am going to share few important stuffs that developer should keep in mind while using Switch.

Let me start with a very basic example.

In the above code I am using Switch statement. But did you notice that Switch statement in Apex is little different than traditional Switch statement in Java or C programming language?

No Case Statement: We don't have case statement in Apex programming language. Reason behind is that Case is a sObject in Apex. That is why Salesforce is having when keyword.

No Break: In Apex, we don't have break statement like we used to have in C programming language. The reason is that in Apex, there is no fall-through. It means unlike C, the first executed branch will block any following branch in Switch statement. For example, if you execute the above code with parameter 'India', it will only print I am in India. It will not execute other System.Debug statements.

sObject support: Apart from standard String, Integer, Long support, Switch statement in Apex can support sObject as well. To illustrate that, consider the below use case -

When a Task is getting created, it can be associated with many sObjects like Account or Case. So based on the sObject with which the task is associated, let's print different statements.

Here is the trigger handler class using Switch statement -

I hope this short post will help you to understand how Switch statement works in Apex.

Kitchener User Group & Salesforce ApexHour Event: How Salesforce Query Optimizer works for LDV

Thanks to guest presenter @Jitendra Zaa (Technical Architect & MVP at BLUEWOLF, an IBM Company)  for his presentation on How Salesforce Query Optimizer works for Large Data Volume! on Kitchener User Group. If you missed this, make sure you watch the recording!

Recording:  https://youtu.be/FtfZV5uf9fg

Link to the Slides:  https://www.slideshare.net/AmitChaudhary112/salesforce-apex-hours-how-lightning-platform-query-optimizer-works-for-ldv

How to Prepare For and Clear Data Architecture and Management Designer Exam

I have cleared my first Salesforce Architect certification - "Data Architecture and Management Designer" on June 1st, 2018. I was dreaming about this certification for quite a long time and finally I am so happy that I am able to clear this one. Here today I am going to share few key tips with you which might help you while you are doing your preparation.

My Strategy:
Important Topics:
I am writing down the important topics which you need to concentrate for sure. Those who already read the study guide, you should already knew this by now. 
  • Large Data Volume: This certification is all about large data, so you will get many questions regarding how you will plan data load, extract when dealing with large data. You need to understand the reason of slowness in your query, report, listview etc. The document which you need to digest from top to bottom is this one. Understand the key concepts -
    • Ownership Skew - Many records with same owner.
    • Lookup Skew - Many child records linked with same parent record. Example: More than 10,000 contacts under the same account.
    • Sharing Recalculation - Understand the different scenarios when sharing recalculation will happen.
    • Implicit Sharig - Understand different implicit sharing options.
    • Upsert ? Update ? Insert ? - Which one to select and why?
    • Selective and Non-Selective Queries - Understand the different way to do query optimization
    • PK Chunking 
  • Skinny Tables: You need to read this document.
    • Understand what is Skinny Table and how to enable it.
    • Type of fields which can be part pf Skinny Table.
    • Understand the limitations like 
      • What will happen when you add/delete any field which is part of skinny table.
      • Which sandbox?
  • Bulk API: This is also a very important topic. Understand the below points -
    • How Bulk Query Works? Gemma prepared a really good flow diagram here.
    • What happens when Bulk API encounters locks? Again thanks to Gemma for such a great diagram here.
  • Query Optimizer: You need to understand how to improve the query performance, what is query plan tool and how it can help you to improve the query, what are the indexes Salesforce will create for you and what are the indexes you can create to improve the performance.
  • Duplicate Management: Complete this Trailhead module.
  • Data.com: Understand how Clean can help you in cleaning the data.
  • Different ETL Tools: This is one of the toughest section in the exam. You need to understand -
    • How to manage architecture between legacy CRM, Salesforce and ERP Applications.
    • How to decide your MDM strategy.
    • While integration Salesforce with Non-Salesforce applications -
      • What type of relationships you will build (Master-Details, Lookup, External Object etc.)?
      • Which data you will bring to Salesforce?
      • Which data you will not bring to Salesforce, but just refer using External Object?
    • Read the document - Data management key concepts.
  • Data Quality and Governance: Read this one and understand 6 steps towards data quality. Read this document as well. There is another good document, you should read - 10 steps to data quality and trusted information.
Good luck my friends. If you have any questions/suggestions/feedback, please let me know.


Implicit Sharing in Salesforce

In Lightning Platform, Salesforce provides multiple options to administrators so that they can grant data access to different users, groups, teams. But there is something which is implemented and maintained by Salesforce which will also give relational data access to users based on their's access to other records. In Lightning Platform, it is known as Implicit Sharing. Administrator cannot change the way implicit sharing works. So it is very important to understand the different types of implicit sharing we have in the platform.

In this blog post, I am going to explain different types of Implicit Sharing and how it works.
To understand, let's first consider the Account and Contact object. These two objects are linked with each other. So let's say the Organization Wide Default for both Account and Contact are mentioned as Private, i.e. the record owner can see the records they created or owned.

With the above assumptions, here are the different Implicit Sharing we have -

  • Parent Implicit Sharing: This sharing provides read only access to parent record if the user is having access to the child record. Example - Refer the picture below. Here Bob is getting read-only access to Account because he is having access to the Contact (bcoz: Jimmy manually shared the contact with Bob). The level of Account access Bob will get is Read-Only and it is because of Parent Implicit Sharing.
  • Child Implicit Sharing: This sharing provides Read/Write access to child record if the user is the owner of the parent record. Example - Refer the picture below. Here Jimmy is getting read-write access to Contact because he is the owner of the Account record. The level of Contact access Jimmy will get is Read/Write and it is because of Child Implicit Sharing.
  • Portal Implicit Sharing: This sharing will provide Read-Only access to portal account and all associated portal user's contact record using portal role sharing. Example - Refer the picture below. Here both Ryan and Jimmy are getting Read-Only access to Account because they are portal contacts. This is happening because of Portal Implicit Sharing. But contact Bob is not having any access to Account since he is not enabled as Portal user yet.
  • High Volume Portal Implicit Sharing: In this Implicit sharing any record owned by high volume portal users will be shared with other high volume users who are part of Sharing set.
  • High Volume Parent Implicit Sharing: In this implicit sharing, read only access will be given to parent account of records shared through a sharing set to other user members.
I would recommend going through the below documents to understand how the sharing and record level access is maintained within Salesforce.

Continuation in Salesforce - Asynchronous Callout option for long running requests

While implementing features, we need to write code to call external web services to fetch or update information. But calling external web service doesn't mean we should wait for the response from the web service. That is a bad design. We should always write code in such a way so that we can call external web service and still continue to do other work and when the response is available from the web service, we will update the page with response. This way of calling web service is known as Asynchronous callout.

Since in Salesforce, we are living in a multi-tenant architecture, so calling external services synchronously can create issues if the response is taking too much of time to come due to network latency or complex calculation or long running requests. There can be n number of reasons why the response is taking longer time. To make sure System resources are available to all customers, Salesforce introduces limitation on how much synchronous callout you can do from a single organization. Limit is each org can make a maximum of 10 synchronous requests running for more than 5 seconds. When the limit is reached, any subsequent request will fail until and unless an existing request completes successfully.

Apex continuation is an architectural design which will allow to call long running external web services in a scalable fashion without blocking any server threads and also avoiding Apex concurrency limit. With Apex continuation, you can make asynchronous external web service callout and then continue working on other activities. When the response is available, callback method will take care of that and take actions like - updating some values in object, rendering a section of the visual force page to display the result.

Below code snippet will demonstrate how you can use Continuation object for making Asynchronous callout.

I will be using two external web services for this demo. So you need to add them in your developer org's Remote Site settings.
Visualforce Page: click here

Apex Controller: click here

Here is the demo - click here

You can learn more about Apex continuation below -

Query Plan Tool from Salesforce - A Hidden Gem

Query Plan in the developer console can help to speed up SOQL queries done over large volumes of data. This is such a powerful tool when dealing with bad performance. Developer can use this tool to optimize and speed up SOQL queries.

We can enable Query Plan in the Developer Console by -

Before we go into details, it's better to understand how Salesforce uses indexes while running the SOQL. As we all know it is always good to go for selective query instead of full table scan. But even with selective query, when we are using different filter criteria, it is not always the best SOQL query we are writing. The reason behind is that just writing where clause in the query does not guarantee that the filter is selective. So it is very important to understand which are the fields are good to be used in filter. Let's understand that first in the below section -
  • All we need to use is the indexes in the filter.
  • If we are using filter on standard fields, then we are using index if -
    • it is primary key (Id, Name, OwnerId)
    • it is a foreign key (CreatedById, LastModifiedById, Lookup, Master-Detail)
    • it is an audit field (CreatedDate, SystemModstamp).
  • If we are using filter on custom fields, then we are using index if that field is marked as Unique or External Id.
Without indexed filter, the query will not be considered for optimization. 

So does that mean if I use filter which is indexed, I am safe and my query is optimized? Answer is Yes and No.

Why Yes, because definitely using indexed field in filter clause will make the query optimized, but there is a catch which I am going to explain now -

When SOQL query is using indexed field, Salesforce will determine how many records it would return. For example -

  • For a Standard index, the threshold is 30% of the first million targeted record and 15% of all records after that first million. In addition to that, selective threshold for a standard index maxes out at 1 million (which is only possible if the total number of records is 5.6 million).
  • For a Custom index, the threshold is 10% of the first million targeted record and 5% of all records after that first million. In addition to that, selective threshold for a standard index maxes out at 333,333 (which is only possible if the total number of records is 5.6 million).
So if the filter exceeds the threshold, then query will not be considered for optimization.

Query Plan will provide us the below information about the SOQL query -

Now with the above information, let's execute few queries and analyze the result -

Query 1: Select count() from Contact

Here I am not using any index field, Field column is blank, Operation Type is TableScan and cost is > 1. Anytime the cost of a SOQL query is greater than 1, it means it is not considered for Optimization.

Query 2: Select count() from Contact Where External_Id__c = '0xP1500100KXFU4512'

Here I am using custom index field (External_ID__c) which is there in the Field column, Operation Type is Index and cost is < 1. Since we have one cost which is less than 1, that will be used to optimized the query.

Query 3: Select count() from Contact Where External_Id__c != '0xP1500100KXFU4512'

Here I am using custom index field (External_ID__c) but still the field column in blank and Operation Type is TableScan and cost is > 1. So definitely this query is not optimized. But Why??
The reason is -
There are few unsupported operations which will make your query not good enough for optimization. They are as mentioned below -

Query 4: Select count() from Contact Where External_Id__c = '0xP1500100KXFU4512' and Contact_Type__c = 'Customer'

Here I have used second indexed field(Contact_Type__c) in the query. In this scenario, Salesforce will select the plan with lowest cost.

Query 5: Select count() from Contact Where External_Id__c = '0xP1500100KXFU4512' And Client_Status__c = 'Active'

Here I have used second non-indexed field(Client_Status__c) in the query. That is why only one indexed field in the result.

Query 6: Select count() from Contact Where External_Id__c = '0xP1500100KXFU4512' Or Client_Status__c = 'Active'

Here I have used second non-indexed field(Client_Status__c) in the query with or condition.When using OR condition, all filters must be indexed and under the 10% threshold.

Query 7: Select count() from Contact Where Contact_Type__c = 'Customer'

Here even though I have used indexed field(contact_type__c), but still the query is not optimized as you can see the lowest cost is also greater than 1. The reason is that here the finding variable 'Customer' is resulting more than 10% of the full table.

Query 8: Select count() from Contact Where Contact_Type__c = 'Advisor'

Here I have changed the binding variable to 'Advisor' and resulting data count is less than 10% of the full table. That is why this query is optimized.

You can go through the below articles to go through more examples -


LastModifiedDate Vs SystemModStamp

In Salesforce, when we create or update a record, there are so many things happen in the background. In this post, I am going to share my knowledge regarding two important fields present in each Salesforce record. I will start with a basic explanation regarding these fields and then at the end, I will explain how these fields are going to impact your query performance.

Let's start with basic explanation -


This is a standard field present in each Salesforce record. This field will be updated with current timestamp when the record is created or edited by Salesforce user. This field also has a very unique feature i.e. this field can be imported with some previous date. Let's say you want to load data from your old legacy system, but you want to preserve the dates from your legacy system. In this situation, you can load the records from your legacy system into Salesforce by updating the LastModifiedDate field with the previous date.


This is a read-only field. This field will be updated with current timestamp when the record is updated by the user. But the important difference is that this field will also be updated when the record is updated by Automated System Process. So in mathematical term -
LastModifiedDate <= SystemModStamp    This is possible.
LastModifiedDate > SystemModStamp      This is not possible.

How LastModifiedDate and SystemModStamp affect SOQL performance:

LastModifiedDate field is not indexed, but SystemModStamp field is indexed. So when SOQL query uses LastModifiedDate field in the where clause, Salesforce's Query Optimizer will internally use SystemModStamp to improve the performance. But when LastModifiedDate is used to determine the upper boundary of a date range, then Salesforce's Query Optimizer will not be able to use SystemModStamp. Confused???
Let's understand the concept with below examples -

Consider one account record - ABC Technologies
Record created by user on Jan 31st, 2018 LastModifiedDate: Jan 31st, 2018
SystemModStamp: Jan 31st, 2018
Record updated by Automated Process on Feb 2nd, 2018 LastModifiedDate: Jan 31st, 2018
SystemModStamp: Feb 2nd, 2018

Query: Select Id From Account Where LastModifiedDate > 2018-01-30T00:00:00Z
Can Salesforce's Query Optimizer replace LastModifiedDate with SystemModStamp? Answer is YES
Salesforce's Query Optimizer will change the query to -
Select Id From Account Where SystemModStamp > 2018-01-30T00:00:00Z to improve the performance and definitely we will get out ABC Technologies back from the SOQL.

Now consider another situation where the query is:
Select Id From Account Where LastModifiedDate < 2018-02-01T00:00:00Z.
Can Salesforce's Query Optimizer replace LastModifiedDate with SystemModStamp? Answer is NO
With original query (Select Id From Account Where LastModifiedDate < 2018-02-01T00:00:00Z) we are expecting ABC Technologies will come out, but if Salesforce's Query Optimizer replaces LastModifiedDate with SystemModStamp, then the query will become Select Id From Account Where SystemModStamp < 2018-02-01T00:00:00Z. So definitely with this query, we will not get our ABC Technologies back.

That is why Salesforce's Query Optimizer will not be able to use SystemModStamp instead of LastModifiedDate when LastModifiedDate is used to determine with the upper boundary of a date range, otherwise, the records in between these two dates(SystemModStamp and LastModifiedDate) will be missed from the query result.


Setup Service Cloud Lightning Snap-Ins with Omni Channel - Basic Steps

When it comes to CRM Customer Engagement, as per Gartner's Magic Quadrant for the CRM Customer Engagement Center, Salesforce is the in the "Leaders" section. Gartner estimates that 20% of Salesforce's new revenue came from Service Cloud in 2016 and it expects to exceed $2 billion in 2017. Reference: Gartner.

Service always tries to bring new features, innovations to market and the goal is always to increase customer satisfaction. In order to serve the customer better, Salesforce introduces a new feature called - Service Cloud Lightning Snap-In. Service Cloud Lightning Snap-ins are a fundamentally new way to deliver a service experience for today's connected customers. 

In this post, I will explain how to configure Lightning Snap-Ins with Omni Channel and receive chat request. So I know you guys are really excited to know this new feature. So without any further detail, let's get into the main topic. I am going to mention the steps below. If there is any pre-requisite, I will mention the same.

Step 1: Pre-Requisite: Live Agent and Omni Channel is enabled.
You need to make sure Live Agent and Omni Channel is enabled. There should be user present in your org with Live Agent checkbox checked. Omni Channel should be added to your console app.

Step 2: Create Queue for Live Chat Transcript

Step 3: Create Omni-Presence

Step 4: Create Live Chat Button

Step 5: Create Live Agent Deployment

Step 6: Create Force.com Site. 
You can refer Salesforce help link for creating Force.com Site. Link: https://help.salesforce.com/articleView?id=sites_overview.htm&type=5
Step 7: Enable Lightning in your org
Link: https://help.salesforce.com/articleView?id=lex_enable_turn_on.htm&type=5
Step 8: Add your website to CORS Whitelist
You should add the website domain to CORS Whitelist. This website is the one where you will include your snap-ins code. 
Link: https://help.salesforce.com/articleView?id=snapins_chat_cors_whitelist.htm&type=5
Step 9: Create Snap-Ins Deployment
In order to do this step, we need to move into Lightning Experience and then from setup, search for Snap-Ins. Click on "New Deployment". Give Deployment name and select the site you created @ step 6. Here is the screenshot -

Step 10: Configure Snap-ins Deployment
In this step, click on Start next to Live Agent Basic Settings. Select the Live Chat Button and Live Agent Deployment you created @ Step #4 & 5.

Step 11: Get the code and put it in HTML page

Step 12: Open the HTML page in your browser and you will see that Chat Button is available.

Step 13: Here is the animated video chat conversation from Lightning Snap-Ins

In my next post, I will explain the customization options available with Snap-Ins.



Follow Me

Enter your email address:

Delivered by FeedBurner


Salesforce (105) Apex (47) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) lightning (15) SOAP (13) javascript (13) tutorial (11) Certification. (10) Kitchener Developer Group (8) Certification (7) Trigger (7) security (7) test class (7) unit testing (7) Advanced Admin (6) Advanced Apex (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) service cloud (6) trailhead (6) Lightning Experience (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) use case (5) JSON (4) Kitchener User Group (4) Lightning Web Component (4) Sales Cloud (4) Salesforce DX (4) Tips (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) event (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Architect (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) Salesforce Certification (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Web Technology (3) automation tool (3) dynamic apex (3) license (3) map (3) mapbox (3) release (3) singleton (3) version controlling (3) visual studio code (3) Asynchronous callout (2) Aura Framework (2) Bulkify (2) Community (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) Lightning Design System (2) Lightning Feature (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) Virtual Event (2) ant (2) basic (2) chatter (2) coding (2) communication (2) configuration (2) console (2) controller (2) documentation (2) dreamforce (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Activity Timeline (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) AppExchange (1) Arrow (1) Article (1) Asynchronous Apex (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Compare (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) CumulusCI (1) Custom Metadata (1) Custom Object (1) Custom Permission (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Development (1) Diwali (1) EDA (1) ESLint (1) Education Cloud (1) Email (1) FSC (1) Function (1) Future (1) Global Gathering (1) Goals (1) Guest Access (1) Guest Profile (1) Guest User Sharing Rule (1) Guide (1) HEDA (1) Higher Education (1) Household (1) Husky (1) IDE (1) Ideas (1) Improvement (1) KPIs (1) Knowledge Management (1) LWC (1) Large Data Volume (1) LastModifiedDate (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Permission Set (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Prettier (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) Queueable (1) QuickReference (1) Related records (1) Reports (1) Retrieve (1) Role Hierarchy (1) SAL (1) SFDX (1) Salesfor (1) Salesforce Advisor Link (1) Salesforce Labs (1) Salesforce Optimizer (1) SalesforceDx (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Spring 20 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) Timeline (1) Unauthorized Access (1) User License (1) Users (1) VS Code (1) Validation Rule (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) code (1) code coverage (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) duplicate (1) dynamic (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) sub-tab (1) tab (1) username (1) visual workflow (1) workflow (1)

Popular Posts

Total Subscribers

Total Pageviews

Contact Me


Email *

Message *