CRM Archives -

Tag Archives: CRM

How a U.S.-Based Steel Windows and Doors Manufacturer Built a Multi-Entity Business Process Flow in Dynamics 365 Sales

01Summary A manufacturer of custom steel windows and doors was running its entire sales pipeline through a default BPF that ended at the Opportunity stage. Once a deal was won, production tracking moved to spreadsheets and email threads. Sales could not tell a client where their order stood. Operations had no consolidated view of which orders were in engineering review, which were in fabrication, and which were waiting on finishing. CloudFronts designed and implemented a multi-entity Business Process Flow in D365 Sales that spans Lead, Opportunity, and a custom Order Fulfillment entity. The BPF now tracks every order through its production stages, from engineering sign-off through fabrication, finishing, quality inspection, and dispatch. Sales sees order status without calling the shop floor. Operations reports on production bottlenecks across the full pipeline. Table of Contents 01Summary→ 02Business Challenges→ 03Solution Overview→ 04Technical Approach→ 05Business Impact→ 06Conclusion→ 07Connect With Us→ 02About the Customer A manufacturer of custom steel windows and doors uses Dynamics 365 Sales to manage its customer relationships and order pipeline. The business builds bespoke, high-specification products where every order is unique, every unit requires individual engineering, and every delivery carries a direct reputational commitment to the client. 02Business Challenges Every product this manufacturer builds is bespoke. Every steel window and door is individually engineered, fabricated, and finished to specification. Every delivery carries a direct reputational commitment to the end client, whether that client is a homeowner, an architect, or a commercial developer. The sales cycle does not end when the deal is won. It ends when the product is delivered, installed, and accepted. The D365 Sales environment had been live for over a year when CloudFronts began the engagement. The standard Lead-to-Opportunity BPF was in place. The problems started the moment a deal moved to Won. Production tracking lived outside the CRM. Once an opportunity was marked as Won, the order moved to a shared spreadsheet. The operations team tracked engineering review, fabrication, finishing, and dispatch dates in separate columns. Version control was manual. Updates were delayed. Sales had no visibility into order status. When a client called to ask where their order was, the sales rep had to phone or email the shop floor. The answer took hours, sometimes a day. For a business built on bespoke, high-specification products, that delay eroded the client experience. No single view from inquiry to delivery. Management could report on pipeline (leads and opportunities) or on production (the spreadsheet), but not on the full journey from first inquiry to delivered product. There was no way to measure the total cycle time from lead capture to dispatch, or to identify where orders stalled. The lead form had accumulated 40+ custom fields. Contact data, project specifications, engineering notes, and production preferences were all on the Lead entity. Sellers filling in a new inquiry from a trade show had to scroll past glazing specification fields that only mattered later. The form was slow to load and difficult to use on mobile. No distinction between project types in the process flow. A residential architect requesting a quote for three casement windows and a commercial developer scoping a 200-unit curtain wall project followed the same BPF stages. The qualification criteria, production complexity, and delivery timelines are fundamentally different, but the system treated them identically. 03Solution Overview CloudFronts designed a multi-entity Business Process Flow that extends the sales process beyond the Opportunity into production. The BPF spans three entities: Lead, Opportunity, and a custom Order Fulfillment entity. Instead of ending at Won, the process flow continues through the production stages that define this manufacturer’s delivery commitment: engineering review, fabrication, finishing, quality inspection, and dispatch. The Lead entity was trimmed to fewer than 15 fields. Contact details, referral source, project type (residential or commercial), and initial product interest (windows, doors, curtain walls, or mixed) are the only data captured at the lead stage. Engineering specifications, production requirements, and order details move to the entities where they belong: the Opportunity and Order Fulfillment records. The Order Fulfillment entity tracks the production lifecycle of each won deal. Each fulfillment record is linked to an Opportunity and carries its own set of production stages, dates, owners, and status fields. Sales reps see a live production status on the opportunity record without accessing the shop floor system. Operations managers see a consolidated production pipeline across all active orders, with the ability to filter by stage, project type, and expected dispatch date. ⓘWhy extend the BPF instead of building a separate production tracker? A separate production module would have created two disconnected systems: one for sales, one for operations. By extending the BPF into Order Fulfillment, the entire lifecycle from first inquiry to delivery lives in a single process flow. The sales team does not need to switch systems. Reporting joins lead source, deal value, and production cycle time in one data model. And the BPF enforces stage gates that prevent an order from advancing to fabrication before engineering sign-off is complete. 04Technical Approach Entity Model The framework uses three primary entities in the BPF and two supporting reference tables. Entity Type Purpose Key Fields Lead Standard First contact: who the lead is and where they came from Contact name, company/architect firm, referral source, project type (Residential/Commercial), initial product interest (Windows/Doors/Curtain Walls/Mixed) Opportunity Standard Deal record: commercial qualification and proposal Estimated project value, product mix, unit count, expected order date, project timeline, sales stage Order Fulfillment Custom Production lifecycle: tracks each won order through manufacturing to delivery Engineering review status, fabrication start/end dates, finishing status, quality inspection outcome, dispatch date, delivery confirmation, Opportunity lookup Entity model for the multi-entity BPF framework The Order Fulfillment entity carries a lookup to the Opportunity. When an opportunity moves to Won, the BPF transitions to a new Order Fulfillment record. This record becomes the single source of truth for production status. The Opportunity record retains the commercial data (deal value, product mix, client details), while the Order Fulfillment record tracks manufacturing progress. 💡Keep each entity focused on one job … Continue reading How a U.S.-Based Steel Windows and Doors Manufacturer Built a Multi-Entity Business Process Flow in Dynamics 365 Sales

