<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tectura Japan | DX</title>
    <description>The latest articles on DEV Community by Tectura Japan | DX (tecturajpndx).</description>
    <link>https://dev.to/tecturajpndx</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13534%2F228289e2-62fc-4e7c-9c4e-d230bc9f960c.png</url>
      <title>DEV Community: Tectura Japan | DX</title>
      <link>https://dev.to/tecturajpndx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tecturajpndx"/>
    <language>en</language>
    <item>
      <title>D365 Customer Insights for Our Own Sales Team (Customer Zero) (5) Setting Up Customer Insights - Journey</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Thu, 16 Jul 2026 01:00:03 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-5-setting-up-customer-insights--133</link>
      <guid>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-5-setting-up-customer-insights--133</guid>
      <description>&lt;p&gt;This continues from &lt;a href="https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-4-error-handling-16pc"&gt;Part ④&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When you open Customer Insights - Journey, the segments created in Customer Insights - Data are visible. The integration appears to be working correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Journey for Segment ①
&lt;/h2&gt;

&lt;p&gt;With "① License expiring within 90 days" checked, click the &lt;strong&gt;"New journey"&lt;/strong&gt; button to start building the journey.&lt;/p&gt;

&lt;p&gt;Configure it so that a next-action recommendation is sent to customers who newly meet the segment condition.&lt;/p&gt;

&lt;p&gt;This brings up the journey canvas. Clicking the &lt;strong&gt;"+"&lt;/strong&gt; button opens a panel where you can add steps to the journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a Custom Trigger
&lt;/h2&gt;

&lt;p&gt;Select &lt;strong&gt;"Custom trigger"&lt;/strong&gt; and use the search field to create and add a new trigger.&lt;/p&gt;

&lt;p&gt;Configure the contents of the trigger, then complete the attribute mapping.&lt;/p&gt;

&lt;p&gt;The mapping is now complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;In the next part, we'll continue configuring Customer Insights - Journey and build the corresponding Power Automate flow on the receiving end.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>customerinsights</category>
      <category>d365sales</category>
      <category>dynamics365</category>
    </item>
    <item>
      <title>D365 Customer Insights for Our Own Sales Team (Customer Zero) (4) Error Handling</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Thu, 16 Jul 2026 00:01:38 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-4-error-handling-16pc</link>
      <guid>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-4-error-handling-16pc</guid>
      <description>&lt;p&gt;This continues from &lt;a href="https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-3-fixing-the-d365-sales-n0n"&gt;Part ③&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We have the system set to refresh data daily, but unexplained errors can sometimes occur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symptoms
&lt;/h2&gt;

&lt;p&gt;The segments were not properly configured as expected.&lt;/p&gt;

&lt;p&gt;Checking &lt;strong&gt;System → Schedule&lt;/strong&gt; showed that the automatic refresh schedule itself was fine. The data source refresh also appeared to have no issues.&lt;/p&gt;

&lt;p&gt;Opening the &lt;strong&gt;Unify&lt;/strong&gt; screen, everything looks like it succeeded at first glance — but checking the &lt;strong&gt;Performance&lt;/strong&gt; screen reveals that something is failing during unification. Drilling in further, the failure is happening at the &lt;strong&gt;Customer Profiles&lt;/strong&gt; step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Attempt to manually re-run just the "Customer Profiles" task → Error persists&lt;/li&gt;
&lt;li&gt;Redo everything manually from the data source refresh step onwards&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This resolved the issue successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Since this is not a misconfiguration issue, patient repetition of the refresh process is enough to recover. Hopefully this saves someone some troubleshooting time.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>dynamics365</category>
      <category>customerinsights</category>
      <category>d365sales</category>
    </item>
    <item>
      <title>D365 Customer Insights for Our Own Sales Team (Customer Zero) (3) Fixing the D365 Sales Customization</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Wed, 15 Jul 2026 23:47:13 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-3-fixing-the-d365-sales-n0n</link>
      <guid>https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-3-fixing-the-d365-sales-n0n</guid>
      <description>&lt;p&gt;This continues from &lt;a href="https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-2-building-segments-33ab"&gt;Part ②&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As part of Customer Zero, we planned to extract customers with no contact activity in the past 90+ days and send activity recommendations to sales reps. To support that segmentation, we had added a "Last Activity Date" field back in &lt;a href="https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-1-setting-up-customer-insights--3mng"&gt;Part ①&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, the Power Automate flow wasn't running, and we discovered the following.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: &lt;code&gt;activitypointer&lt;/code&gt; Cannot Be Used as a Dataverse Trigger
&lt;/h2&gt;

&lt;p&gt;Due to a Dataverse platform constraint, it is not possible to register a trigger (callback registration) against the &lt;code&gt;activitypointer&lt;/code&gt; entity.&lt;/p&gt;

