My favorite Salesforce Spring 18 Feature

In Spring 18 Salesforce released the ability to clone a Sandbox.  It has been asked from both Admins and Developers for some time but now you are able to take advantage of exciting new feature!  In fact, this request was 7 years in the making and have over 11k votes on the Ideas page.

Sandbox cloning simplifies having multiple concurrent streams of work in your application life cycle.  This will allow you to build work in one sandbox then replicate those changes so that another system admin or developer can start from a developed point in time without losing the changes that the first admin or developer made.  It will also allow you to go from Development to QA, Staging then Production making sure you test all the touch points and delivering as bug free environment as possible.  Contingent on your Software Development Life-cycle, you can have changes sitting in the sandbox from a Sprint or two ago.

One notable factor to consider is that today a full copy sandbox to a developer sandbox is still not possible.

This is personally my best feature in Spring 18 and you should investigate if it can be used in your development strategies moving forward.  Good job Salesforce for continuing to deliver features in the platform in which customers are truly interested in using.



Administration of Adobe Sign

Your boss walks up to you one day and says, we want to integrate sending legal documents to our customers using Salesforce data.  The company has decided to go with Adobe Sign as its primary application.

Later that day when you go home, you can get a 14 day trial of the application so you can learn how to use it.  Go to the Adobe site, choose Adobe Sign and then Free Trial.

Once you get your account you will have a full working 14 day trial of the application.  I have to admit, the interface on the application is very clean and easy to use.

Account – Here you will find the core Administration functions.

Dashboard, I used it to quickly add a Template to my Library.  It gives you a full view of everything happening in your account.

Manage – Will show all your documents that have been sent out, signed and your Template.

Account Tab – Here is where Admins will spend most of their time. Adding Users, creating Groups for people to share documents with and configure the Security.

Manage – Here is where you will find the documents Waiting to be Signed, those out for Signature, Signed, Archived, and Library Templates.

Finding out what Salesforce instance the company is on when it uses My Domain.

Its Monday morning and you noticed that you got an email from Salesforce at 1:51 am stating that an upcoming MAINTENANCE Major Release – NA51 – Core Services.

#Season# ’18 Major Release


Impacted Services – Core Services

Availability – This instance will not be available during the maintenance window.

One issue is that

you manage more than 1 Salesforce instance and all your instances use My Domain.

So go to the url link

On the right side of the page you will notice a button called ‘My Domain’

I randomly typed the word Warm and someone else domain came up.  It was only used for learning purposes. Once you type in your company domain then it will tell you on what instance it resides.  Now you can match the notice number with the one that on the Salesforce My Domain site.

I recommend you store your Salesforce My Domains and Instances locally on a file to properly send out notification when the systems will be impacted.

If you dont know what domain you are using for your Salesforce instance, you can do the following.

  1. Setup
  2. Administer
  3. Domain Management
  4. My Domain

Do you Trust.Salesforce.Com? You definitely should!

Did you ever get a call from a user or partner that they cant access Salesforce and it must be down?  Before you log that case with Salesforce support, you have an easy way to go online and check the status of the Salesforce Orgs.  You definitely should trust as they post the status of the instances for the entire world to see.

The hyperlink is :

Once you clicked on Status above, you will get all the instances in your region.

API Limits maxed out! Whats an Admin to do?

Your coming from a late day meeting when you return to the flashing red light on your phone blinking like crazy.  As you look at your phone it says 32 missed calls.  Thats odd, I normally dont get that many calls in a day.  As you pick up the phone to hear the message while logging back into you work device, you see Slack posts directed to you as well as your ALL CRM group.  One of the tech lead from Dev Ops has slacked you that they are getting errors on their integration API account in the syslogs.  That odd you then get a phone message, the VP of Sales leaves a message “My reps cant get incoming leads or dial out, were losing money here and its almost end of month!”  What is going on down there?   The second message is one of two Customer Service Directors stating we cant log in our calls into the CRM, Salesforce is down!  I repeat Salesforce is down!

OMG you think, let me jump on I have a major outage issue here.  How in the world did this happen?  What happened to the multi-tenant architecture thats supposed to stop this from happening?  You sit there a little confused for a few minutes.  Salesforce is reporting no system outages on your instance.  After further investigation and the IT team escalating the issue to your CIO, you realize that the impacted users are all using externally integrated systems.  Could it be that something happened to the integration accounts?

Looking deeper it sure was, your externally connected apps have consumed all the allocated API Calls for the Salesforce Instance.

Here is how you manually check your API Usage – 

  1. Click Setup
  2. Adminster
  3. Company Profile
  4. Company Information
  5. ‘API Requests, Last 24 Hours’