How AI-Powered Meeting Briefings Are Transforming Client Preparation for a Boston based Private Equity Firm

Summary We built an AI-powered meeting briefing solution on top of Dynamics 365 CRM that assembles a complete, structured briefing – customer details, meeting history, email insights, professional profile, and open action items – with a single button click, delivered in under 30 seconds. Powered by Azure Functions and Azure OpenAI GPT-4.1, the solution sits inside the existing CRM workflow with zero change to the tools the team already uses. Built for private equity and asset management firms where missing context isn’t just inefficient – it’s a credibility cost. Table of Contents 01Summary 02Customer 03Challenge 04Solution 05Architecture 06Briefing 07Intelligence 08Enterprise 09Benefits 10Why PE About the Customer Customer Overview Our customer is a US based private equity investment firm focused on partnering with and growing businesses over the long term. With a portfolio of investments and a strong emphasis on operational excellence and value creation, the firm required an AI-powered solution to streamline client preparation, consolidate information from multiple sources, and enable investment professionals to make more informed decisions before meetings. The Challenge Data Exists. Context Doesn’t. Modern CRM platforms are excellent at storing information. On their own, they’re not built to assemble it into something a person can use in the next fifteen minutes. It’s 8:45 AM. Fifteen minutes before an important client call, a relationship manager has four tabs open – CRM, Outlook, LinkedIn, and a folder of old meeting notes – trying to reconstruct the relationship before the call starts. Nothing here is missing. It’s just scattered. And the fifteen minutes meant for preparing get spent finding what to prepare instead. As firms manage more relationships – more portfolio companies, more LPs, more prospects – this problem doesn’t stay the same size. It grows with every account added to the book. A typical prep routine still looks like this: 01Reviewing CRM records for account history 02Reading through recent email threads 03Searching old meeting notes for what was actually discussed 04Looking up a contact’s current role and background 05Trying to remember what was promised – and what’s still open Each source holds something useful on its own. None of them, alone, tells the whole story – and stitching them together by hand is what actually eats the morning. The result is inconsistent prep, lost productivity, and context that depends entirely on who happens to be covering the account that day. Today 01Manually researching each contact across CRM, LinkedIn, and email 02Meeting notes scattered across CRM records, shared drives, and inboxes 03Generic AI summaries that miss relationship context 04Key background often missed before the meeting even starts With AI-Powered Briefings 01A structured briefing generated in the team’s own template, on demand 02Contact details, professional background, and CRM data pulled automatically 03Past meetings and email threads summarized with real context 04The team arrives prepared in seconds, not hours Turning CRM Data Into Meeting Intelligence One Click. A Complete Briefing. We built an AI-powered meeting briefing solution that sits directly on top of Dynamics 365 CRM — adding a single button to the record teams already work from, with no change to the existing workflow underneath it. 01 Click The relationship manager clicks “AI Meeting Insights” on the contact or prospect record – the trigger for everything that follows. 02 Gather Azure Functions orchestrates the retrieval: CRM history, grouped email threads, past meeting notes, and the contact’s public professional profile. 03 Analyze Azure OpenAI GPT-4.1 reads everything chronologically, identifying what was discussed, what’s outstanding, and the tone of recent exchanges. 04 Deliver A formatted briefing, built in the team’s existing template, lands in minutes — a progress indicator keeps the user informed while it runs. In practice, the full sequence — from button click to finished document – runs in under 30 seconds. Solution Architecture How It Works — End to End From a single button click in Dynamics 365 to a formatted briefing delivered in under 30 seconds. Inside the Document What’s Actually in the Briefing Instead of a generic summary, the output is built around the fields teams actually need before walking into a conversation. 01 Customer & Contact Details Pulled directly from the CRM record — no re-typing, no re-checking. 02 Previous Meeting Summary Condensed from historical notes into a concise interactions record. 03 Recent Email Insights Key topics and sentiment from the latest correspondence. 04 Business Overview A short, current description of the company and its context. 05 Meeting Attendees Who’s expected in the room, drawn from calendar and CRM data. 06 Professional Profile Reference Publicly available background on the contact, added automatically. The Intelligence Behind the Briefing Structured, Not Just Summarized What makes this different isn’t simply the use of Generative AI — it’s the structure behind it. Rather than summarizing documents in isolation, the model reads a customer’s engagement history chronologically: completed and upcoming meetings, attendees, recent conversations, sentiment, and open action items, resolved into one coherent picture. Every section of the briefing is mapped back to a defined source. Customer details come from CRM. Meeting summaries come from meeting records. Communication insights come from email. Profile information is referenced separately and flagged as such. That traceability is what keeps the output contextual and consistent, rather than a plausible-sounding but generic AI summary. It’s also reviewed, not just trusted. Fields the model is less confident about are flagged for a human to check, and the team approves AI-generated sections before a briefing goes out. The goal isn’t to remove judgment from the process — it’s to remove the search that used to come before it. Built for the Enterprise Enterprise-Ready by Design This runs inside the systems and controls teams already trust — not alongside them. 01 Role-Based Access Visibility follows existing Dynamics 365 security roles — no new permission model to manage. 02 Data Protection Data is encrypted in transit, credentials sit in a secure Azure vault, and only the fields needed reach the model. 03 Graceful Failure Handling A failed run is flagged clearly, prior briefing data stays intact, and the user can … Continue reading How AI-Powered Meeting Briefings Are Transforming Client Preparation for a Boston based Private Equity Firm