&lt;p&gt;This is because &lt;code&gt;activitypointer&lt;/code&gt; is not a real table with its own data — it is an abstract aggregation view that surfaces records across multiple concrete activity tables: &lt;code&gt;task&lt;/code&gt;, &lt;code&gt;phonecall&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;appointment&lt;/code&gt;, and others. Power Automate's Dataverse trigger ("When a row is added, modified or deleted") does not support detecting changes on abstract entities like this. In other words, specifying "Table: Activity (activitypointers)" as the trigger target was a fundamentally unworkable design from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Instead of a single &lt;code&gt;activitypointer&lt;/code&gt; trigger, you need to create a separate trigger for each concrete activity table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the C-6 flow in edit mode&lt;/li&gt;
&lt;li&gt;Change the target table of the current "When a row is added, modified or deleted" trigger from &lt;code&gt;activitypointer&lt;/code&gt; to a concrete table (e.g., &lt;code&gt;task&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Apply the same logic (update the related Account when &lt;code&gt;statecode = 1&lt;/code&gt;) and duplicate the flow for each required activity type:

&lt;ul&gt;
&lt;li&gt;Task (&lt;code&gt;task&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Phone Call (&lt;code&gt;phonecall&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Email (&lt;code&gt;email&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Appointment (&lt;code&gt;appointment&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the "Get a row by ID" step (fetching the Opportunity), select &lt;strong&gt;regarding (value)&lt;/strong&gt; as the row ID.&lt;/p&gt;

&lt;p&gt;The third flow also needs to be updated — set the row ID to &lt;strong&gt;Potential Customer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After testing, the update was correctly reflected, confirming success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Duplicating the Flow (Common Steps for Phone Call, Email, and Appointment)
&lt;/h2&gt;

&lt;p&gt;Since C-6 (Task version) is working correctly, use it as the base and duplicate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the flow list, open the verified "C-6 Write Back Last Activity Date" (Task version)&lt;/li&gt;
&lt;li&gt;Click "..." (More options) in the top right → "Save As" to duplicate&lt;/li&gt;
&lt;li&gt;Rename each copy following the naming convention:

&lt;ul&gt;
&lt;li&gt;C-6 Write Back Last Activity Date (Phone Call)&lt;/li&gt;
&lt;li&gt;C-6 Write Back Last Activity Date (Email)&lt;/li&gt;
&lt;li&gt;C-6 Write Back Last Activity Date (Appointment)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In each copy, change only the trigger table name:

&lt;ul&gt;
&lt;li&gt;Phone Call (&lt;code&gt;phonecall&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Email (&lt;code&gt;email&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Appointment (&lt;code&gt;appointment&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The "Get a row by ID" (Opportunity fetch) and "Update a row" (Account write-back) logic can be reused as-is — no changes needed&lt;/li&gt;
&lt;li&gt;Save and run a test&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One Important Caveat
&lt;/h2&gt;

&lt;p&gt;The logic in these flows assumes that the activity's &lt;strong&gt;Regarding&lt;/strong&gt; field points to an Opportunity. However, phone calls, emails, and appointments are more likely than tasks to be linked directly to an Account or Contact rather than an Opportunity. If the Regarding target is an Account rather than an Opportunity, the "Get a row by ID" step will attempt to look up the Opportunity table and return an error (the same Entity Not Found pattern as before).&lt;/p&gt;

&lt;p&gt;Make sure the table name and logical name are configured correctly for each flow.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>dynamics365</category>
      <category>d365sales</category>
      <category>customerinsights</category>
    </item>
    <item>
      <title>D365 Customer Insights for Our Own Sales Team (Customer Zero) (2) Building Segments</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Thu, 09 Jul 2026 07:24:04 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-2-building-segments-33ab</link>
      <guid>https://dev.to/tecturajpndx/using-d365-customer-insights-for-our-own-sales-team-customer-zero-2-building-segments-33ab</guid>
      <description>&lt;h2&gt;
  
  
  Customer Insights - Data Configuration
&lt;/h2&gt;

&lt;p&gt;Now that data unification is complete, it's time to configure D365 Customer Insights - Data. From the left menu, go to &lt;strong&gt;Insights → Segments&lt;/strong&gt; and click the Segments button.&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;"+ New segment"&lt;/strong&gt; button in the center of the screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Goal
&lt;/h3&gt;

&lt;p&gt;The goal is to push notifications to sales reps to prompt activity. As a preparatory step, we create the following segments:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① License expiring soon&lt;/td&gt;
&lt;td&gt;Customers whose renewal date (&lt;code&gt;cr917_renewal_date&lt;/code&gt;) is approaching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② No active license + recent purchase history&lt;/td&gt;
&lt;td&gt;Customers with no active opportunity but a past Won close on record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ No recent contact&lt;/td&gt;
&lt;td&gt;Customers where a certain amount of time has passed since &lt;code&gt;cr917_last_activity_date&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Building Segment ①
&lt;/h3&gt;

&lt;p&gt;Click (or drag) &lt;code&gt;cr917_renewal_date&lt;/code&gt; from within &lt;code&gt;account : CustomerZero&lt;/code&gt; and add it to the Rule 1 condition box on the left side.&lt;/p&gt;

&lt;p&gt;To set a relative date instead of a fixed calendar date, click the &lt;strong&gt;⇄ button&lt;/strong&gt; next to the calendar icon. This enables relative date configuration — set it up as follows.&lt;/p&gt;

&lt;p&gt;When you click Save, a details panel appears. Fill it in as shown and save.&lt;/p&gt;

&lt;p&gt;Make sure to verify how many records match each rule. If the count is 0, you will need to revisit your data source or unification settings and start over.&lt;/p&gt;

&lt;p&gt;In our case, the data is there — Rule 1 shows 8 members.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerautomate</category>
      <category>customerinsights</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>D365 Customer Insights for Our Own Sales Team (Customer Zero) (1) Setting Up Customer Insights - Data</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Mon, 06 Jul 2026 02:24:55 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-1-setting-up-customer-insights--3mng</link>
      <guid>https://dev.to/tecturajpndx/d365-customer-insights-for-our-own-sales-team-customer-zero-1-setting-up-customer-insights--3mng</guid>
      <description>&lt;p&gt;Once the D365 Customer Insights installation is complete, the first step is connecting data to the Data module. Since we need data from D365 Sales, we pull it in via Dataverse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall Flow
&lt;/h3&gt;

&lt;p&gt;Add data source → Confirm change tracking → Select tables → Set primary keys → Deduplication rules (entity resolution) → Match rules (linking) → Unified data view → Run unification / Complete&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding a Data Source
&lt;/h3&gt;

&lt;p&gt;Click "Add data source" and the next screen will appear. Since we're using D365 Sales data, select &lt;strong&gt;Dataverse&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enter a data source name (anything is fine) and the D365 Sales server address, then click "Next."&lt;/p&gt;

&lt;p&gt;On the next screen, select the tables needed for the data connection. For this implementation, we selected the following five tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;account&lt;/code&gt; (Account)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;opportunity&lt;/code&gt; (Opportunity)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contact&lt;/code&gt; (Contact)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;activitypointer&lt;/code&gt; (Activity)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task&lt;/code&gt; (Task)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The initial data sync takes some time — ours completed after about 40 minutes. You can confirm that data has loaded correctly in the data view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unification
&lt;/h3&gt;

&lt;p&gt;Next, we run the unification process. Select "Unify" from the left menu.&lt;/p&gt;

&lt;p&gt;From here, we map the primary keys for each table.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adding Deduplication Rules for Account
&lt;/h4&gt;

&lt;p&gt;Click "Add rule" under &lt;code&gt;account : CustomerZero&lt;/code&gt;. A screen will appear where you configure which columns must match for two records to be considered the same company. Common conditions used for Account entity resolution are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company name (&lt;code&gt;accountname&lt;/code&gt;) match (basic, but vulnerable to name variations)&lt;/li&gt;
&lt;li&gt;Phone number match&lt;/li&gt;
&lt;li&gt;Email domain match&lt;/li&gt;
&lt;li&gt;Address match&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Normalizing the Account Name Field
&lt;/h4&gt;

&lt;p&gt;Normalize the &lt;code&gt;name&lt;/code&gt; field on the account table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normalization&lt;/strong&gt; is an option that determines how text is pre-processed before comparison. The recommended settings for this implementation are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Apply?&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unicode to ASCII&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Standardizes full-width/half-width differences — important for Japanese company data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbols&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Removes characters like &lt;code&gt;, . &amp;amp; ( )&lt;/code&gt; — handles punctuation in names like "Co., Ltd."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text to lowercase&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Ignores case differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whitespace&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Removes extra spaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type (phone, name, address, organization)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Identifies and normalizes legal entity suffixes (Co., Ltd., Inc., Corp., etc.) — recommended for company name matching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numbers&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;If company names include numbers (e.g., 3M, 104 Information Technology), removing them can cause false matches — safer to leave unchecked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Custom" options (Alias mapping, Custom bypass) are not needed for this implementation and can be left unchecked.&lt;/p&gt;

&lt;p&gt;Apply the same normalization settings to &lt;code&gt;contact&lt;/code&gt; and &lt;code&gt;opportunity&lt;/code&gt; as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Match Rules
&lt;/h4&gt;

&lt;p&gt;Click "Add rule" under &lt;code&gt;contact&lt;/code&gt;. Here you specify which columns to use to link accounts and contacts. In the standard Dataverse structure, the relationship is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;contact.parentcustomerid&lt;/code&gt; (parent company ID) = &lt;code&gt;account.accountid&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Data View
&lt;/h3&gt;

&lt;p&gt;Once the above steps are complete, the Unified Data View screen is displayed. In our case, it showed 135 merged customer columns, 528 individual customer columns, and 0 excluded columns. This confirms that the previous steps — deduplication rules and match rules — worked without issues.&lt;/p&gt;

&lt;p&gt;In this step, you review and adjust which columns will be included (or excluded) in the final unified customer profile. By default, all columns are included.&lt;/p&gt;

&lt;p&gt;Click "Create customer profiles" to run the unification job. Depending on the amount of data, this may take anywhere from a few minutes to several tens of minutes.&lt;/p&gt;

&lt;p&gt;Next, we move on to building &lt;strong&gt;Measures&lt;/strong&gt; and &lt;strong&gt;Segments&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerautomate</category>
      <category>microsoft</category>
      <category>marketingautomation</category>
    </item>
    <item>
      <title>Customizing D365 Sales — For Our Own Sales Team (Customer Zero) (5) Reorganizing the Dashboard Views</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Fri, 03 Jul 2026 01:37:03 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-5-reorganizing-the-dashboard-views-5b1a</link>
      <guid>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-5-reorganizing-the-dashboard-views-5b1a</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: I'm working on a separate article for Part ④, but it's not ready to publish yet, so I'm skipping ahead to Part ⑤.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We'll use D365 Sales's built-in dashboard feature to visualize the tasks and field values generated by Power Automate.&lt;/p&gt;

&lt;p&gt;Before building the dashboard, we first need to create the views.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Steps (View Creation Basics — Power Apps is the easiest place to work)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the target table (Opportunity / Account / Task / Activity)&lt;/li&gt;
&lt;li&gt;Go to the "Views" tab → "New View"&lt;/li&gt;
&lt;li&gt;Enter a view name&lt;/li&gt;
&lt;li&gt;Use "Edit columns" to add and reorder the columns you want to display&lt;/li&gt;
&lt;li&gt;Use "Edit filters" to configure filter conditions&lt;/li&gt;
&lt;li&gt;Use "Sort by" to set the sort column and order&lt;/li&gt;
&lt;li&gt;Save and publish&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Task View
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Table:&lt;/strong&gt; Task&lt;br&gt;&lt;br&gt;
&lt;strong&gt;View name:&lt;/strong&gt; Zone A - My High-Priority Tasks&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Columns:&lt;/strong&gt; Subject / Due Date / Priority / Regarding&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Owner = Me AND Status = Incomplete AND Priority = High&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sort:&lt;/strong&gt; Due Date (ascending)&lt;/p&gt;

&lt;p&gt;Add columns from the new view screen, then click "Edit filters" on the right side of the screen. Since all conditions in this case are AND, make sure all boxes are checked. Click OK, then add a sort criterion as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Activity Schedule View
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Table:&lt;/strong&gt; Activity&lt;br&gt;&lt;br&gt;
&lt;strong&gt;View name:&lt;/strong&gt; Zone A - Today's Scheduled Activities&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Columns:&lt;/strong&gt; Subject / Start Date &amp;amp; Time / Type / Regarding&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Start Date = Today AND Owner = Me&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sort:&lt;/strong&gt; Start Date &amp;amp; Time (ascending)&lt;/p&gt;

&lt;h3&gt;
  
  
  Opportunity View (Zone B)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Table:&lt;/strong&gt; Opportunity&lt;br&gt;&lt;br&gt;
&lt;strong&gt;View name:&lt;/strong&gt; Zone B - Opportunity Velocity Monitor&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Columns:&lt;/strong&gt; Opportunity Name / Account / Estimated Amount / Stage / &lt;code&gt;cr917_stage_changed_date&lt;/code&gt; / Estimated Close Date&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Status = Open AND Assigned to Me&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sort:&lt;/strong&gt; &lt;code&gt;cr917_stage_changed_date&lt;/code&gt; (ascending)&lt;/p&gt;

&lt;h3&gt;
  
  
  Account View (Zone C)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Table:&lt;/strong&gt; Account&lt;br&gt;&lt;br&gt;
&lt;strong&gt;View name:&lt;/strong&gt; Zone C - Customer Health Management&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Columns:&lt;/strong&gt; Account Name / &lt;code&gt;cr917_customer_type&lt;/code&gt; / &lt;code&gt;cr917_last_activity_date&lt;/code&gt; / &lt;code&gt;cr917_renewal_date&lt;/code&gt; / Owner&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Assigned to Me&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sort:&lt;/strong&gt; &lt;code&gt;cr917_last_activity_date&lt;/code&gt; (ascending)&lt;/p&gt;

&lt;h3&gt;
  
  
  Opportunity View (Zone D)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Table:&lt;/strong&gt; Opportunity&lt;br&gt;&lt;br&gt;
&lt;strong&gt;View name:&lt;/strong&gt; Zone D - Document Progress&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Columns:&lt;/strong&gt; Opportunity Name / Account / &lt;code&gt;cr917_proposal_sent&lt;/code&gt; / &lt;code&gt;cr917_po_received&lt;/code&gt; / &lt;code&gt;cr917_invoice_sent&lt;/code&gt; / &lt;code&gt;cr917_acceptance_done&lt;/code&gt; / &lt;code&gt;cr917_invoice_date&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Status = Open&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sort:&lt;/strong&gt; Opportunity Name (ascending) or &lt;code&gt;cr917_invoice_date&lt;/code&gt; (ascending)&lt;/p&gt;

&lt;p&gt;Now we display these views on the D365 Sales dashboard. Select "Dynamics 365 Dashboard" and choose the 3-column standard template. Then, for each component, add a list and select the "Table - View" you just created — and you're done.&lt;/p&gt;

&lt;p&gt;The finished result looks something like this: a three-column layout with your tasks, opportunities, accounts, and document progress all visible at a glance.&lt;/p&gt;

&lt;p&gt;If you find that additional flows are needed depending on your industry or use case, feel free to leave a comment with your question!&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>microsoft</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Customizing D365 Sales — For Our Own Sales Team (Customer Zero) (3) The "Missed Tasks" Problem</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Thu, 02 Jul 2026 05:12:01 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-3-the-missed-tasks-problem-1mp7</link>
      <guid>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-3-the-missed-tasks-problem-1mp7</guid>
      <description>&lt;p&gt;This continues from &lt;a href="https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-2-common-settings-15al"&gt;Part ②&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Does any of this sound familiar?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After a customer meeting, activity entries in the SFA get missed — materials don't get sent, follow-ups slip through the cracks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The ideal flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hold a customer meeting (Outlook appointment exists) → Link meeting notes and slide URLs to D365 Sales → Issue follow-up action tasks in Sales from the notes → Set reminders in Sales&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zone A — Next Action: Scheduled Flow Running Every Morning at 8:00
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Generated Task (Message)&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Notify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A-1&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_stage_changed_date&lt;/code&gt; is 7+ days ago AND status is Open&lt;/td&gt;
&lt;td&gt;"[Opportunity name] stage has been stalled for 7+ days. Please check for follow-up."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A-2&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_last_activity_date&lt;/code&gt; is 30+ days ago AND there is an open opportunity&lt;/td&gt;
&lt;td&gt;"No activity toward [Account name] for 30 days. Consider reaching out."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A-3&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;estimatedclosedate&lt;/code&gt; is in the past AND status is not Won/Lost&lt;/td&gt;
&lt;td&gt;"[Opportunity name] close date has passed. Please update the date or confirm status."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Zone B — Opportunity Velocity Monitoring: Mix of Scheduled and Event Triggers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Generated Task (Message)&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Notify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B-1&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;estimatedvalue&lt;/code&gt; &amp;gt;= 5,000,000 AND &lt;code&gt;cr917_stage_changed_date&lt;/code&gt; is 14+ days ago&lt;/td&gt;
&lt;td&gt;"[Opportunity name] is a large deal but has had no progress in 14+ days."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner + Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B-2&lt;/td&gt;
&lt;td&gt;On opportunity update (Event)&lt;/td&gt;
&lt;td&gt;Stage (&lt;code&gt;stagename&lt;/code&gt;) changes from "Proposal" → "Negotiation"&lt;/td&gt;
&lt;td&gt;"[Opportunity name] has entered the Negotiation stage. Please confirm the PO receipt deadline."&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B-3&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;closeprobability&lt;/code&gt; &amp;gt;= 80 AND &lt;code&gt;estimatedclosedate&lt;/code&gt; is within 7 days&lt;/td&gt;
&lt;td&gt;"[Opportunity name] closes in 7 days. Please do a final review."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Zone C — Churn Prevention: Threshold Switching by Customer Type
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Generated Task (Message)&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Notify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C-1&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_customer_type&lt;/code&gt; = License-continuation OR Support (term contract) AND &lt;code&gt;cr917_last_activity_date&lt;/code&gt; is 60+ days ago AND no active opportunities&lt;/td&gt;
&lt;td&gt;"[Account name] may be a churn risk (License type — 60 days no activity). Please do a health check."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-2&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_customer_type&lt;/code&gt; = Project OR Support (spot) OR Support (time-purchase) AND &lt;code&gt;cr917_last_activity_date&lt;/code&gt; is 90+ days ago AND no active opportunities&lt;/td&gt;
&lt;td&gt;"[Account name] may be a churn risk (Project type — 90 days no activity). Consider seeding the next engagement."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-3&lt;/td&gt;
&lt;td&gt;1st of each month (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_renewal_date&lt;/code&gt; is within 90 days AND not before the 90-day window&lt;/td&gt;
&lt;td&gt;"[Account name] contract renews in 90 days. Please start preparing the renewal proposal."&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-4&lt;/td&gt;
&lt;td&gt;1st of each month (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_renewal_date&lt;/code&gt; is within 30 days&lt;/td&gt;
&lt;td&gt;"[Account name] contract renews in 30 days. Please expedite PO receipt."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner + Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-5&lt;/td&gt;
&lt;td&gt;On opportunity update (Event)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;statecode&lt;/code&gt; changes to Won (no task generated)&lt;/td&gt;
&lt;td&gt;Auto-set &lt;code&gt;cr917_renewal_date&lt;/code&gt; to close date + 365 days&lt;/td&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C-6&lt;/td&gt;
&lt;td&gt;On activity create/update (Event)&lt;/td&gt;
&lt;td&gt;A completed activity (&lt;code&gt;statecode&lt;/code&gt; = 1) is added or updated (no task generated)&lt;/td&gt;
&lt;td&gt;Write back &lt;code&gt;cr917_last_activity_date&lt;/code&gt; to current date/time&lt;/td&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Zone D — Chained Tasks Triggered by Yes/No Flag Changes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Generated Task (Message)&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Notify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;D-1&lt;/td&gt;
&lt;td&gt;On opportunity update (Event)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_proposal_sent&lt;/code&gt; changes false → true&lt;/td&gt;
&lt;td&gt;"[Opportunity name] Proposal sent. Please confirm the expected PO receipt date."&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D-2&lt;/td&gt;
&lt;td&gt;On opportunity update (Event)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_po_received&lt;/code&gt; changes false → true&lt;/td&gt;
&lt;td&gt;"[Opportunity name] PO received. Please send the order acknowledgment and prepare to issue the invoice."&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D-3&lt;/td&gt;
&lt;td&gt;On opportunity update (Event)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_invoice_sent&lt;/code&gt; changes false → true&lt;/td&gt;
&lt;td&gt;"[Opportunity name] Invoice issued. Please register the acceptance confirmation deadline (30 days from now) as a task."&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D-4&lt;/td&gt;
&lt;td&gt;Daily 8:00 AM (Scheduled)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cr917_invoice_date&lt;/code&gt; is 30+ days ago AND &lt;code&gt;cr917_acceptance_done&lt;/code&gt; = false&lt;/td&gt;
&lt;td&gt;"[Opportunity name] Acceptance is unconfirmed (30 days since invoice). Please follow up with the customer."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Owner + Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Configuring these flows can significantly reduce the operational overhead of sales management.&lt;/p&gt;

&lt;p&gt;Depending on your industry, you may need additional flows. If you have questions like "what should we do in this situation?", please feel free to leave a comment!&lt;/p&gt;

</description>
      <category>sfa</category>
      <category>microsoft</category>
      <category>powerapps</category>
      <category>powerplatform</category>
    </item>
    <item>
      <title>Customizing D365 Sales — For Our Own Sales Team (Customer Zero) (2) Common Settings</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Wed, 01 Jul 2026 00:28:47 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-2-common-settings-15al</link>
      <guid>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-2-common-settings-15al</guid>
      <description>&lt;p&gt;This continues from &lt;a href="https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-preparation-56f9"&gt;Part ①&lt;/a&gt;. In Part ②, we'll configure the common settings and the internal-processing Power Automate flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Settings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setting Up Connections
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Power Automate (&lt;a href="https://make.powerautomate.com" rel="noopener noreferrer"&gt;https://make.powerautomate.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Go to "Data" → "Connections" → "New connection" and create a Microsoft Dataverse connection&lt;/li&gt;
&lt;li&gt;Do the same to create an Office 365 Outlook connection&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Basic Flow Creation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click "Create" → select "Automated cloud flow" (event-triggered) or "Scheduled cloud flow" (recurring)&lt;/li&gt;
&lt;li&gt;Name flows in the format &lt;code&gt;[Zone]-[Number] [Description]&lt;/code&gt; (e.g., "A-1 Opportunity Stage Stall Alert")&lt;/li&gt;
&lt;li&gt;Always run a test after creating a flow to verify it works&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Internal-Processing PA Flows — 4 Flows (Write-back portions of A-4, C-5, C-6, D-3)
&lt;/h2&gt;

&lt;p&gt;Once the common settings are done, it's time to build.&lt;/p&gt;

&lt;h3&gt;
  
  
  A-4: Write Back Stage Changed Date
&lt;/h3&gt;

&lt;p&gt;Without this flow, the stall-day calculations in A-1 and B-1 will not work. Implement this first.&lt;/p&gt;

&lt;p&gt;In Microsoft Dynamics 365 (D365), a "stage" refers to a major milestone in a process — such as a sales deal or customer engagement — that guides the responsible person through what needs to happen next. It's how a series of activities is visualized and managed.&lt;/p&gt;

&lt;p&gt;From here, all work is done in Power Automate.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Create the flow&lt;/td&gt;
&lt;td&gt;"Automated cloud flow" → select trigger "When a row is added, modified or deleted (Dataverse)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Configure trigger&lt;/td&gt;
&lt;td&gt;Table: Opportunities / Change type: Modified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add condition&lt;/td&gt;
&lt;td&gt;Add a "Condition" action: "When Status Reason (statuscode) has changed"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Write-back action&lt;/td&gt;
&lt;td&gt;"Update a row (Dataverse)" → set &lt;code&gt;cr917_stage_changed_date&lt;/code&gt; to &lt;code&gt;utcNow()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  C-5: Auto-Set Renewal Date + Auto-Create Renewal Opportunity (on Won)
&lt;/h3&gt;

&lt;p&gt;On Won close, two things happen: ① auto-set the renewal date to close date + 365 days, and ② auto-create a new Opportunity for the renewal cycle and add it to the pipeline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Create the flow&lt;/td&gt;
&lt;td&gt;"Automated cloud flow" → trigger "When a row is added, modified or deleted (Dataverse)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Configure trigger&lt;/td&gt;
&lt;td&gt;Table: Opportunities / Change type: Modified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add condition&lt;/td&gt;
&lt;td&gt;Process only when "Status (statecode)" changes to "Won"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Calculate renewal date&lt;/td&gt;
&lt;td&gt;"Variables" → "Initialize variable" (Date type), set to &lt;code&gt;addDays(triggerOutputs()?['body/actualclosedate'], 365)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Write back to Account&lt;/td&gt;
&lt;td&gt;"Update a row (Dataverse)" → set &lt;code&gt;cr917_renewal_date&lt;/code&gt; on the Account to the variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Auto-create renewal opportunity&lt;/td&gt;
&lt;td&gt;"Add a new row (Dataverse)" → Table: Opportunities. Subject: original name + " — Renewal " + (close year + 1) + "". Account: same Account ID. Owner: same owner ID. Estimated close date: &lt;code&gt;cr917_renewal_date&lt;/code&gt; value. Estimated amount: same as original. Stage: "Prospect" (first stage). Description: "Auto-generated — Created from Won close of " + original name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Prevent duplicate creation&lt;/td&gt;
&lt;td&gt;Before running the flow, add a condition to check whether a renewal opportunity with the same name already exists. Skip if it does.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  C-6: Write Back Last Activity Date
&lt;/h3&gt;

&lt;p&gt;This flow runs only when a completed activity (statecode = 1) is created or updated. It does not trigger on scheduling a new activity.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Create the flow&lt;/td&gt;
&lt;td&gt;"Automated cloud flow" → trigger "When a row is added, modified or deleted (Dataverse)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Configure trigger&lt;/td&gt;
&lt;td&gt;Table: Activity Pointers (activitypointers) / Change type: Added or Modified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add condition&lt;/td&gt;
&lt;td&gt;Process only when "statecode" equals "1 (Completed)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Get related Account&lt;/td&gt;
&lt;td&gt;"Get a row (Dataverse)" → retrieve the Account linked via the activity's &lt;code&gt;regardingobjectid&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Write back to Account&lt;/td&gt;
&lt;td&gt;"Update a row (Dataverse)" → set &lt;code&gt;cr917_last_activity_date&lt;/code&gt; to &lt;code&gt;utcNow()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  D-3 (Write-back portion): Auto-Record Invoice Issue Date
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Create the flow&lt;/td&gt;
&lt;td&gt;"Automated cloud flow" → trigger "When a row is added, modified or deleted (Dataverse)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Configure trigger&lt;/td&gt;
&lt;td&gt;Table: Opportunities / Change type: Modified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add condition&lt;/td&gt;
&lt;td&gt;Process only when &lt;code&gt;cr917_invoice_sent&lt;/code&gt; changes from false → true (retrieve the previous value via &lt;code&gt;triggerOutputs()&lt;/code&gt; and compare)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Write back issue date&lt;/td&gt;
&lt;td&gt;"Update a row (Dataverse)" → set &lt;code&gt;cr917_invoice_date&lt;/code&gt; to &lt;code&gt;utcNow()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Continued in Part ③.&lt;/p&gt;

</description>
      <category>sfa</category>
      <category>microsoft</category>
      <category>powerapps</category>
      <category>powerplatform</category>
    </item>
    <item>
      <title>Customizing D365 Sales — For Our Own Sales Team (Customer Zero)(1) Preparation</title>
      <dc:creator>Miwa J</dc:creator>
      <pubDate>Tue, 30 Jun 2026 03:12:16 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-preparation-56f9</link>
      <guid>https://dev.to/tecturajpndx/customizing-d365-sales-for-our-own-sales-team-customer-zero-preparation-56f9</guid>
      <description>&lt;h2&gt;
  
  
  What is Customer Zero?
&lt;/h2&gt;

&lt;p&gt;"Customer Zero" is a strategy used by IT and technology companies in which the company itself becomes the "0th customer" (a test monitor) for a new product, AI service, or cloud service before rolling it out to external customers.&lt;/p&gt;

&lt;p&gt;Key benefits: faster validation and improvement (using the product in a real working environment surfaces bugs and usability issues early), and more persuasive sales pitches (a proven in-house success story/use case lets you propose to clients with confidence).&lt;/p&gt;

&lt;p&gt;With that in mind, the DX team has kicked off an initiative to get our own sales team using D365 Sales more fully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Zone A&lt;/td&gt;
&lt;td&gt;Auto-generated Next Actions / detecting stalled deals&lt;/td&gt;
&lt;td&gt;Power Automate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone B&lt;/td&gt;
&lt;td&gt;Opportunity velocity monitoring / large-deal alerts&lt;/td&gt;
&lt;td&gt;Power Automate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone C&lt;/td&gt;
&lt;td&gt;Customer health management / churn prevention / renewal alerts&lt;/td&gt;
&lt;td&gt;Power Automate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone D&lt;/td&gt;
&lt;td&gt;Document flow / chained tasks&lt;/td&gt;
&lt;td&gt;Power Automate + BPF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Implementation Order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create custom fields (12 on Opportunity, 6 on Account)&lt;/li&gt;
&lt;li&gt;4 internal-processing Power Automate flows (write-back portions of A-4, C-5, C-6, D-3)&lt;/li&gt;
&lt;li&gt;3 Zone A alert flows (A-1, A-2, A-3)&lt;/li&gt;
&lt;li&gt;3 Zone B alert flows (B-1, B-2, B-3)&lt;/li&gt;
&lt;li&gt;6 Zone C alert flows (C-1–C-6)&lt;/li&gt;
&lt;li&gt;4 Zone D document flows (D-1–D-4)&lt;/li&gt;
&lt;li&gt;Enable and verify the Outlook Add-in&lt;/li&gt;
&lt;li&gt;Reorganize dashboard views&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Creating Custom Fields (12 on Opportunity, 6 on Account)
&lt;/h2&gt;

&lt;p&gt;Custom fields are added from Power Apps using the following steps.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Open Power Apps&lt;/td&gt;
&lt;td&gt;Go to make.powerapps.com and select the target environment (sandbox)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Select the table&lt;/td&gt;
&lt;td&gt;Left menu "Tables" → select "Opportunity"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add a column&lt;/td&gt;
&lt;td&gt;"Columns" tab → click "Add column"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Enter field info&lt;/td&gt;
&lt;td&gt;Enter display name, data type, and schema name (cr917_xxxxx), then save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Do the same for Account&lt;/td&gt;
&lt;td&gt;Add the corresponding fields to the "Account" table the same way (also create the Initiative ② additional fields using the same steps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Configure choices&lt;/td&gt;
&lt;td&gt;For cr917_customer_type, add a "new choice" with the two options "License-continuation type" and "Project type"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Add to forms&lt;/td&gt;
&lt;td&gt;Open the main form for each table, add the new fields, then save and publish&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Fields added to the Opportunity entity
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Note: prefixes like &lt;code&gt;cr917_&lt;/code&gt; vary by environment.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Input Method&lt;/th&gt;
&lt;th&gt;Purpose / Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proposal Sent &lt;code&gt;cr917_proposal_sent&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;Checked by the rep when the proposal is sent. Trigger condition for Zone D-1 flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PO Received &lt;code&gt;cr917_po_received&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;Checked when the PO is received. Trigger condition for Zone D-2 flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoice Sent &lt;code&gt;cr917_invoice_sent&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;Checked when the invoice is issued. Flow D-3 auto-sets &lt;code&gt;cr917_invoice_date&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acceptance Confirmed &lt;code&gt;cr917_acceptance_done&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;Final completion flag. If left unchecked for 30 days, flow D-4 generates a reminder task.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoice Date &lt;code&gt;cr917_invoice_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Date and Time&lt;/td&gt;
&lt;td&gt;PA auto (D-3)&lt;/td&gt;
&lt;td&gt;PA automatically records the date &lt;code&gt;cr917_invoice_sent&lt;/code&gt; became Yes. Used as the baseline date for the 30-day acceptance check.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage Changed Date &lt;code&gt;cr917_stage_changed_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Date and Time&lt;/td&gt;
&lt;td&gt;PA auto (A-4)&lt;/td&gt;
&lt;td&gt;PA updates this with the current date/time every time the stage changes. Used for stall-day calculations in flows A-1 and B-1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDA Status &lt;code&gt;cr917_nda_status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Option Set&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ① NDA Signing. Three choices: Not Submitted / Under Review / Complete. PA monitors status changes to advance the flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDA SharePoint URL &lt;code&gt;cr917_nda_sharepoint_url&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;PA auto&lt;/td&gt;
&lt;td&gt;For ① NDA Signing. After signing completes, PA automatically writes in the SharePoint storage URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WBS Approved &lt;code&gt;cr917_wbs_approved&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ⑤ Offering. Checked once WBS approval is complete. PA then advances to the order-registration step.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Order Registered &lt;code&gt;cr917_order_registered&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ⑤ Offering. Order-registration completion flag. Checking it generates the flow-completion task.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment Confirmed &lt;code&gt;cr917_payment_confirmed&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;Shared by ④⑥ Renewal/Inspection. Checked after payment is confirmed. If unconfirmed 60 days after invoicing, an alert fires.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SP Registered &lt;code&gt;cr917_sp_registered&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ⑥ Delivery Inspection. Flag for completed SharePoint registration of deliverables. PA checks this as a precondition before triggering invoicing.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Fields added to the Account entity
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Input Method&lt;/th&gt;
&lt;th&gt;Purpose / Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Renewal Date &lt;code&gt;cr917_renewal_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;PA auto + manual override&lt;/td&gt;
&lt;td&gt;PA auto-sets this to close date + 365 days on a Won close. Rep may optionally adjust it. Baseline date for flows C-3/C-4.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last Activity Date &lt;code&gt;cr917_last_activity_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Date and Time&lt;/td&gt;
&lt;td&gt;PA auto (C-6)&lt;/td&gt;
&lt;td&gt;PA updates this to the current date/time whenever a completed activity (call, email, visit, CI-J integration) is created. Baseline date for A-2, C-1, C-2.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer Type &lt;code&gt;cr917_customer_type&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Option Set&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;5 choices: License-continuation / Project / Support (spot) / Support (term contract) / Support (time-purchase). 60-day group: License-continuation, Support (term contract). 90-day group: Project, Support (spot), Support (time-purchase).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BC Registered &lt;code&gt;cr917_bc_registered&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes/No (Boolean)&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ② Partner Contract. Rep records completion of Business Central registration. Interim flag pending full BC integration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract SharePoint URL &lt;code&gt;cr917_contract_sharepoint_url&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;PA auto&lt;/td&gt;
&lt;td&gt;For ② Partner Contract. After the contract is signed, PA automatically writes in the SharePoint storage URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PO Number &lt;code&gt;cr917_po_number&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;Manual (rep)&lt;/td&gt;
&lt;td&gt;For ③ PO Issuance. Rep enters the PO number when it's received; used for reconciliation at invoicing time.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>dynamics365</category>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>sfa</category>
    </item>
    <item>
      <title>What I Learned from Building an AI Agent in Copilot Studio: 3 Design Points That Helped It Work as Expected</title>
      <dc:creator>Sugiyama Yuki</dc:creator>
      <pubDate>Tue, 30 Jun 2026 03:04:31 +0000</pubDate>
      <link>https://dev.to/tecturajpndx/what-i-learned-from-building-an-ai-agent-in-copilot-studio-3-design-points-that-helped-it-work-as-km7</link>
      <guid>https://dev.to/tecturajpndx/what-i-learned-from-building-an-ai-agent-in-copilot-studio-3-design-points-that-helped-it-work-as-km7</guid>
      <description>&lt;p&gt;AI agents are getting a lot of attention these days, but are they really easy to build the way we expect?&lt;/p&gt;

&lt;p&gt;Tools like Claude Code make it possible to create agents very intuitively. However, in a real company environment, we often cannot use such tools freely because of permission, governance, or security restrictions.&lt;/p&gt;

&lt;p&gt;In my case, Copilot Studio was one of the few AI tools I could realistically use in a business environment. So I started building an AI agent with it.&lt;/p&gt;

&lt;p&gt;But once I actually started building, I ran into issues like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was harder to build than I expected.&lt;/li&gt;
&lt;li&gt;I created the flow step by step, but it did not behave the way I designed it.&lt;/li&gt;
&lt;li&gt;I wanted to combine several functions into one chat, but the branching did not work well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first glance, Copilot Studio looks like a tool that lets you build flows easily. However, after working with it, I realized that unless the design is clear, the agent can easily behave in unexpected ways.&lt;/p&gt;

&lt;p&gt;In this article, I want to share three design points I learned while building an AI agent in Copilot Studio.&lt;/p&gt;

&lt;p&gt;The second and third points were especially important in my case. If you are struggling to make your Copilot Studio agent work as expected, these points may help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Design Points for Building a Copilot Studio AI Agent
&lt;/h2&gt;

&lt;p&gt;From my experience, the following three points are important when designing an AI agent in Copilot Studio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clarify what you want the agent to do before creating the flow.&lt;/li&gt;
&lt;li&gt;Create a separate topic for each task.&lt;/li&gt;
&lt;li&gt;Write prompts in English.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Point 1: Clarify What You Want the Agent to Do Before Creating the Flow
&lt;/h2&gt;

&lt;p&gt;Before building the flow, I think it is important to define which business task you want the AI agent to handle and how the task should be processed.&lt;/p&gt;

&lt;p&gt;If you have used Copilot Studio before, you probably know that there are many different types of nodes, or action boxes.&lt;/p&gt;

&lt;p&gt;For example, you can create variables, call generative AI, create conditions, branch the flow, call actions, and so on. Some features are not immediately obvious, and if you start building while thinking through the design at the same time, it is very easy to lose time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcsmpmgyja6otiilultx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcsmpmgyja6otiilultx.png" alt=" " width="745" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even in this screen alone, there are more than 10 visible functions.&lt;/p&gt;

&lt;p&gt;What I realized is that building a useful AI agent is not about understanding every single function in Copilot Studio.&lt;/p&gt;

&lt;p&gt;The more important skill is being able to choose the right functions for the task you want to automate.&lt;/p&gt;

&lt;p&gt;The process that worked better for me was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, write down the business task and its steps.&lt;/li&gt;
&lt;li&gt;Send the task and steps to ChatGPT, Copilot, or another AI tool, and ask how the flow should be designed.&lt;/li&gt;
&lt;li&gt;Build only the necessary parts in Copilot Studio while checking the design step by step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach helped me avoid randomly adding nodes without a clear reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Point 2: Create a Separate Topic for Each Task
&lt;/h2&gt;

&lt;p&gt;Another thing I learned is that it is better to create one topic for one task or function.&lt;/p&gt;

&lt;p&gt;When building an AI agent, it is tempting to add many features into a single topic. You may want one topic to receive a request, understand the user’s intent, extract data, confirm the result, call an external system, and complete the registration.&lt;/p&gt;

&lt;p&gt;However, in my experience, the more tasks and branches I added into one topic, the more unstable the flow became.&lt;/p&gt;

&lt;p&gt;This is not only about Copilot Studio. Generative AI and AI agents in general are not always good at handling many different tasks at the same time. When one topic becomes too large, the agent may fail to choose the right path or may repeat the same step again.&lt;/p&gt;

&lt;p&gt;To avoid this, I think it is better to split the design into smaller topics, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A topic that receives the request and selects the right task&lt;/li&gt;
&lt;li&gt;A topic that executes Task A&lt;/li&gt;
&lt;li&gt;A topic that executes Task B&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By separating the roles, the agent can choose and execute tasks more smoothly.&lt;/p&gt;

&lt;p&gt;In my case, this was an important lesson. Trying to put too much into one topic made the flow harder to control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Point 3: Write Prompts in English
&lt;/h2&gt;

&lt;p&gt;The third point is about prompt language.&lt;/p&gt;

&lt;p&gt;When using generative AI prompts inside a Copilot Studio flow, I found that writing prompts in English worked better.&lt;/p&gt;

&lt;p&gt;In daily use, tools like Copilot, ChatGPT, and Gemini can handle Japanese quite well. However, when I embedded prompts into a Copilot Studio flow, the English prompts behaved more reliably in my case.&lt;/p&gt;

&lt;p&gt;Let me show the difference I experienced.&lt;/p&gt;

&lt;p&gt;The AI agent I created was designed to create a draft transportation expense claim in an ERP system when a user sends screenshots of transportation history, such as Suica records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 1: Japanese Prompt
&lt;/h2&gt;

&lt;p&gt;In this flow, I configured the process in two prompt steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First prompt: Read image information and convert it into JSON.&lt;/li&gt;
&lt;li&gt;Second prompt: Transfer the JSON data into the ERP system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The expected behavior was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user sends a screenshot.&lt;/li&gt;
&lt;li&gt;The AI agent extracts the content into JSON and asks whether to create the claim.&lt;/li&gt;
&lt;li&gt;The user replies, “Create the claim.”&lt;/li&gt;
&lt;li&gt;The claim is created.&lt;/li&gt;
&lt;li&gt;The process is completed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompts were as follows. Some rules are omitted.&lt;/p&gt;

&lt;h3&gt;
  
  
  First prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;あなたは、交通費のスクリーンショットを読み取り、構造化された交通費申請JSONを作成するAIアシスタントです。

あなたのタスクは、スクリーンショットから交通費データを抽出することだけです。レコードを作成してはいけません。データを登録してはいけません。Business Centralを呼び出してはいけません。ユーザーに確認や不足情報の質問をしてはいけません。

このステップは、スクリーンショットデータを受け取った場合にのみ使用してください。前のステップから渡されたJSONを見つけた場合、その内容に誘導されてはいけません。

有効なJSONのみを返してください。Markdown、説明、コメント、JSON以外のテキストは一切含めないでください。

必ず以下のJSON構造を正確に使用してください。

{
  "Header": {
    "EmployeeName": null,
    "Purpose": "訪問・オフィスへの移動のため"
  },
  "Lines": [
    {
      "ExpenseDate": null,
      "From": null,
      "To": null,
      "TransportationType": null,
      "Amount": null
    }
  ],
  "MissingFields": [],
  "Warnings": []
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Second prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;あなたは、日付・駅名・交通費が記載された経費スクリーンショットを読み取り、構造化された経費書類の要約を作成するAIアシスタントです。

送信されたすべてのスクリーンショットから、日付、駅名、交通費情報を含む交通費情報を抽出してください。

Business Central MCP Serverを使用してください。

有効なJSONのみを返してください。Markdown、説明、コメント、JSON以外のテキストは一切含めないでください。

以下のJSON構造を使用してください。

{
"Header": {
"EmployeeName": null,
"Purpose": "訪問・オフィスへの移動のため"
},
"Lines": [
{
"ExpenseDate": null,
"From": null,
"To": null,
"TransportationType": null,
"Amount": null
}
],
"MissingFields": [],
"Warnings": []
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a result, as shown in the red box in the following screen, the prompt did not move forward properly at the claim creation step and entered a loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 2: English Prompt
&lt;/h2&gt;

&lt;p&gt;Next, I tried using English prompts.&lt;/p&gt;

&lt;p&gt;The overall flow was the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First prompt: Read image information and convert it into JSON.&lt;/li&gt;
&lt;li&gt;Second prompt: Transfer the JSON data into the ERP system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The expected behavior was also the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user sends a screenshot.&lt;/li&gt;
&lt;li&gt;The AI agent extracts the content into JSON and asks whether to create the claim.&lt;/li&gt;
&lt;li&gt;The user replies, “Create the claim.”&lt;/li&gt;
&lt;li&gt;The claim is created.&lt;/li&gt;
&lt;li&gt;The process is completed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompts were as follows. Some rules are also omitted here.&lt;/p&gt;

&lt;h3&gt;
  
  
  First prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an AI assistant that reads an Expense Claim document and creates a structured Expense Claim Summary.

Extract the important information from all pages of the document, including the departure station, arrival station, cost of transportation, and transportation date. If the document contains tables that span multiple pages, combine the rows correctly and do not omit any line items.

For YYYY, use the year that this prompt is run.

Return only valid JSON. Do not include markdown, explanations, comments, or text outside the JSON.

For transportationType, choose from the following based on the station names only: "電車", "地下鉄", "バス", "その他".

Use the following JSON structure:

{{
"headerActionName": "null",
"headerRequest": {{
"employeeNo": "TEST",
"claimDate": "null",
"purpose": "交通費精算のため",
"remarks": "AI Foundry MCP OCR Test"
}},
"lineActionName": "null",
"lineRequests": [
{{
"expenseDate": "null",
"fromLocation": "null",
"toLocation": "null",
"transportationType": "電車/地下鉄/バス/その他",
"description": "交通費",
"amount": 0
}}
]
}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Second prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If you receive a photo with station or bus stop names, dates, and costs, use the TravelExpenseFlow topic to extract the expense claim details.

Search for the required information in Business Central using the Business Central MCP Server.

If the required information is found, use the analyzed expense claim details to create an Expense Claim in Business Central.

Use the analyzed line items to create expense claim lines. For each analyzed line, search for the corresponding required information in Business Central using the Business Central MCP Server.

Do not create the Expense Claim until all required information and line items have been identified and confirmed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a result, as shown in the following screen, the claim was created successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kb14nwcq9htbpo6s0qy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kb14nwcq9htbpo6s0qy.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, simply changing the prompt language improved the behavior.&lt;/p&gt;

&lt;p&gt;Of course, this does not mean that English prompts will always solve every issue. The topic design, branching logic, variables, and action settings are also important.&lt;/p&gt;

&lt;p&gt;However, based on what I experienced, when using prompts inside Copilot Studio flows, it is worth writing the prompt in Japanese first and then translating it into English before embedding it into the flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this article, I shared three design points I learned while building an AI agent in Copilot Studio.&lt;/p&gt;

&lt;p&gt;The three points were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clarify what you want the agent to do before creating the flow.&lt;/li&gt;
&lt;li&gt;Create a separate topic for each task.&lt;/li&gt;
&lt;li&gt;Write prompts in English.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are many other things to consider when building agents in Copilot Studio. However, in my case, just keeping these three points in mind made the flow easier to design and helped the agent behave closer to what I expected.&lt;/p&gt;

&lt;p&gt;If your Copilot Studio agent does not work the way you expect, it may be worth reviewing these three points first.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>copilotstudio</category>
      <category>powerplatform</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
