So it’s 2020 and you’re still unsure of the benefits of a CRM? Here are 5 things you can do today with a modern CRM system.
Automatic Marketing
Add someone to your CRM and your CRM can automatically begin the process of turning that lead into a sale. How?
Let’s say you add someone from a trade show. You can have a set of processes that automatically run to email your new lead then have your salespeople followup and more. And all of this can happen without a single lead falling through the cracks.
Micro-Applications for different user types
Your CRM is not just for salespeople to remember phone numbers and appointments, it’s a tool for everyone who supports sales. But how can you ask non-salespeople to use it without being overwhelmed?
This is 2020. Today, you can create micro applications that work with the same underlying database, but show non-technical users only the data they need to complete their role. By building smaller apps, you bring better data in and it can make the whole organization stronger. (Microsoft Dynamics calls these Model-Driven apps. See our Blog Series on Model-Driven Apps.
Eliminate Data Silos
You know the pain of having your organization’s data spread across multiple systems if you don’t have a CRM in 2020.
A well implemented CRM gives your organization a single location where all of your organizations most valuable data can live. Until you have all of your data in a place you can work with it, you can’t gain insight from it.
Powerful reporting, including trends and projections
You’re losing ground to competitors if you still don’t have a way to visualize your company’s performance in real-time.
Today’s modern CRMs give you tools and insights you need to stay competitive.
Your CRM can work harder than your sales staff
The real magic of CRM happens when you realize your systems can work harder than your sales staff can.
You can setup automatons to hook into your website leads, chatbots to handle incoming leads on social networks, and integrations to work with any of your other custom apps.
Instead of training your sales staff, your investment lets you build once and then continuously improve, ever widening your moat on the market.
Contact Us for Help
Have questions about how a CRM system can benefit your organization? Feel free to reach out to reenhanced! Fill out our Contact Form with details about what you’re working on, or email me directly at nhance@reenhanced.com. Happy training!
One of our Dynamics 365 (On-premise v9.0) users is having a problem with their Quick Create Forms.
Whenever they click to open a Quick Create form from the top navigation or from a sub-grid, the modal that opens shows me the full default form instead of the quick create.
This user is using Google Chrome on a Windows 7 installation.
Mr. Slow Create
Dear Mr. Slow Create,
We’ve seen this issue happen when users are using Chrome on Windows 7. The solutions we’ve identified at this time are as follows.
If experiencing this in Chrome on Windows 7:
– Use an alternate browser such as Internet Explorer or Firefox. – Upgrade the impacted machine to Windows 10
On further digging, we were able to identify this with an error message in the developers console:
Cannot read property 'firstChild' of null
Our investigation discovered no quick fix so we’re diagnosing this as a browser incompatibility specific to Chrome on Windows 7.
Is my Dynamics 365 implementation built correctly?
Is it really supposed to work like this?
Does everyone else who uses Dynamics have the same pain points?
If so, you might be a good fit for a Dynamics 365 Rescue.
Dynamics 365 is supposed to be easy to use.
Microsoft has spent years working to make Dynamics 365 simple for all users and at the same time powerful enough to meet the needs of many different businesses. When properly customized, it can and should match the needs of your business so that your system provides you with all of the tooling you desire at the time you need it.
Dynamics 365 designed to grow with you. If it is getting in the way of your growth, it is built incorrectly.
Dynamics 365 is more valuable when everyone uses it.
Even when perfectly configured, some portion of your organization will struggle to use the software. User Adoption is something almost all users of Dynamics 365 struggle with and Microsoft is vocal about this being an area they want to improve.
Through a combination of training and intelligent system configuration, you can build a plan that will help all of your users realize the benefits of Dynamics 365.
Dynamics 365 should not feel too big.
Even though Dynamics 365 can run everything from a small 3 person business all the way to the world’s largest companies, it should only ever feel as large as the company using it needs it to be. It is not normal to have to work with extra entities (like Orders or Entitlements) when they don’t make sense for your company. Your system should only feel as big as your company needs it to be.
Proper configuration should keep those internals out of your way until your company grows large enough to need them.
Make sure you understand your business processes before you ask someone else to automate.
Ensure that your partner wants to understand your business processes.
Have an evolving User Adoption Plan. This is a long term effort.
We’re a specialist firm focused on rescuing struggling Custom Software and Dynamics 365 implementations. We truly love our customers and we believe the world would be better if companies like ours didn’t need to exist. Let’s work together to make that happen.
Here are 3 tips that can help you avoid becoming our customer.
When building automation into your business it’s vitally important to understand your business processes (and all edge cases) before asking your development partner to automate them. Only when you truly understand your business can you build automation that works the way you expect it to.
Companies that fail to fully understand their business before starting a software automation project (which includes Dynamics 365 implementation) often find that what they end up building does not match the reality of their business.
Realizing the need to change the software after it is built can cost up to 150 times the cost of understanding and planning ahead. Your most important work is to make sure you understand your business and can explain it to others who may know nothing about how your business works. Not always an easy task!
Work with an interested partner
Many partners are happy to do what you ask but not all of them will take the time to understand your business. When you choose to work with a partner who blindly implements what you ask them to do you may save a few dollars at the expense of an architecture that doesn’t match the realities of your business.
There are only two hard things in Computer Science: cache invalidation and naming things.
Phil Karlton
One of the most important pieces of building any software system is to ensure that the relationships between different types of data are modeled after the real world. If you work with a partner who doesn’t take the time or make the effort to understand your business, you miss out on this critical component of your system.
What you might end up with from a partner who isn’t invested in you is a system that looks like it works but because of how it is internally implemented, does not work in a way that will fit your business. Always choose a partner who takes the time to understand why your business works the way it does.
User Adoption is a journey
One of the most overlooked areas of Dynamics 365 implementations (and other software systems) is User Adoption. That is, the process of bringing new users of the system online and helping them be effective with the tools they’re given.
There are many different types of people in the world and your organization and userbase will contain a wonderfully varied mix of them. Do you have a plan for helping them understand what you’ve built?
If you aren’t lucky enough to have an internal “champion” who’s taken on the role of guiding new users you’ll need a plan that helps those who are new to your platform come up to speed. This area, above all others, is one of the most difficult challenges of the implementation of any software system.
Starting tomorrow (October 1, 2019) the way Dynamics 365 is licensed is changing. These changes will apply on your next annual renewal and represent a big change from how the products used to be licensed.
Understanding how things used to work
Prior to this change, Dynamics 365 was licensed on a selection “One Size Fits All” packages. Depending on what applications and features you needed, your accounts were licensed according to different bundles that would provide as much or more than needed for your account to function.
For example, if you needed to access Field Service and Sales, your only option was to purchase the Customer Engagement Plan, which would also give you access to Customer Service and Project Service Automation.
Now its a pay-per-app model
With the changes launched on October 1, pricing moves to a Base plus Attach model for licensing in which a Base application is selected and then one or more Attach licenses can be added to it to determine costs.
In this new model, many businesses can save costs in some areas and see price increases in others. Due to the way licensing is assigned, these costs may not always be clear.
Announcing the Dynamics 365 License Planner
In order to help you understand how these licensing changes impact you, we are releasing a Dynamics 365 License Planner tool to help you build your license plan and understand how your users will need to be licensed upon renewal.
Click the image above to visit the planner and start planning your license renewal today.
Click the image above to watch how the PowerApp updates Excel
For 100 days, I will be doing 100 push-ups a day. I built a PowerApp to track the push-ups I have done each day.
The PowerApp does the following:
Lookup a row from Excel containing today’s count
Calculate and display the remaining push-ups for today. Each day starts at 100.
Show a set of buttons for the number of push-ups completed.
When a button is pressed, update the Excel spreadsheet and show the remaining count. This will be covered in a future blog post
To get this project started, I needed my data in Excel. Starting with a blank worksheet, our data starts off like this.
Preparing the Excel file for use with PowerApps
Before you can connect an Excel file you will need to convert the data into a table. To do this, select cells that contain your data then use Insert > Table with the selected values to convert your data into a table.
Once your table is created, assign the Table Name and rename each of the Column Names to describe the data they contain.
I used the following for my table:
Table Name: pushupTable
Column1: Date
Column2: done
Click the image to watch how this is done
Creating your PowerApp
Next, we’ll visit https://make.powerapps.com/ to create a new PowerApp. We’re going to be creating a Canvas App for this project.
Create a blank canvas app (click to view)
This will give us a completely blank screen. You can use the Insert tab to add various items and place them.
Insert items into the canvas (Click to view)
To build the push-up tracker, we added the following fields:
Count label
“Remaining push-ups” label
1 button
5 button
10 button
20 button
25 button
50 button
With the layout completed, it’s helpful to give each field a meaningful name. You can double click the field name on the Tree view to rename each. You’ll access these within the coding portion of PowerApps so give each a name that will make sense if you have to maintain this later. You can also choose a color theme under the Home tab.
Next, we’ll move on to connecting this to Excel. First, you need to connect OneDrive for Business and select the Excel file and table that you want to use.
Why am I getting an error about no tables in my Excel file?
If you see this, you still need to convert your data into a table in order to use it as a data source in PowerApps. Follow the instructions here.
Once your table appears as a data source, your excel file is now connected.
Lookup a row from Excel containing today’s push-up count
Let’s look at our first requirement for our app: Lookup a row from Excel containing today's push-up count
Breaking this requirement down into steps, we need:
Access data from our connected data source pushupTable (The Excel table)
Locate a single row matching today’s Date
Find the value in the done column inside the matching row
Setting variables in PowerApps
Nearly all statements in PowerApps are function calls, which means setting a variable is possible only at the time of assignment.
What this means is you have two ways to assign variables. You can use Set() to assign a global variable (Meaning can be accessed from any screen) and you can use UpdateContext() and/or Navigate() to create or assign local variables (visible only from a single screen.)
Creating a global variable: Set(ThisIsMyGlobalVar, "This is the stored value");
Creating a local variable: UpdateContext({ thisIsMyLocalVar: "This is the local stored value" }); Navigate('Screen Name', ScreenTransition.Cover, { thisIsAssignedInNewScreen: 'Var only on Screen Name'})
PowerApp application startup
When a canvas app starts, it runs what is contained within App.OnStart and then displays the first screen in the tree view.
We’ll use App.OnStart to set a global variable pushupsToday that contains the row of Excel data that we care about and then use Navigate to create a local variable Count_text that contains the text for the Count label.
Why are we using Navigate if the first screen is shown anyway? We’ve chosen this path because we want to store Count_text as a local variable as it’s only used on this one screen.
In a simple app like this it doesn’t matter about our global variable usage but in larger apps it’s a good idea to keep variables scoped to only the places they will be used.
Accessing a specific row in Excel from your PowerApp
In order to find a row in our Excel table we use the LookUp function. Here’s the code we’re using:
This code looks up a Record from the table PushupTable and assigns it to the global variable pushupsToday.
Why is my Excel date off by one day?
You’ll notice some strange syntax in the Formula parameter of the LookUp function above. This syntax is required because of the way Excel handles Date fields.
In Excel, when you put a Date value in a column, it is stored internally as a DateTime value. For example, if you have a value of 09/16/2019 in an Excel cell, then behind the scenes Excel stores this as 09/16/2019 12:00AM (+0000) (This is in the UTC (+0:00) timezone).
Why is this important? When you pull this data into PowerApps, PowerApps will run in the timezone of the device it is run on. This means that both Date and Time values are converted into your local timezone.
In our case, we are in EST (America/New_York) (-0400). This means that when we enter a date of 09/16/2019 and Excel stores it as 09/16/2019 12:00AM +0000, PowerApps so helpfully converts it for us as 09/15/2019 8:00PM (-0400), which is the wrong date!
The way to fix this is to “push forward” the Date record rendered inside of PowerApps the value of TimeZoneOffSet being used by the PowerApp. This is required even if you aren’t storing Time data in your Excel records because of how Excel internally renders dates.
Thus, to work with Date values from Excel in a PowerApp, you need to do the following:
Timezones are one of the hard parts of computer programming.
Calculating and displaying the remaining push-ups for today
After we have the record stored in pushupsToday we use this to populate a local variable that we will assign inside our Pushup Status screen. To do this, we assign a Context parameter inside of a call to the Navigate function. Note that the call to Navigate isn’t required but is used here so we can push the variable into the right area. It’s not possible to create local variables from within App.OnStart any other way.
Here is the full code we’ve used in our App.OnStart:
We’ve assigned a local variable called Count_text with the text that we want to display on the big label. To assign the label to show the value for this, do the following:
Assigning the remaining push-ups to display (Click to watch)
Why are we using a variable to hold the text? When we assign Count.Text to a variable it will update whenever the value of that variable is updated. In a future blog post you’ll see how we use this to always display the most recent data from Excel so that our push-up count is always accurate.
Putting everything together
The first step in our PowerApp is now done. We are showing the remaining number of push-ups for the current day on top of the app. In coming blog posts we will cover how to enable each of the buttons and how we’ll use what we did today to dynamically update the remaining count so it is always accurate.
As a final walkthrough, lets run our app and show how all of the moving pieces are connected. View the image below to see how the values are captured from Excel and then used to display inside the app.
A very simple script that we’ll load into the OnLoad event of Lead form.
In this article, you’ll learn how to load a simple javascript extension into Dynamics 365 forms. Our example script is a single function that will execute during the OnLoad event for our Lead form. In future articles you’ll learn how to package full Angular and React applications and deploy them to your entities.
TIP: While today’s method is useful for an example, you won’t want to modify your forms directly like this. In future articles you will learn how to package your javascript into a solution that will allow you to more easily manage your releases.
The first step will be to create your javascript file as shown above. Our file is saved under the filename onload-example.js
Some important things to note at this time:
Your file must include a function that will be available in the global context.
If you are minifying a large application, you will need to know the name of the function to execute.
Dynamics will handle the import of this single script and will control when the method is executed.
Now that you have your javascript file, the next step is to load it into your Dynamics instance.
Loading Web Resources into Dynamics
A full overview of loading web resources
To load web resources into CRM, visit the Settings > Customizations page and click “Customize the System”.
Once that page loads click on “Web Resources” from the left column and then click “New” to add a new web resource.
Note the web resource will automatically be prefixed with new_ so when you are searching for it later, you’ll have to look for the filename you uploaded starting with that string.
Once you have named your file, select it from your file system and click “Save”.
You don’t need to publish new uploads but you will need to click publish when you change an existing web resource.
Once these steps are complete, your new javascript file is stored within the Dynamics filesystem.
Next we need to load this script into the Lead entity.
Attaching your Web Resource to Form Events
A full overview. We break this down into steps below
Now we will be modifying the form to add the new web resource to it. The first step is to open the form editor from the dropdown menu in the ribbon.
How to open the form editor
The form editor will open a new window and from there you’ll click on “Form Properties”.
Why do I use Form Properties instead of inserting a Web Resource?
Even though you upload your script as a web resource, we must use Microsoft’s Form Properties to insert the script and set it up for execution during the OnLoad event of the form. If you attempt to insert it as a web resource you won’t have the ability to connect it to the form events.
Next, you will click on “Add” to bring your Web Resource into the Form Properties. You’ll need to first add the web resource and then assign the resource to an Event Handler.
Below, you can see an animated example of how you can find your web resource (Remember, it was uploaded with a filename starting with new_) and attach it to the form event.
Inserting your script. Remember how it was prefixed with `new_` during upload? That makes finding it easy.
In this final steps shown above you pull together the file you’ve uploaded with the form and assign it to the Event Handler. Once completed, press “OK” and then Save followed by Publish on the Form Editor window.
You are done!
If you’ve enjoyed this article and would like to see more, please email us at javascriptforcrm@buildbettersoftware.com with ideas for what you would find helpful for future articles. We are always happy to answer questions and help you get more comfortable modifying CRM to meet your needs.
Recently, I helped a CRM Developer learn how to embed a view of his Audit History directly into his form. Keep reading for a step-by-step process explaining exactly how this is done and find a code sample you can download and use to power the same behavior inside your entity forms as well.
First, let’s look at what we’re inserting. Our view of the audit history will be the same view that you see when you select Audit History from the Form Navigation. If you’re using v9, it looks like this:
The Audit History that we want to show inside our form.
Now that we’re on the audit history page, let’s take a closer look at how this is displayed. If you use the Developer Tools for your browser, you’ll find that this view is shown inside an IFRAME which is how a lot of the components in Dynamics are displayed.
So now what we need to do is grab the URL for the IFRAME that’s showing the audit history. We will use this to build a web resource that we’ll be able to embed into our form. From the Audit History page, if using Chrome press Control + Shift + J to open the developer tools, then scroll to the iframe in the elements tab.
Hold on to this, because we’ll be using it to customize your web resource that will handle the embed of this IFRAME.
Open your favorite text editor and paste in the following in a file called web-resource.html:
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body style="height: 100%">
<iframe src="" id="areaAuditFrame" name="areaAuditFrame" scrolling="auto" isarea="1" frameborder="0" style="width: 100%; height: 100%"></iframe>
<script>
let auditLoader = window.auditLoader || {};
auditLoader.setIframe = function() {
const search = new URLSearchParams(window.location.search);
const recordId = search.get('id');
let element = document.getElementById('areaAuditFrame');
// TODO: Modify this with your url from the iframe
// Make sure you modify it to add ${recordId} where needed
element.src = `/userdefined/areas.aspx?formid=e3b6ddb7-8df0-4410-ac7b-fd32e5053d38&inlineEdit=1&navItemName=Audit%20History&oId=${recordId}&oType=4&pagemode=iframe&rof=true&security=852023&tabSet=areaAudit&theme=Outlook15White`;
};
auditLoader.setIframe();
</script>
</body>
</html>
Note: For the script above we have all of the code and display components in the same file. It’s a good idea to do this when possible because it will be easier to maintain the system if each modification is self-contained. If you ever need to remove this, you can remove the web resource and there are no further steps. Always think about how to minimize dependencies as you build your modifications.
What the code above does is the following:
It creates a blank IFRAME that takes up 100% of the space in the displayed Web Resource
It uses parameters passed to the web resource to set the src attribute of the IFRAME to the Audit History page, customized to load the correct record for the form where it is embedded.
You will need to change the element.src line to match the IFRAME url you copied above, making sure to replace the oId= section with oId=${recordId}.
Once you have your file, save it to your local machine. The next step is to upload this into your entity form. In our example, we add a section to the bottom of our form that will hold the Audit History because this component requires a lot of space to display.
Some things to note when you do this:
Mark the Web Resource type as HTML so that Dynamics knows the right way to display it.
Make sure you click the box inside Web Resource Properties to Pass record object type code and unique identifier as parameters. The script uses this to know what audit records to show.
You can reuse the script above to display any iframe you like into any entity form, all you need to do is change the element.src property.
Happy Modifications! If you liked this, please leave a comment.
Starting in Chrome 72 the way the file download process works has changed. For Dynamics users, this means that files are currently being downloaded with a ‘ character surrounding the files.
What this means is if a user downloads a file called Report.xls what actually happens is the file is downloaded as ‘Report.xls’ which causes the file to be unknown. There is no problem with the file itself, but this is very confusing for users.
The Solution
To fix this, users may rename the file to remove the apostrophe or if you like, I wrote a Chrome Plugin available for FREE that will automatically remove the apostrophe before download.
Download the extension from the Chrome Web Store here or click the button below.
I am new to CRM (under a year) and have been super frustrated with the single tics on downloads that were happening in Chrome. Today we got a Help desk ticket that i researched and found your chrome plug in…. [link to store]… It worked… Helped the customer right away… Thank you so much for this. I have a very tenured developer on my team that actually worked for Microsoft on the CRM team and he didn’t know how to fix this. Made me look like a rockstar for the day!!! Great plug in! Thank you,
Steven T. Parsley
Our firm is a heavy user of Dynamics CRM. We have been dealing with the CRM/Chrome export to Excel issue for a year. Our “solution” was not ideal. We either instructed users to use Internet Explorer or to associate .xlsx’ files to Excel. Nobody wants to use IE and the file association workaround was too difficult for users resulting in lots of Helpdesk tickets.
This extension worked exactly as described. We were able to immediately roll it across our firm via our Chrome Group Policy.
Thank you so much for providing a fix to a problem that should have been resolved by Google and/or Microsoft by now. Your firm is our hero!
Aaron Appelbaum, Laird Norton Wealth Management
To whom Concern, I have added extension which is provided by your company to chrome to fix download problem of Chrome on CRM 365. It is great and useful. thanks for your solution
Bahram T.
Have a great experience? Share a message with the hashtag #reenhancedtotherescue
If you haven’t built an automated test suite for your software application yet, you’re missing out on benefits that become more important the longer your application is useful. The five benefits below describe the long term advantages gained through disciplined testing of your software application.
Improve release quality. Rarely can a new feature be added without consideration for the impact it will have on existing functionality. Automated tests describe and execute your application’s features so your team can integrate your new features without introducing problems with existing features.
Adapt to change quickly. With a good test suite your development team can be freed from the fear of releasing new code to the point where you can comfortably deploy new changes every day. A properly constructed test suite ensures all business requirements are met and you’ll be able to nearly eliminate the need to manually test the application before release. With a deploy process tested daily, you can gain a competitive advantage in being able to adapt faster than any of your competitors.
Explore new technology. By relying on your test suite to verify complete operation of your application, you’ll be free to explore new technology stacks and gain advantages through software developed by others. It is for this reason that, in the long term, your automated tests can be arguably more valuable than the software application itself.
Freely adapt to changes to development team. Reduce your reliance on your original development team and gain freedom to explore different options to develop your software. By removing the need for developers to keep knowledge of feature interaction in their head, you can change your development team with greatly reduced ramp-up costs because you can rely on your automated test suite to verify the application.
Reduce liability. Your automated tests can validate that your application does what is expected and also that it acts correctly when prohibited actions are attempted. This provides you with a layer of protection to ensure you are not exposed to undue liability, and provides a defensible position should the time ever arise where your software’s operation is in question.
Learn more and get started with tests today with Reenhanced.