You will see on the Company Information tab “API Requests, Last 24 Hours” Here you will see your number 300,000 (300,000 max). The screen shot is my personal dev org which shows 0 out of the 15,000 provided.

Your company API requests are specific to your Org so the Max number can be higher or lower.

You noticed, yes one of your external API connection has in deed consumed your API calls for the rolling 24 hours.  This part is very important, API usage is rolling in 24 hours.  So, if for some reason a big job was run at 9 pm the day before, once it becomes 9 pm today those used api calls roll back into your allowance.

Once you identify that the API limits were maxed, you should do a couple of things.  You should report it up the chain to your management and executive suite of the issue.  You should also open a case with Salesforce to see if they will allow you a temporary API increase to get your org back up and running ASAP.  This normally needs high level approval on the Salesforce side and your Sales Rep will be contacted of the situation.   They will only do this once so you will need a long term plan to finding out whats consuming all your API allocation.

You next step is to find the culprit.  Just an FYI, normally the 1st person who called to complained is your primary suspect but we need more than a sneaky suspicion.  The good news is Salesforce stores that data on your Org for you to check.  You just need to learn how.

  1. Click on the Reports Tab
  2. Look for the Salesforce provided ‘Administrative Reports’ folder.  The one you cant delete reports from or add to.
  3. The first report on the list will be called ‘API Calls Made Within Last 7 Days’

After running the report, you will want to customize it and group the report by Username. Remember it gives you the last 7 days so your looking for the day that you actually consumed all your API calls.  You now found your offending user account and can report back to that team to see if they can make the calls more efficient when they query your Salesforce Org.

*Pro Tip: while you now know that this report exists, Schedule it to run daily and send you the last 7 days of API calls so you can monitor it for the next week or two for trends.  As the owner of a Salesforce Org this should be on your radar at all times.

One of the major issues with the above is that Salesforce will only record the last 7 days in our instance.  This can be an issue if you wanted to see utilization from an API account a few weeks, months or years ago.  Its also difficult to see trending, e.g. if one of the external systems get a large import of data quarterly that syncs to Salesforce.  You will miss these very important stories in your data.

Long Term Fix

So, if you want to track this information for more than 7 days, you are going to need to pull it to an external source using the Salesforce API.  This can be done so many different ways.   One of the companies I worked at used Omniscope and pulled the data to a SQL database.  Another company used the Streaming API with a tool called SteamSets and dumped the information into Grafana.  You can also use Jenkins jobs to query the database and dump it into another Salesforce Org if needed.  So at this point you should look at what tools you have in your organization and what developers you have as a resources.

Salesforce Analytics – Catch that WAVE

I was recently asked to lead the evaluation of Salesforce Wave for our Global Salesforce Org. With slightly over 1,100 users around the world it was an exciting opportunity and I was happy to be given the project.  I have worked on several different Business Intelligence tools in the past, so I felt very comfortable taking on this new challenge.  It involved working with our divisional team leaders to understand the business needs and identify what was working with the out of the box Salesforce reporting and where their was a void of intelligence around core business decisions metrics.

During one of our NYC Developer Meetup sessions, we had a Wave analytics consultant show us all the cool and advance things he did with the application.  It was very impressive.  What I personally took out of that meetup session was two things.  The first was that there was a Sandbox that could be created so that I could get some hands-on experience with Wave.  The second was to use Trailhead for training to understand the application better.

I would like to share with you some prep work I used to ramp me up quickly on the tool.

Free Developer Wave Environment :

Trailhead :

There are 4 components to Wave which you should understand and learn to effectively manage the tool.

  1. Apps
  2. Datasets
  3. Lenses
  4. Dashboards


An app contains dashboards, lenses, and datasets in any combination that makes sense for sharing your data analyses with colleagues. Apps are like folders. They allow users to organize their data projects—private and shared—and to control sharing.


“A dataset is a collection of related data that is stored in a denormalized, yet highly compressed form. For each platform license, your
organization can have a maximum of 250 million rows of data stored for all registered datasets combined.
Wave Analytics applies one of the following types to each dataset field:

Date – A date can be represented as a day, month, year, and, optionally, time. You can group, filter, and perform math on dates.

A dimension is a qualitative value, like region, product name, and model number. Dimensions are handy for grouping and filtering
your data. Unlike measures, you can’t perform math on dimensions. To increase query performance, Wave Analytics indexes all
dimension fields in datasets.

A measure is a quantitative value, like revenue and exchange rate. You can do math on measures, such as calculating the total revenue
and minimum exchange rate. For each dataset that you create, you can apply row-level security to restrict access to records in the dataset”

