Skip to main content

Posts

Salesforce Pipeline Reporting - part 1 of 3

In a dozen (plus) years working with Salesforce, I've never been entirely happy with the built in reporting of my opportunity pipeline. I can export details, or a printed (formatted) view, but I lose the interactivity. I can use a dashboard, which is better now in Lightning in that I can see a lot more fields in a table component. But flexible views require filtered dashboards, and just maintaining the filter values (if they go down to a rep level) can be onerous. Plus applying (or removing) a filter tests my (very limited) patience. So I've typically exported the report details into Excel, and there created a workbook that includes (1) summary info, (2) scrollable deal lists with hyperlinks back to the opportunity records in Salesforce and (3) filters that let me instantly switch views, say among teams, reps, opportunity types, or fiscal periods. My process around this involved LOTS of VBA and LOTS of formulas. Lately, I've (finally) gotten turned on to slicers in Exc...

Salesforce reporting: XL-Connector and VBA

In an earlier post , I mentioned a tool I'm using to import Salesforce data - via SOQL or existing reports - into Excel. This post is more about using that tool, XL-Connector from Xappex . Here, I'll walk through the (simple) process of importing and refreshing a report, and I'll provide a simple VBA macro to automate the refresh. In a future post, I'll expand on that macro to show a friendly view of my opportunity pipeline and a single-page view of how each of my sales reps are doing against a series of KPIs. Importing a report is simple enough. From the XL-Connector tab, select Log In and enter your credentials. I'm using the old id and password (as opposed to SSO), so I provide that along with my 'token'.  (Don't remember your token? Log in to Salesforce via your browser, click on your photo, select Settings, then 'reset my security token'.) Once you're logged in the lock turns green. Back in Excel, on the XL-Connector tab, select ...

A personal dashboard keeping my (Salesforce) house in order

I've put a 'penalty box' on my reps' dynamic dashboard. This section of their dashboard calls out items that they own that require attention. Their penalty box includes issues such as open opportunities with a close date in the past forecasted opportunities with no quote issued open opportunities that include inactive SKUs MQLs that haven't been addressed after some period of time stale opportunities (untouched in, say, 30 days) early-stage opportunities with near-term close dates These are intended to keep the reps honest and help them keep their pipeline clean. But I have my own Salesforce hygiene issues to keep up with. So I've created my own dashboard to keep these front and center. I can't necessarily fix all the issues today (who gets those leads when the territory is vacant?), but I want to fix what I can, and then keep sight of others needing attention. My personal cleanup dashboard includes the following: Open opportunities ow...

Layouts, layouts, layouts

We've all customized our Salesforce orgs, adding custom fields and placing them on the page layouts, grouping related fields and trying to make the most important fields the most obvious on the page. But it's easy to focus on the body of the page (the 'details' tab in Lightning Experience) and overlook some other layouts that can help you and your users see what matters most. Here, I'll discuss Search Layouts, Compact Layouts, and Related List customizations on the Page Layout. The screenshots here are from a Trailhead org with minimal customizations and not a lot of data. Hopefully you can still appreciate the potential benefits from making these layout customizations in your org. Search Layouts When you perform a search, the result is a list of matching records, whether those are all of a single object type, or a selection of the best matches from different objects. But what fields are shown in the search results? That's governed by each object's...

Change sets - cryptic validation error messages

I'm a fan of change sets to migrate my development work from a Salesforce sandbox to production. (Check out the Trailhead module on change sets here ). After I make my updates, I create an outbound change set and add all those updates to the change set. Assuming the deployment settings in my production org allow inbound change sets from the sandbox, I upload from the sandbox to my production org. That change set encapsulates all the updates which will be validated and deployed (or not) together. That is, if the deployment fails, all of the updates get rolled back. After a few minutes (wait even a few minutes beyond when you get the email telling you the upload succeeded), switch to the production org, open Setup and go to the Inbound Change Sets. From there, select the new change set and choose Validate. Once that kicks off, switch to the Deployment Status Page and watch the green circle fill in. Assuming it stays green, the next step is Deploy. Sometimes, however, that circle...

Using Excel with Salesforce: One tool, two tips

Obviously, Salesforce has strong built-in reporting tools. And I'm a big fan of the dashboards, especially filtered dashboards and dynamic dashboards. WAY better than the old approach of creating a unique set of reports and a corresponding dashboard for every conceivable view. Still, I often want to pull my Salesforce data into Excel. This might be for further manipulation / processing, aggregating data that doesn't live in Salesforce, or distribution to non-Salesforce users (hey, those licenses are expensive!). Reporting Tool - XL-Connector: I'm using a new (to me) tool when I have to repeatedly pull Salesforce data into Excel: XL-Connector  (fka Enabler 4 Excel) from Xappex. There's a lot you can do with XL-Connector. My primary use is just to extract data from Salesforce, and this can be done in two ways: reports or SOQL queries. The great part is that once you've captured data into an Excel file, refreshing the data is trivial. I've stored my credential...

