<?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>Forem: Fernanda Ek</title>
    <description>The latest articles on Forem by Fernanda Ek (@fernandaek).</description>
    <link>https://forem.com/fernandaek</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1037037%2F0a1e1895-8294-4b6f-945e-64b7109c457c.jpeg</url>
      <title>Forem: Fernanda Ek</title>
      <link>https://forem.com/fernandaek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fernandaek"/>
    <language>en</language>
    <item>
      <title>Controlling data visibility &amp; access with RLS &amp; OLS in Dataverse</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Wed, 10 Sep 2025 10:25:40 +0000</pubDate>
      <link>https://forem.com/fernandaek/controlling-data-visibility-access-with-rls-ols-in-dataverse-35nf</link>
      <guid>https://forem.com/fernandaek/controlling-data-visibility-access-with-rls-ols-in-dataverse-35nf</guid>
      <description>&lt;p&gt;When we build apps with Dataverse, it’s not enough to just decide who gets access. We also need to control what data each person can actually see. Two key governance practices that help achieve this are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Row Level Security (RLS):&lt;/strong&gt; Decides which records a user can see. For example, an employee only sees their own record, a manager sees their department's records and HR sees everyone's.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Object Level Security (OLS):&lt;/strong&gt; Decides which tables or fields a user can see. For example, only HR should see the 'Salary'-column, while for everyone else it's completely hidden.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining the two, we make sure people only see the data that’s relevant to them. It keeps sensitive information safe and avoids unnecessary exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concepts in Dataverse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RLS:&lt;/strong&gt; Controls which records (rows) a user can see.&lt;br&gt;
Implemented via Security Roles and Hierarchical Security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OLS:&lt;/strong&gt; Controls which tables (entities) and columns (fields) a user can see.&lt;br&gt;
Implemented via Table permissions and Field-Level Security Profiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario
&lt;/h2&gt;