Bridging the Gap: How Sales Reporting Aligns Teams with Business Objectives

In today’s fast-paced business landscape, alignment between sales teams and overall business objectives is crucial for success. However, many organizations struggle with fragmented communication, misaligned goals, and inefficient decision-making. This is where sales reporting plays a transformative role. By leveraging accurate and real-time data, businesses can ensure that every department—from sales to marketing to finance—is working towards a unified vision. The Importance of Sales Reporting in Business Alignment Sales reporting is more than just tracking revenue—it’s a strategic tool that helps businesses: How Sales Reporting Aligns Teams 1. Data-Driven Goal Setting Sales reporting provides clear benchmarks for teams to measure performance. By using historical data, businesses can set realistic sales targets that align with revenue goals, ensuring that every department contributes to overall growth. 2. Transparency and Accountability When all departments have access to sales performance metrics, it promotes accountability. For example, if a sales team struggles with conversions, marketing can adjust its lead generation strategies accordingly. This ensures that teams are not working in silos but rather as a cohesive unit. 3. Optimizing Sales Strategies Regular sales reports highlight which products or services are performing well and which need improvement. Sales managers can use these insights to refine sales pitches, adjust pricing strategies, or reallocate resources to high-performing areas. 4. Customer Insights for Better Engagement Sales reports provide valuable data on customer behavior, preferences, and buying patterns. This enables teams to personalize their approach, leading to higher customer satisfaction and increased retention rates. For example: A mid-sized SaaS company struggling with declining sales implemented real-time sales dashboards to track performance across multiple teams. By analyzing the data, they: Example 1: CRM Dashboard for Sales Performance Analysis A CRM Dashboard, like the one shown below, helps businesses track critical sales metrics: By leveraging such dashboards, companies can make data-driven decisions, enhance collaboration, and ultimately align sales efforts with overarching business goals. Example 2: Sales and Brand Performance Dashboard Another example of effective sales reporting is a Sales and Brand Performance Dashboard, which provides: This level of visibility ensures that sales, marketing, and finance teams are working towards common business objectives, optimizing resources, and increasing profitability. To Conclude, sales reporting is not just about numbers—it’s about aligning teams with business goals to drive success. If your business is looking to improve sales performance, start by implementing data-driven reporting tools to enhance collaboration, optimize strategies, and achieve long-term growth. Want to learn more about how sales reporting can transform your business? Get in touch with us today for consultation! 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.

