Category Archives: Dataverse
How We Built Smart Pitch — and What We Learned Along the Way
In today’s world, AI is no longer a luxury—it’s a necessity for driving smarter decisions, faster innovation, and personalized experiences. We have come up with our requirements for AI to support the conversion from MQL (Marketing Qualified Lead) to SQL (Sales Qualified Lead). How did the idea originate? In our organization, whenever a prospect reaches out to us, we search for company information like company size, revenue, location, industry type, contact person details, designation, decision-maker, and LinkedIn profile. This information helps the Sales team prepare better and deliver a stronger pitch by understanding the customer before the call. Also, during the MQL to SQL stage, we look for things like: This information helps the Sales team convert the prospect into a client and increases our chances of winning the deal. Earlier, this entire process was manual and time-consuming. So, we decided to automate it with an AI agent that can gather this information for us in just a few minutes. Implementation approach After the project was approved internally, we started exploring how to make it happen. Initially, we didn’t know where or how to start. During our research, we came across Copilot Studio, which allows us to build custom agents from scratch based on our needs. We learned about Copilot Studio’s and began building our agent. We named it Elevator Pitch. Version 1 Highlights: This feedback led to the idea for Version 2, which would automate more steps and also pull information from the internet. Version 2 Enhancements: Version 2 Features: Company & Contact information with a single click on MQL to SQL, the agent now generates the document within minutes—something that earlier used to take hours or even a full day. Live demo in Zurich & New York On 22nd May 2025, we had an event scheduled at the Microsoft office in Zurich with one of our clients, where we shared the Buchi journey with CloudFronts. We discussed how we collaborated to connect their multiple systems and prepared their data for insights and AI initiatives. At the same event, we had the opportunity to demonstrate our Smart Pitch product, which caught the audience’s attention. It was a proud moment for us to showcase our first AI product at the Microsoft office—delivered within just a few months of hard work. Our second opportunity came on 06 June 2025 in New York, at the AI Community Conference, where we presented again in front of a global audience. What Next in Version 3: So far, we have built this solution using Microsoft’s inbuilt Knowledge Center, ChatGPT API, SharePoint, company websites, and Dataverse. Since we were working with both structured and unstructured data, we faced some inconsistencies and performance issues. This led us to reflect and identify the need for Version 3 (V3), which will include: The development of Smart Pitch V3 is currently in progress. We’ll share our thoughts once it goes live. A demo video has also been shared, so you can see how smart and fast our Agent is at delivering useful insights. Delivering Answers in Minutes—Thanks to Smart Pitch I’d also like to share a quick story. One day, our Practice Manager was on leave, and we received a prospect inquiry about Project Operations to Business Central (PO-BC) pricing. I wasn’t sure where that information was stored, and suddenly our CEO asked me for the details. I was a bit stressed, unsure where to search or how to respond. Then I decided to ask our Smart Pitch agent the same question. To my surprise, the agent quickly gave me the exact information I needed. It was a big relief, and I was able to share the details with our CEO in just a few minutes—without even knowing where the document was uploaded. 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 Perform Data Transformation in Microsoft Dataverse
Microsoft Dataverse is a powerful data platform that supports secure and scalable data storage for business applications. However, raw data imported into Dataverse often needs transformation—cleaning, reshaping, filtering, or merging—to make it useful and reliable for apps and analytics. In this blog, we’ll show you how to apply transformations to data before or after it reaches Dataverse using tools like Power Query, Dataflows, and business rules—ensuring you always work with clean, structured, and actionable data. What is Data Transformation in Dataverse? Why Data Transformation Matters Data transformation refers to modifying data’s structure, content, or format before or after it’s stored in Dataverse. This includes: Step-by-Step Guide: Connecting a Database to Dataverse Step 1: Open the Power Apps and select the proper Environment Step 2: Open Dataflow in Power Apps and create a new Dataflow Step 3: Connect to the Database using SQL Server Database. Step 4: Add the required credentials to make the connection between the database and Dataverse. Step 5: Add the transformation in the Dataverse Step 6: Add proper mapping of the column and find the unique ID of the table Step 7: Set the schedule refresh and publish the Dataflow. Step 8: Once Dataflow is published, we can see the table in the Power apps To conclude, transforming data in Dataverse is key to building reliable and high-performing applications. Whether using Power Query, calculated columns, or Power Automate, you can ensure your data is clean, structured, and actionable. 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. Ready to improve your Dataverse data quality? Start with a simple dataflow or calculated column today, and empower your business applications with better, transformed data.
Share Story :
Bridge Your Database and Dataverse: Complete Integration Guide
Modern applications demand seamless, real-time data access. Microsoft Dataverse—the data backbone of the Power Platform—makes it easier to build and scale low-code apps, but often your enterprise data resides in legacy databases. Connecting a database to Dataverse enables automation, reporting, and app-building capabilities using the Power Platform’s ecosystem. In this blog, we’ll walk you through how to connect a traditional SQL database (Azure SQL or On-Premises) to Microsoft Dataverse. What is Dataverse? Dataverse is Microsoft’s cloud-based data platform, designed to securely store and manage data used by business applications. It’s highly integrated with Power Apps, Power Automate, and Dynamics 365. Key Features: Why Connect Your Database to Dataverse? Step-by-Step Guide: Connecting a Database to Dataverse Step 1: Open the Power Apps and select the proper Environment Step 2: Open Dataflow in Power Apps and create a new Dataflow Step 3: Connect to the Database using SQL Server Database. Step 4: Add the required credentials to make the connection between the database and Dataverse. Step 5: Add proper mapping of the column and find the unique ID of the table Step 6: Set the schedule refresh and publish the Dataflow. Step 7: Once Dataflow is published, we can see the table in the Power apps To conclude, connecting your database to Dataverse amplifies the power of your data, enabling app development, automation, and reporting within a unified ecosystem. Whether you need real-time access or periodic data sync, Microsoft offers flexible and secure methods to integrate databases with Dataverse. Start exploring virtual tables or dataflows today to bridge the gap between your existing databases and the Power Platform. Want to learn more? Check out our related guides on Dataverse best practices and virtual table optimization. We hope you found this blog useful. If you would like to discuss anything further, please reach out to us at transform@cloudfonts.com.
Share Story :
How to Trim and Remove Spaces from Multiple Columns in Power Query
Efficient data cleaning is a crucial step in any data preparation process, and Power Query makes it easy to handle common tasks like trimming and removing unnecessary spaces with functions that you can apply across multiple columns and queries at once. By creating and invoking a function, you can quickly trim and remove spaces from all the columns & tables you need, saving time and effort. In this blog, we’ll show you how to use Power Query functions to streamline your data-cleaning process. The power query we are going to use to trim text in columns is – (text as text, optional char_to_trim as text) =>letchar = if char_to_trim = null then ” ” else char_to_trim,split = Text.Split(text, char),removeblanks = List.Select(split, each _ <> “”),result=Text.Combine(removeblanks, char)inresult This Power Query function takes text as input and removes extra spaces or a specified character from a text string. It splits the text into parts, filters out empty strings, and recombines the cleaned parts using the specified character. If no character is provided, it defaults to removing spaces. The power query we are going to use to remove spaces from the text is – (InputTxt as text) => let Clendata = Text.Combine(List.Select(Text.Split(Text.Trim(InputTxt),” “),each _ <> “”),“”) in Clendata The Power Query function removes all spaces from a given text string. It trims the input, splits it by spaces, filters out blanks, and then combines the parts into a single string. The result is a clean, space-free text, ideal for standardized data preparation. Now, we have our power query function ready, we can use this function across multiple columns or dataset. To do so, go to Add Column > Invoke Custom Function > Your Power Query Function. To conclude, Cleaning and transforming data in Power Query become much easier and more efficient with the use of custom functions. Whether you need to remove spaces, clean multiple columns, or standardize text, these functions save time and ensure consistency across your dataset. By applying these techniques, you can handle large, messy datasets with ease, making your data ready for analysis or reporting. Start implementing these simple yet powerful methods today to streamline your data preparation process! 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 :
Building Custom Solutions with Low-Code Plugins: Part 1- Overview
Low-code development has revolutionized the way businesses build software applications. By providing a visual, drag-and-drop interface, low-code platforms enable developers to quickly create complex applications without writing much code. However, even with the power of low-code platforms, there may be times when you need to extend their capabilities to meet specific business requirements. This is where low-code plugins come into play. Low-code plugins are small pieces of software that can be added to a low-code platform to extend its functionality. In this blog post, we will discuss the benefits of using low-code plugins, the steps involved in creating them, and some tips for successful development. Benefits of Using Low-Code Plugins Low-code plugins offer a number of benefits for businesses, including: Steps in Creating a Low-Code Plugin The process of creating a low-code plugin typically involves the following steps: Tips for Successful Low-Code Plugin Development Here are some tips for developing successful low-code plugins: Example Use Cases Low-code plugins can be used to solve a variety of business problems. Here are some examples: Conclusion Low-code plugins offer a powerful way to extend the capabilities of low-code platforms and create custom solutions that meet specific business needs. By following the steps outlined in this blog post and incorporating the tips for successful development, you can effectively leverage low-code plugins to drive innovation and achieve your business objectives. Later we will see working of the Low-Code Plugin in Dynamics 365 CRM with an example. 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 :
Transform Document Management in Dynamics 365: Automate, Organize, and Scale Across All Entities with Custom Pages for Streamlined Document Handling
Introduction Document management is a critical aspect of any organization using Dynamics 365 CRM, and finding a simple, scalable solution can often be a challenge. In this blog, I’ll show you how PowerApps Custom Pages can transform your document handling experience. By leveraging model-driven capabilities, I’ve built a solution from scratch that allows you to handle multiple document templates at once without the complexity and clutter of traditional methods. Using Custom Pages, you can generate and organize documents across different entities directly within the Dynamics 365 environment, making it easy to scale your solution for any table or scenario. Let’s take a closer look at how Custom Pages can streamline and simplify document management for your organization. The Use-Case: Document Management Application Key Components of the Solution which I have chosen for this use-case and blog Step-by-Step Process Step 1: Create the Custom Page (refer to my previous blog if needed) Create a solution, create custom Page and then embed it into Model-Driven App. I’ve made a sample example below: Step 2: How to retrieve parameters when App is opened. For the App’s ‘OnStart’ property, enter the following code Step 3: Trigger Document Generation App (I have used a ribbon button to trigger using JS) You will need to write a JavaScript in order to trigger and display the Custom Page. Where to find the app name, you will find in the solution. My example is below Step 3: Trigger Document Generation Page Once the document is created, you can close the Page using X button. As per JS code, our code will navigate to Document Tab. Ensure the name of Document Tab is correct. Step 4: Automation to SharePoint Use PowerApps Connector and add your input parameters to it. In the Custom Page, do insert the newly created Power Automate flow and pass the input values respectively Also, once the flow is completed, you can send a response back to Custom Page using same connector but of different action ‘Respond to PowerApp or Flow’. Conclusion Conclusion This Custom Page use-case demonstrates how a thoughtfully designed solution can enhance productivity and user experience in Dynamics 365. By streamlining document creation and navigation, it reduces friction in day-to-day operations, empowering teams to focus on higher-value tasks. Whether you’re a technical developer or a functional consultant, this approach provides actionable insights for building powerful and efficient solutions. References 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. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
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 :
What Are PowerApps Custom Pages? Exploring its Features, Benefits, and Unique Capabilities
What Makes Custom Pages Unique? Key Differences Between Custom Pages and Canvas Apps Benefits of Using Custom Pages in D365 Conclusion In conclusion, Custom Pages stand out as a powerful tool for enhancing the functionality and user experience within the D365 ecosystem. By offering seamless integration with Model-Driven Apps, advanced design capabilities, and tailored interactions, Custom Pages provide users with a dynamic, responsive interface that feels native to the D365 environment. While Canvas Apps offer broader cross-platform flexibility, Custom Pages excel in scenarios requiring deep integration and advanced Model-Driven functionalities. Whether you’re looking to improve user engagement or create personalized, context-sensitive workflows, Custom Pages offer a unique advantage, making them an essential tool for any D365 implementation. 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 PowerApps Custom Page: Microsoft Documentation – Custom Page
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!!!