&lt;p&gt;You’re building an HR app in Power Apps using Dataverse with the following tables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Employees (EmployeeID, Name, Department, Salary, Manager, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Departments (DepartmentID, DepartmentName, ManagerID, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Regular employees should see only their own record.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Managers should see employees in their department.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HR staff should see all employees + Salary field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Non-HR users should never see Salary at all.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fs75azrvkcu2oeix94jap.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.amazonaws.com%2Fuploads%2Farticles%2Fs75azrvkcu2oeix94jap.png" alt=" " width="597" height="975"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Row Level Security (RLS)
&lt;/h2&gt;

&lt;p&gt;Go to Power Platform Admin Center &amp;gt; Select the environment &amp;gt; User + permissions &amp;gt; Security roles&lt;br&gt;
Create 3 roles: Employee Role, Manager Role and HR Role&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.amazonaws.com%2Fuploads%2Farticles%2Fd47x6iqfrd0tdvps94a6.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.amazonaws.com%2Fuploads%2Farticles%2Fd47x6iqfrd0tdvps94a6.png" alt=" " width="616" height="1021"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;None =&lt;/strong&gt; No access&lt;br&gt;
&lt;strong&gt;User =&lt;/strong&gt; Access only to records the user owns&lt;br&gt;
&lt;strong&gt;Business Unit =&lt;/strong&gt; Access to records in the same BU&lt;br&gt;
&lt;strong&gt;Parent: Child BU =&lt;/strong&gt; Access to their BU + child BUs&lt;br&gt;
&lt;strong&gt;Organization =&lt;/strong&gt; Full access&lt;/p&gt;

&lt;p&gt;Select the 'Employees'-table and set 'Read'-permission to 'User' and save. This means the user can only see rows they own.&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.amazonaws.com%2Fuploads%2Farticles%2Fa6sj2t952jh9qnth35sp.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.amazonaws.com%2Fuploads%2Farticles%2Fa6sj2t952jh9qnth35sp.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the Manager Role set 'Read'-permission to Business Unit and save. Managers will see records in their own business unit.&lt;/p&gt;

&lt;p&gt;For HR Role set 'Read'-permission to Organization (full access).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give broader rights (Create, Write, Delete, etc) if HR should manage all employee records.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Assign roles to users
&lt;/h3&gt;

&lt;p&gt;Go back to 'Settings' in the admin center and under User + Permissions select 'Users'&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.amazonaws.com%2Fuploads%2Farticles%2Flb5j7zm4u70uungg7dda.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.amazonaws.com%2Fuploads%2Farticles%2Flb5j7zm4u70uungg7dda.png" alt=" " width="331" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select a user and select 'Manage security roles'. Now sdd the role that match their job (Employee, Manager, HR). Hit save.&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.amazonaws.com%2Fuploads%2Farticles%2Fh9ylnyigk97qaibyzlsz.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.amazonaws.com%2Fuploads%2Farticles%2Fh9ylnyigk97qaibyzlsz.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Regular employees only see their own record.&lt;/li&gt;
&lt;li&gt;Managers see employees in their BU.&lt;/li&gt;
&lt;li&gt;HR sees all employees.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up Object Level Security (OLS)
&lt;/h2&gt;

&lt;p&gt;We want to hide Salary from everyone except HR.&lt;/p&gt;

&lt;p&gt;Go back to settings and select 'Column security profiles'&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.amazonaws.com%2Fuploads%2Farticles%2Fx1vex4mldzojmijrtzpf.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.amazonaws.com%2Fuploads%2Farticles%2Fx1vex4mldzojmijrtzpf.png" alt=" " width="426" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a New Profile:
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F5feyhd5nysc5w2oc2duv.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.amazonaws.com%2Fuploads%2Farticles%2F5feyhd5nysc5w2oc2duv.png" alt=" " width="669" height="1026"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add users or teams:
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F6w4ixff5ystdt1oxt458.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.amazonaws.com%2Fuploads%2Farticles%2F6w4ixff5ystdt1oxt458.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable Field security
&lt;/h3&gt;

&lt;p&gt;Go to the 'Employee'-table &amp;gt; select 'Salary'-column &amp;gt; set Field security/Enable column security = Enabled&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.amazonaws.com%2Fuploads%2Farticles%2Fywewe9mqs746ef1z03mv.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.amazonaws.com%2Fuploads%2Farticles%2Fywewe9mqs746ef1z03mv.png" alt=" " width="365" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, only users in a Field Security Profile can see/edit it.&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.amazonaws.com%2Fuploads%2Farticles%2F3r964y7bzn90w0rsdcma.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.amazonaws.com%2Fuploads%2Farticles%2F3r964y7bzn90w0rsdcma.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meaning, for everyone else (not in the 'HR Sensitive Data Access'-profile) they automatically get No access. Salary will be hidden from forms, views and apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HR Role + HR Sensitive Data Access profile = full visibility of Salary.&lt;/li&gt;
&lt;li&gt;Everyone else = cannot even see the column, it’s completely hidden in Dataverse, model-driven apps, and API queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Plan roles up front:&lt;/strong&gt; Align with business rules before implementing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use security groups:&lt;/strong&gt; Easier than managing individuals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test:&lt;/strong&gt; Use 'View as role' or test accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Least privilege principle:&lt;/strong&gt; Give only the minimum data visibility needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document roles:&lt;/strong&gt; For governance, always keep a map of roles and it's permissions.&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>governance</category>
      <category>powerapps</category>
      <category>powerfuldevs</category>
    </item>
    <item>
      <title>Environment variable management with Power Automate</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Wed, 06 Aug 2025 09:08:00 +0000</pubDate>
      <link>https://forem.com/fernandaek/environment-variable-management-with-power-automate-352k</link>
      <guid>https://forem.com/fernandaek/environment-variable-management-with-power-automate-352k</guid>
      <description>&lt;p&gt;This is one of those tweaks I’ve been using for while, but it never occurred to me how useful it actually is until a colleague recently asked me about it.&lt;/p&gt;

&lt;p&gt;He basically was concerned about having to update variables and store them temporally while also passing the current value into multiple flows, since the value changes dynamically. You know, create a new column(our case) just for that purpose (store temporally values) is just not elegant. On top of that, you still have to keep track of the values, know where they are being used and hope you’re not messing up the current value 😩&lt;/p&gt;

&lt;p&gt;So, here it is, a quick walkthrough on how to build a Power Automate flow that takes care of environment variable updates for you. &lt;/p&gt;

&lt;h1&gt;
  
  
  Scenario: Dynamic file path for File System connector
&lt;/h1&gt;

&lt;p&gt;Here is the exact scenario that got me writing this post. In one my solutions, I'm creating files locally. Nothing fancy, I'm using the File System connector and a regular "Create file"-action but the annoying part is that the path where the file gets saved is dynamic and changes depending on the conditional logic I'm using in the flow. Later, I also need to reuse the same value across multiple flows.&lt;/p&gt;

&lt;p&gt;That’s when I decided to store the file path in an environment variable instead.&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.amazonaws.com%2Fuploads%2Farticles%2F9i0xag0skv4eu9uiwsqz.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.amazonaws.com%2Fuploads%2Farticles%2F9i0xag0skv4eu9uiwsqz.png" alt=" " width="773" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...Then, automatically update it depending on the audience. No more errors caused by hardcoded values.&lt;/p&gt;

&lt;h1&gt;
  
  
  Behind the scenes
&lt;/h1&gt;

&lt;p&gt;When we create environment variables in Power Platform, they're stored in Dataverse across two places/entities.&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.amazonaws.com%2Fuploads%2Farticles%2Fhbtvhnhl12pyiylxzdwp.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.amazonaws.com%2Fuploads%2Farticles%2Fhbtvhnhl12pyiylxzdwp.png" alt=" " width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment Variable Definitions:&lt;/strong&gt; these where the variables name are stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Variable Values:&lt;/strong&gt; Here is stored the actual value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Here's how we make it work
&lt;/h1&gt;

&lt;p&gt;Our flow will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Look for the definition based on the schema name&lt;/li&gt;
&lt;li&gt;Check if there is already a value saved&lt;/li&gt;
&lt;li&gt;Update it or create a new one&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Start by creating the environment variable:
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F7f4szhygjet4qocbf6t5.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.amazonaws.com%2Fuploads%2Farticles%2F7f4szhygjet4qocbf6t5.png" alt=" " width="417" height="1023"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm manually running this flow, so, in my case, I'm using the instant trigger.&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.amazonaws.com%2Fuploads%2Farticles%2F9pr2vbvbjfr1jh1lg595.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.amazonaws.com%2Fuploads%2Farticles%2F9pr2vbvbjfr1jh1lg595.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add one more action "List rows" and select the "Environment Variable Values"-table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter rows:&lt;/strong&gt; Filter the records to locate the exact environment variable using this query:&lt;br&gt;
&lt;code&gt;EnvironmentVariableDefinitionId/schemaname eq 'YOUR_ENV.VARIABLE'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;Use the schema name not the display name&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Tip:&lt;/strong&gt; &lt;em&gt;You can get the list of rows by running the flow once and checking the output of the action.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fmf9il7p7xal5r1v4nkyc.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.amazonaws.com%2Fuploads%2Farticles%2Fmf9il7p7xal5r1v4nkyc.png" alt=" " width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my case, I added a switch control to handle different audiences. The value is passed in the trigger.&lt;/p&gt;

&lt;p&gt;Each case inside the Switch updates the environment variable with the correct value for that specific audience.&lt;/p&gt;

&lt;p&gt;Below, I'm using "Update a row"-action to update the value of the environment variable without to manually change values each 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.amazonaws.com%2Fuploads%2Farticles%2Fb0hdxrsn4y8tjtpsmcvr.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.amazonaws.com%2Fuploads%2Farticles%2Fb0hdxrsn4y8tjtpsmcvr.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Voilà
&lt;/h3&gt;

&lt;p&gt;The first compose shows the current value of the environment variable.&lt;br&gt;
Then the flow runs the update action to change it.&lt;br&gt;
Finally, the second compose confirms the new value was applied.&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.amazonaws.com%2Fuploads%2Farticles%2F6lkpsdilzqnnz8bvpu83.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.amazonaws.com%2Fuploads%2Farticles%2F6lkpsdilzqnnz8bvpu83.png" alt=" " width="800" height="893"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Honestly, this little trick has saved me so much time. Updating environment variables might not sound like a big deal, but when you are working with multiple flows, specially when you need to pass values like endpoint, target audience or other dynamic data, it really helps. Instead of creating workaround columns or hardcoding values, Environment variables makes everything cleaner and way easier to maintain. &lt;/p&gt;

&lt;p&gt;Save it for later, you might run into a moment where this comes in handy.&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>powerfuldevs</category>
    </item>
    <item>
      <title>How to create Generative Pages in Power Apps</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Wed, 30 Jul 2025 12:40:03 +0000</pubDate>
      <link>https://forem.com/fernandaek/how-to-create-generative-pages-in-power-apps-2ahb</link>
      <guid>https://forem.com/fernandaek/how-to-create-generative-pages-in-power-apps-2ahb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Yeees! It's finally happening and I couldn't be more excited&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been dreaming of a day when we could describe an app and voilà, it appears. That dream is starting to come true in Model-driven apps. &lt;/p&gt;

&lt;p&gt;Generative Pages helps makers to turn ideas into working UI in minutes allowing you to describe the type of page you want and building it for you, including layout, controls and data. &lt;/p&gt;

&lt;p&gt;This new feature is still evolving, but I tested and see already a huge potential for speeding up app creation, especially when working with structured Dataverse tables. &lt;/p&gt;

&lt;p&gt;Let’s dive into what it is, how to create your first Gen page and, of course, the limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Generative Pages?
&lt;/h2&gt;

&lt;p&gt;In short, Generative Pages let you describe the page layout and purpose then, Power Apps (and Copilot) automatically generates the UI, logic and bindings. Currently only available in model‑driven apps, the GenPages works by interacting with the app agent, where you describe what you need, specify the Dataverse tables needed and can even attach images of your idea as inspiration.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to create a Generative Page in model-driven apps?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Pre-requisites:&lt;/strong&gt; &lt;em&gt;in August 2025&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This feature is only available for Model-Driven Apps (not Canvas Apps) &lt;/li&gt;
&lt;li&gt;The Power Platform environment must be located in the US region. &lt;/li&gt;
&lt;li&gt;It also requires Copilot features to be enabled in the environment. &lt;em&gt;It's on by default&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F7v87w76pbz5vopqftp0p.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.amazonaws.com%2Fuploads%2Farticles%2F7v87w76pbz5vopqftp0p.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For this post, I’ll walk you through the process using a real solution I created years ago: an HR onboarding app built in a Model‑Driven App, where new hires are registered and onboarding tasks are tracked. So, the tables already exists.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create or open a model-driven app  for editing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the app designer, select "Add a page"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Describe your page: A new tab will open and you will se a Copilot prompt like the image bellow:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fu11cs73gxsi45yqhyea0.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.amazonaws.com%2Fuploads%2Farticles%2Fu11cs73gxsi45yqhyea0.png" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
Then, describe what you want to create. Example: &lt;em&gt;Based on the attached image, create a page to view, edit, and add employee records from the Employees table.&lt;/em&gt;&lt;br&gt;
...And add the tables.&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.amazonaws.com%2Fuploads%2Farticles%2F71blkxfsfvk6ggptu17a.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.amazonaws.com%2Fuploads%2Farticles%2F71blkxfsfvk6ggptu17a.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copilot instantly built a structured page, pulling data from the mentioned Dataverse tables and generating views and forms that I could immediately test and customize.&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.amazonaws.com%2Fuploads%2Farticles%2Fwy668tn7v11znp8gb0qb.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.amazonaws.com%2Fuploads%2Farticles%2Fwy668tn7v11znp8gb0qb.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what I got&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.amazonaws.com%2Fuploads%2Farticles%2F72cosa6puktlnclkt44p.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.amazonaws.com%2Fuploads%2Farticles%2F72cosa6puktlnclkt44p.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fs3kwhbvhgci6rq3xnbdw.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.amazonaws.com%2Fuploads%2Farticles%2Fs3kwhbvhgci6rq3xnbdw.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you can refine the layout, behavior and adjust the relationships in the App Agent using natural language&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.amazonaws.com%2Fuploads%2Farticles%2F760vt3no8q1bruvkq23h.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.amazonaws.com%2Fuploads%2Farticles%2F760vt3no8q1bruvkq23h.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerations and limitations: August 2025
&lt;/h1&gt;

&lt;p&gt;There are a few limitations to keep in mind when working with Generative Pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataverse only:&lt;/strong&gt; You can only connect to Dataverse tables (up to 6 tables per page)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No code editing:&lt;/strong&gt; You can't edit generated code directly. You need use the App Agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual publishing required:&lt;/strong&gt; You need to publish each generative page separately, meaning, publishing your app won't automatically publish the pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initial prompt:&lt;/strong&gt; You must include all needed tables in the first prompt, there is no 'add later'.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Only US english is supported&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No collaboration:&lt;/strong&gt; Only one maker at a time working on a gen page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt history:&lt;/strong&gt; You can just access your last 5 interactions with the App Agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;With these limitations in mind, plan your data model and page structure in advance to avoid problems during the page generation.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Don't skip the "Agent Thoughts!
&lt;/h2&gt;

&lt;p&gt;When you generate a page or make any adjustment with the App Agent, you will find the "Agent Thoughts" just bellow the response. The Agent Thoughts give you back the interpreted request and what steps it took to build the page.&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.amazonaws.com%2Fuploads%2Farticles%2F9pvbpvw044f2j7x08paf.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.amazonaws.com%2Fuploads%2Farticles%2F9pvbpvw044f2j7x08paf.png" alt=" " width="409" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Really nice, huh?! And more, if the result doesn’t look how you imagined, this section helps you troubleshoot, improve your prompts and better understand the App agent/Copilot behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus 2: Unexpected behavior
&lt;/h2&gt;

&lt;p&gt;While testing, the "Restore" button didn't respond, even after multiple clicks and waiting.&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.amazonaws.com%2Fuploads%2Farticles%2Ftc6p9te38sooxisa6dbh.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.amazonaws.com%2Fuploads%2Farticles%2Ftc6p9te38sooxisa6dbh.png" alt=" " width="379" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also tried typing "Restore" into the prompt, thinking it might revert the page to the last published or saved version. Instead, it quickly generated a random landing page unrelated to my current project. At one point, displayed this error page.&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.amazonaws.com%2Fuploads%2Farticles%2F0bdl8x3rxzaic2uvsmel.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.amazonaws.com%2Fuploads%2Farticles%2F0bdl8x3rxzaic2uvsmel.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This might just be a temporary bug, but it’s good to be aware of it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Generative pages won't build everything for you, but it can help you prototype, learn and improve your app faster. Sometimes, that's exactly what you need, move faster and smarter.&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerapps</category>
      <category>powerfuldevs</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Tue, 10 Jun 2025 14:37:24 +0000</pubDate>
      <link>https://forem.com/fernandaek/-1en4</link>
      <guid>https://forem.com/fernandaek/-1en4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/fernandaek/connections-in-power-platform-a6p" class="crayons-story__hidden-navigation-link"&gt;Connections in Power Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/fernandaek" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1037037%2F0a1e1895-8294-4b6f-945e-64b7109c457c.jpeg" alt="fernandaek profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/fernandaek" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Fernanda Ek
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Fernanda Ek
                
              
              &lt;div id="story-author-preview-content-2577690" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/fernandaek" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1037037%2F0a1e1895-8294-4b6f-945e-64b7109c457c.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Fernanda Ek&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/fernandaek/connections-in-power-platform-a6p" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 9 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/fernandaek/connections-in-power-platform-a6p" id="article-link-2577690"&gt;
          Connections in Power Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/powerplatform"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;powerplatform&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/powerautomate"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;powerautomate&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/powerapps"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;powerapps&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/powerfuldevs"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;powerfuldevs&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/fernandaek/connections-in-power-platform-a6p" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/fernandaek/connections-in-power-platform-a6p#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              2&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>powerfuldevs</category>
    </item>
    <item>
      <title>Connections in Power Platform</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Mon, 09 Jun 2025 09:06:19 +0000</pubDate>
      <link>https://forem.com/fernandaek/connections-in-power-platform-a6p</link>
      <guid>https://forem.com/fernandaek/connections-in-power-platform-a6p</guid>
      <description>&lt;p&gt;A while ago, I was helping a colleague with Power Automate flow when asked:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wait, why is this flow sending emails as me instead of our shared mailbox?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Many people build flows every day without really understanding how connections work behind the scenes. So in this post, I'm going to explain everything you need to know about connections in Power Platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  But first: What are connectors in Power Platform?
&lt;/h2&gt;

&lt;p&gt;Before we jump into connections, I believe it's important to briefly explain what connectors are and how they function within the Power Platform.&lt;/p&gt;

&lt;p&gt;One of the biggest superpowers of the Power Platform is how well it integrates with other systems. Microsoft gives us access to over 1000 connectors like SharePoint, Outlook, Teams etc and that number is growing constantly.&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/connectors/connector-reference/connector-reference-powerautomate-connectors" rel="noopener noreferrer"&gt;List of all Power Platform connectors&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F4kcfkxpgnlz8htd7gjf9.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.amazonaws.com%2Fuploads%2Farticles%2F4kcfkxpgnlz8htd7gjf9.png" alt="Image description" width="800" height="843"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No matter what service you’re trying to automate or pull data from, there's probably a connector for it.&lt;/p&gt;

&lt;p&gt;Every connector needs a connection.&lt;/p&gt;

&lt;p&gt;That connection is like the "key" that unlocks access to that service and it’s almost always tied to a specific user account.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is connection in Power Platform?
&lt;/h2&gt;

&lt;p&gt;In Power Platform, a connection is how, for example, your flow talks to another service, like: SharePoint, Outlook, Dataverse or even external systems like Salesforce, SAP or custom API. It’s like giving Power Automate a permission to act on your behalf in those systems.&lt;/p&gt;

&lt;p&gt;By default, it picks your own account.&lt;/p&gt;

&lt;p&gt;That’s fine when the flow is personal. But in shared or business critical (when it supports essential operations within an organization), it can be a problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connections are tied to a user or a account
&lt;/h3&gt;

&lt;p&gt;When you add a connector, let's say SharePoint, Power Platform will ask for the user account. If you pick your own account, everything works great until YOU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave the company,&lt;/li&gt;
&lt;li&gt;change your password,&lt;/li&gt;
&lt;li&gt;you go on vacation and someone else needs to fix the resource in Power Platform,&lt;/li&gt;
&lt;li&gt;you share the resource and now other users are running actions under your identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Not great huh&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When connections cause issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When flows stop working:&lt;/strong&gt; If a flow uses your personal account and your password expires or you leave the company, the flow breaks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When flows run with the wrong identity:&lt;/strong&gt; If you're sending emails, creating items or modifying data and it's done using your name users might get confused, specially if you are an external consultant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When you need traceability:&lt;/strong&gt; You can’t track ownership properly when everything’s tied to individual users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sharing connections
&lt;/h3&gt;

&lt;p&gt;Power Automate makes it way too easy to accidentally share something that shouldn’t be shared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You create a flow that sends emails from Outlook using your account. You later share the flow with someone else... but forget to update the connection.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now you’ve got someone else triggering a flow and emails are being sent under your name and mailbox.&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.amazonaws.com%2Fuploads%2Farticles%2F0maqv8nkacyyqaoyleu6.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.amazonaws.com%2Fuploads%2Farticles%2F0maqv8nkacyyqaoyleu6.png" alt="Image description" width="691" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That's awkward at best and a data privacy risk at worst.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared Connections ≠ Shared Responsibility
&lt;/h3&gt;

&lt;p&gt;Nope.&lt;br&gt;
If you’re managing shared resources in Power Platform, make sure connections are reviewed and either replaced with service accounts or managed using solutions and environment variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal productivity ≠ Business resources
&lt;/h2&gt;

&lt;p&gt;If you're automating your own tasks and maybe just trying to save yourself time, that’s personal productivity. The moment your automation starts handling shared data, emailing customers, writing to shared systems or being used by others, then you're no longer in the “personal productivity” space. You're in the “business resource” space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Personal Productivity&lt;/th&gt;
&lt;th&gt;Business Resource&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built by and for one user&lt;/td&gt;
&lt;td&gt;Shared across teams or part of a business process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runs under your identity&lt;/td&gt;
&lt;td&gt;Needs a consistent, auditable identity (like a service account)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure affects just you&lt;/td&gt;
&lt;td&gt;Failure can affect teams, customers, or compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No risk if you leave the company&lt;/td&gt;
&lt;td&gt;Serious risk if you're the only one who owns the connection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Using a service account means the flow will keep running, even if you’re on vacation or change teams. It also makes ownership crystal clear.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to manage connections in Power Platform
&lt;/h2&gt;

&lt;p&gt;Connections exist across the entire Power Platform, and how you manage them depends a bit on which tool you’re using. But the core idea is the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. View the existing connections: Power Automate&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit your flow&lt;/li&gt;
&lt;li&gt;Select each action and view or change the connection&lt;/li&gt;
&lt;li&gt;Or to manage globally: go to “Connections” &lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fagtl6urd3kgl7upz2a6d.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.amazonaws.com%2Fuploads%2Farticles%2Fagtl6urd3kgl7upz2a6d.png" alt="Image description" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. View the existing connections: Power Apps (Canvas)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit your app&lt;/li&gt;
&lt;li&gt;Go to “Data”, you’ll see all connected data sources then you can remove, refresh, or replace each connection.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Ffoq5mhz3tk87oyihemhg.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.amazonaws.com%2Fuploads%2Farticles%2Ffoq5mhz3tk87oyihemhg.png" alt="Image description" width="714" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. You also can manage these in the solution&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fwyfsycsjy0vxymwumpc3.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.amazonaws.com%2Fuploads%2Farticles%2Fwyfsycsjy0vxymwumpc3.png" alt="Image description" width="800" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Educate you team, connection management is something people don’t know they don’t know. Spread the knowledge.&lt;/em&gt; &lt;br&gt;
&lt;strong&gt;...and document everything!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>powerfuldevs</category>
    </item>
    <item>
      <title>3 most common challenges when setting up Power Platform Governance and how to solve them</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Thu, 05 Jun 2025 18:18:31 +0000</pubDate>
      <link>https://forem.com/fernandaek/3-most-common-challenges-when-setting-up-power-platform-governance-and-how-to-solve-them-25j3</link>
      <guid>https://forem.com/fernandaek/3-most-common-challenges-when-setting-up-power-platform-governance-and-how-to-solve-them-25j3</guid>
      <description>&lt;p&gt;A few weeks ago, I had a conversation with a client who asked, “Do we really need governance in Power Platform? I mean, we already have governance around Microsoft 365 and Azure. Isn’t that enough?” That question really hit because I’ve heard it so many times.&lt;/p&gt;

&lt;p&gt;A lot of organizations I work with do understand the need for governance. The tricky part is that their focus is usually on the more traditional areas like email, Teams, identity and infrastructure not on the Power Platform. And yet, Power Platform introduces a whole new layer of tools, users and risks that aren’t covered by those existing policies.&lt;/p&gt;

&lt;p&gt;Implementing Power Platform governance is often a complex, layered process  and even organizations with strong foundations in Microsoft 365 and Azure can find themselves overwhelmed by the new concepts and responsibilities that Power Platform brings. &lt;/p&gt;

&lt;p&gt;In todays post I will try to break down the 3 most common challenges I’ve encountered when working with Power Platform governance and I’ll provide my ways to overcome them. &lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge 1: IT Admins are unfamiliar with Power Platform concepts
&lt;/h2&gt;

&lt;p&gt;Many IT administrators are comfortable with Microsoft 365 and Azure, but the Power Platform introduces new paradigms: environments, Power Platform DLP (Data Loss Prevention) policies, custom connectors, solutions, makers, and more. It's not uncommon to see IT professionals struggle with the admin interfaces or how it brings new things to the table. Some admins find it tricky at first.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why this happens?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Power Platform lives in that space between IT and business users. The platform gives business users (makers) powerful tools, which introduces risks if not understood or managed properly. If IT doesn't have a clear understanding, they often can't provide appropriate guardrails.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What you/your org can do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with Education:&lt;/strong&gt; Encourage your IT team to engage with the Power Platform Community, blogs and Microsoft's documentation to stay updated on best practices and when possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the Power Platform Admin Center:&lt;/strong&gt; Familiarize yourself with the Admin Center, it’s your control tower for managing environments, capacity, analytics, and policies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F5on8fj74dd80ukteus5z.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.amazonaws.com%2Fuploads%2Farticles%2F5on8fj74dd80ukteus5z.png" alt="Image description" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Join the Community:&lt;/strong&gt; Engage with the Power Platform Community, blogs and Microsoft's documentation to stay updated on best practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenge 2: No one knows what has been built, by whom, or why
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F7oqq4v9jc5g4ymkx2jvh.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.amazonaws.com%2Fuploads%2Farticles%2F7oqq4v9jc5g4ymkx2jvh.png" alt="Image description" width="800" height="346"&gt;&lt;/a&gt;&lt;br&gt;
In an open, ungoverned environment, apps and flows get created organically. Over time, people in different departments build apps and flows. But without governance, nobody tracks who built what, where it’s running or even if it’s still needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why this happens?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Power Platform is easy to adopt, which is its strength and weakness. Without governance from the start, users create apps to solve local problems without oversight or documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What you/your org can do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Implement the Center of Excellence (CoE) Starter Kit (&lt;a href="https://dev.to/fernandaek/power-platform-strategy-with-coe-6eh"&gt;read more here&lt;/a&gt;) this solution helps you track app and flow inventory, maker activity and usage trends. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App/Flow inventory&lt;/li&gt;
&lt;li&gt;Environment insights&lt;/li&gt;
&lt;li&gt;Orphaned resources reporting&lt;/li&gt;
&lt;li&gt;Nurture communications to support makers&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fmh23vovxhgs9g6h7u1m8.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.amazonaws.com%2Fuploads%2Farticles%2Fmh23vovxhgs9g6h7u1m8.png" alt="Image description" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;…and maybe, implement a 'request process', I mean ask users to submit a short form describing the purpose, owner, and data used before publishing solutions to production.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge 3: Responsibilities for managing the Platform have not been defined
&lt;/h2&gt;

&lt;p&gt;In many organizations, it's unclear who is responsible for different aspects of Power Platform governance. Who’s in charge of what? Who handles support? Who approves new environments? If you don’t define this early, things can slip through the cracks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why this happens?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Power Platform is used by both IT and business teams. That’s great for collaboration, but it also causes confusion over who’s responsible for what.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What you/your org can do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Define roles and responsibilities using a RACI (Responsible, Accountable, Consulted, Informed) Matrix model. &lt;/p&gt;

&lt;p&gt;Here’s what those roles mean:&lt;br&gt;
&lt;strong&gt;Responsible:&lt;/strong&gt; The person (or team) who actually do the work.&lt;br&gt;
&lt;strong&gt;Accountable:&lt;/strong&gt; The one who makes sure the work gets done and signs off on decisions.&lt;br&gt;
&lt;strong&gt;Consulted:&lt;/strong&gt; People who should be asked for input or advice before things move forward.&lt;br&gt;
&lt;strong&gt;Informed:&lt;/strong&gt; People who just need to be kept in the loop.&lt;/p&gt;

&lt;p&gt;For example:&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.amazonaws.com%2Fuploads%2Farticles%2Fnhul1zr3ka5xie6kzhoc.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.amazonaws.com%2Fuploads%2Farticles%2Fnhul1zr3ka5xie6kzhoc.png" alt="Image description" width="585" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Designate a Platform Owner. This person or team will be responsible for maintaining platform strategy, alignment and overall governance. They bridge the gap between business needs and IT control.&lt;/p&gt;

&lt;p&gt;In big companies, let each department have their own mini-admins while still following central rules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Governance isn’t about restricting users, it’s about empowering them with the right support and boundaries to innovate safely and sustainably. &lt;/p&gt;

&lt;p&gt;While it’s tempting to delay governance until you "have more apps" or "understand more," starting small with visibility and education will put you miles ahead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BONUS:&lt;/strong&gt; &lt;em&gt;If you’re just getting started, begin with visibility like the CoE Starter Kit and define a few simple rules. You don’t need a perfect setup from day one just a direction and some small wins.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerfuldevs</category>
      <category>powerautomate</category>
      <category>powerapps</category>
    </item>
    <item>
      <title>Setup document templates in Microsoft Teams using Power Automate</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Tue, 01 Apr 2025 15:36:38 +0000</pubDate>
      <link>https://forem.com/fernandaek/setup-document-templates-in-microsoft-teams-using-power-automate-33e4</link>
      <guid>https://forem.com/fernandaek/setup-document-templates-in-microsoft-teams-using-power-automate-33e4</guid>
      <description>&lt;p&gt;Have you ever wondered: “&lt;em&gt;Can we, and if so, how do we make our Word and Excel templates available under the 'Files' tab and 'New' button inside all Teams channels?&lt;/em&gt;”?&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;YES&lt;/strong&gt; and no, you don’t need to go into every single channel and do it manually 😅 &lt;em&gt;&lt;del&gt;Imagine having to distribute templates to hundreds of Teams channels across your organization… Yeah, no thanks.&lt;/del&gt;&lt;/em&gt; &lt;br&gt;
That’s where Power Automate comes in and saves the day.&lt;/p&gt;
&lt;h2&gt;
  
  
  But before... let’s talk a bit about Microsoft Teams
&lt;/h2&gt;

&lt;p&gt;Every time a team is created in Microsoft Teams, a corresponding SharePoint site is also created in the background. The Files tab in each channel is simply a document library in that SharePoint site. So when you click “New” in Teams to create a new Word or Excel file, it’s actually pulling from a folder in SharePoint and that’s exactly where your custom templates need to live.&lt;/p&gt;

&lt;p&gt;Knowing this, we can use Power Automate to target the SharePoint library directly and automate the process of uploading templates to the correct location.&lt;/p&gt;
&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Be a member:&lt;/strong&gt; The service account running the flow must have access to each Teams channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SharePoint admin permissions:&lt;/strong&gt; since we’ll be creating a custom content type and managing it from the SharePoint Admin Center&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 1:Content type
&lt;/h2&gt;

&lt;p&gt;Start by creating the content type from the SharePoint Admin Center. In the SharePoint Admin Center, go to&lt;br&gt;
Content services &amp;gt; Content type gallery &amp;gt; Create content type.&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.amazonaws.com%2Fuploads%2Farticles%2F31d7q8pfma65hczku8yc.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.amazonaws.com%2Fuploads%2Farticles%2F31d7q8pfma65hczku8yc.png" alt="Image description" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill in the following fields:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Something meaningful like Contoso Internal Template&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Optional, but great for keeping track of what the template is for&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parent content type:&lt;/strong&gt; Select “Document Content Types”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content type:&lt;/strong&gt; Document. Create&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.amazonaws.com%2Fuploads%2Farticles%2Fg1ijz3wt61ezlnimvayj.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.amazonaws.com%2Fuploads%2Farticles%2Fg1ijz3wt61ezlnimvayj.png" alt="Image description" width="739" height="951"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once created:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your Content type and select &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Advanced settings&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select “Upload a new template” and upload the template. Save.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fgqq3cj555jsooaqyc079.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.amazonaws.com%2Fuploads%2Farticles%2Fgqq3cj555jsooaqyc079.png" alt="Image description" width="731" height="959"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that your content type linked to a specific document template, it’s time to publish it so it becomes available across all SharePoint sites including the ones behind your Teams channels.&lt;br&gt;
This process can take a few minutes to propagate, especially in larger tenants.&lt;/p&gt;

&lt;p&gt;Once published, the content type will be available to add in any SharePoint document library. &lt;br&gt;
Checking in a random site collection&lt;br&gt;
&lt;em&gt;Before publishing&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fqlqnim8xsj3o1k5y0kp5.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.amazonaws.com%2Fuploads%2Farticles%2Fqlqnim8xsj3o1k5y0kp5.png" alt="Image description" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After publishing&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F5b30xm9xu4kog6ka752k.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.amazonaws.com%2Fuploads%2Farticles%2F5b30xm9xu4kog6ka752k.png" alt="Image description" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Enable Content type
&lt;/h2&gt;

&lt;p&gt;Before we can add our custom content type to each Teams library, we first need to enable content types in those libraries because by default, SharePoint document libraries (including the ones behind Teams) don’t allow multiple content types.&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.amazonaws.com%2Fuploads%2Farticles%2F0tnchawswymc99n06lho.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.amazonaws.com%2Fuploads%2Farticles%2F0tnchawswymc99n06lho.png" alt="Image description" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our case, we created a manually triggered Power Automate flow that retrieves all Teams and loops through them.&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.amazonaws.com%2Fuploads%2Farticles%2Fp9d7dkq1xmgg93gv631b.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.amazonaws.com%2Fuploads%2Farticles%2Fp9d7dkq1xmgg93gv631b.png" alt="Image description" width="620" height="864"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside our loop, we send a HTTP request to SharePoint to enable content types in the Documents library (or the correct library path).&lt;br&gt;
&lt;strong&gt;Method:&lt;/strong&gt; POST&lt;br&gt;
&lt;strong&gt;URI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/_api/web/lists/GetByTitle('Your library name')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Body:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "__metadata": { "type": "SP.List" },
  "ContentTypesEnabled": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2Fglc2qyfotl9zdar0y0uq.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.amazonaws.com%2Fuploads%2Farticles%2Fglc2qyfotl9zdar0y0uq.png" alt="Image description" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will modify the document library to allow content types, which is required before you can attach the custom content type we published earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add the custom content type to the site
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Ftuz17i67dy3fi1fv1cvx.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.amazonaws.com%2Fuploads%2Farticles%2Ftuz17i67dy3fi1fv1cvx.png" alt="Image description" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we’ll add the custom content type to each site using another a couple of API request and make sure that our template appear in Teams!&lt;/p&gt;

&lt;p&gt;Add a new 'Send an HTTP request to SharePoint'-action inside our loop and configure as bellow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This will add a copy of our published content type from the content type hub to a target site.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fd63qyy9k327c0718gxij.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.amazonaws.com%2Fuploads%2Farticles%2Fd63qyy9k327c0718gxij.png" alt="Image description" width="800" height="579"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Method:&lt;/strong&gt; POST&lt;br&gt;
&lt;strong&gt;URI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/_api/v2.0/sites/TEAMNAME/ContentTypes/addCopyFromContentTypeHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Content-Type": "application/json;odata=verbose"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Body:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"contentTypeId": "0x010100 YOUR CTID"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Get the CTID: By going back to the Content Type &amp;gt; Gallery in the SharePoint Admin Center &amp;gt; Clicking on your content type &amp;gt; Copying the Content Type ID from the details page&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: Add the custom content type to each library
&lt;/h2&gt;

&lt;p&gt;Now that content types are enabled in the libraries and available in the site, the next step is to add our custom content type to each SharePoint document library connected to a Teams channel.&lt;/p&gt;

&lt;p&gt;We will use another 'Send an HTTP request to SharePoint'-action inside our loop, as bellow.&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.amazonaws.com%2Fuploads%2Farticles%2Ftr8idu5u7l0raf43qscs.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.amazonaws.com%2Fuploads%2Farticles%2Ftr8idu5u7l0raf43qscs.png" alt="Image description" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method:&lt;/strong&gt; POST&lt;br&gt;
&lt;strong&gt;URI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/_api/web/lists/GetByTitle('Documents')/ContentTypes/AddAvailableContentType
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Content-Type": "application/json;odata=verbose"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Body:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"contentTypeId": "0x010100 YOUR CTID"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Replace "0x010100 YOUR CTID" with the actual Content Type ID from the Content type gallery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the flow
&lt;/h2&gt;

&lt;p&gt;After the flow runs successfully across your selected Teams channels, you can validate the outcome in two places:&lt;br&gt;
&lt;strong&gt;SharePoint library&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Friv6dv425riy6dfudj9u.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.amazonaws.com%2Fuploads%2Farticles%2Friv6dv425riy6dfudj9u.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fk4nnlhmbwi0sz0c8bp35.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.amazonaws.com%2Fuploads%2Farticles%2Fk4nnlhmbwi0sz0c8bp35.png" alt="Image description" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Voilà&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And there you have it, your custom document templates are now available under the &lt;strong&gt;New&lt;/strong&gt; button in the Files tab of every Teams channel in your organization.&lt;/p&gt;

</description>
      <category>microsoft365</category>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>sharepoint</category>
    </item>
    <item>
      <title>Using Power Automate to migrate SharePoint documents from one tenant to another while preserving System Columns</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Tue, 01 Apr 2025 11:37:37 +0000</pubDate>
      <link>https://forem.com/fernandaek/using-power-automate-to-migrate-sharepoint-documents-from-one-tenant-to-another-while-preserving-2p08</link>
      <guid>https://forem.com/fernandaek/using-power-automate-to-migrate-sharepoint-documents-from-one-tenant-to-another-while-preserving-2p08</guid>
      <description>&lt;h2&gt;
  
  
  The background
&lt;/h2&gt;

&lt;p&gt;After my previous post &lt;a href="https://dev.to/fernandaek/updating-sharepoint-items-without-modifying-system-columns-309i"&gt;Updating SharePoint Items Without Modifying System Columns&lt;/a&gt;, I got a really good question on LinkedIn. First of all, I’d like to take the opportunity to thank everyone who reached out and connected, it's been great seeing the interest and feedback!&lt;/p&gt;

&lt;p&gt;The question was whether the same kind of logic could be applied to documents instead of list items. And more than that, "&lt;em&gt;could it work across tenants?&lt;/em&gt;". &lt;br&gt;
He meant: create new documents in another tenant based on documents in a source tenant, and keep system columns like "Created", "Created by", "Modified", and "Modified by" intact.&lt;/p&gt;

&lt;p&gt;That got me thinking.&lt;/p&gt;

&lt;p&gt;Up until now, I’ve mostly done tenant-to-tenant migrations using tools like ShareGate, which make the process much easier. But I was curious to see what could be done directly in Power Automate. So, I decided to try and build a flow that moves documents from one SharePoint tenant to another without relying on third party tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;We’re talking about a few documents here, not massive libraries or thousands of files.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge
&lt;/h2&gt;

&lt;p&gt;Copying files between sites in the same tenant is straightforward in Power Automate. But what if you try to move something to another tenant, would the usual "Create file" or "Copy file" actions work?&lt;/p&gt;

&lt;h2&gt;
  
  
  The workaround
&lt;/h2&gt;

&lt;p&gt;What I discovered is that it’s possible to set up a flow that writes to a site in another tenant, you just have to add a new connection to the SharePoint connector using credentials from the destination tenant. &lt;em&gt;Magic huh&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's how we make it work
&lt;/h2&gt;

&lt;p&gt;Build your flow as usual, up until the point where you need to create the file in the target library in the destination tenant.&lt;/p&gt;

&lt;p&gt;Use your source tenant credentials for the "Get file properties", "Get file content", etc. actions.&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.amazonaws.com%2Fuploads%2Farticles%2Fyen4zf1s1eza6vaej4ds.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.amazonaws.com%2Fuploads%2Farticles%2Fyen4zf1s1eza6vaej4ds.png" alt="Image description" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add the "Create file" action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classic design: Click the three dots (…) in the top right of the action and select "Add new connection".&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern design: Select the action, and in the panel that opens on the left, down to the bottom, select "Change connection", then click "Add new connection".&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.amazonaws.com%2Fuploads%2Farticles%2Fi0y94gcntw5lcoxk3mg8.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.amazonaws.com%2Fuploads%2Farticles%2Fi0y94gcntw5lcoxk3mg8.png" alt="Image description" width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign in with a user from the destination tenant who has permission to write to the target document library.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fc49py30aktsxo895spph.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.amazonaws.com%2Fuploads%2Farticles%2Fc49py30aktsxo895spph.png" alt="Image description" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once connected, you’ll be able to select the site and folder path from the destination tenant just like you would within your own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now to the point, while it’s totally possible to copy documents across tenants using Power Automate, keeping system columns like "Created" and "Modified" is where things get complicated.&lt;br&gt;
If you follow the steps in this article &lt;a href="https://dev.to/fernandaek/updating-sharepoint-items-without-modifying-system-columns-309i"&gt;Updating SharePoint Items Without Modifying System Columns&lt;/a&gt; you will be able to preserve the original timestamps (Created/Modified dates). For author and editor (Created by / Modified by), those accounts must exist in the destination tenant, ff they don’t, you’ll need to assign another user account, I would recommend a service account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I’m still experimenting but can already confirm that document migration across tenants is possible using Power Automate. Even better, I was able to create new documents in a destination library based on a source library in another tenant, and keep the information in the system columns like Created, Modified, Created by, and Modified by (as long as the users exist).&lt;/p&gt;

</description>
      <category>sharepoint</category>
      <category>powerautomate</category>
      <category>powerplatform</category>
      <category>microsoft365</category>
    </item>
    <item>
      <title>Updating SharePoint items without modifying System columns</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Sat, 26 Oct 2024 08:55:45 +0000</pubDate>
      <link>https://forem.com/fernandaek/updating-sharepoint-items-without-modifying-system-columns-309i</link>
      <guid>https://forem.com/fernandaek/updating-sharepoint-items-without-modifying-system-columns-309i</guid>
      <description>&lt;p&gt;When working with SharePoint, there are scenarios where you need to update a library/list item’s information but want to keep the system fields, like Modified and Modified By, intact. In this blog post, I’ll walk you through how to update custom columns in a SharePoint list while preserving these system columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is This Useful?
&lt;/h2&gt;

&lt;p&gt;Imagine you have a live application and need to add new columns to an existing list or modify data without affecting the historical metadata, such as who modified or last modified the item. We want ensure that only the new information is updated and the record’s creation and modification details remain untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario
&lt;/h2&gt;

&lt;p&gt;Let’s take a SharePoint list named “Desks Reservations” where we store Desk Name, Description, etc. We now need to add an 'Reserved By email'-column and populate it with existing records without changing the original Created By, Created, Modified By and Modified fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Using PnP PowerShell
&lt;/h2&gt;

&lt;p&gt;We could use a PnP PowerShell script to modify specific fields while preserving the metadata related to who modified or created the item. The script would include a section that might look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Update the fields
Set-PnPListItem -List $ListName -Identity $ItemId -Values @{
    "Title" = "Test Title"; 
    "Category"="Test Category"
}

# Preserving system fields explicitly
Set-PnPListItem -List $ListName -Identity $ItemId -Values @{
    "Created" = $page.FieldValues["Created"];
    "Modified"= $page.FieldValues["Modified"];
    "Author" = $page.FieldValues["Author"].Email;
    "Editor" = $page.FieldValues["Editor"].Email;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Using Power Automate
&lt;/h2&gt;

&lt;p&gt;Another alternative (and the focus of this article) for performing this type of operation is to use Power Automate.&lt;br&gt;
Power Automate provides actions like 'Update Item' or 'Send an HTTP request to SharePoint' that can be used to update fields in a SharePoint list. When updating custom fields, you have to take additional steps to preserve the system columns by capturing the original values and then restoring them, similar to PowerShell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, how it works?&lt;/strong&gt; &lt;br&gt;
By default, whenever you update a SharePoint item, the system will change the 'Modified' and 'Modified By' fields to reflect the current user and the time the update was made.  What we will do is send an HTTP request to submit the original values along with our updates, similar to the PowerShell approach.&lt;/p&gt;
&lt;h3&gt;
  
  
  Set up
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Create an Instant Cloud Flow:&lt;/strong&gt; &lt;a href="https://make.powerautomate.com/" rel="noopener noreferrer"&gt;make.powerautomate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Retrieve SharePoint items:&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Foiosz3qvo5bnjeid746e.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.amazonaws.com%2Fuploads%2Farticles%2Foiosz3qvo5bnjeid746e.png" alt="Image description" width="544" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Add Compose Actions:&lt;/strong&gt; Use two Compose actions to store the 'Created By'-email and 'Modified By'-email for each item. &lt;em&gt;This will allow us to re-apply these values after we update the custom field.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fzalcpj7x4yvlqzkxk7gk.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.amazonaws.com%2Fuploads%2Farticles%2Fzalcpj7x4yvlqzkxk7gk.png" alt="Image description" width="520" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Create a JSON structure:&lt;/strong&gt; Include the custom fields you wish to update (like 'Reserved By email') and also pass the system fields that we want to preserve.&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.amazonaws.com%2Fuploads%2Farticles%2F0s1ih9an5f90sk4ciobu.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.amazonaws.com%2Fuploads%2Farticles%2F0s1ih9an5f90sk4ciobu.png" alt="Image description" width="464" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date formating expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;formatDateTime(items('Apply_to_each')?['Created'], 'yyyy-MM-dd hh:mm:ss')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Author is the internal name for the &lt;em&gt;Created by&lt;/em&gt;-field and Editor is the internal name for the &lt;em&gt;'Modified by'&lt;/em&gt;-field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Send the update request:&lt;/strong&gt; Use the Send an HTTP request to SharePoint action to post this data to your list. The method will be POST and the URI will point to the specific list and item:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_api/web/lists/getbytitle('Desk Reservations')/items(ID)/ValidateUpdateListItem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2F1q18yu01v3i08ffdw17v.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.amazonaws.com%2Fuploads%2Farticles%2F1q18yu01v3i08ffdw17v.png" alt="Image description" width="459" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;bNewDocumentUpdate&lt;/strong&gt; property is used in the HTTP request to indicate whether the update should be treated as a new or as a regular item update. When it's set to false, it prevents the system fields from being automatically updated with new metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  PowerShell vs. Power Automate
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Power Automate&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ideal for large-scale or batch processing of SharePoint list items.&lt;/td&gt;
&lt;td&gt;Better for individual item updates or smaller-scale operations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires scripting knowledge.&lt;/td&gt;
&lt;td&gt;Easier to manage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  My thoughts
&lt;/h2&gt;

&lt;p&gt;The choice between PowerShell and Power Automate depends on your specific needs. If you're performing large-scale operations, PowerShell might be the best option. On the other hand, if you’re looking for a more accessible, low-code solution with an intuitive interface, Power Automate is ideal. &lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fen2rjgdch70ca20rd959.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.amazonaws.com%2Fuploads%2Farticles%2Fen2rjgdch70ca20rd959.png" alt="Image description" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behind the scenes&lt;/strong&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F2l317cr9tpjj6n91kbyk.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.amazonaws.com%2Fuploads%2Farticles%2F2l317cr9tpjj6n91kbyk.png" alt="Image description" width="675" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt; &lt;em&gt;Voilà&lt;/em&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F0ols4ltwdsnsfomhv3vi.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.amazonaws.com%2Fuploads%2Farticles%2F0ols4ltwdsnsfomhv3vi.png" alt="Image description" width="800" height="127"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fpgt84qerzx8naqrmqttd.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.amazonaws.com%2Fuploads%2Farticles%2Fpgt84qerzx8naqrmqttd.png" alt="Image description" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ultimately, the right choice depends on the complexity of your task and your familiarity with scripting. Regardless of the tool you choose, you can efficiently manage SharePoint data while preserving system metadata.&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>sharepoint</category>
      <category>powerautomate</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Power Platform strategy with CoE</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Sun, 13 Oct 2024 15:15:26 +0000</pubDate>
      <link>https://forem.com/fernandaek/power-platform-strategy-with-coe-6eh</link>
      <guid>https://forem.com/fernandaek/power-platform-strategy-with-coe-6eh</guid>
      <description>&lt;p&gt;&lt;strong&gt;SPOILER ALERT:&lt;/strong&gt; This is going to be a looong article 😅 But my hope is that it will answer many questions about this topic.&lt;/p&gt;




&lt;p&gt;More and more companies are turning to automation to simplify their processes, which is, obviously, great. However, despite the growing popularity of Microsoft Power Platform (which is also great), some companies have yet to establish a clear strategy or a way to track what’s happening in their environments.&lt;/p&gt;

&lt;p&gt;This lack of governance can lead to a wild west of uncontrolled environments, often starting with the default environment, where there’s little oversight into who is creating what, how apps and flows are being shared or whether sensitive data is at risk.&lt;/p&gt;

&lt;p&gt;The default environment, if unmanaged, can quickly become chaotic. This exposes the organization to significant risks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security vulnerabilities:&lt;/strong&gt; apps using unauthorized connectors.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data governance issues:&lt;/strong&gt; apps and flows are shared without proper control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficulty scaling:&lt;/strong&gt; users adopt the platform without a clear understanding of best practices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Now to the reason I’m writing this blog post&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;I'm often asked to perform a Power Platform analysis, reviewing Power Automate flows and Power Apps applications and to provide recommendations.&lt;/p&gt;

&lt;p&gt;From what I’ve seen businesses find themselves in situation where they’ve enabled citizen development but lack a centralized way to track and manage the applications and automations that have been created. Without a proper Center of Excellence (CoE) in place, companies face the risk of duplicated efforts, apps going unmonitored or, worse, critical data breaches&lt;/p&gt;

&lt;p&gt;This blog post is here to address those challenges and to show how establishing a Power Platform CoE (specifically using the CoE Starter Kit) can bring order, governance and innovation, ensuring your automation initiatives stay secure, compliant and aligned with your business goals.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let’s dive in!&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Introduction to Power Platform Center of Excellence (CoE)
&lt;/h1&gt;

&lt;p&gt;The Power Platform Center of Excellence (CoE) is designed to help organizations adopt, govern and scale their use of Microsoft Power Platform. It brings together a set of tools and components aimed at providing administrative oversight, encouraging best practices and fostering innovation. The CoE plays a crucial role in managing environments, supporting makers, and ensuring that apps, flows, and connectors are used efficiently and securely.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the CoE Starter Kit?
&lt;/h2&gt;

&lt;p&gt;The CoE Starter Kit is a collection of Power Apps, Power Automate flows, Power BI reports and tools that help organizations implement a CoE. It provides a framework for managing governance, nurturing makers and automating workflows. Some key components include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Core components:&lt;/strong&gt; Tools that help admins manage resources like apps, flows and environments across their tenant. This includes inventory management, Power BI dashboards and apps like the DLP Impact Analysis and Set New App Owner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Governance components:&lt;/strong&gt; These help enforce governance policies through features like app archival and compliance monitoring. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Nurture components:&lt;/strong&gt; To support makers within the organization. The CoE includes Welcome email Flow and components designed to onboard new makers and share best practices.&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.amazonaws.com%2Fuploads%2Farticles%2Fagu4b8brc7prjik40yzd.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.amazonaws.com%2Fuploads%2Farticles%2Fagu4b8brc7prjik40yzd.png" alt="Image description" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s important to clarify that a CoE is not just about tools, but also about the people involved in managing and supporting the platform. &lt;/p&gt;

&lt;p&gt;A CoE team may include roles like admins, solution architects, citizen developers and governance specialists. Having the right team in place is critical for maintaining control over Power Platform solutions, ensuring that governance policies are followed and supporting users across the organization&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of implementing the CoE Starter Kit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Governance and process standardization:&lt;/strong&gt; The CoE Starter Kit helps enforce governance across Power Platform environments, ensuring that apps and flows adhere to data security and organizational guidelines. It also simplify processes like environment requests and user activity tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Lifecycle Management:&lt;/strong&gt; The CoE Starter Kit helps track component creation and usage as well as identify inactive apps and flows. It automates the environment cleanup process with tools like App Archive and Cleanup.&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.amazonaws.com%2Fuploads%2Farticles%2F82bjl271hkezfo0crglr.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.amazonaws.com%2Fuploads%2Farticles%2F82bjl271hkezfo0crglr.png" alt="Image description" width="666" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Data Loss Prevention (DLP):&lt;/strong&gt; The CoE includes a DLP Impact Analysis that provides visibility into how new policies might affect existing apps and connectors.&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.amazonaws.com%2Fuploads%2Farticles%2Fa97ycbkrkoxq2vfmhia3.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.amazonaws.com%2Fuploads%2Farticles%2Fa97ycbkrkoxq2vfmhia3.png" alt="Image description" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsoft CoE vs. Power Platform CoE
&lt;/h2&gt;

&lt;p&gt;If your organization already has a Microsoft Center of Excellence (CoE), you might wonder if this covers your Power Platform needs. While a Microsoft CoE can support broader IT governance, a Power Platform CoE ensures that Power Platform specific activities, such as Data Loss Prevention (DLP) and app ownership, are appropriately managed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Differences in Data Loss Prevention (DLP) between Microsoft and Power Platform governance
&lt;/h2&gt;

&lt;p&gt;DLP policies exist in both Microsoft 365 and Power Platform governance, but they serve different purposes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Microsoft 365 DLP:&lt;/strong&gt; This is generally focused on managing sensitive information across Microsoft 365 services like SharePoint. The policies are broader and designed to protect critical business data from being shared externally or stored improperly​.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Power Platform DLP:&lt;/strong&gt; It focuses specifically on how connectors interact with data across apps and flows by preventing unauthorized connectors from accessing sensitive data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommended for medium to large business
&lt;/h2&gt;

&lt;p&gt;Smaller companies may not immediately require the full suite of governance tools offered by the CoE Starter Kit, making it better suited for medium to large enterprises. These organizations often have multiple departments with varying levels of Power Platform adoption, making governance and user support essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started
&lt;/h2&gt;

&lt;p&gt;Prerequisites to set up the CoE Starter Kit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Power Apps Per User license and Power Automate Per User or Per Flow license.&lt;/li&gt;
&lt;li&gt;Admin access to the tenant with the Power Platform Admin or Global Tenant Admin role.&lt;/li&gt;
&lt;li&gt;Install and configure the CoE Starter Kit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With Copilot,  it’s easier than ever to create solutions, but that also means it’s easier to miss important governance steps. Without a CoE in place, apps could be deployed with insufficient security measures, leading to potential data leaks or unauthorized access. In short, the CoE isn’t just about managing what’s already been created, it’s about preparing for future success in a fast changing digital world.&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>powerapps</category>
      <category>microsoft365</category>
    </item>
    <item>
      <title>Using Parent and Child Flows for better workflow management</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Mon, 15 Jul 2024 06:03:18 +0000</pubDate>
      <link>https://forem.com/fernandaek/using-parent-and-child-flows-for-better-workflow-management-115c</link>
      <guid>https://forem.com/fernandaek/using-parent-and-child-flows-for-better-workflow-management-115c</guid>
      <description>&lt;p&gt;If you've been using Power Automate, you might have come across the term "parent flows" or "child flows." These concepts are super useful for organizing and managing your automation processes efficiently. In this blog post, I'll break down what parent flows and child flows are, why you should use them, and how to get started with them. Let's dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Parent Flows and Child Flows?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Parent flows
&lt;/h3&gt;

&lt;p&gt;Parent flows refer to the primary flow that calls another flow within Power Automate. Think of it as a larger process that includes smaller, specific tasks handled by other flows. This helps keep your main flow clean and focused while separating complex tasks into manageable pieces.&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.amazonaws.com%2Fuploads%2Farticles%2Fkf8qlu3xduvr8y9p8uls.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.amazonaws.com%2Fuploads%2Farticles%2Fkf8qlu3xduvr8y9p8uls.png" alt="Image description" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Child flows
&lt;/h3&gt;

&lt;p&gt;Child flows are a type of flow where a primary flow (the "parent") initiates another flow (the "child") to handle a specific task. The parent flow can then continue its process or wait for the child flow to complete and return results. This approach is excellent for reusing common tasks across multiple flows.&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.amazonaws.com%2Fuploads%2Farticles%2Fn2vy8hbb6dluj8ncs28h.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.amazonaws.com%2Fuploads%2Farticles%2Fn2vy8hbb6dluj8ncs28h.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Parent and Child flows?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Break down complex processes into simpler, reusable components.&lt;/li&gt;
&lt;li&gt;Easier to update and manage smaller, focused flows.&lt;/li&gt;
&lt;li&gt;Use the same child flow in multiple parent flows, saving time and effort.&lt;/li&gt;
&lt;li&gt;Efficiently manage and scale your automation processes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting up Parent and Child Flows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Both parent and child flows must be created within a solution. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Solutions are containers for grouping related flows, which simplifies management and deployment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1: Create your Child flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go to Power Automate&lt;/strong&gt;: Open Power Automate and create a new flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define Trigger and Actions&lt;/strong&gt;: Set the trigger for your child flow. &lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fg62i7qagv2i27zbfy7s3.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.amazonaws.com%2Fuploads%2Farticles%2Fg62i7qagv2i27zbfy7s3.png" alt="Image description" width="733" height="815"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Flb3q05bk6jg7fxt1qvmi.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.amazonaws.com%2Fuploads%2Farticles%2Flb3q05bk6jg7fxt1qvmi.png" alt="Image description" width="713" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add the necessary actions to perform the task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add Response Action&lt;/strong&gt;: If your child flow needs to return data to the parent flow, include a "Response" action at the end.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Forkzbiu9lonwaav0n5io.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.amazonaws.com%2Fuploads%2Farticles%2Forkzbiu9lonwaav0n5io.png" alt="Image description" width="697" height="805"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fn9dhod86k22pt4ore216.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.amazonaws.com%2Fuploads%2Farticles%2Fn9dhod86k22pt4ore216.png" alt="Image description" width="708" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create Your Parent Flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New Flow in Power Automate&lt;/strong&gt;: Create another new flow that will act as your parent flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Actions&lt;/strong&gt;: Define the trigger and initial actions for the parent flow.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fsvvu4dcrsy0rvz1c5k6l.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.amazonaws.com%2Fuploads%2Farticles%2Fsvvu4dcrsy0rvz1c5k6l.png" alt="Image description" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Invoke Child Flow&lt;/strong&gt;: Use the "Run a Child Flow" action to call your child flow. Pass any required inputs to the child flow.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fxt7vi1n6m8t4lbz013ab.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.amazonaws.com%2Fuploads%2Farticles%2Fxt7vi1n6m8t4lbz013ab.png" alt="Image description" width="673" height="794"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F8l5ibjty4a2a8g8ly2dp.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.amazonaws.com%2Fuploads%2Farticles%2F8l5ibjty4a2a8g8ly2dp.png" alt="Image description" width="769" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Handle Child Flow Responses
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Configure Response Handling&lt;/strong&gt;: If your child flow returns data, set up the parent flow to handle this data. This might involve adding conditional logic or further actions based on the child flow's output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Your Flows&lt;/strong&gt;: Run your parent flow and ensure that it correctly calls and interacts with the child flow.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fzqtwjapu7ofnxslf7vbh.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.amazonaws.com%2Fuploads%2Farticles%2Fzqtwjapu7ofnxslf7vbh.png" alt="Image description" width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Errors and Troubleshooting
&lt;/h2&gt;

&lt;p&gt;When working with parent and child flows, you may encounter several common errors. Here's how to recognize and troubleshoot them:&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: Multiple response actions
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;'The schema definition for action with status code '200' is invalid. The schema definitions for actions with the same status code is missing.'&lt;/em&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F0dixsit3cpzib41ufy4m.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.amazonaws.com%2Fuploads%2Farticles%2F0dixsit3cpzib41ufy4m.png" alt="Image description" width="800" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: Having more than one response action in your child flow with different schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Ensure that all PowerApps response actions in the child flow have the same schema or consolidate them into a single response action.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fajlt9qmj1sq1qzbhbakf.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.amazonaws.com%2Fuploads%2Farticles%2Fajlt9qmj1sq1qzbhbakf.png" alt="Image description" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: Inactive Child Flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: The child flow is inactive or has been deleted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Verify that the child flow is active and exists. Reactivate or recreate the child flow if necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Error: Incorrect "Connections used"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: The "Run only users" &amp;gt; "Connections used" is incorrect (Provided by the user run-only user), preventing the parent flow from executing the child flow.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fzsq3sf7yzuc44697vfn4.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.amazonaws.com%2Fuploads%2Farticles%2Fzsq3sf7yzuc44697vfn4.png" alt="Image description" width="499" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Check the "Run only users" settings in the child flow and update the "Connections used".&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fbnpxt1bbp29dx49mlxrx.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.amazonaws.com%2Fuploads%2Farticles%2Fbnpxt1bbp29dx49mlxrx.png" alt="Image description" width="541" height="933"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Parent and Child Flows
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear Naming Conventions&lt;/strong&gt;: Use descriptive names for your flows to easily identify their purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Document the functionality of each flow, especially if it's used in multiple parent flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Implement error handling in both parent and child flows to manage and log issues effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular Maintenance&lt;/strong&gt;: Periodically review and update your flows to incorporate new features and improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Parent and child flows in Power Automate can significantly improve the efficiency and manageability of your automation processes. By breaking down complex tasks into smaller, reusable components, you can create more modular, maintainable, and scalable flows. Try them out and see how they can upgrade your workflows!&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerfuldevs</category>
      <category>powerautomate</category>
    </item>
    <item>
      <title>Power Platform Hack: Turning a Managed solution into Unmanaged</title>
      <dc:creator>Fernanda Ek</dc:creator>
      <pubDate>Tue, 25 Jun 2024 16:36:41 +0000</pubDate>
      <link>https://forem.com/fernandaek/power-platform-hack-turning-a-managed-solution-into-unmanaged-no7</link>
      <guid>https://forem.com/fernandaek/power-platform-hack-turning-a-managed-solution-into-unmanaged-no7</guid>
      <description>&lt;p&gt;Hey folks! 👋 I’ve got quite a story to share about a little sweaty moment I had with Power Platform. If you’ve ever had a situation where you needed to convert a managed solution into an unmanaged one, keep reading… I’ve got a trick for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it all started: Importing
&lt;/h2&gt;

&lt;p&gt;So there I was, trying to import a solution back into my Power Platform environment. I got this error:&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.amazonaws.com%2Fuploads%2Farticles%2Fo0quwa5evba6jri3bmsi.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.amazonaws.com%2Fuploads%2Farticles%2Fo0quwa5evba6jri3bmsi.png" alt="Image description" width="576" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The import solution must have a higher version than the existing solution it is upgrading."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Honestly, I wasn’t sure how to fix it 😵‍💫 &lt;/p&gt;

&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;Not one to give up easily, I decided to dig into the solution file itself. I unzipped the solution and opened the &lt;code&gt;solution.xml&lt;/code&gt; file. This file contains all the details of your solution. Here’s a peek at the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ImportExportXml&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"9.2.24052.196"&lt;/span&gt; &lt;span class="na"&gt;SolutionPackageVersion=&lt;/span&gt;&lt;span class="s"&gt;"9.2"&lt;/span&gt; &lt;span class="na"&gt;languagecode=&lt;/span&gt;&lt;span class="s"&gt;"1033"&lt;/span&gt; &lt;span class="na"&gt;generatedBy=&lt;/span&gt;&lt;span class="s"&gt;"CrmLive"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SolutionManifest&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;UniqueName&amp;gt;&lt;/span&gt;QMS&lt;span class="nt"&gt;&amp;lt;/UniqueName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LocalizedNames&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;LocalizedName&lt;/span&gt; &lt;span class="na"&gt;description=&lt;/span&gt;&lt;span class="s"&gt;"QMS"&lt;/span&gt; &lt;span class="na"&gt;languagecode=&lt;/span&gt;&lt;span class="s"&gt;"1033"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/LocalizedNames&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Descriptions&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Version&amp;gt;&lt;/span&gt;1.0.0.4&lt;span class="nt"&gt;&amp;lt;/Version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Managed&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/Managed&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Publisher&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;UniqueName&amp;gt;&lt;/span&gt;xxxxxxxxx&lt;span class="nt"&gt;&amp;lt;/UniqueName&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;LocalizedNames&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;LocalizedName&lt;/span&gt; &lt;span class="na"&gt;description=&lt;/span&gt;&lt;span class="s"&gt;"xxxxx"&lt;/span&gt; &lt;span class="na"&gt;languagecode=&lt;/span&gt;&lt;span class="s"&gt;"1033"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/LocalizedNames&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Descriptions&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Other tags omitted for brevity --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Publisher&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RootComponents&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Components list --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/RootComponents&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;MissingDependencies&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/SolutionManifest&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ImportExportXml&amp;gt;&lt;/span&gt; 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I noticed the &lt;code&gt;&amp;lt;Version&amp;gt;&lt;/code&gt; tag and thought, “What if I just bump up the version number?” So, I changed &lt;code&gt;&amp;lt;Version&amp;gt;1.0.0.4&amp;lt;/Version&amp;gt;&lt;/code&gt; to something higher, like &lt;code&gt;&amp;lt;Version&amp;gt;1.0.0.7&amp;lt;/Version&amp;gt;&lt;/code&gt;, saved the file, zipped it back up, and tried importing it again. Success! 🎉&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.amazonaws.com%2Fuploads%2Farticles%2F2967345i1tm34i5xu5nx.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.amazonaws.com%2Fuploads%2Farticles%2F2967345i1tm34i5xu5nx.png" alt="Image description" width="800" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The “Eureka” moment with &lt;code&gt;&amp;lt;Managed&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;While I was poking around, another tag caught my eye: &lt;code&gt;&amp;lt;Managed&amp;gt;&lt;/code&gt;. It was set to &lt;code&gt;0&lt;/code&gt;, which means it was an unmanaged solution. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;In the context of many programming languages, 0 and 1 are used as Boolean values to represent false and true, respectively.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Curious, I wondered what would happen if it was a managed solution, if it was set to &lt;code&gt;1&lt;/code&gt;🤔 Then I decided to test it out with a managed solution… I changed it to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;•   1: This means the solution is managed. Managed solutions are typically used in production environments where you don’t want users to modify the solution directly. The 1 here is like saying “Yes, this is managed.”&lt;br&gt;
    • 0: This changes the solution to unmanaged. Unmanaged solutions are often used in development environments because they allow for direct modifications. The 0 here is like saying “No, this is not managed.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, by changing the  tag from 1 to 0, you’re effectively telling Power Platform that the solution should no longer be treated as a managed solution, allowing you to edit and customize it freely.&lt;/p&gt;

&lt;p&gt;So, I did just that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Managed&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/Managed&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I saved the file again, zipped it up, and imported it back into my environment. And guess what? The solution was now imported as an unmanaged solution! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Here’s how to do it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unzip and Edit&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Unzip the exported file and open &lt;code&gt;solution.xml&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Change the &lt;code&gt;&amp;lt;Managed&amp;gt;&lt;/code&gt; tag from &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fq97hge33gj8at572mxjd.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.amazonaws.com%2Fuploads%2Farticles%2Fq97hge33gj8at572mxjd.png" alt="Image description" width="800" height="164"&gt;&lt;/a&gt;&lt;br&gt;
    &lt;em&gt;If you’re facing a version issue, update the &lt;code&gt;&amp;lt;Version&amp;gt;&lt;/code&gt; tag to a higher number.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I find it easier opening it directly in Visual Studio Code, you can of course open with notepad as well.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2F2jdqspgqr4dsxrnmhucq.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.amazonaws.com%2Fuploads%2Farticles%2F2jdqspgqr4dsxrnmhucq.png" alt="Image description" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zip and Import&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zip up the files and import the solution back into your environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Voilà! You now have an unmanaged solution.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to use this trick
&lt;/h2&gt;

&lt;p&gt;Managed solutions are great for deploying stable versions to production environments but if you ever need to modify something or if you’ve somehow lost your unmanaged version and need to make changes, this little trick can save you tons of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;While this trick works, it’s more of a workaround than an official method. Use it wisely and always keep backups of your solutions. Also, keep in mind that this might not be suitable for all scenarios, especially in production environments where stability is key.&lt;/p&gt;

&lt;p&gt;I hope this helps you out as much as it did for me 🚀&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>powerautomate</category>
      <category>powerapps</category>
    </item>
  </channel>
</rss>