Two Great Composer Parameters That Work Great Together

We use Conga Composer to generate documents out of Salesforce; for those unfamiliar, I describe it as a really smart form-fill using Salesforce as a data source. Our primary use for Composer is quote generation, and the myriad parameters allow us to generate fairly custom quotes for a whole slew of cases (direct or via the channel; new or renewal; show discounts or not, etc., etc.). Conditionally Disable Composer One set of parameters that I've really come to like work in tandem: DC - Disable Conga Execution, and DCL - Disable Conga Execution Label. The idea is that if DC=1, so Composer is disabled, then the value of DCL is displayed to the user. As an example, suppose we have &DC=1&DCL=Opportunity+Is+Closed. When the user attempts to launch Composer, it won't run, but instead will display 'Opportunity Is Closed'. On the other hand, if DC=0 then Composer runs as normal. So how do we use this? As I said, we use Composer mostly for quotes. And there are a...

Task Cleanup - Launching the Flows

In the previous post , we set the objective of cleaning up open tasks either when (1) the opportunity to which they are related is closed or (2) another task with many of the same attributes is created. We created an auto-launched flow which determined which of those two flavors was in play, captured the appropriate tasks and, if there were any, deleted those tasks. What we didn't do last time was launch that flow. That's the exercise now. We'll create two Process Builder flows which invoke the flow, setting the appropriate input variables. Recall there are two instances in which we're going to launch our flow. The first, and more complex, is when a task is created. If a task is created, it relates to an opportunity and its status is Not Started, I'm going to launch the flow. Let's get started... From Setup, search on Process Builder, then click on it and then New. Give the process a name, and have it start when a record changes. Next, Add Object and sele...

Cleaning up reminder tasks

It seems fairly standard practice to create reminder tasks to nudge reps about neglected opportunities. We do that for open opps that haven't been modified for 30 days, and for renewal opps when they get within 90 days of the renewal date. Do your reps always take action? Yeah, mine don't either. My concern is that these reminders become noise. The few new alerts get crowded out (attention-wise) by all the alerts that have been sitting around neglected. The net is that reps learn to ignore these alerts, and they become pointless. What to do? One step I've taken is to automate cleanup of certain old tasks. This post and the next will walk through the steps I've taken. My aim is to (1) delete any 'Not Started' tasks associated with opportunities when the opportunities get closed, and (2) delete any duplicate reminder tasks on a given opportunity when creating a new such task. To do this, I'm going to create a flow which, given an opportunity id, will de...

Recurring Revenue - Part 5 - Wrapping Up

To better support this SaaS world we live in, we've so far calculated and forecasted both the Monthly Recurring Revenue (MRR) and the First-Year Value (FYV) of our opportunities. Two more things to wrap up this series. First, I want to track scheduled payments. And then we'll create a report to track the month-end MRR under contract, as this is a critical metric for SaaS providers. Scheduled Payments I want to help my finance team to tracking payments that are expected from prior-period bookings. So I've added a custom field, Payment Amount, to my Activity Object, and added that field to the Event page layout. Now when I mark an opportunity closed-won and the opportunity term exceeds 23 months, I create an Event to record the scheduled payment(s). (For my purposes, I don't create a Schedule Payment for the initial billing, though you could if you want to record all billing events in Salesforce.) From the opportunity record, I record a new all-day event with no...

Recurring Revenue - Part 4 - Forecasting MRR and FYV

In the previous post , we added MRR and FYV custom currency fields on the Opportunity object. The next step is to set up forecasting on these fields. The first requirement is to enable Opportunity Splits .  If you’re not actually splitting credit among reps, the opportunity owner will receive 100% credit by default, so turning on splits doesn’t require additional input on each opportunity, but IS required to set up forecasting with custom fields. In Setup, search for Splits, click on Opportunity Splits Settings then on Set Up Opportunity Splits. I’m going to rename the first entry from Revenue to TCV (total contract value) to better distinguish that from our custom fields. I’ll deactivate the Overlay split type. Next, I’ll add a new split type, naming it MRR and selecting the Opportunity – MRR field. Repeat for FYV, using the Opportunity – FYV field. Click Save. Check the warning and then, if those warning conditions don’t apply, click Enable. Now you...

Recurring Revenue - Part 3: Opportunity and Opportunity Product