Using the pre-built Salesforce Developer Org with Analytics already on top of it, I quickly went to work and added some of my orgs custom fields and dataloaded the sample records to match my company architecture better.  I segmented the Account and Opportunities by Market, Region and other metrics that matched closely my organization.  Before you demo how something works, its important to add components that the business is use to seeing.  Just demo’ing the Salesforce sample org would have just confused my sponsor and champions of the project.



One small caveat I should mention, if you have an older Developer Org you will need a new one with the Wave application on it.  So now I have two Dev orgs, one with all my original development test code and a second one just for Wave Analytics.

If asked by our company to lead an effort or you just want to understand if Wave Analytics can be used at your company to enhance the user experience feel free to ump on the surfboard, learn and push the limits of the application.

Free Developer Wave Environment :


Salesforce Object ID Prefixes Decoder (Your secret decoder ring for Salesforce IDs)

In the blog post “What is difference between 15 and 18 Digit Record Id’s in Salesforce” I make reference to a Salesforce Acccount Id of 0015000001Fn4VL in my sample.

These IDs are the core to identifying the unique records and configuration in Salesforce. This information can be found in Knowledge Article Number 000005995.  I would like to share with my awesome admins the ID Prefix and the Objects those IDs are associated to. This can help you if you work in a multiple administrator org and someone provided to you and already exported file from the system.

Open the box and grab your Salesforce decoder ring to take the mystery out of those ID Prefix.

ID Prefix

Object Type

001 Account
002 Note
003 Contact
005 User
006 Opportunity
008 OpportunityHistory
100 UserLicense
101 Custom Label
400 ApexClassMember
500 Case
501 Solution
608 ForecastShare
701 Campaign
707 AsyncApexJob
709 ApexTestQueueItem
750 Bulk Query Job
751 Bulk Query Batch
752 Bulk Query Result
800 Contract
806 Approval
888 Remote Access
000 Empty Key
00a CaseComment/IdeaComment
00b WebLink
00B View
00D Organization
00e Profile
00E UserRole
00G Group
00h Page Layout
00I Partner
00J OpportunityCompetitor
00K OpportunityContactRole
00k OpportunityLineItem
00l Folder
00N Custom Field Definition
00o OpportunityLineItemSchedule
00O Report
00P Attachment
00p UserTeamMember
00Q Lead
00q OpportunityTeamMember
00r AccountShare
00S Import Queue
00t OpportunityShare
00T Task
00U Event
00v CampaignMember
00X EmailTemplate
010 CaseSolution
011 GroupMember
012 RecordType
015 Document
016 BrandTemplate(Letterhead)
018 EmailStatus
019 BusinessProcess
01a DashboardComponent
01D UserAccountTeamMember
01H MailmergeTemplate
01I Custom Object
01m BusinessHours
01M AccountTeamMember
01n CaseShare
01N Scontrol
01o LeadShare
01p ApexClass
01q ApexTrigger
01Q AssignmentRule
01Q Workflow Rule
01r Visualforce Tab
01s Pricebook2
01t Product2
01u PricebookEntry
01Y CampaignMemberStatus
01Z Dashboard
020 EventAttendee
021 QuantityForecast
022 FiscalYearSettings
026 Period
027 RevenueForecast
028 OpportunityOverride
029 LineitemOverride
02a ContractContactRole
02c Sharing Rule
02i Asset
02n CategoryNode
02o CategoryData
02s EmailMessage
02Z AccountContactRole
033 Package
035 SelfServiceUser
03d Validation Rule
03g QueueSobject
03j CaseContactRole
03s ContactShare
03u UserPreference
04g ProcessInstance
04h ProcessInstanceStep
04i ProcessInstanceWorkitem
04k Outbound Message Id
04l Outbound Notification Id
04m AdditionalNumber
04s AsyncResult/DeployResult
04t Install Package
04v CallCenter
04W RevenueForecastHistory
04X QuantityForecastHistory
04Y Field Update
058 ContentWorkspace
059 ContentWorkspaceDoc
05X DocumentAttachmentMap
060 Portal Id
066 ApexPage
068 ContentVersion
069 ContentDocument
07E Sandbox
07L ApexLog
07M ApexTestResult
07M Apex Test Result
081 StaticResource
082 Data from Uninstalled Packages
083 Vote
087 Idea
08e CronTrigger
08s CampaignShare
091 EmailServicesFunction
092 Weekly Data Export
093 EmailServicesAddress
099 ApexComponent
09a Community
0A2 Change Set
0A3 Installed Package
0BM Connection – Salesforce to Salesforce
0C0 Holiday
0D2 OrgWideEmailAddress
0D5 UserProfileFeed
0D5 FeedItem/NewsFeed/UserProfileFeed
0DM Site
0E8 EntitySubscription
0EP Inbound Change Set
0J0 SetupEntityAccess
0PS Permission Set Metadata
0Q0 Quote
0t0 TagDefinition
0Ya LoginHistory
1dc MetadataContainer
1dr ContainerAsyncRequest
7tf TraceFlag