Automating Opportunity Timeline Updates for Owners and Sales Teams in Dynamics 365 using power automate

Posted On September 5, 2024 by Mithun Varghese Posted in Tagged in

What is Opportunity in D365 CRM? The opportunity table represents a potential sale to new or established customers. It helps you to forecast future business demands and sales revenues. You can create a new opportunity in Dynamics 365 for Customer Engagement to monitor an inquiry from your existing customer or convert a qualified lead into an opportunity. Opportunities are frequently used by salespeople to monitor the sales engagements they are presently working on. For More details, please follow the linkhttps://learn.microsoft.com/en-us/dynamics365/sales/developer/opportunity-entities What are Notes in Timeline Section of D365 CRM? The timeline makes the entire history of activities visible to app users. The timeline control is used to capture activities like notes, appointments, emails, phone calls, and tasks to ensure that all interactions with the related table are tracked and visible over time. Use the timeline to quickly catch up on all the latest activity details. For More details, please follow the link https://learn.microsoft.com/en-us/power-apps/maker/model-driven-apps/set-up-timeline-control Use Case: Using Power Automate, whenever the notes in the Opportunity’s Timeline are updated, an automated email will be sent to the Opportunity Owner and associated Sales Team in the timeline of that Opportunity. Steps: – Login to make.powerautomate.com with your CRM credentials and you will land onto this page. – Once you have landed into Power Automate Page, click on Create and selected Automated Cloud Flow – Set your Trigger as the below since the flow should start working only when the Notes are added in the timeline of the Opportunity. – I have also set a certain condition to this flow.  In other words, it checks whether there is a non-empty value in _objectid_value and that this value’s type is ‘opportunities’. The expression returns true if both requirements are satisfied and returns false otherwise. – The Expression is @and(not(empty(triggerOutputs()?[‘body/_objectid_value’])),    equals(triggerOutputs()?[‘body/_objectid_type’], ‘opportunities’)) – Then Initializing variable for Email Addresses – Initializing variable for Notes Table – Retrieving the Owner’s Email Address. This step is necessary to obtain the Opportunity Owner’s email address so that we can send the initial notification email to them. – List All Notes in the Opportunity. We use the List rows action to retrieve multiple Note records associated with the Opportunity. This allows us to access all the notes within the Opportunity’s timeline. – Get opportunity by ID. Here we are fetching the complete details of to access all the fields and data associated with the specific record. We are filtering out based on name and opportunity id. The row ID is typically obtained from another step in your flow, such as a “List rows” action or a trigger that provides record details. My record details where I need fetch details is from Opportunity.  – After retrieving the record, we need to fetch details of the associated Sales Team. This ensures that whenever a record is linked to the Sales Team, all members of the Sales Team receive an email notification. Thus, we are connecting the Sales Team to the Opportunity to include them in the notification process. The Fetch XML needs to be taken from Advanced Find in CRM. – In this step, we need to store the email address of the sender (i.e., the “From” user). We initialized this variable in step 3, so here we will save the GUID of the sender into that variable. – In this step, we need to save the email address of the recipient (i.e., the “To” user). We initialized this variable in step 3, so here we will store the GUID of the recipient into that variable. a participationtype mask of 2 indicates a specific participant role or type, i.e., sales team members associated with this Opportunity. – Next, we need to ensure that the content is structured within a table. As specified in step 6, I created a variable called `NotesTable` to hold this data. We will use this table to format the content into an HTML table for the email. – In this step, we are configuring the URL link for the Opportunity. Include the base URL of the environment and append the unique identifiers for both the Opportunity and the Topic field (which is a field within the Opportunity). – Sending an Outlook Email to the Opportunity Owner and Sales Team associated with the Opportunity. This Outlook mail works only if ‘Email Addresses Sales Team is Skipped’. – In Power Automate, adding a new row typically involves using actions provided by connectors such as Dataverse, SQL Server, SharePoint, or others, depending on where your data is stored. Here we have created an email body in this action. – In this step, we are using a bound action to send emails within the CRM system. Output: – Once, I click on Add Note, waiting 5-10 seconds and then you find the email within the timeline. Please note that the Email is tracked within CRM itself. – Below is the Opportunity which contains the Opportunity Owner, and the Sales team associated with that Opportunity. The Owner is CF Admin, and the Sales Team Members are Amit Prajapati, Ethan Rebello and Mithun Varghese. – The Opportunity Owner and Sales Team will receive notifications about the Notes in the timeline. All email interactions will be tracked in the Opportunity’s timeline, where you can also view all previous notes associated with this timeline. Conclusion: Automating bulk case resolution using Power Automate in Dynamics 365 CRM offers an efficient way to streamline your workflows and reduce manual errors. By setting up automated email notifications for updates in the Opportunity’s timeline, your sales team and opportunity owners stay informed, ensuring smoother communication and faster response times. We hope you found this article useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfronts.com

