Category Archives: Model-Driven App
Managing Post-Delivery Service and Repairs Using Cases in Dynamics 365 CRM
Why This Matters Imagine you’ve just delivered an order, and now there’s a service issue or repair request from the customer. What’s the best way to track and resolve that? That’s where Cases come in. This blog walks you through how your company can use Cases in Dynamics 365 CRM to efficiently handle post-delivery service and repair requests—directly linked to the order fulfillment process for better visibility and control. Let’s break it down step by step. Step 1: Navigate to Cases from an Order Fulfillment Record Start by opening the Order Fulfillment record.Click on the “Related” dropdown and select “Cases” from the list. This takes you directly to all service cases related to that order. Step 2: Create a New Case Click on the “New Case” button in the Cases tab. A Quick Create: Case form appears. Here’s what you’ll see and fill in: Optional fields like Contact, Origin, Entitlement, and others can be filled in if needed.You can also include details such as First Response By, Resolve By, and Description, depending on your business requirements. Once done, hit Save and Close. Step 3: View All Related Cases After saving, you’ll see a list of all Cases associated with the order under the Case Associated View. Each entry includes key info like: This makes it easy to monitor all service activity related to an order at a glance. Step 4: Manage Case Details Click on any Case Title to open the full Case record. From here, you can: Step 5: Monitor Service Performance Navigate to Dashboards > Service and Repair to track ongoing Case performance. Here’s what you’ll see: This allows your company’s service team to monitor progress, manage workload, and identify recurring product or fulfillment issues. To conclude, by following this process, your company ensures that every post-delivery service or repair request is captured, tracked, and resolved—while keeping everything connected to the original order. It’s simple, efficient, and fully integrated into Dynamics 365 CRM. Hope this helps!!! I hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfronts.com.
Share Story :
Automatically Update Lookup Fields in Dynamics 365 Using Power Automate: From Custom Tables to Standard Entities
Imagine this: you update a product’s purchase date in a registration record and—boom—a related case automatically gets refreshed with the accurate “Purchased From” lookup. Saves time, reduces errors, and keeps everything in sync without you lifting a finger. Let’s walk through how to make that happen using Power Automate. The goal: When a Product Registration’s cri_purchasedat field is changed, the system will retrieve the related “Purchased From” record and update any linked Case(s) with the appropriate lookup reference. Let’s break down the step-by-step process of how this is done in Power Automate. Step 1: Trigger the Flow When Purchase Date Changes Flow trigger: When a row is added, modified, or deleted (Dataverse) This setup ensures that our flow only fires when that specific date field is modified. Step 2: Pull in the “Purchased From” Record Next, use List rows on the “Purchased From” table with a FetchXML query. We’re searching for a record whose name matches the updated cri_purchasedat. Set Row Count to 1, since we expect only one match. 3. Identify Any Linked Case Records Add another List rows action, this time on the Cases table. We look for records where cri_productregistrationid equals the current product registration’s ID:We now use the List Rows action to fetch all related Case records tied to the updated Product Registration. This time we’re targeting the Cases table (which is internally incident in Dataverse) and using a FetchXML query to match records where cri_productregistrationid equals the current record being modified. This step is critical because it gives us the list of Case records we need to update, based on the link with the modified product registration. <fetch> <entity name=”incident”> <attribute name=”incidentid” /> <attribute name=”title” /> <attribute name=”cf_actualpurchasedfrom” /> <filter> <condition attribute=”cri_productregistrationid” operator=”eq” value=”@{triggerOutputs()?[‘body/cri_productregistrationid’]}” /> </filter> </entity></fetch> 5. Before updating anything, we add a Condition control to ensure that our previously fetched Purchased From record exists and is unique. Why? Because if there’s no match (or multiple matches), we don’t want to update the Cases blindly. We check if this length equals 1. If true → move forward with updates.If false → stop or handle the exception accordingly. To conclude, this kind of validation builds guardrails into your automation, making it more robust and preventing incorrect data from being applied across multiple records. After confirming a valid match, the flow loops through each related Case and updates the “Actual Purchased From” field with the correct value from the matched record, ensuring accurate linkage based on the latest update. Once this step runs, your staging automation is complete—with Cases now intelligently updated in real-time based on Product Registration changes. We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.
Share Story :
Automated Email Reminders Based on Date Fields in Power Automate for Dynamics 365 CRM.
Managing reminders and deadlines can be tricky, especially when you’re juggling multiple tasks in Dynamics 365. But what if you could set up automatic email reminders based on specific dates? In this guide, I’ll show you how to use Power Automate with D365 CRM to send automatic email reminders when certain dates are entered, and follow up at 7, 14, 21, and 28-day intervals if another related date field isn’t filled. By the end of this post, you’ll learn how to create a simple workflow that keeps your team on track by sending timely reminders when needed. The Use-Case: Automatic Email Reminders for Unfilled Dates Imagine this: Your Project Manager fills in a date for a project milestone. But if the next milestone isn’t updated after a set period, your system will automatically send reminder emails to the right people. This saves your team from having to manually follow up and ensures that important dates are never overlooked. Here’s how you can set it up using Power Automate: Key Components of the Solution Follow the Power Automate step outlined below: Select the “When a row is added, modified or deleted” trigger from the Dataverse connector, set the Change Type to Modified, choose the Order Fulfillments table, set the Scope to Organization, specify the columns cf_submittalprotocolprocess and cf_initialshopdrawingssubmitted to trigger only on changes to those fields, and optionally use the Filter Rows field to apply additional conditions if needed. Click the ellipsis (three dots) on the top-right corner of the trigger card, select Settings, scroll to the Trigger Conditions section, and enter the following expression to ensure the flow only triggers when cf_initialshopdrawingssubmitted is not empty: Below is the condition that you need to add: @and( not(empty(triggerOutputs()?[‘body/cf_initialshopdrawingssubmitted’])), equals(triggerOutputs()?[‘body/cf_submittalprotocolprocess’],979570001) ) Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Opportunities, and use the dynamic value Opportunity (Value) for the Row ID to retrieve the corresponding Opportunity record related to the modified Order Fulfillment. Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Order Fulfillments, and use the dynamic value Order Fulfillment for the Row ID to retrieve full details of the modified Order Fulfillment record. Add a “Compose” action named Comments for Email, and provide a formatted list including Project Manager (Order Fulfillment), Opportunity Contact, Secondary Contact, a static email (e.g., testblog@gmail.com), and again Project Manager (Order Fulfillment) as an example. Add a “Filter array” action, set the From field to a coalesce(…) expression generating a list of participants, and in Basic Mode set the condition to Item is not equal to null to remove null entries. Use a coalesce(createArray(…)) expression to conditionally construct an array of activity parties based on field availability (Opportunity Contact, Secondary Contact, Owner ID, Project Manager), falling back to a default address (CRMAdmin@gmail.com) if the Project Manager is null. coalesce( createArray( if( not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], null)), json(concat( ‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], ‘)”}’ )), null ), if( not(equals(triggerOutputs()?[‘body/_ow_secondarycontact_value’], null)), json(concat( ‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, triggerOutputs()?[‘body/_ow_secondarycontact_value’], ‘)”}’ )), Null ), if( not(equals(triggerOutputs()?[‘body/_ownerid_value’], null)), json(concat( ‘{“participationtypemask”: 3,”addressused”: “testblog@gmail.com”}’ )), null ), json(concat( ‘{“participationtypemask”: 4,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’ )), if( not(equals(outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], null)), json(concat( ‘{“participationtypemask”: 1,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’ )), json(concat( ‘{“participationtypemask”: 1,”addressused”: “CRMAdmin@gmail.com”}’ )) ) )) Switch to Advanced Mode in the Filter array and use the expression @not(equals(item(), null)) for better control over null filtering of the dynamic participant list. In the step below, I used a “Compose” action to extract the Project Manager’s ID, which is then used in the filter array step. Below is the body of the Filter Array, which I’ve saved in a new Compose action named “Email Participants.” Add a “Compose” action to generate the email body using HTML formatting, apply an if() expression to dynamically insert the recipient’s name, and use concat() to list the required items for fabrication. Below is the expression I used to identify all the recipients who will be receiving the emails. if( not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], null)), concat(‘<strong>’, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], ‘</strong>’), null After completing the previous steps, add a parallel branch with four parallel actions, each configured to send the email after a delay of 7, 14, 21, and 28 days, respectively. After introducing a 7-day delay, add a parallel branch that retrieves the corresponding Order Fulfillment record by ID and checks if both the Drawing Approval Date and Redline Issued Date fields updates have been made since the initial trigger Add the “Add a new row” action from the Dataverse connector, set the Table Name to Email Messages, populate the Activity Parties field using the dynamic output outputs(‘Email_Participants’), and map the Description field similarly with the appropriate output value containing the email body content. Set the Regarding (Order Fulfillments) field in the “Add a new row” action to the dynamic value Order Fulfilment (cf_orderfulfillment) to associate the email with the corresponding Order Fulfillment record. This is how the final power automate will look like Similarly, you can do for 14,21 and 28 days. Below is how the email would look like in CRM: The trigger will start when Initial shop drawings field contains the date field and Submittal/protocol process equals certain option. If both Redline Int Received and Drawing Approved Date fields remain empty after 7, 14, 21, and 28 days, CRM will automatically send a follow-up email on each of those days. This is how the email will look like. To conclude, setting up this automatic reminder system in Power Automate for D365 CRM will help your team stay on top of project milestones, reduce manual follow-ups, and make sure nothing gets overlooked. It’s a simple yet effective way to automate reminders and keep everyone informed without any extra effort. Hope this helps!!! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com
Share Story :
How to Display the ‘+New’ Quote Button Only for System Administrators Using JavaScript and Ribbon Workbench in Dynamics 365 CRM
Uploading and managing quotes efficiently is crucial for Dynamics 365 CRM users. However, sometimes you may want to restrict certain buttons, such as the ‘+New’ Quote button, to only users with specific roles, like the “System Administrator.” In this guide, I’ll walk you through how to achieve this by leveraging JavaScript and the Ribbon Workbench tool in Dynamics 365. This method allows administrators to control button visibility based on user roles, ensuring that only users with the correct permissions can access sensitive functionality. The Use-Case: Restricting Access to the ‘+New’ Quote Button for Non-Administrators. Imagine a scenario where your organization needs to ensure that only users with a “System Administrator” role can create new quotes in Dynamics 365. This is crucial for maintaining control over who can initiate important processes within your CRM system. Using JavaScript and Ribbon Workbench, you can easily customize the UI to hide the ‘+New’ Quote button for non-administrators. Here’s how this use case can be implemented: In this scenario, your team wants to ensure that only system administrators have access to the “+New” button for creating quotes in the system. For non-administrators, the button will be hidden from both the homepage subgrid and the main quote tab to prevent unauthorized users from creating quotes. By using the Ribbon Workbench tool, a custom JavaScript function is created to check if a user has the “System Administrator” role. If they do, the “+New” button remains visible, and they can create a new quote. For all other users, the button is hidden. Key Components of the Solution 1. Ribbon Workbench: The Ribbon Workbench tool allows you to customize the Dynamics 365 ribbon, enabling you to create custom buttons and define their visibility and actions. It is used to create the new custom “+New” Quote button, which replaces the default button while maintaining system integrity. 2. JavaScript Customization: Custom JavaScript is used to manage role-based access for the “+New” Quote button. The script checks the user’s role within Dynamics 365 to ensure that only users with the “System Administrator” role can view and use the button. This helps enforce security and restricts unauthorized users from creating new quotes. 3. Enable Rule for Button Visibility: An Enable Rule is set to control the visibility of the custom “+New” Quote button based on the user’s role. It ensures that only users with the “System Administrator” role can see and use the button, while hiding it for other users. 4. Custom Button Action (Command): The command linked to the custom “+New” button triggers a custom action (JavaScript function) to open the quote form. This ensures that the action associated with the button aligns with the business needs and provides a seamless user experience for administrators. Step-by-Step Process Sign in to Dynamics 365 using your URL, such as abc.dynamics.com, and enter your credentials or login to make.powerapps.com Create a solution and add the web resource. Once it’s done login to ribbon workbench from XRM toolbox and connect to your organization. After logging in, it is recommended to create a new solution for Ribbon Workbench in Dynamics 365. Ensure that no forms, views, charts, or other entities are included, as Ribbon Workbench may fail to upload the solution with excessive data. Only include the Quote entity with no additional dependencies. Ensure the existing +New Quote button is hidden, as modifying Microsoft-standard buttons is not recommended. Instead, create a new custom button and implement the functionality for creating a new quote Form using custom JavaScript. I have provided the code for this functionality as well. Ensure that the existing +New button for quote would be hidden from the homepage Subgrid and the quotes main tab. Next step would be to create a enable rule. Enable rule is used to control the visibility and availability of a button or command of the button. Name the id of your choice but make sure to add the suffix Enable Rule. Here, un-customised is set to False. By setting isCore (or Un customized) to false, you’re indicating that the button or element is a custom component, not part of the out-of-the-box (core) solution provided by Microsoft. This helps differentiate custom actions from the default ones in the system. Below is the code for the new quote form create and user role-based code. Make sure to select the Function name properly. After setting the enable rule, go to the Commands section in Ribbon Workbench and rename the command. A command defines the action triggered by a button click. Since this is a new button, you’ll need to add the custom form opening code. Below is the function for creating the form. Final Steps: Once the command is added, don’t forget to add the Enable rule that you have created above. Once the command is added, make sure to add all the rules we wrote into the custom button. The image also needs to be added so that the icon can be visible. My custom +New icon looks like this. Testing: Once everything is done, make sure Publish the changes. You can now try to log in from the user that has no System administrator role. Once logged in, you can see that button is not visible. Button will be only visible to user that have system Administrator role. User having no System Administrator role. You can see below that there’s no +New button displayed. To conclude, by following this guide, you can efficiently control the visibility of the ‘+New’ Quote button in Dynamics 365 CRM, making it accessible only to users with the “System Administrator” role. This ensures better control over who can create quotes in the system while maintaining the flexibility of user roles. We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.
Share Story :
A Step-by-Step Beginner’s Guide on Creating PowerApps Custom Pages in D365
Introduction In this guide, I’ll Walk you through creating your first PowerApps Custom Page in Dynamics 365. This beginner-friendly approach will demystify the process and include a high-level use-case to inspire your developing use-cases in creative and simple way. Why are Custom Pages good? Custom Pages are Model-Driven exclusive Pages that can be used with Dataverse/CRM easily, it can bring flexibility and power to your Model-Driven Apps by allowing tailored layouts, interactive designs, and seamless integration within Dynamics 365. Custom Pages supports Power FX commands which are not present in Canvas Apps. Step-by-Step Guide to Creating a Custom Page Step 1: Prerequisites and Environment Setup Ensure users have the necessary permissions and access to PowerApps Studio and Dynamics 365.Also, prefer using Solutions as pages are seen in solutions but not in Apps section. Step 2: Create a New Custom Page There are 2 ways to create Custom Page, I will highly recommend 1st point but 2nd point is also there for your knowledge. You will land to PowerApps Editor screen for Page after this Add desired content to the Page as per your use-case, for the blog purpose, I made a contacts page. Save your Custom Page and Publish it. [Note: Do save and publish the App] Step 3: Embed the Custom Page in Dynamics 365 Model-Driven App To add the newly created Page in your Model-Driven App, add the Model-Driven app to your solution and click on Edit For showing it on the Navigation Menu, do select checkbox. But if you want to show it Page as on-demand style/pop-up or JS triggered style then simply add the page to Model-Driven and hide it on Sitemap. [Note: Once completed, Do save and publish the App] Final Output Your Custom Page will be embedded directly to the Model-Driven App. That’s all for creating Custom Page in Model-Driven App. Conclusion Creating a Custom Page in D365 is a simple yet powerful way to enhance your Model-Driven Apps. With this guide, you’re ready to start building interactive, dynamic solutions tailored to your business needs. Hope my blog helps you! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com. Reference Links Microsoft documentation: Understanding Custom Page Microsoft Documentation: Create Custom Page Microsoft Documentation: Calling/Navigating to Custom Page
Share Story :
How to create and add/attach a custom activity-type entity to an existing entity in Dynamics 365 CRM
Introduction Activities are tasks or sorts of homework that we as a team perform when contacting a customer for example making a phone call, making an appointment or calls, and so on. You can set the status of this activity to complete pending or in progress. For more details, please follow the link: Activity entities (Developer Guide for Dynamics 365 Customer Engagement … Steps to create and add/attach a custom activity entity in D365 CRM Step 1: Log in to the required D365 CRM environment using the URL https://home.dynamics.com. by providing a username and password and selecting your environment accordingly. Step 2: Once logging into your Dynamics 365 CRM, select the model-driven app you are currently working on. In my case, it’s Sales Team Member. Step 3: Once you are in your app, Click on the Settings icon and select [Advanced Settings]. Step 4: Click on Solutions. Create a solution or go to an existing solution. Click on Entities once inside the solution and Click on New. Once you name your entity don’t forget to tick on the [Define as an activity entity] checkbox. You can also check boxes on other options according to your need. Step 5: You can also notice the other checkboxes in Communication & Collaboration column, most of the options are non-editable.It’s because we are enabling it as an activity entity. Hence, all the checkboxes related to the Custom Activity Entity get non-editable. Step 6: Now we have to add the custom activity which we created. Click on the entity with which you are working. Then go onto the Forms inside that Entity in which you are working. Step 7: In Forms, once you have done your customizations, Add the activity timeline by enabling it during the entity creation on which you are currently working (checkbox those 2 columns and that’s how you can view the activities timeline in Form). Step 8: Once done with the above step, click on Activities & Notes and you can view the Activities & Notes Timeline. Step 9: Double tap on the Notes timeline and go to Activities. Step 10: Select the custom activity which you created. In my case, it was Order Review. Step 11: Click Ok. Save and Close and don’t forget to Publish the Customizations. Once this is done navigate to the Dynamics 365 CRM Main Form. As you Can the custom entity which we created has been added. Step 12: Click on ‘Order Review’ and add the details. Also, remember you can add many fields to this custom entity as per your requirements. How to do that is by going back to the Solution and navigating to this entity(Order Review). Create or add a new field and then add the Field to the Form. Save and Publish the Customizations. Hope this Helps.!!!
Share Story :
How to add an Entity and fields in Global Search On Dynamics 365 CRM
Introduction Global Search for Microsoft Dynamics 365 is a custom module, which allows you to search across all CRM entities at the same time, providing results in a single-view convenient layout. For more details please follow the link: Global Search for Microsoft Dynamics CRM Online User Manual Adding an Entity and fields in Global Search On Dynamics 365 CRM Step 1: Log in to the required Power Apps environment using the URL https://home.dynamics.com. by providing a username and password and select your environment accordingly. Step 2: Once you have logged into your environment, click on the Settings Icon and select Advanced Settings. Step 3: Drop down Settings and then click on Administration. Step 4: After clicking on Administration, select System Settings. Step 5: Go onto the option Set up Search and then click on Select. Step 6: For FYI, you can select 10 Entities at a time for Global Search. So Select the 10 Entities according to your requirements. We can even sort the Entities using the options Move up and Move down. Step 7: As I have said in Step 5, the maximum number of entities that can be added is 10. Step 8: Once the above steps are done, Return to the below page and click on [Solutions]. Create a solution and add the required table which you wanted to show in Global Search. In my case, the table name is Order Fulfillment. So accordingly add your Entity/Tables. Step 9: Click on the Entity in which you are working inside the solution and click on Views. Step 10: Typically, the global search option in D365 CRM is associated with Quick Find View. Select the Quick Find Active Order Fulfilments view. Step 11: Add the Fields which are needed for View and Find Columns. FYI, in the main D365 CRM Form, the global search has the feature of displaying only the first 3 fields of that view. So insert the important 3 fields in the view first. Step 12: Once all the customizations are done, Save and publish the solution. Step 13: Return to the D365 CRM Main page of our Model Driven App and as highlighted below, click on that icon and try searching for the value of the field. For example, If you have added a field named ‘Order Number’, Try searching the value of that field. Step 14: Once I type the value, the entity in which the value has been present has shown up. For your information, only three fields will be visible once you do the global search and 10 Entities can be visible during the global search. Hope this Helps!!!
Share Story :
How to use Dataverse Global In-App Notification for Real-Time Notification in Model-Driven PowerApps
Hi All, Have you ever wondered how to use Dataverse In-App notification that can be helpful in many scenarios, I’ll give an overview of the usage with a use-case. Documentation Link Business Insights in Real-Time – Documentation This is the In-App Notification Let’s see how to create such an In-App notification Step 1: In order to use this In-App notification, we need to enable it. -> Go to Editor of Model-Drivel App -> Click on Settings -> Click on ‘Features’ -> Enable ‘In-App Notification’ Note: This In-App notification creates records in Dataverse, therefore the storage will be consumed. There’s also a time-based auto-deletion that can be configured by Admin. Step 2: Save & Publish your Model-Driven App. You will see a Bell Icon on the top-right of the App. Step 3: Now, we will create the notification. There are 3 ways to create the notification, Using JavaScript -> will be using in this example Using C# Plugins (Dataverse SDK) Using HTTP Request (Web API) Step 4: As example, I will be sending a Notification to me but you can configure it to send to anyone in the organization. Note: You must have the necessary permissions to do so, Admin can configure these privileges by customizing Security Roles for the ‘app notification‘ table Refer what type of format you want to display from the documentation link provided above Step 5: I’ve created a Web-Resource that triggers when I manually close the case, So when I close a case, here’s the output. Note: You can automate these and send to anyone.Some examples are:1. Automatic send Notification of new case created to assigned person.2. Automatic notification to the Team whenever a critical ticket is raised.3. Apart from these, you can have notification whenever a Business critical flow has been failed. Some of the best ways to use is with having rich user experience with Icons and formatting options that are available to use.Icons, font styling and mentioning anyone That’s how we can achieve In-App notifications. Hope this helped you!