What is difference between 15 and 18 Digit Record Id’s in Salesforce?

Many time during my mentoring sessions I get asked by new administrators and developers this question. “What is the difference between a 15 digit id and 18 digit id in Salesforce?”

Normally, when a Salesforce user pulls the id from a record through the interface on any object they get the 15 digit id by design.  So, if you created a report on Leads / Account / Contacts or any custom object and add the id field through the interface it will look something like 0015000001Fn4VL.

However, if you were to access that same Salesforce account id via an API or a tool like this from the Apex Dataloader & workbench 0015000001Fn4VLAAZ.

One thing to note is that Salesforce IDs are case sensitive when they are 15 digit and insensitive when they are 18 digit.  This means you must take into account upper and lower cases when you export the data from the system for the case sensitive data elements.  If your using tools like vlookup in Excel to do comparison from various sources of data, be careful as Excel can incorrectly map the data since it is not case sensitive on the 15 digit id.

The last three digits in the ID is a checksum.  A calculation to assure that the first 15 pieces of the ID are accurate for the object its being written into.

So following that analogy just mentioned.

15 digit case-sensitive version

15 digit ID is what will be received from within the user interface

18 digit case-insensitive and best used for manipulating data outside Salesforce

18 digit id is referenced through in the API and other 3rd party tools.

If you would like to convert the current user interface id to 18 digits this can be done by using a formula very simple formula.  I have seen a couple of versions of the formula but this is the one that worked best for me in my career.

All you need to do is add a new formula field, text 18 characters with “CASESAFEID(ID)”

Salesforce has a knowledge base article on this topic which gives clear instructions on how to use it.

Convert a 15 character ID to a 18 character ID


Knowledge Article Number

Description Convert 15 character IDs to 18 character IDs to update records,

or to make working in systems that aren’t case sensitive easier.

Resolution Follow the steps below to create a formula field that will give you

the 18 characters ID of the records.

1. Go to Setup | Customize | object name | click Fields
– For Custom objects: Setup Create Objects | object name
3. In the related list “Custom Fields & Relationships” click New.
4. Click the Formula radio button.
5. Click the Text radio button for “Formula Return Type.”
6. Input the following Formula into the Formula Editor:


7. Set Field Visibility, add/ remove from Page Layout(s).
8. Click Save.

So when your boss asks you to do that dataload of leads / Accounts / Contacts or Opportunities rise up and take the challenge.  Using the formula will help you access the 18 digit Id so you can successfully cleanse the data outside the system and push it back up after the business has fixed the incorrect data elements.

Process Builder: Created and Last Modified Date information

Many companies are seeing the strength of using Process Builder for automating the company business process.  As an admin who used Salesforce for almost a decade, I am very versatile in the use of both Workflows and Process Builder. I must honestly say, the strength of Process Builders cross object functionality is very impressive and being used more by our organization to meet tasks previously performed by Workbench in our Sprints.

As one of the admins or developers for your org, you may have the need to find out who created or last modified one of the process builder that were previously built.  This is especially important if your have multiple administrators and developers working in your org.  However, for some reason the created and last modified username and last modified date does not show up on the admin user interface. Hopefully, sometime soon Salesforce will make this available in the admin UI as its essential for auditing purposes and helpful for someone investigating a recent change.

If you have a Process Builder automated process that you need to identify who created or last modified it, this can be accomplished pretty quickly with the use of the Workbench.

Login to the Workbench by doing one of the two following steps.

a. Google search of the “Salesforce Workbench” to get the latest version of the Workbench

b. Use the following url

Once you logged into the workbench with your username and password credentials, you want to do the following to get the created by and last modified by administrator information.

  1. Click on the “Info” drop down.
  2. Hover over : “Metadata Types & Components”
  3. Click on “Metadata Type & Components” in the available list
  4. Pick “Flow“ in the drop down when you see Metadata Type & Components in blue.
  5. Click on Components “folder” for list of Process Builders. I will display components.
  6. Click on the Process Builder name you used in your Salesforce Org to find the details.  Mine was Chatter Post on New Contact.

Picture from steps 1 (info) & 2 (Metadata Types & Components)

Picture from steps 3 (flow) / 4 (folder) & 5 (your process builder)