Trigger Power Automate Flow using JavaScript – Uni-Directional

Hi All, Did you know you can use JavaScript to trigger Power Automate flows and pass input data? So, I’ll show you how to do that, as well as how to pass strict structured data and dynamic schema in Power Automate. In the next blog, I’ll talk about Trigger Power Automate Flow using JavaScript – Bi-Directional Steps to follow for Initial Setup Step 1: Let’s create a Power Automate Flow and define the input JSON schema.Go to: Power Automate Create an Instant Flow with the trigger ‘When a HTTP request is received‘ Step 2: Let’s outline the input schema and then focus on the output in a ‘Compose’ block. I’ll describe two types of inputs. (Strict and Dynamic).Our strict schema will be identified by a specific pattern indicating how the input should be given.Our dynamic schema will be recognised by an unknown pattern, and input will not always be fixed. Click on ‘Use sample payload to generate schema’. Apply the following code, click on Done and you will see the schema in ‘Request Body JSON Schema’. Add a Compose Block to check the output of the request and save the Flow. URL will be generated and is ready to be used. Let’s now proceed to create JavaScript to trigger this flow Steps to follow for calling Flow using JavaScript Since I’ll show the code snippet, adjust it as per your use case. Note: Copy your HTTP Post URL from the trigger as it will be used in the JavaScript Step 1: Type the following code Step 2: Execute the JS with ‘TriggerFlow.Main()‘. Note: Make sure you pass Execution Context to the JS Step 3: Check your Power Automate Flow History and open the Run. That’s how Power Automate is triggered using JavaScript. Hope this has helped you 🙂 Next blog – Trigger Power Automate Flow using JavaScript – Bi-Directional

Make form read-only using JavaScript 

Posted On September 23, 2022 by Richie Jacob Posted in Tagged in ,