Continuing the series on how to quote, forecast and measure recurring revenue... What I'm trying to determine with Opportunities are the: First-Year Value, and Monthly Recurring Revenue Ultimately, I want to be able to forecast based on these amounts. Monthly Recurring Revenue (MRR) is probably my most important metric as a SaaS provider, so I want to move away from forecasting on the Amount field (which typically represents the total contract value of an opportunity). FYV is kind of an in-between measure; it includes start-up charges (training, setup) and the first 12 months of service, but excludes multiple years of service. I'm basing these on custom fields on the Opportunity (Term, the service duration in months) and Product (Category). I have one field to add to the Opportunity Product: Recurring Charges: If the Line Item's Product Category (see the first post in this series) is either Subscription or Over Time, the Recurring Charges are set to the L...

Recurring Revenue - Part 2: Quote and Quote Line Item

Continuing the series on how to quote, forecast and measure recurring revenue... What I'm trying to determine with Quotes are the: Number of payments Amount of each recurring payment, and Amount of the initial payment I'm basing these on custom fields on the Opportunity (Term, the service duration in months) and Product (Category).  In practice, I also have the Term on the Quote object so that we can have quotes for different terms attached to a single opportunity. Then I use Custom Quote Sync from Salesforce Labs to sync custom fields across the Quote and Opportunity. But that's a detail I'll avoid for now. I have two fields to add to the Quote Line Item (QLI): Recurring Charges: If the Line Item's Product Category (see the prior post) is either Subscription or Over Time, the Recurring Charges are set to the Line Item's Total Price; otherwise to 0. BUT... this is NOT a formula field. Instead, I populate it via a simple workflow rule and field up...

Recurring Revenue - first of a series

SaaS, PaaS, IaaS, ... the world seems to be moving to an 'as-a-service' model. Instead of a big upfront charge with smaller maintenance fees thereafter, we're more often now establishing subscriptions that lower the entry fee but generate greater recurring revenue. And it's those ongoing subscription charges that really drive business valuations. But out of the box, Salesforce doesn't help much with reporting or forecasting recurring revenue. Typically, the Amount which rolls up into the forecast is the Total Contract Value, which may include non-recurring items, as well as multiple years of service. Yes, you can create schedules (quantity schedules or revenue schedules) attached to each line item. And that does help, especially with reporting on revenue in each period. But I don't find that a complete solution (though it is reasonably flexible given that you can edit each entry of the schedule). Over several posts, I'm going to walk through a set of Sal...

Helping reps adjust line-item prices

Our Salesforce org doesn't allow reps to enter a unit sales price directly. Rather, reps can only apply a discount to the list price. There are some solid reasons for this, most notably that we want to know what discounts are being applied, and greater discounts may require different approvals (higher discounts might go all the way to the CFO and CEO for approval). But a couple of problems result from this restriction: 1) Sometimes a rep may want to sell (or at least quote) above list price, and Salesforce doesn't allow a negative discount. 2) The discount percent allows just two decimal places, so we can't always get to exactly the price we want (try discounting from $350 to $200 !). 3) Even when it is possible to discount to the exact price, the calculation isn't always easy for my reps. So we often had prices in the CRM that didn't match what the rep had expressed to the prospect. Or maybe I would get a call to adjust the pricing. My workaround: A flow!...

Spring '19: Increased storage limits could save you money

We know about the Salesforce release schedule... updates come out three times each year and are automatically applied to their multi-tenant environment. And for those of us trying to keep up, each release comes with literally hundreds of pages of release notes and, hopefully, at least a couple of features that we're genuinely excited to share with our users. The Spring '19 release includes a change that *could* lower the total cost of your subscription! Storage in Salesforce comes in two flavors, data storage and file storage. I'm focused here on data storage, because  that's where I've seen orgs push (or exceed) the standard limits the standard data storage limits are changing  additional  data storage on the platform is EXPENSIVE!  One additional GB of data storage can run $3,000 per year ! I worked with one small org whose incremental storage charges were a pretty hefty percent of their base license costs! (Archived Tasks were the culprit, but that's ...

Security adjustments

As GDPR came into view, I took a closer look at the security settings in our Salesforce org. Probably nothing novel about that statement, but I'll share a few of the changes that resulted. First, I ran the Health Check. It's under Setup | Security. It provides an immediate view of some big-picture security issues. I'll confess that I knowingly have not taken all the recommended actions. In some cases, that's for my own convenience (I do want to be able to log in as any of my users, and I don't want to log in under my own credentials after I log out under a user's id). But some of the isues identified are no-brainers and do leave you in a better security posture. But that's primarily about ensuring that the a user should indeed be logged in to your org. What about the permissions that those legit users have? I've taken a number of steps to further limit access to company data. First, I inherited an org with roughly a hundred users and nearly a d...