Now you know who created the process builder or modified that working process builder job.  This can be very valuable information for many different reasons.

How to easily identify a Salesforce workflow that sent that automated email to an Admin, Developer or User. 

Many times throughout my career I would have a user send an email or a string of automated emails to my support team and say “John Jones is a new hire” and I would like him to get a copy of this automated email.  Regardless if it’s a part of your Sales or Service automation process, us admins dive into the back-end system to figure out where the automated email came from and add John to the list of the workflow recipients.  Not a terrible process and effective at the end of the day.

However, what if I told you there was an easy way to figure it out without searching through all those workflows manually in your Salesforce Org?

You know, that custom view you have in either your Leads, Opportunities or Cases with the word “Active” in it.  The one you have to click more at the bottom since you have so many workflows.

Its pretty easy.  Just follow the below instructions.

If you or your company is using Outlook – Go to the automated email and do the following.

  1. Click on “File

  1. Click on “Properties

  1. Go to the Internet Headers section in Properties.

In the Internet headers you will find all sorts of valuable information like the Org Id (SFDC-LK), the user SFDC-User) who caused the condition which fired the email.

Even the id of the workflow.  01W31000000….. is the id of the workflows that fired this alert!  So you can easily just add John Jones as quickly and productively as possible.


If you or your company is using Gmail – Go to the automated email and do the following.

  1. Click on the “Down Arrow” on the right side of the reply button.

  1. Click on “Show Original

Similar to the Internet headers you will find all sorts of valuable information like the Org Id (SFDC-LK), the user SFDC-User) who caused the condition which fired the email.

You will find the id of the workflow.  01W31000000….. that fired this alert!  So you can easily just add John Jones as quickly and productively as possible.

I really cant tell you how much time I had invested sifting through the workflows before I found out about this information.  Don’t get me wrong its good to know your companies workflows inside and out.

So every minute you invest in investigating your workflows makes you a more awesome admin.  Shortcuts like these make you a super admin.

Updating Hard-Coded References in your Salesforce Org

At times administrators and developers think it’s a good idea to hard code salesforce instances into their code, email templates or other parts of the application. I have went through three production refreshes in my career which were all impacted by this behavior. The hyperlink in an email template will look something like

Salesforce Knowledge Article Number 000230820 Updating Hard-Coded References explains what hard coded references are and how to find them in your org.

Quoted right from the Salesforce Article 000230820.
“3. How can I update hard-coded references using IDE?
Follow the steps below to update hard-coded references* in your org and your org’s metadata (setup or customer code):

i. Create a new Project:
1. Go to File > New > Project
2. Provide a name for your project, enter your login credentials for the org, and then click “Next.”

ii. Choose the project contents:
1. Select metadata components, then click “Choose.”
2. On the next screen for metadata components, select the field’s required then click “OK.”

a. At a minimum, we suggest selecting the following: email templates, home page components, web links, workflow, triggers, classes, visualforce pages, and tabs.

3. Please keep in mind that you can only pull 1500 components at a time. If you need to pull more metadata, we recommend dividing your work into multiple projects.
a. If you exceed the limit for number of components, you will receive this error message: “LIMIT_EXCEEDED: Too many files retried in a single retrieve call, limit is 1500.” The Metadata API, which the IDE uses to communicate with the server, enforces these limits per each deploy/retrieve transaction.

iii. Once you have created your project, press Ctrl-H to perform a search.
1. Search for the name of the instance that your org resides on, for example: NA4. See Figure 1 below.
a. If you have multiple projects open, right-click on each project you don’t want to search on and choose “Close Project” or modify the search criteria so that you have a “working set” to minimize the files you’re searching on.”

It is not best practices to hard code instances in your org.

Fix :

Use the relative URL. Instead of using use /001/e?retURL=/home/home.jsp. Leave out the Instance or host part of the URL.

Secondly, will also work.

Salesforce (Thailand) locale forwarded 543 years.

When you have multiple locales enabled in your Salesforce Org and the date function of your code uses the locale set in the system for the user, the Thai locale will increase the years by 543. This was actually done by design to follow the user’s locales.

Wikipedia : “The Thai solar calendar, was adopted by King Chulalongkorn (Rama V) in AD 1888 as the Siamese version of the Gregorian calendar, replacing the Thai lunar calendar as the legal calendar in Thailand (though the latter is still also used, especially for traditional and religious events). Years are now counted in the Buddhist Era (B.E.)) which is 543 years ahead of the Christian/Common Era.”

Fix: You will need to use another locale for the user or calculate off the 543 in all date functions in your code for Locale : Thailand.