One way to lock down a form is through JavaScript. Let’s go through how to do this by looking at the code. var formCustomizations = { disableForm: function (executionContext) { let formContext = executionContext.getFormContext(); let formControls = formContext.ui.controls; formControls.forEach(element => { if (element.getName() != “” && element.getName() != null) { element.setDisabled(true); } }); } } Here when the JavaScript Function Is called and the execution parameter is passed, the user can see the desired output. formContext.ui.controls; Provides the properties and methods to retrieve information about the user interface (UI) controls for several sub-components of the form. formControls.forEach(element => { if (element.getName() != “” && element.getName() != null) { element.setDisabled(true);} Here the forEach loop will traverse and see if there are any fields that are not blank and the field value is not null, then set all that fields to read only on that form. Hope this helps!

Create new records in CRM from JSON data in Blob Storage

If you want to create new records from a json data, you can do it by using Logic App. First you need to make sure to upload json file in blob container Steps for Logic App: First select a HTTP Trigger block in a new logic app designer Next step is to select Get blob content (V2) and choose the storage account name and the blob file where you uploaded the json file. Note: If you don’t have a connection to Blob Storage account already you need to create one by clicking on change connection and the Add New. You need to fill the details properly to create a correct connection. Access Key of the storage account can be found in Storage account in access keys section Now select Parse Json block to extract all values. Click on use sample payload and paste your payload there to get a schema. Note: In Content if you directly put File content then you will get error after you run the logic. Error: You get this error so for the you need to convert the octet-stream file to json file by writing the following function json(body(‘Get_blob_content_(V2)’)) Now once your json is parsed you need to create record in CRM using this data by selecting Create a new record block in CRM. You need to first sign in with your CRM account and then choose the organization and entity. Later you need to map the fields. Note: If there are mulitple records in json then the logic app will automatically take the create new record block in  for each block as a step. Now the records will be created in CRM.

Event Based Processing – Creating a Request/Reply Map in Tibco Scribe Online

In this Blog a Request/Reply Map is created to verify the Event based map which can send and receive data. This can be done a number of ways but Postman is more commonly used utility that can be used for this purpose. Login to app.scribesoft.com and select the Organization as CloudFronts Technologies LLP. To Create a new Solution click on the + Button and Select Integration Event Now Rename the Solution and in the Maps section, click on the three ellipsis and select Create Request/Reply Map to create a new Map. Now Rename the Map and Add Connector. You can Create a new Connector or select any connector which is already created. Create a Map as shown below. In Wait for Request Block, click on Request and add field names as desired and Click on Validate and then OK. In Create Block, in General Tab and add the entity name in which you want to integrate. In Fields Tab, map the important fields and click on OK. In Build Reply Block, in the Fields tab drag and drop the fields from Results section to the Target Connection side and the click OK. Once the Map is created then Click on Apply and OK. Again open the map and copy the Endpoint URL. Now in Postman click on + icon and Add a request. Select POST and paste the Endpoint URL, then in Authentication tab select No Auth. In the Headers tab, enter the Key and the value as shown In the Body tab, select raw and select JSON, then type the JSON Format and enter the field and value as desired. Click on Send. You will get this as result in the Body section. In Tibco, in the execution history you can see the process is completed successfully. In CRM, you can now see the Record is created.

Disable field on change of tab in D365 CE

Use case – Our requirement is to enable field description field on invoice line form on clicking of tab General. Let’s see how we can achieve this Solution – Step 1 – Create web resource with below function- var invoiceLineCustomization = {     unlockField : function(executionContext)     {         var formContext = executionContext.getFormContext();             formContext.getControl(“description”).setDisabled(false);     }, } Step 2: Add this web resource on tab property event TabStateChange and try. (path to go to event tab – Click on tab -> change properties -> event) Output – Hope this helps !

Disable field in Business Process Flow in D365 CE using JavaScript

Use case – Our requirement is to mark field Purchase time Frame disabled in Business process flow on change of disable field(custom field) on opportunity form. Let’s see how we can achieve this Solution – Step 1 – Create web resource with below function- Add header_process before schema name of field. Here schema name of purchase time frame field is purchasetimeframe. And after adding header_process_purchasetimeframe var opportunityCustomization = {     //opportunityCustomization.disableField     disableField : function(executionContext)     {         var formContext = executionContext.getFormContext();         var disable = formContext.getAttribute(“cf_disable”).getValue();         if (disable == true)         {             formContext.getControl(“header_process_purchasetimeframe”).setDisabled(true);         }     } } Step 2: Add this web resource on form load, on Save and on change of the field. And try Output – Hope this helps !

SEARCH :

FOLLOW CLOUDFRONTS BLOG :

FOLLOW CLOUDFRONTS BLOG :


Categories

Secured By miniOrange