Dreamforce 2019 Global Gathering

Yesterday we had the event - Dreamforce Global Gathering - a joint event between Kitchener Developer Group and Mississauga Developer Group.

We discussed about new announcements from Dreamforce 2019, had great participations from audience and networking. Ohh Yesh!!! There were swags & certification vouchers as well.

Here are few pictures and the slide deck.

Dreamforce Global Gathering from Sudipta Deb ☁

Register below to get notifications about our future events -

Kitchener Developer Group
Mississauga Developer Group

Tips for passing Salesforce Certified Education Cloud Consultant

I have successfully passed Salesforce Certified Education Cloud Consultant exam on 19th January 2020. Here are few tips to pass the exam.

Exam Outline

  • Content: 60 multiple-choice/multiple-select questions 
  • Time allotted to complete the exam: 90 minutes 
  • Passing Score: 68%  
  • Registration fee: USD 200, plus applicable taxes as required per local law 
  • Retake fee: USD 100, plus applicable taxes as required per local law 
  • Delivery options: Proctored exam delivered onsite at a testing center or in an online proctored environment. 
  • Prerequisite(s)Salesforce Certified Administrator credential

  • I have faced 60 questions and most of the questions are about Education domain knowledge, configuring HEDA and SAL, use case oriented questions.


    Core SAL Data Model

    Topics Received on Exam

    • Questions regarding to Administrative and Household Account Model
    • Sequence of data load into Education Cloud instance.
    • Consideration of installing education cloud when person account is enabled.
    • Frequency of updates for education cloud managed package.
    • TDTM Framework
      • Importance of user managed and namespace field.
      • Best practices to include own trigger in TDTM Framework 
    • Ways to handle former names in EDA
    • Automation around addresses with Administrative and Household Account Model
    • Use case to choose best product (Pardot vs. Marketing Cloud). Understanding the basic features and their differences is important for this one.
    • Open Source solutions around HEDA
    • Consideration when loading bulk data 
      • Data Skew
      • Ownership Skew
    • Questions on creating reports
      • Understanding of data model and their relationship is important
      • Once you have the relationship in mind, it will be easier for you to decide whether to create a new report type or use the existing one. 
    • Community Cloud Implementation strategies
      • Sharing consideration
      • License Type
    • Use case to choose the correct API strategy -
      • REST
      • SOAP
      • Streaming
      • Salesforce Connect
    • Roles and Responsibilities of CoE (Center of Excellence)
    • Comparison between different sandbox types

    Hope this will help you to clear the certification. Best of luck.


    New AppExchange Component || Activity Timeline || View related records in a whole new way

    Salesforce Labs published a new Lightning Web Component named "Timeline". It will display the related records in a totally different way i.e. in a timeline fashion.

    I installed this in my developer org and this post is about how to configure this component.

    Pre-requisite: Enhanced Email should be enabled in the org.

    Here are the steps:

    Permission Set 

    Assign the permission set "Timeline User" to the users.

    Update Timeline Configurations Page Layout

    Open the Timeline Configuration Page Layout and in the related list - Timeline Child Objects, include the New button.

    Create Timeline Configuration record

    Let's say we want to include this component in Account record page. So we will first create the Time Configuration record like below -

    Create Timeline Child records

    Let's say we want to display Contact and Opportunities in Activity Timeline. So we will create two Timeline Child records like below -

    Note - Here is the quip document explaining the field details. Link

    Include the component - Activity Timeline in Account record page 

    Here comes the new view of the related record

    Observation(as of today): Fields are not getting displayed properly while expanding the individual items in the Activity Timeline. I informed Salesforce Labs Team about the issue. Will update this post based on the response.

    Overall this is a very cool component published by Salesforce Labs and I am quite sure this will provide great addition to any implementation.


    Things to remember before giving community access to guest users

    When we build the Salesforce Communities, sometimes based on the customer requirements, we need to provide guest access to the communities. Guest access in basically the unauthorized access to the community. As you can easily understand, any unauthorized access is always a very dangerous things to implement. So we need to make sure our security configuration is strong enough that no internal data is getting exposed to the outside world i.e. unauthorized users. And if situation demands, only the required information(as minimum as possible) will be exposed.

    I am going to write down what are the details we should keep in mind while configuring guest access to the communities. To start, let's revisit some basic stuffs first.

    For each communities we build in Salesforce, there will be a guest profile created for us automatically. It doesn't matter, whether we allow guest access or not, the guest profile will be created for us always.

    All guest users i.e. unauthorized users will use this profile to access the community. If we create 5 communities, then there will be 5 guest profiles created. Name of the profile will be Profile. 

    Starting Spring'20 Salesforce release, the settings "Secure guest user record access" will be enabled by default. Salesforce recommends using this settings to provide user record access to the guest users through communities. But there are few important things we should keep in mind -
    • OWD will be private for all objects and we can't modify this one.
    • Guest users are not allowed to be added in any queues or groups.
    • Manually sharing records will guest users are not allowed.
    • Guest users can only be given Read Only access though guest user sharing rule.
    So now let's jump into our fictitious Use Case.
    The Great University wants to engage their students by allowing them to provide feedback and ideas so that they can keep on improving their infrastructure, course contents, communications etc. They want students, alumni, parents, teachers to provide their feedbacks without disclosing their names. And to this they don't need to create any user accounts. University also wants that all feedbacks should be visible to others as long as they are not implemented, rejected or duplicated.
    Highlighting few sections to put more focus on these parts of the use case.

    We will create a custom object called Feedback to store the feedbacks. We will also create the Salesforce community and enable guest access there. Expose the Feedback list view in the community.

    Will configure guest profile in such a way that guest users can create new feedbacks and also can see all the open feedbacks. Since we want all the feedbacks to be total anonymous, we will assign all the feedbacks created by guest users to internal default user.

    Let's first create the custom object - Feedback, relevant fields, and list views.

    Now let's create the community called - Let's Build Better Tomorrow. Below is the authenticated user's view of the community. List view from the custom object - Feedback is added in the community.

    Now let's enable the guest access for the community. We can do that by -
    • Settings -> All Communities.
    • Click Builder against the newly created community
    • Click Settings -> General
    • Check the box - "Public can access the community"
    Once done, if we try to access the community url from Chrome Incognito mode(or from some new browser), we will get this below view (this is guest profile's view)-
    As we can see that Feedback's list view is not appearing. Because guest profile is not having enough permission to this custom object. Now we need to configure the guest profile and provide Read and Create access to the custom object - Feedback. 

    To do that, let's follow the below steps -
    • Settings -> All Communities.
    • Click Builder against the newly created community
    • Click Settings -> General
    • Click on "Configure access for guest or unauthenticated users"
    • And then provide Read and Create permission on the Feedback object.

    Important Note: We can only assign Read & Create to the standard objects, but can assign all CRUD permissions to the custom objects to the guest profile.

    Once we provide the access, let's refresh the same page and here is the view(guest/unauthenticated user's view) - Awesome

    Now one part of the requirement is solved that guest users can create ideas, but can they really see the existing ideas?? No

    The reason is that these ideas are private and not shared with guest users.

    Now we need to write Guest User Sharing Rule like below to provide Read Only access -

    Important Note: - We can only provide Read Only access through Guest User Sharing Rule.

    With this above change, guest users can see the existing open feedbacks as well(only open feedbacks).

    We are almost there. The last configuration - we want to make sure that all created feedbacks should be owned by internal users not the guest users. Let's do that by -
    • Settings -> Communities -> Communities Settings 
    • Check the box against "Reassign new records created by guest users to the default owner"
    Now in the community put the default owner by -
    • Settings -> Communities -> All Communities
    • Click Workspace against the community
    • Go to Administration -> Preferences
    • Select the default owner 
    With the above use case, I tried to explain stuffs that should be kept in mind while configuring Guest access. Please provide your feedbacks and if you have any unique use cases in mind, please share in the comments. Thank you.


    Compare Knowledge Articles - WoW Feature

    In Spring'20, Salesforce introduced one feature which was pending for a long time and also got a good amount of vote in Idea Exchange.

    Recently while working with a customer who is trying to implement Lightning Knowledge, it was one of the top priority requirement. And I don't want to do any custom development for this. But to my surprise, I saw that Salesforce already introduced this feature in Spring'20 as Beta.

    I was like ...

    So thought of sharing this information here how we can use this great feature.

    Basically in the article layout all we need to do is include the Lightning component "Article Version Comparison" and then we can select the versions we want to compare. Screenshots are given below.

    This is very useful feature for the Approver to see the actual changes before taking any decisions. Also for the viewer also, they can see the changes between different versions(provided they have the permission to view versions of the articles).


    All About Asynchronous Apex

    While studying for the Salesforce Platform Developer II certification, I was going through the different options Apex provides to run Apex code asynchronously. This post is all about sharing the study notes with key points to remember.

    Apex provides four options to run code asynchronously. Future Method, Queueable Apex, Batch Apex and Scheduled Apex.

    Future Methods

    • Methods are annotated with @future annotation.
    • Future methods should be static and can only return void type.
    • It supports parameters, but parameters should be primitive data types, arrays of primitive data types, or collection. sObjects or objects cannot be used as parameters to future methods.
    • These methods run in their own thread and will only start when the resources are available.
    • They are used for long running operations and prevent any delay in apex transaction.
    • They can be used for callouts to external web services and also separating DML operations to prevent Mixed DML error.
    • Future methods should not be used for processing large amount of data. In that case, Batch Apex should be used.
    • To test future methods, enclose test code between startTest and stopTest test methods.
    • Future methods not necessarity execute in the same order as they are called.
    • Future methods cannot be used inside Visualforce controllers getter, setter, constructor methods.
    • Apex code must implement Queueable interace.
    • By implementing Queueable interface, Apex class can be added to the job queue and it will run when the system resources are available.
    • The difference between Queueable Apex and Future methods is -
      • Queueable Apex supports job-chaining
      • It supports non primitive data types likes sObjects or custom objects.
    • System.enqueueJob method is used to submit the job. After submission, ID of AsyncApexJob record is returned.
    • Using SOQL, status of the queued job can be monitored programmatically by querying AsyncApexJob table. The same is also possible from "Apex Jobs"in setup.
    • Chaining is supported here, thus allowing a job to be started from another running job.
    • The execution of a queued job counts once against the shared limit for Asynchronous Apex method executions.
    • Maximum 50 jobs can be added to the queue in a single transaction.
    • Only one child job can exist for each parent job.
    • There is no limit on the dept of the chained jobs.
    • Apex class must implement Database.Batchable interface, which will allow them to write code against start, execute and finish methods.
    • A batch class can be invoked by calling Database.executeBatch. It needs the instance of the class and batch size.
    • Using SOQL, status of the batch job can be monitored programmatically by querying AsyncApexJob table. The same is also possible from "Apex Jobs"in setup.
    • It is used to process millions of records asynchronously.
    • Apex jobs always get executed in a separate transaction.
    • Every batch apex transactions has their own governor limit(new limit always). Thus if one batch fails, it will not impact other batches.
    • Start Method:
      • It is used to collect records or objects which will be passed to the method "execute". 
      • It returns either a Database.QueryLocator object or an Iterable.
    • Execute Method:
      • This method is responsible for doing the actual processing work.
      • Default batch size is 200.
      • Parameter it needs - a reference to Database.BatchableContext object and a list of sObjects.
    • Finish Method:
      • This method is used to do post-processing operations likes sending email etc.
    • Apex class must implement Schedulable interface. By implementing this interface, an apex class can be scheduled at specific time/day in the Apex Scheduler.
    • System.Schedule method is used to schedule an instance of the class.
    • It should implement the execute method(this is the only method). Parameter - SchedulableContext object.
    • Once a class is scheduled, as CronTrigger object record is created. The getTriggerId method can be used to return the ID of CronTrigger record.
    • If the class is getting scheduled from Trigger, Governor limit should be checked.
    • Additional processing should be done in a separate class outside of execute method.
    • Maximum 100 scheduled Apex jobs at one time is possible.
    • Synchronous Web service callouts are not supported from scheduled apex. To do that, make an asynchronous callout in a method annotated with @future(callout=true) and then call it from scheduled apex. Note - If scheduled apex exceutes batch job, then callouts are possible as they are supported from batch class.

    Important points to remember regarding actionRegion, actionFunction, actionSupport, actionPoller

    Last night(July 17th, 2019) while preparing for Platform Developer II certification, I was going through my notes to revise the different ways to call Apex Controller functions from Visualforce page, I thought of making a post regarding actionRegion, actionFunction, actionSupport, actionPoller & actionStatus. Just setting the expectation beforehand - It is not a post which will explain you all, but I will share the developer guide link for each of them so that you can go and read them (highly recommended).


    The specifies the components to be processed on Force.com server. Without this tag, the whole page will be processed. With actionRegion also the whole form is submitted, but only the part within the tag will be processed.

    It needs a reRender attribute to be effective. It will only refresh the part of the page using the data contained within the tag. This can be very effectively used to avoid validation errors that may occur due to present of standard validation rule in VF page like required attribute.

    Here is the example without ActionRegion:
    public with sharing class WithoutActionRegionController {
        public String valueEntered{get;set;}
        public String country{get;set;}
        public String state{get;set;}
        public WithoutActionRegionController() {
            country = '';
            state = '';
            valueEntered = '';
        public PageReference countrySubmitted(){
            valueEntered = 'Country: ' + country;
            return null;

    Visualforce Page:
    <apex:page controller="WithoutActionRegionController">
        <apex:form id="myForm">
            <apex:pageMessages id="messages1"/>
            <apex:pageBlock id="topPageBlock">
                <apex:pageBlockSection columns="2" title="Country & State">
                    <apex:outputText value="Enter Country" />
                    <apex:inputText value="{!country}" >
                        <apex:actionSupport action="{!countrySubmitted}" reRender="messages1,outputId" event="onchange"/>
                    <apex:outputText value="Enter State" />
                    <apex:inputText value="{!state}" required="true"/>
                <apex:pageBlockSection title="Output" id="outputId">
                        <apex:outputText value="{!valueEntered}" />


    As you can see it throws the validation message due to state field is marked as required=true to moment I finish entering the country. This is because the whole page is submitted to render.

    Now the same example with ActionRegion:
    <apex:page controller="WithoutActionRegionController">
        <apex:form id="myForm">
            <apex:pageMessages id="messages1"/>
            <apex:pageBlock id="topPageBlock">
                <apex:pageBlockSection columns="2" title="Country & State">
                    <apex:outputText value="Enter Country" />
                        <apex:inputText label="Enter Country" value="{!country}" >
                            <apex:actionSupport action="{!countrySubmitted}" reRender="messages1,outputId" event="onchange"/>
                    <apex:outputText value="Enter State" />
                    <apex:inputText value="{!state}" required="true"/>
                <apex:pageBlockSection title="Output" id="outputId">
                        <apex:outputText value="{!valueEntered}" />

    This time no error message because actionRegion will render the Output and message1 part of the page with the content present inside tag. 

    Reference: https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_compref_actionRegion.htm?search_text=actionregion


    This allows calling controller functions directly from the JavaScript code using AJAX request. It is not the same as actionSupport which only allows calling controller functions from other Visualforce components. Few things to remember -
    • actionFunction is not allowed to be placed inside iteration component. It should be placed after the iteration component.
    • order is matched by the caller's argument list. reRender attribute is needed to define
    • It doesn't have event attribute. It doesn't add Ajax request before calling the Controller method.
    public with sharing class ActionFunctionController {
        public Boolean showHelloWorld{get;set;}
        public String message {get;set;}
        public ActionFunctionController(){
            showHelloWorld = false;
            message = '';
        public PageReference shouldDisplayHelloWorld(){
            showHelloWorld = true;
            message = 'Now we can say Hello World';
            return null;

    Visualforce Page:
    <apex:page controller="ActionFunctionController">
            <apex:actionFunction name="checkHelloWorldDisplay" action="{!shouldDisplayHelloWorld}" reRender="HelloWorldSection"/>
                <apex:pageBlockSection id="HelloWorldSection" columns="1">
                    <apex:inputCheckbox value="{!showHelloWorld}" onChange="checkHelloWorldDisplay()"/>
                    <apex:outputText value="{!message}" />


    This can be used when we need the Visualforce component to be refreshed asynchronously by the server when a particular event occurs like button click or mouseover.
    • It adds the AJAX request to the Visualforce Page and then calls the controller function. This is how it different from actionFunction.
    • It also has event attribute. Another difference between actionFunction and actionSupport.
    • It can be placed inside an iteration component.


    • A timer that sends an AJAX request to server according to a time interval specified. Each request can result full or partial refresh of the page.
    • Enabled attribute is used to make poller as active or inactive. Default is active.
    • It won't time out due to inactivity.


    Advanced Currency Management in Salesforce

    Salesforce supports multi currency. You can enable the same by going to Company Information and then checking the box - "Activate Multiple Currencies". You need to read the below article before enabling multi currency. https://help.salesforce.com/articleView?id=admin_enable_multicurrency_implications.htm

    Once done, you can enable Dated Exchange Rate to define the exchange rate for any kind of periods like month, quarter, year etc. To do that you can go to Company profile -> Manage Currencies

    Now you can add the entries for dated exchange rates by clicking on the "Manage Dated Exchange Rates" button. And then click on "New Exchange Rates" button. Below images shows how to add dated exchange rates.

    This dated exchange rates are used in Opportunities, Opportunity products and Opportunity Reports.

    The object used to store this information is DatedConversionRate. You can run SOQL queries against this object to get the details -

    SELECT IsoCode,ConversionRate,NextStartDate,StartDate FROM DatedConversionRate ORDER BY NextStartDate ASC

    You can use Rest Explorer also to add/delete new DatedConversionRate like below -
    Important Objects/Fields:

    • CurrencyType: This object stores the list of currencies used in the org when multi currency is enabled. If single currency is used in the org, then this object is not available.
    • DatedConversionRate: This object stores the dated exchange rates.
    • CurrencyIsoCode: This additional field is present in object which has current field and the org has multi-currency enabled. 

    Summer'19 : Celebrate Sales Milestones with Path

    In Summer 19 release, Salesforce introduces a new cool feature so that you can let your user celebrate when they reach certain stages in Sales path(or any path). This is a fun, visual way of celebrating success right from the Salesforce screen.

    This idea came from an old blog post regarding building with path based component, where community liked the idea and Salesforce delivered this to us now. To me this is the power of Salesforce community.

    So let's configure this together -

    Step 1

    Enable path in your org.

    Step 2

    Click on New Path. Choose values as shown in the below screenshot. (You can select any values available).

    Step 3

    Click on Next and ant the next screen select Key fields for the Opportunity Stages. Click on Next.

    Step 4

    At this stage, enable on-screen confetti.

    Step 5

    Here, you can select which stage you want top celebrate. Select those picklist values. Also you can select the frequency of celebration. 
    And finally click on Finish. That's all you need to do to get this new cool feature.

    Here is the video with step by step instructions -


    Follow Me

    Enter your email address:

    Delivered by FeedBurner

    Popular Posts


    Salesforce (105) Apex (45) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) SOAP (13) lightning (12) tutorial (11) Certification. (9) javascript (9) Certification (7) Trigger (7) test class (7) unit testing (7) Advanced Admin (6) Kitchener Developer Group (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) security (6) service cloud (6) trailhead (6) Advanced Apex (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) use case (5) JSON (4) Lightning Experience (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) Sales Cloud (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Web Technology (3) dynamic apex (3) license (3) map (3) mapbox (3) singleton (3) version controlling (3) Asynchronous callout (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) Kitchener User Group (2) Lightning Design System (2) Lightning Web Component (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) ant (2) automation tool (2) basic (2) chatter (2) coding (2) communication (2) console (2) controller (2) documentation (2) dreamforce (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) release (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) Aura Framework (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) Custom Metadata (1) Custom Object (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Diwali (1) EDA (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) Ideas (1) Improvement (1) KPIs (1) Knowledge Management (1) Large Data Volume (1) LastModifiedDate (1) Lightning Feature (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) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (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) Salesforce Advisor Link (1) Salesforce Certification (1) Salesforce Labs (1) Salesforce Optimizer (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) 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) configuration (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)

    Total Subscribers

    Total Pageviews