
Search Content
186 results found with an empty search
- Power Apps App and Host Objects Explained: How to Detect Device, OS, and Screen Info
TL;DR: The App and Host objects in Power Apps let you read details about the device your app is running on and what the app is doing. This post explains what each object exposes, including OS type, browser, session, screen size, and theme colors, and shows you when to use them for troubleshooting and responsive design. Nothing earth shattering, just more core skills you need to have. A question came up in class recently that you have probably hit yourself: how do you make your app behave differently when someone is on an iPhone versus a PC? Maybe you want to open Apple Maps on iOS but send everyone else to a Google Maps link. The answer is the App and Host objects, two built in pieces of Power Apps that quietly hold a ton of useful information about the device, the session, and the app itself. In this post you will learn what the Host and App objects in Power Apps give you, how to read those values, and the real-world reasons you would reach for them. Most of the time it is either troubleshooting a user issue or making a responsive decision on the fly. If you would rather watch the full walkthrough, check out the video here: https://youtu.be/e20InQtbHxo What is the Host object in Power Apps? The Host object gives you information about the environment your app is running in, returned as simple text strings you can read or compare. To use it, you just type Host. in a property and pick what you want. That is genuinely as complicated as it gets. Here is what the Host object exposes: Host.BrowserUserAgent returns the browser user agent string. Host.OSType tells you the operating system, such as Windows, iOS, Android, or Linux. Host.SessionID gives you the current session identifier. Host.TenantID returns your tenant identifier. Host.AppVersion reports the host version the app is running on. Host.OfflineEnabled tells you whether offline is enabled. How do you use the Host object for troubleshooting and device decisions? There are two everyday uses. The first is troubleshooting. You can add a small button that pops up this information so a user can screenshot it and send it to you. Instead of asking someone whether they are on a phone or a laptop and getting a "I do not know", you can see their device, OS, and version information for yourself. The second is making decisions. Because the values come back as text, you can compare them and branch your logic. A real example from class last week: a student needed to open Apple Maps when a user was on iOS instead of sending them to the usual Maps link. The fix was to read the OS type or the browser user agent and decide from there. To see this in action, watch the walkthrough. What about the App.Host object and Host Info? (Two things to ignore) Two lookalikes trip people up, and for the basic scenario you can ignore both. There is an App.Host object in the tree on the left. It showed up fairly recently, but it has no usable properties. It is likely facilitating something behind the scenes, so for now there is nothing you can do with it. There is also HostInfo, used with ShowHostInfo. That one only applies when you have enabled offline, so it is tied to the offline data story and not to grabbing basic device information quickly. What is the App object in Power Apps? The App object holds information and settings about the app itself rather than the device. You access it the same way, by typing App. and choosing a property. One small quirk: the first time you type App. it sometimes does not show the properties, so back out and type it a second time and they appear. That looks like a bug, but it is harmless. The property you will probably use most is App.ActiveScreen, which is the screen the user is currently on. A common pattern is App.ActiveScreen.Name, which a lot of people drop into a header component, so the current screen name always shows at the top of the app. The App object also exposes things like the Theme and whether the app is in a printing state. How do you use App width and height for responsive design? App.Width and App.Height give you the current actual width and height of the app. That is useful in responsive scenarios when you want to know what the user is doing right now. For example, to tell whether the screen is currently horizontal or vertical, you just ask whether height is greater than width or the other way around. App.MinScreenWidth and App.MinScreenHeight are different. Those are the prespecified responsive size breakpoints you have designed, the points where your layout is meant to shift. If you build on size breakpoints, those are the values tied to that responsive story. How do you access theme colors with the App object? You can reach your app theme through the App object too. App.Theme.Colors lets you pull a specific theme color, such as Darker60 or Lighter10, and apply it to a control. Copy that value into a control's Fill and you get the matching theme color, which keeps your app consistent without hardcoding hex values. What settings live on the App object? Select the App object in the tree on the left and you will find a set of app wide settings worth knowing about, even if you do not touch them often: ConfirmExit and its message, so you can force a yes I really meant to close prompt on mobile. Named Formulas, a feature that adds real performance improvements to your apps. OnError, your global error handling entry point. OnStart, functionality that fires before the app loads, plus where you set start screen, theme, and the responsive size breakpoints. OnMessage, a newer one that is likely related to messages or notifications sent to the app, though it is worth confirming in the docs before you rely on it. You do not need to memorize every one. The useful habit is to jump in here periodically and remind yourself what is available so you reach for the right tool when a need comes up. What is the difference between the App and Host objects in Power Apps? The Host object gives you information about the environment and device, such as OS type, browser user agent, session ID, and host version. The App object gives you information and settings about the app itself, such as the active screen, current width and height, and theme colors. How do I detect whether a Power Apps user is on iPhone or Android? Use Host.OSType, which returns values like iOS, Android, Windows, or Linux. Because it comes back as text, you can compare it and branch your logic, for example opening Apple Maps on iOS and a Google Maps link everywhere else. How do I check if a Power Apps screen is in portrait or landscape? Compare App.Height and App.Width. If height is greater than width the screen is vertical, and if width is greater than height it is horizontal. These return the current actual dimensions, so they update as the screen changes. What is the difference between App.Width and App.MinScreenWidth? App.Width is the current actual width of the app at runtime. App.MinScreenWidth is a prespecified responsive breakpoint you design, used to decide when your layout should shift. Why does the App.Host object have no properties? The App.Host object appeared in the tree fairly recently and currently exposes no usable properties. It is likely supporting something behind the scenes, so for now you can safely ignore it. How do I use my Power Apps theme colors in a formula? Use App.Theme.Colors followed by the color name, such as Darker60 or Lighter10, and apply it to a control property like Fill. This keeps your colors consistent with the app theme without hardcoding hex values. Key takeaways The Host object returns environment details as text, including OSType, BrowserUserAgent, SessionID, TenantID, AppVersion, and OfflineEnabled. The App object exposes app level information such as ActiveScreen, current Width and Height, theme colors, and app wide settings. Host values are commonly used for troubleshooting and for conditional logic like opening Apple Maps on iOS versus a Google Maps link elsewhere. App.Width and App.Height tell you the current screen size, while App.MinScreenWidth and App.MinScreenHeight are your designed responsive breakpoints. App.ActiveScreen.Name is a popular way to show the current screen name in a header component. Ignore the App.Host object and Host Info for basic scenarios, since App.Host has no usable properties and Host Info only applies to offline enabled apps. A practical way to make a Power Apps screen look good is to build the structure yourself, then iterate with an AI tool to polish the design. Need a hand with Power Platform? If you want help building solutions like this or taking your Power Platform skills further, the team at PowerApps911 can help. Click the Contact Us button and tell us how we can help! Thanks for reading.
- What Is Copilot Cowork and Why Does GA Matter?
Copilot Cowork is officially Generally Available. And honestly? I'm excited, I love me some Cowork. I've been using Cowork daily since it first showed up in the Frontier program, and it has become one of those tools that quietly changes how you work. Not because it gives better answers than chat, but because it actually does the work. That's always been the magic of Cowork. Traditional AI chat is great at helping you think through a problem. Cowork is great at taking a goal and executing a series of steps to get there. Instead of asking AI for advice, you're increasingly asking AI to complete a task and bring you back the finished result. Microsoft describes it as handling long-running, multi-step work, and that lines up well with what I've seen in real-world usage. More of a visual learner? I have a complete video walkthrough, with demos of what is new, here: What is new with Copilot Cowork. What Changed When Cowork Moved from Frontier to GA? Frontier was Microsoft's way of saying, "This is the future, but we're still figuring some things out." The technology was evolving quickly. The user experience was evolving quickly. And the licensing story was still evolving we found out. GA is Microsoft planting a flag in the ground. Cowork is now a real product with a real licensing model, real governance controls, and a clear path forward. How Much Does Copilot Cowork Cost? The biggest surprise for many people will be that Cowork is no longer simply "included." You now need a Microsoft 365 Copilot license, and Cowork usage consumes Copilot Credits. That's a tougher answer than many of us were hoping for, but it isn't surprising. Long-running agentic tasks burn a lot of tokens, call a lot of services, and can run for extended periods of time. Somebody has to pay for that compute. And, there is a lot of value being generated from all of that compute. The good news is Microsoft is giving organizations controls around usage, spending limits, and administration. Cowork is off by default, and admins can decide who gets access and how much can be consumed. I poked around for a bit, and the policies look pretty good and flexible, I need to explore more though. Do I wish it was an all-you-can-eat buffet? Absolutely. Do I understand why it isn't? Also, yes. Microsoft's own testing indicates Cowork can execute similar work at roughly 30 to 40% lower cost than comparable Claude Cowork with M365 scenarios, which helps soften the impact a bit. What New Features Did Copilot Cowork GA Introduce? GA is bringing some genuinely interesting updates: More model choices, including GPT 5.5, with Microsoft's upcoming Cowork 1 model arriving soon. Model flexibility continues to be one of the strongest reasons to build on Microsoft's AI platform. (This is my big bet on why Microsoft wins in the end) Improved plugin and skill management, making it easier to extend what Cowork can do. Browser Use, allowing Cowork to interact with websites through a local Edge browser. (Still waiting for this one to light up in my tenant.) A refined user experience that is rolling out across tenants. (Also not showing up for me quite yet but shows up for my coworkers, very rude.) Is Copilot Cowork Worth the Cost? At the end of the day, I would have loved for Cowork to be unlimited. But if the tradeoff is getting a sustainable platform that Microsoft can continue investing heavily in, then the pricing model is reasonable. More importantly, the product is genuinely good. I use it. I like it. I rely on it. Now that it's GA, I expect a lot more organizations to start taking it seriously. If you're trying to figure out licensing, governance, adoption, training, or how Cowork fits into your broader Microsoft AI strategy, we'd be happy to help. We spend a lot of time helping organizations make sense of Copilot, Cowork, Copilot Studio, and the rapidly growing Microsoft AI ecosystem. Just click the Contact button. Now excuse me while I keep trying to get Browser Use to show up in my tenant. 😁 Key Takeaways Copilot Cowork is now Generally Available, having graduated from Microsoft's Frontier preview program. Cowork is built for long-running, multi-step agentic tasks — it completes work and returns a result, rather than just offering advice. A Microsoft 365 Copilot license is required, and usage is metered through Copilot Credits. Cowork is off by default; admins control access and can set spending limits at the organizational level. Microsoft's own testing shows Cowork completes similar tasks at roughly 30–40% lower cost than comparable Claude Cowork scenarios. GA introduces additional model choices (including GPT 5.5), improved skill management, Browser Use via Edge, and a refreshed UI. Organizations building a Microsoft AI strategy should plan for Cowork alongside Copilot Studio and Microsoft 365 Copilot. If you have any questions or need assistance with Copilot Cowork, just click the button below and let us know how we can assist. FAQ Q: What is Copilot Cowork? A: Copilot Cowork is Microsoft's agentic AI assistant designed to handle long-running, multi-step tasks. Rather than answering questions, it executes a series of steps to complete a goal and returns a finished result. Q: Is Copilot Cowork included in Microsoft 365? A: No. Cowork requires a Microsoft 365 Copilot license, and usage consumes Copilot Credits. It is not included in base Microsoft 365 plans. Q: What is the difference between Microsoft Copilot chat and Copilot Cowork? A: Copilot chat helps you think through problems and provides answers. Cowork takes a goal, runs a multi-step process autonomously, and brings back a completed result. Q: What are Copilot Credits and how do they work? A: Copilot Credits are the consumption-based currency that powers Cowork tasks. More complex, longer-running tasks consume more credits. Organizations can set spending limits through the admin center. Q: Can IT admins control who uses Copilot Cowork? A: Yes. Cowork is off by default, and Microsoft 365 admins can control which users have access and how many Copilot Credits can be consumed through policies. Q: What new features came with the Copilot Cowork GA release? A: The GA release added model options including GPT 5.5, an upcoming Cowork 1 model, improved plugin and skill management, Browser Use (Cowork interacting with websites through Edge), and a refined user experience. Q: What is Browser Use in Copilot Cowork? A: Browser Use lets Cowork interact with websites directly through a local Edge browser, enabling tasks that require navigating or interacting with web-based content. Q: How does Copilot Cowork pricing compare to other AI tools? A: Microsoft's own testing indicates Cowork completes similar work at roughly 30 to 40% lower cost than comparable Claude Cowork scenarios.
- Microsoft Scout Explained: What Microsoft's First Autopilot Agent Is and What It Can Do
TLDR - Microsoft Scout is the first of Microsoft's new Autopilots: a personal AI agent that runs on your Windows 11 PC, can see local files, browse the web, and write and run code to finish tasks on its own, all inside security boundaries you and your admins control. It runs on GitHub Copilot Business or Enterprise credits rather than your Microsoft 365 Copilot license and getting it running today requires a Frontier organization and an Intune policy. Microsoft used its Build announcements to introduce something that changes how you think about AI assistants. It is called Microsoft Scout, and it is the first of what Microsoft is calling Autopilots. If you have been using Copilot chat and Cowork and wondering what comes next, this is it: an agent that can run on its own, see your local files, launch a browser, and write and run code to finish a job for you. This article covers what Scout is, what it can do today, how it gets billed, and the setup you need before you can try it, so you can decide where it fits next to the tools you already use. Want to see Scout in action? Watch the full walkthrough here: Hands-on with Microsoft Scout. What is Microsoft Scout? Microsoft Scout is the first example of Microsoft's new Autopilots. The easiest way to understand it is to line it up against the tools you already know. Copilot chat is a quick, one-to-one conversation. Ask a question, get an answer, move on. Cowork takes a recipe or standard operating procedure and runs a task on your behalf. It does the work for you, but on demand. You tell it to go, and it goes. Autopilots, with Scout being the first, are agents that run and do things for you without you having to sit there and interact. That is the leap. Scout is built on top of an OpenClaw agent platform, the same kind of technology that had people earlier this year automating everything on their own machines. Some of those experiments went great, and some deleted files or wiped-out accounts because there were no guardrails. What makes Microsoft Scout different is that you get that same autonomy inside the security boundaries provided by Microsoft. You can make sure it is not allowed to delete all your files or touch your bank accounts, and as you will see in the setup section, that security layer is a core part of the product. What can Microsoft Scout do? Scout's real difference is that it reaches beyond the cloud and onto your machine. Copilot and Cowork live in the cloud and will not run code for you or modify anything your desktop. Scout will. Here is what that looks like in practice, with brief examples from a real session. Read your local files. Scout can look through the folders on your PC. Ask it to see your downloads folder and it will. Run PowerShell to act on those files. In one example it found leftover installer files, then cleared 31 of them and freed 4.4 GB, after asking permission first. You never have to know what PowerShell is, just another tool Scout uses to accomplish your goals. Browse the web with a real browser. Scout opens a browser to reach sites and pages, and it will not handle your usernames and passwords, so signed-in sites have limits. Write and run code to solve a problem. When a browser login blocked it from grabbing a YouTube transcript, Scout installed an open-source tool, wrote and ran Python, and kept trying different approaches until it pulled the transcript and saved it to a working folder. Tenacity! Save repeatable work as a skill. Once it figures out a task, you can have Scout turn the steps into a reusable skill so next time is faster and uses fewer credits. Take on a personality. You can choose from a default professional tone, a sarcastic teenager, or an enthusiastic intern, which makes day-to-day use more fun. Now I can have the fun of my mouthy teenagers while at work. 🤣 The key idea across all of this: Scout asks permission before sensitive actions, and you can allow each step just for that session or deny it. You stay in control while it does the work. These examples are quick to summarize but more fun to watch. If you want to see Scout clean up a drive and write its own Python live, the full walkthrough is here. How is Scout different from Agent Builder and Copilot Studio? When you hear the word agent, your mind might jump to Agent Builder or Copilot Studio, but those do a different job. Agent Builder is for chatbot-style agents that chat with a little configuration. Copilot Studio is where you build both conversational and autonomous agents with tools and MCP servers, the kind of enterprise-grade, department-level solution you stand up for a whole team or organization. Scout is not that. Scout is a personal assistant, an agent running just to do things for you. In the broader agent progression, it lands in the no-code bucket alongside Copilot for SharePoint, Agent Builder, and Cowork, even though it can run its own code under the hood. Above that sit Copilot Studio and Agent Flows for enterprise solutions, and above those is full code. Scout is interesting precisely because it lives in the no-code world while still being able to run code, which the other no-code options cannot do. Chat vs Cowork vs Scout: what's the difference? If you already use Copilot Cowork, Scout can feel familiar at first. The easiest way to understand where it fits is to line it up against the two tools you already know. The real difference is not what each one knows, it is how much it does on its own. Copilot Chat is reactive. It is a quick, one-to-one conversation. You ask a question, you get an answer, and you move on. Nothing happens until you type again. Cowork works on demand. You hand it a recipe or standard operating procedure and it runs the whole task on your behalf. You say go, it goes, and then it stops. Scout is autonomous. It is a personal agent that runs and does things for you without you sitting there to drive it. Through automations and heartbeats, it can work in the background on a schedule or a trigger, and unlike Chat and Cowork it can reach your local files, launch a browser, and write and run code, all inside guardrails you control. Think of it as an autonomy ladder. Chat answers, Cowork delivers a task, and Scout runs on its own. That last step, an agent that keeps working while you do something else, is what makes Scout a real shift rather than just another chat window. What are automations and heartbeats? Scout can work in the background two ways, and they are easy to mix up. Automations feel like a Power Automate flow. You tell Scout to run a prompt on a schedule or when a condition is met, such as every hour, once a week, or when a certain file changes. For example: every day at 4:00, check for new videos and generate the summary content that goes with them. You can then run multiple steps. Heartbeats run a prompt on a recurring pulse, such as every 30 minutes, every two hours, during work hours, or always. A common example is triaging your inbox each hour to flag urgent messages from your boss. Running just the same prompt each time. Both can run quietly while you do other things, which is the whole point of an agent. Just be deliberate about frequency. You are paying for usage, so a heartbeat every 15 minutes around the clock burns credits fast. When you set up an automation, also review its permissions and only grant what it needs. If an automation never needs the file system or the ability to run code, do not give it those rights. What tools, skills, and MCP servers can Scout use? Scout ships with built-in skills for Word, PowerPoint, Excel, Loop, and building websites and HTML. You can add your own skills too, since a skill is just a pre-packaged recipe written in markdown. You can even ask Scout to write a skill for you so you do not have to spell out every step again. You can also connect MCP servers, which is how you expand what Scout can reach. One of the things that boxes in Cowork and Copilot is that they are sealed off. With MCP servers you can give Scout access to other tools and data, for example a Dataverse MCP to pull in Dataverse and Dynamics data, or Power Apps MCPs. If you do not know what MCP servers are yet, that is fine. You will get there. Which model and settings should you use? Scout lets you pick the model behind each chat, and the choice affects both quality and cost. The default when you first turn it on can be one of the most expensive options, so match the model to the job. Deep, hard thinking may justify a premium model, while cleaning up a hard drive runs fine on a cheaper, lighter one. You can set a default model in settings so it is always your preferred choice. A few other settings matter. Memory lets Scout learn about you over time. Your default working location is where Scout has the most permissions, and asking it to work outside that location triggers more permission prompts, so set it to the workspace you actually want. Finally, Scout has a prevent sleep setting that needs to be on, because automations and heartbeats only fire while Scout is running. How is Microsoft Scout billed? This is important and easy to miss. When you install Scout you connect it to your GitHub Copilot, and it uses your GitHub Copilot credits to do its job. Scout is not included in your Microsoft 365 Copilot licensing. As of today you need a Microsoft 365 account plus a GitHub Copilot Business or Enterprise account with credits available. The more Scout does, the more credits it uses, so cost scales directly with usage. This is all frontier and new, so Microsoft may change how it works, but that is the model right now. What do you need to set up Microsoft Scout? Installing Scout itself is next, next, finish. The challenge is everything that has to be in place first, and this is the part that keeps most people from trying it today. On the user side you need Windows 11, a Microsoft 365 account, permission to install the app, and a GitHub Copilot Business or Enterprise license, since that license is where the consumption comes from. The admin side is where the work piles up. Your organization must be a Frontier organization. Then an admin configures a Microsoft Scout Intune policy on the target devices, which means setting up Intune, creating a policy, adding the user, and getting the PC to accept it. After that you complete a Microsoft form acknowledging that Scout can process data outside the Microsoft safety bubble, because if GitHub Copilot is configured to use external models, Scout will use them too. None of this is trivial, so if you want to try Scout, engage your IT team early. If you have any questions or need assistance with Microsoft Scout, just click the button below and let us know how we can assist. Frequently Asked Questions What is Microsoft Scout? Microsoft Scout is the first of Microsoft's Autopilots, a personal AI agent that runs on your Windows 11 PC and can complete tasks on its own. Unlike Copilot chat, which is quick question and answer, and Cowork, which runs recipes on demand, Scout is built to run in the background and act for you within security boundaries you and your admins control. How much does Microsoft Scout cost? Scout runs on your GitHub Copilot Business or Enterprise credits, not your Microsoft 365 Copilot license. There is no flat cost. The more Scout runs, the more credits it consumes, so cost scales with how much you use it. What do you need to run Microsoft Scout? You need Windows 11, a Microsoft 365 account, permission to install the app, and a GitHub Copilot Business or Enterprise license. Your organization must be a Frontier organization, and an admin must configure a Microsoft Scout Intune policy and a data acknowledgment before it will run. Is Microsoft Scout safe to use? Scout asks permission before sensitive actions, and you can allow or deny each one. Admins set boundaries through Intune, and you can restrict what automations are allowed to do, such as blocking file system or code access, so it only ever has the permissions it needs. What is the difference between automations and heartbeats? Automations run a prompt on a schedule or when a condition like a file change is met. Heartbeats run a prompt on a recurring pulse, such as every 30 minutes or during work hours. Both consume credits, so set them on a cadence that matches what you need and can afford. Key Takeaways Microsoft Scout is the first of Microsoft's Autopilots, a personal agent that runs tasks on its own rather than only on demand. Scout can read local files, run PowerShell, browse the web, and write and run code, which Copilot chat and Cowork cannot do. Every sensitive action requires your permission, and admins set the security boundaries through an Intune policy. Scout runs on GitHub Copilot Business or Enterprise credits, not Microsoft 365 Copilot licensing, so usage has a direct cost. Automations run on schedules or triggers, while heartbeats run a prompt on a recurring pulse, and both consume credits. You can extend Scout with built-in skills, your own skills, and MCP servers such as Dataverse or Power Apps. Setup today requires Windows 11, Microsoft 365, a Frontier organization, and an Intune policy, so involve IT early. Let's Build Something Awesome Together If you want help getting Scout set up, or you are trying to keep up with all this AI and make your business more productive, the team at PowerApps911 can help. We offer consulting and training, including our Microsoft Power Platform and AI University. Reach out by clicking the Contact Us button and let us know how we can help.
- How to Auto-Sort Email Attachments with Power Automate and AI
Do you, or someone you know, get buried in emails full of attachments that all need to go somewhere different? One file is a purchase order, the next is an invoice, the one after that is a resume, and somewhere in the pile is a photo somebody swore was important. If your day involves constantly triaging emails and dragging files into the right folders, this one is for you. In this guide you will learn how to use a Power Automate cloud flow, a couple of AI prompts, SharePoint, and even Copilot to automatically sort attachments for you. The flow figures out what each file is, drops it into the right SharePoint folder, and pulls the important details into the file properties. The whole idea is to sprinkle a little AI into a process you are probably already running, so you get better results with a lot less manual work. I will also show you a second way to do the same thing using Copilot in SharePoint, so you can decide which approach fits your situation best. Prefer to watch instead of read? Check out the full walkthrough here: https://youtu.be/BgEeOe5NMSI TL;DR: A Power Automate flow watches your inbox, loops through each email attachment, uses an AI prompt to label it as an invoice, purchase order, resume, or other, saves it to the matching SharePoint folder, and pulls the key details into the file properties. You can also do the data extraction with no flow at all using Copilot autofill columns in SharePoint (an M365 Copilot license is required). The Setup: One Messy Email, Four Attachments Here is the scenario. I asked my coworker to send me a few things: a purchase order, a resume, some invoices, and a cute picture for good measure. What I really wanted was for everything to land in the right place automatically. What I got instead was a single email with everything but the kitchen sink crammed into it, attachments and all. That is actually perfect, because it is exactly the kind of mess this flow is built to clean up. When that email lands, all four files need to be sorted, saved, and have their key data pulled out. Let us look at how the flow handles it. What Does This Power Automate Flow Actually Do? Before we get into the details, here is the big picture of what the flow does each time that email arrives: The email trigger kicks off the flow. It grabs the attachments and loops through each one. An AI prompt looks at each file and categorizes it as a resume, purchase order, invoice, or other. The file is saved to a SharePoint folder that matches its category. Based on that same category, a specialized prompt extracts the important details and writes them to the file properties. With four attachments, the loop runs four times. If only one file came in, it would run once. Simple as that. Step 1: Trigger the Flow When an Email Arrives The flow starts with the When a new email arrives trigger. This is where you decide what counts as a file worth sorting. You can scope it to a specific mailbox, a specific sender, only emails that have attachments, or only mail that lands in a certain folder. There are a lot of options here, so configure it to match how the mail actually shows up for you. A common real-world pattern is a shared or generic mailbox. Customers will set up something like invoices@yourcompany.com, and the flow fires every time something lands there. That keeps the automation tightly focused on the mail you actually want to process. Step 2: Get and Loop Through the Attachments Next, add a Get attachments action. Here is the key thing to understand: attachments come back as a table, not as a single file. That is why we have to loop. For each item in that table, we add a Get attachment action that pulls the actual file content using the message and the attachment ID for the item we are currently on. This is the part that lets one email with four files turn into four trips through the rest of the flow. Pro Tip: Loops like this can be confusing but they are necessary, so if you are building your flow and it wants to loop, ask why it wants to loop instead of trying to get rid of it. Step 3: Use an AI Prompt to Categorize Each File This is the first bit of sprinkling some AI, and honestly it is the part that does the heavy lifting. We add a Run a prompt action and pass in the file. The instructions are short and direct: analyze this file and choose one of the following categories: resume, purchase order, invoice, or other. Here is the nice thing about a large language model. I did not have to explain what a purchase order or an invoice actually is. It already understands the difference. If you have unusual documents, you absolutely can give it more specific rules, like 'if the file contains these fields, treat it as this category.' But for most everyday documents, a generic prompt works great. Make It Return JSON, Not Text At the bottom of the prompt I ask it to respond with the category plus the file content, formatted as JSON, with exactly two fields: my category and my contents. Then on the right side of the action, I switch the output from the default Text to JSON. This matters more than it sounds. When the output is JSON, you can work with each piece as its own object later in the flow. So you can grab the category to decide where to save the file, and grab the contents to feed the next prompt. A lot of the time in Power Automate, JSON output is what you want. Step 4: Save the File to a Dynamic SharePoint Folder Now that we know what the file is, we save it with a Create file action in SharePoint. The trick is in the folder path. Instead of hard-coding one location, I set it to something like Shared Documents/AI Prompt Router/ and then add the category as dynamic content on the end. So when the prompt returns 'invoice,' the file lands in the invoice folder. When it returns 'resume,' it lands in the resume folder. When you write a file to a SharePoint or OneDrive path that does not exist yet, it gets created for you. The first time I ran this, the invoice folder was not there. The flow made it and dropped the file in. No setup required. For the file name I use the name from Get attachment, and for the content I use the file bytes from that same action. That is all it takes to put each file exactly where it belongs. Step 5: Switch Based on the Category With the file saved, we use a Switch action to decide what to do next. Think of a Switch as a clean way of saying 'if it is this, do that.' We point it at the category and set up a case for each value: one for invoice, one for resume, one for purchase order, and one for other. Inside each case we run a second, specialized prompt against the file content we captured earlier. This is where having that JSON output pays off, because we can feed the 'my contents' value straight into the next prompt. Each case has its own prompt tuned for that document type, and once again I set the output to JSON so I can use the results in the next step. Step 6: Update the File Properties The last piece in each case is an Update file properties action. We already created the file and uploaded it, so now we write the extracted details into its SharePoint columns. What you capture depends on the document: Invoices: name, amount, invoice number, and invoice date. Purchase orders: name and amount. Resumes: a short description and the person's name. Other: nothing. We just let those files sit in the folder. Your mileage will vary, and that is the point. You can capture whatever metadata matters to your business. The big takeaway is that a couple of small prompts can help you understand your content and pull out the pieces you care about, automatically. Why Not Just Use One Big Prompt? Good question, and one I asked myself. I could have written a single prompt that says 'figure out the category, and if it is an invoice do this, if it is a resume do that.' But that prompt would have gotten big, and the instructions could start to conflict with each other. It also tends to use more credits to run. Splitting it into one prompt to identify the document and a separate, specialized prompt to process it just felt cleaner when I was building it. I am not going to call it a best practice. I would genuinely encourage you to test it both ways and see which uses fewer credits and gives you better results. The point is to understand the tools and the tradeoffs, then pick what fits. Can SharePoint Extract the Data Without a Flow? (Copilot Autofill Columns) Here is the bonus method I promised. Everything above uses AI credits in the flow to extract data. But what if SharePoint could do the extraction for you the moment a file lands? That is exactly what Copilot in SharePoint autofill columns do. Over on a SharePoint site with M365 Copilot set up, I have an invoice library. Drop a file in, wait a few seconds, and the columns fill themselves in: invoice amount, date, name or number, and vendor name. You will see a little sparkle icon next to each value, which tells you Copilot generated it. How to Set It Up In the library, I used the Copilot 'ask a question' option and typed something like: This document library has invoices. Create autofill columns to extract vendor name, invoice number, invoice date, and invoice amount. Copilot reviews the content, confirms it can find that information, and defines the new columns for you. It even writes the column-level prompts itself. For example, the invoice amount column ended up with instructions to extract the total amount due and return it as a number without currency symbols, returning 0 if it is missing. I did not type any of that. One requirement to know up front: you need an M365 Copilot license to set this up. But once it is configured, anyone who drops a file in that library gets the columns filled automatically. No flow steps, no extra credits for the extraction. This is very interesting. Which Approach Should You Use? So how do you choose? Maybe you don't? What if you combine them? Imagine the flow from the first half simply sorts each file into the right library, and each of those libraries already has autofill columns set up. You would not need the second layer of prompts in the flow at all. The data extraction would just happen on its own. Two techniques, working together. Keep It Tight: Models and Credits Whichever path you choose, a couple of habits will save you money. First, do not overdo the prompts. I have seen people write ten pages of instructions. They work, but all of that has to be ingested and processed, and it burns more credits. Keep prompts as tight as you can while still getting good results. Second, pick the smallest model that does the job. I used Sonnet 4.6 here because it is a strong choice today, but for simple categorization a lighter model like GPT-4.1 mini would likely work fine and cut credit use considerably. Save the big reasoning models for when you actually need them. Key Takeaways If you remember nothing else, remember these: Attachments come into Power Automate as a table, so you have to loop through them. One AI prompt to categorize, then a specialized prompt per type, is cleaner and cheaper than one giant prompt. Set your prompt output to JSON so you can reuse the category and contents later in the flow. Write files to a dynamic SharePoint folder path. If the folder does not exist, SharePoint creates it for you. Copilot in SharPoint Autofill columns can extract data automatically with no flow steps and no extra credits, if you have an M365 Copilot license this is interesting. Use the smallest model that gets good results, and keep prompts tight, to control credit usage. Frequently Asked Questions Do I need a Copilot license for this? Not for the Power Automate version. The flow uses AI prompt actions that run on AI Builder or Copilot credits, so no Copilot license is required there. You only need an M365 Copilot license for the second method, the Copilot autofill columns in SharePoint. Why output JSON instead of plain text? JSON gives you structured fields you can reference individually later in the flow. With JSON you can grab the category to decide where to save the file, and grab the extracted contents to feed the next prompt. Plain text would force you to parse it yourself. Will this work with a shared or generic mailbox? Yes, and that is one of the most common real-world setups. You point the trigger at the shared mailbox, like invoices@yourcompany.com, and the flow runs every time a message with attachments lands there. Why not use one big prompt to do everything at once? You can, but a single prompt that both categorizes and extracts tends to get long, its instructions can start to conflict, and it usually costs more credits to run. Splitting it into a categorize prompt plus a specialized extraction prompt keeps each one focused. Test both ways and compare results and credit usage for your own documents. Do I have to create the SharePoint folders first? No. When the cloud flow writes a file to a folder path that does not exist yet, SharePoint creates the folder automatically. The first run will build the invoice, resume, purchase order, and other folders for you. Which AI model should I choose? Use the smallest model that gives you good results. A strong general model like Sonnet 4.6 works well, but for simple categorization a lighter model such as GPT-4.1 mini may do the job for far fewer credits. Save the heavy reasoning models for tasks that genuinely need them. Wrapping Up That is the whole thing. You took a messy email full of mixed attachments and turned it into neatly sorted SharePoint folders with the key details extracted into file properties, all automatically. You saw how to do it with AI prompts inside a Power Automate flow, and how to do it with Copilot autofill columns in SharePoint. None of this is a giant rebuild. It is not an agent or a pile of new infrastructure. It is a flow you might already have for moving files around, made smarter by sprinkling in a little AI. That is the mindset I want you to walk away with: look for the small places where AI can do the boring work for you. Need a Hand? If you want help building solutions like this, or you are looking for more ways to get Copilot working across your business, the team at PowerApps911 can help. We do Power Platform consulting and training every day, and with our friends at TMC we can even tie this kind of automation into your Dynamics 365 Business Central or wider ERP. Reach out and let us build something great together.
- PowerApps911 Joins Technology Management Concepts (TMC)
We’re excited to officially share some big news with the Power Platform and Microsoft community: PowerApps911 has joined Technology Management Concepts (TMC). Joining TMC allows us to deliver the full Microsoft Business Applications picture in a deeper, more seamless way, so we can better support both what organizations need today and what’s coming next. That means expanded access to a wide range of Microsoft products and services, including: Dynamics 365 Business Central Dynamics CRM Power Apps Power Automate Power BI Copilot Copilot Studio Power Pages SharePoint Dataverse Fabric Azure Data and AI solutions And yes, now we can even help with licensing. Could there be a better scenario than our straightforward approach to helping organizations navigate licensing? 😄 Continuing the Same Practical Approach Most importantly, we are here to support organizations wherever they are on their journey. If you are unsure which Microsoft tools solve your problem, we aim to continue being a trusted advisor by taking the time to understand your business, your organization, and your goals and then recommending the right solution. What’s not changing is the part people already trust. You’ll continue working with the same PowerApps911 team and receiving the same practical, real-world approach. We remain committed to helping organizations learn, build, and succeed, not just at go-live, but as needs evolve. What This Means Going Forward For our training community, this means continued expansion across the Microsoft platform, including plans to grow into the Dynamics space while continuing to add new offerings around Power Platform and Microsoft AI. For consulting clients, it means greater depth and scale. Simply put, we’ll be able to say yes a whole lot more when people ask: “Can you help with XYZ?” Looking Ahead Our focus is on a smooth, thoughtful transition and continuing to earn trust every step of the way. We’re incredibly excited about what this means for the future and look forward to continuing to help organizations build solutions with Microsoft technologies that make a real impact. Thank you to everyone who has supported PowerApps911 over the years. We’re just getting started. If you have any questions or need assistance, just click the button below and let us know how we can assist.
- How to Call an API from Power Apps with Power Automate (A Beginner’s Guide to JSON)
Key Takeaways • Power Apps cannot call REST APIs directly. You must use Power Automate as a middle layer to call the API and return the response. • The HTTP action in Power Automate is a premium connector, so an API-calling solution requires premium Power Apps or Power Automate licensing. • JSON uses curly brackets { } for records (one row of fields) and square brackets [ ] for tables (a list of records). • In Power Apps, ParseJSON converts a JSON string into an untyped object. You must explicitly cast values with Text(), Value(), Boolean(), or Table() before strict controls like Image will accept them. • For best performance and readability, parse the JSON once and reshape it into a typed collection using ForAll, then bind controls to the collection. • APIs are made dynamic by passing parameters in the URL: the first parameter starts with ?, every parameter after uses &. APIs intimidate most Power Apps makers on first contact, but the underlying concept is simple: an API returns text in a structured format called JSON, and Power Platform gives you tools to fetch that text and turn it into usable data. This guide walks through every step using a free public API, so you can follow along without any setup, accounts, or authentication. In this walkthrough, you will learn how to call a real public API from Power Apps using a Power Automate flow, parse the JSON response with the ParseJSON function in Power Apps, handle different data types (text, numbers, images, and nested arrays), reshape the data into a clean Power Apps collection, and finally make the call dynamic with query parameters and a dropdown. No authentication is required for the example API used in this post, so anyone with a Power Apps premium license can recreate the demo end-to-end. Prefer the video walkthrough? Watch the full tutorial here: https://youtu.be/pwZoUsuLBMQ Why APIs Feel Hard (and What They Actually Are) An API can be as simple as a URL that returns text. Most public APIs return data in JSON, which is plain text wrapped in curly brackets and square brackets. The reason APIs feel hard is that the first time you look at a raw response, you are staring at a wall of unformatted text with no obvious starting point. Once you understand the two simple shapes JSON uses, records and tables, the format becomes readable and usable. If you have ever written a record in Power Apps using curly brackets (for example, { Name: "Shane", Role: "CAIO" }), you have already used the same syntax JSON uses. The only new piece is square brackets, which represent a table of those records. What is the Easiest Free API for Practicing in Power Apps? DummyJSON (https://dummyjson.com) is a free, no-authentication public API that returns realistic test data for products, users, recipes, and more. It is ideal for learning Power Apps and Power Automate API techniques without risk. DummyJSON is the recommended sandbox for this tutorial because every endpoint returns predictable JSON, and no signup or API key is required. The walkthrough below uses the recipes endpoint at https://dummyjson.com/recipes which returns 30 recipes by default, each with a name, image, rating, cuisine, a tags array, and other recipe relevant fields. How do you preview an API response without writing any code? Paste the API URL directly into a web browser. For any GET request, the browser will display the raw JSON response on screen. This is the fastest way to confirm that the API works, see the field names, and understand the response shape before building anything in Power Automate. The same trick works for SharePoint REST and Microsoft Graph endpoints when you are signed in. How do you read API documentation efficiently? Every API has documentation, and every set of documentation answers the same three questions: which URL to call, which method to use (GET or POST), and which parameters are supported. If the documentation is dense or written for a different programming language, paste it into Copilot, ChatGPT, or another AI assistant and ask for a Power Platform-friendly explanation. That is a legitimate and effective shortcut. How Do You Call a REST API from Power Apps? Power Apps cannot call REST APIs directly. You must build a Power Automate flow that uses the HTTP action to call the API, then return the response to Power Apps. Licensing note: the HTTP action in Power Automate is a premium connector. Custom connectors are also premium. Any solution that calls an external API from Power Apps therefore requires premium Power Apps or premium Power Automate licensing for every user who runs the app. Steps to create the flow In your Power App, click the ellipses menu, then Power Automate, then Add flow, then Create new flow, then Create from blank. Name the flow clearly, for example "Video Recipes", so you can find it later. Click New step, search for HTTP, and select the HTTP action (the one labeled Premium). How do you configure the HTTP action? The HTTP action requires three pieces of information: a method, a URI, and (optionally) headers, queries, or a body. For the recipes example, the configuration is straightforward. • Method: GET (used to retrieve data from an API). • URI: https://dummyjson.com/recipes • Headers, Queries, Body: leave empty. The Dummy JSON recipes endpoint requires no additional parameters. Two HTTP methods cover most Power Platform API scenarios: GET retrieves data, and POST sends data. The API documentation always specifies which method to use for each endpoint. How Do You Return JSON from Power Automate to Power Apps? Add a "Respond to a Power App or flow" action at the end of the flow, create a Text output, and set its value to the Body of the HTTP action. The "Respond to a Power App or flow" action is what makes the flow callable from Power Apps and allows the flow to return data. To pass the JSON response back, click "Add an output", choose Text, name the output "myJSON", and set its value to the Body output of the HTTP action. (Click "See more" if the Body field is not visible immediately.) This approach passes the entire raw JSON response back to Power Apps as a single string. JSON parsing could be done inside the flow, but parsing inside Power Apps is the focus of this tutorial because it is more flexible and gives you the full original response to work with. How Do You Call the Flow from Power Apps? Add a button to the Power Apps screen and set its OnSelect property to call the flow and capture the result in a variable. After the flow is saved, Power Apps will automatically register it. Add a new screen, drop a button onto the screen, and set the button OnSelect property to the formula below. The formula calls the flow and stores the JSON response in a variable named varMyJSON. Set(varMyJSON, VideoRecipes.Run().myjson) To inspect the response, add a label, set its Text property to varMyJSON, and set the Overflow property to Scroll. Pressing the button (Alt-click in design mode) will populate the label with the full raw JSON response. How Do You Read JSON? Records vs Tables In JSON, curly brackets { } enclose a record (a single row with named fields), and square brackets [ ] enclose a table (a list of records). Understanding this two-shape model is the most important step in working with API data in Power Apps. The recipes response from Dummy JSON is shaped like this: the outer container is a record with a field called "recipes", and that field holds a table of recipe records. Every recipe record contains its own fields: name, image, rating, cuisine, a tags array, and a lot more. When a JSON field has square brackets immediately after its colon, that field is itself an array. The "tags" field on each recipe is one such nested table. So let's translate what you see above: { } on lines 1 and 14. Those outer wrappers are telling you that this response is a record. "recipes":[ ] on lines 2 and 13. That is saying your main record has a field named recipes and the data inside of it is in an array. {} on lines 3 and 7. That is the first record in the recipes table. {} on lines 8 and 12 is the second record in the recipes table. "name" and "image" are two text fields in that image "tags" is an array in that record. It is a single column table, the column name is Value, it contains 3 records "Italian", "Vegetarian", "Main Course". How Do You Use ParseJSON in Power Apps? ParseJSON is a Power Apps function that converts a JSON string into an untyped object. To use the result in a control, navigate to the field you want and wrap it in a type function such as Table(), Text(), Value(), or Boolean(). Add a Gallery to the screen. The Gallery requires a table for its Items property. Because the recipe table lives inside the JSON response, the Items formula must parse the JSON, navigate to the recipes field, and explicitly cast the result as a table: Table(ParseJSON(varMyJSON).recipes) Each part of the formula has a specific purpose. ParseJSON(varMyJSON) converts the raw JSON string into a navigable untyped object. The .recipes drills into the field that holds the recipe list. The Table() wrapper tells Power Apps the result should be treated as a table so the Gallery accepts it. After applying the formula, the Gallery rows render but the field dropdown shows generic "value" entries. The reason is that ParseJSON returns untyped data — Power Apps does not yet know whether each field is text, a number, or something else. The next section covers how to apply types correctly. How Do You Handle Different JSON Data Types? Wrap each ThisItem.Value reference in the appropriate type function: Text() for strings, Value() for numbers, and Table() with Concat() for nested arrays. Image controls require Text() explicitly. Plain text fields In a Gallery template, a label can display a JSON text field directly. The recommended formula uses Text() to make the type explicit and avoid runtime surprises: Text(ThisItem.Value.name) JSON field names are case-sensitive. In the Dummy JSON recipes response, the field is "name" with a lowercase n. Writing "Name" with a capital N will return blank. Numbers Numbers in JSON are not surrounded by double quotes. That is how you can tell them apart from text fields. The recipe rating field, for example, is returned as 4.6 with no quotes. To use the value in calculations or numeric controls, wrap it in the Value function: Value(ThisItem.Value.rating) Why does the Image control fail with untyped data? The Image control in Power Apps does not infer types from untyped data the way a Label does. Setting the Image property directly to ThisItem.Value.image returns an error because the control cannot interpret an untyped object as a URL. The fix is to wrap the reference in Text(), which forces the value into a string: Text(ThisItem.Value.image) Nested arrays such as tags When a JSON field contains square brackets, like the recipe tags field, which holds an array of strings like ["Pizza", "Italian"] then the field is itself a table. To display the array as a comma-separated string in a label, wrap the reference in Table() and pass it through Concat(): Concat(Table(ThisItem.Value.tags), Value, "; ") The same pattern works for any JSON array: ingredients, instructions, or any other field that returns multiple values per record. How Do You Convert API Data into a Reusable Power Apps Collection? Use ClearCollect with ForAll to walk the parsed table once, casting each field to its correct type, and store the result as a typed collection. Bind controls to the collection instead of the raw ParseJSON result. Repeating ParseJSON and ThisItem.Value.fieldname formulas across every control adds maintenance overhead and makes the app harder to read. The recommended pattern is to parse the JSON once when the data arrives, build a clean collection, and then reference that collection everywhere else. Add a button and set its OnSelect property to the formula below. The formula calls ForAll on the parsed table, aliases each row as "JUNK", and produces a record with three properly typed fields per row. ClearCollect( colRecipes, ForAll( Table(ParseJSON(varJSON).recipes) As JUNK, { Name: JUNK.Value.name, Rating: JUNK.Value.rating, Image: JUNK.Value.image } ) ); The collection colRecipes now behaves like any other Power Apps collection. Setting a Gallery Items property to colRecipes allows fields to be referenced as ThisItem.Name, ThisItem.Image, and ThisItem.Rating, with no further parsing required. How Do You Make an API Call Dynamic with Query Parameters? Append parameters to the API URL using one ? for the first parameter and & for every subsequent parameter. To drive parameters from Power Apps, add inputs to the flow and reference them in the URI using triggerBody() expressions. Most public APIs support query parameters that filter, sort, or paginate the response. Dummy JSON supports five common parameters that appear in many APIs: limit: maximum number of records to return. skip: number of records to skip from the start, used for paging. select: comma-separated list of fields to include in the response. sortBy and order: field name and direction (asc or desc) for sorting. q: keyword search across the dataset. How are URL parameters joined together? The first parameter in a URL is preceded by a single question mark. Every parameter after the first is joined with an ampersand. A URL with three parameters looks like the example below. https://dummyjson.com/recipes?limit=10&skip=10&select=name,image Common mistake: pasting a second example URL directly into the URI field, which produces two question marks. Only one question mark is allowed per URL. After that, every additional parameter must use an ampersand. How do you pass a parameter from Power Apps into the flow? To accept input from Power Apps, edit the flow, click the trigger ("PowerApps (V2)" or "Respond to a PowerApp" depending on configuration), and add a Text input named "MyTag". Inside the HTTP action, reference the input in the URI using a triggerBody() expression so the value is substituted at runtime. https://dummyjson.com/recipes/tag/@{triggerBody()['text']}?limit=10&select=name,image After saving the flow, the Power Apps formula must pass the new value when calling the flow. The Run function accepts inputs in the order they were declared. Set(varMyJSON, VideoRecipes.Run("Italian").myjson) How do you drive the API call from a dropdown? To let users pick a value instead of typing one, use the API itself to populate a Power Apps Dropdown. Dummy JSON exposes an endpoint that returns the full list of available recipe tags as a JSON array. Open that URL in a browser, copy the array including the square brackets, and paste it directly into the Items property of a Dropdown control. Power Apps interprets a square-bracketed list as a one-column table named Value automatically. Then update the button OnSelect to pass the dropdown selection to the flow: Set(varMyJSON, VideoRecipes.Run(Dropdown1.SelectedText.Value).myjson) The result is a fully dynamic, user-driven API call: the user picks a tag, the flow builds the URL, and the gallery refreshes with matching recipes. Common Power Apps API Mistakes to Avoid • Case sensitivity: JSON field names must match exactly. The field "name" is not the same as "Name". • Untyped data in strict controls: always wrap values with Text(), Value(), Boolean(), or Table() before binding to controls that require a known type. • Image controls: always wrap the source URL in Text(). The Image control will not infer the type from untyped data. • Nested arrays: wrap with Table() and use Concat() to display them as text in a label. • Premium licensing: the HTTP connector requires premium licensing for every user of the app. Plan licensing before building. • Question marks in URLs: one ? per URL, maximum. Every parameter after the first must use &. Frequently Asked Questions Can Power Apps call a REST API directly? No. Power Apps cannot call external REST APIs directly. The supported pattern is to build a Power Automate flow that uses the HTTP action to call the API, then return the response to Power Apps using the "Respond to a Power App or flow" action. Custom connectors are an alternative, but they also require premium licensing. Do you need a premium license to call an API from Power Apps? Yes. The HTTP action in Power Automate and custom connectors are both premium connectors. Every user who runs an app that calls an external API requires a premium Power Apps or premium Power Automate license. What does the ParseJSON function return in Power Apps? ParseJSON returns an untyped object that can be navigated using dot notation. The function does not assign data types to the values it returns, so each value must be wrapped in a type function like; Text(), Value(), Boolean(), DateValue(), or Table() before being used in a control or formula that requires a specific type. Why does my Image control show an error when I bind it to ParseJSON data? The Image control does not infer types from untyped data the way a Label does. Wrapping the reference in Text() for example Text(ThisItem.Value.image) forces the value to a string and resolves the error. Conclusion Calling an API from Power Apps comes down to a five-step pattern: build a Power Automate flow with the HTTP action, return the JSON to Power Apps, parse the JSON with ParseJSON, cast the values with type functions, and reshape the result into a typed collection for clean reuse. Once the pattern is in place, the same approach works for almost every public or internal REST API. The next two topics worth learning are authentication (API keys, OAuth, and bearer tokens) and writing data back to APIs using POST requests. Both build directly on the foundation in this tutorial. Need a Hand? If you want help building solutions like this or you want to take your Power Platform skills to the next level, the team at PowerApps911 has your back. We offer everything from quick 30-minute consulting sessions to long-term partnerships building enterprise apps. Click the Contact button on this page to start a conversation.
- How to Build Your Own Custom Skills in Copilot Cowork (Step-by-Step Guide)
Do you ever feel like you keep typing the same long instructions into Copilot over and over? Same prompt, same format, same picky details every single week? Yeah, me too. That is exactly the problem custom skills in M365 Copilot Cowork are built to solve. In this walkthrough, you will learn what custom skills are, see a real one I use every single week, and then I will show you two different ways to build your own. One is easy (Cowork builds it for you) and the slightly more manual way (using ChatGPT to help you write the skill file). By the end, you will have everything you need to take the repeatable stuff in your day and turn it into a one-click skill. BONUS: I hate the way the manual section turned out, so I also offer you my actual Skill so you can steal it to get going without too much hassle. You are welcome. 😋 And no, this is not a developer thing. My project managers and admin team are using these every day. If they can do it, you absolutely can too. It is just good ole fashion text. If you would rather watch the full walkthrough, check out the video here: Stop Repeating Yourself - Build Custom Skills in Copilot Cowork What Is a Custom Skill in Copilot Cowork? Copilot Cowork ships with a bunch of built-in skills; working with Office documents, your calendar, email, Teams messages, deep research, all of that. Where as a custom skill is just a saved set of instructions you can trigger anytime with a forward slash. Here is the key idea: instead of typing 100+ lines of instructions every time you want Cowork to do a complex job, you write those instructions one time, save them as a skill, and just call the skill with a quick command. Cowork already knows what to do. A Real Example: Turning YouTube Videos Into Blog Posts Every week I publish a video, and I also want to publish it as a blog post. Not AI-garbage blog posts that all sound the same, I want it to sound like me, based on my actual words from the video. (Hint, this is literally what I am doing right now 🤣) So I built a custom skill called "YouTube to Blog Post." My workflow is dead simple now: Grab the transcript from my video Drop it into Cowork as an upload Type a forward slash, pick the YouTube to Blog Post skill Say something like "Make me a blog post, please" That is it. Cowork pulls in my custom instructions. Tone, structure, SEO rules, image placeholders, where to put the YouTube link and then spits out a draft. I still go back through and Shane-ify it (add my goofiness, dumb a few things down, remove the dumb emm dashes), but the bones are mine because the words are mine. Below is the screenshot that made the base of this blog post, that is the whole thing. Here is why this matters. That skill file is around 170 lines of careful instructions. There is no way I am pasting that into chat every Monday. Once. I write it once. Then I use it forever. The Easy Way: Let Cowork Build the Skill for You This is hands-down the friendliest way to build a skill, and it is the path I would point any non-technical user to first. The trick is to start by solving the actual problem in plain language, get it working, and then ask Cowork to package it up as a skill. Step 1: Solve the Problem in a Normal Chat My project managers get a flood of emails from customers with bugs, feature requests, casual stuff andI want to help them triage. So I just ask Cowork plainly: "Help me find app bugs. Look through my inbox for the last week for emails from chewy@powerapps911.com. Review all the emails for any that are bugs, changes, enhancements, or otherwise involve work on the existing app. Capture that information and save it to an Excel spreadsheet." Notice I gave a tiny bit of context up front ("help me find app bugs") before the actual ask. AI does noticeably better when you set the stage like that. Cowork then searches my inbox, reads each email, decides which ones are actually about app work, and drops the results into an Excel file with columns like Date Received, Subject, Type, App Area, Description, and Source. If those columns are not exactly what you wanted, just tell it. "Hey, I want a column for priority too." Done. Step 2: Ask Cowork to Turn It Into a Skill Now the magic. Once the workflow does what you want, just tell Cowork: "That is perfect. Can you help me make this into a skill I can use anytime? I want to trigger the skill and then have it ask me for what email address to search for and what to name the Excel file." Cowork has a skill for making skills (yes, that is a weird sentence). It builds the SKILL.md file, validates it, and tells you the name. For me it called it "app issue tracker." Here is the key idea: you did not have to know any syntax. You did not have to write a single line of front matter. You solved a real problem first, then turned it into a skill you can summon at anytime. A Quick Note About Syncing the Skill to OneDrive Cowork will tell you the skill is available within 35 seconds. It says that every single time. In my experience, sometimes it takes 35 seconds, sometimes it takes longer, and occasionally you need to nudge it. If your skill is not showing up in the slash menu after a couple of minutes, just say: "I'm not seeing the skill in my folder. Can you try syncing it again?" That second push usually does the trick. This product is still in preview, so expect a little quirkiness. The Manual Way: Building a Skill With ChatGPT If you want to build skills outside of Cowork, say with ChatGPT, Gemini, or another LLM, you absolutely can. It is a little more hands-on, but it is good to understand how the pieces fit together. And FWIW in the video, this went really poorly. ChatGPT wasn't in the right mood I guess, but even if you never do it this way, understanding how the pieces works will help. So, here is the scenario. I get a bunch of weekly AI newsletter emails. I want one skill that pulls them all together, deduplicates the noise, generates an executive summary in Word, builds a PowerPoint for my team, and pings me on Teams when it is done. Step 1: Describe the Skill in ChatGPT I told ChatGPT exactly what I wanted, including my preferences (Microsoft news first, then Google, Anthropic, OpenAI, then everything else). ChatGPT generated a complete SKILL.md file ready to drop into OneDrive. Step 2: Save the File to the Right Spot This is where it gets a little fussy, so pay attention. The file goes into your OneDrive in this exact path: Documents → Cowork → skills → [your-skill-name] If you have never made a skill before, you will need to create the skills folder the first time. Then make a folder for your specific skill, and here is one of the gotchas, the folder name and the skill name inside the file have to match exactly. Another gotcha? the folder needs to be skills all lowercase. I don't make the rules, I just share them. Step 3: Watch Out for the Filename The filename must be SKILL.md — that is uppercase SKILL and lower case md. Microsoft has not documented this anywhere I can find, but trust me, the capitalization seems to matter at this point. Step 4: Make Sure the Front Matter Is There Every SKILL.md file needs a front matter block at the top. It looks like this: --- name: weekly-ai-news-briefing description: Reviews weekly AI newsletter emails and produces a summary doc, deck, and Teams notification. --- Now your instruction start... If ChatGPT forgets the front matter, and it might, just paste it in yourself. The name has to match your folder name, and skill names must be all lowercase letters. No spaces, no capitals, no special characters. Step 5: Wait for the Skill to Show Up Same 35-second sync rule applies. Open Cowork, start a new session, type a forward slash, click Skills, and scroll to the bottom. Custom skills tend to show up at the bottom of the list in alphabetical order. Triggering and Editing Your Skill Once your skill is live, using it is the easy part. Type a forward slash, click Skills, click your skill name, hit enter. Cowork picks up your saved instructions and runs. If your skill asks for inputs (like an email address or a file name), Cowork will prompt you. We didn't build any of that, it just works. The exact UI it uses changes a bit each time. Sometimes it pops up a form, sometimes it asks one question at a time. Do not let that throw you. Just answer what it asks. And here is the part I love: skills are just plain text. If you do not like something about how your skill works, open up the SKILL.md file and edit it. Want to exclude casual social emails? Delete or change that line. Want a summary in Word instead of Excel? Rewrite the output instructions. There is nothing magic going on under the hood. It is your skill, written in your words. Gotchas to Remember Filename is SKILL.md Folder for skills need to be all lower case Skill names must be all lowercase letters. Folder name and the name inside the front matter have to match exactly. Front matter is required (the block between the three-dash lines at the top). Sync to OneDrive is supposed to take 35 seconds. Sometimes it takes longer or needs help. Push it again if needed. Cowork is still in preview. Things change. Be patient with the rough edges. Download my skill Because all of that was confusing, here is my complete example skill. --- name: app-issue-tracker description: | Searches the inbox for emails from a specific sender over the past 7 days, reviews each email, and captures any reported bugs, changes, enhancements, or other work involving an existing app into an Excel spreadsheet. Use when the user says "find app bugs", "track app issues from emails", "capture bug reports from [person]", "make a bug list from my inbox", "log app feedback to Excel", or any similar request that asks to turn email feedback about an app into a spreadsheet. cowork: category: productivity icon: TaskListLtr --- # App Issue Tracker Turns app-related email feedback from a single sender into a structured Excel log of bugs, enhancements, and changes. ## Step 1 — Gather inputs Before doing anything else, ask the user for both inputs in a single `AskUserQuestion` call: 1. **Sender email address** — the email address whose inbox messages should be reviewed. 2. **Excel filename** — what to name the output file (without the `.xlsx` extension; you will add it). Do not assume defaults. If the user has already provided one of these in their request, only ask for the missing one. ## Step 2 — Pull the emails - Resolve "the past week" as the 7 days ending at the user's current local time. - Use `SearchM365` with `from_user` set to the supplied email address, `sources: ["email"]`, and `after`/`before` set to the 7-day window. This is faster and more targeted than paging through `ListMessages`. - If `SearchM365` returns nothing, fall back to `ListMessages` with the same date window and filter for the sender client-side. ## Step 3 — Classify each email Read the body of every returned email. For each one, decide whether it involves work on an existing app. Include it if it reports any of: - **Bug** — something is broken or behaving incorrectly - **Enhancement** — a styling, UX, or feature improvement to an existing app - **Change** — a requested modification to existing app behavior - **Performance issue** — slowness, crashes, or responsiveness problems A single email may contain multiple distinct items (e.g. a bulleted list of issues). Capture each item as its own row. **Exclude:** - Casual/social emails (lunch, chitchat, thanks) - Proposals for entirely new apps or future projects that are not work on the existing app - Status updates with no actionable issue If you exclude an email, briefly mention it to the user in the final summary so they can confirm. ## Step 4 — Build the spreadsheet Create an `.xlsx` file with one sheet named "App Issues" and these columns: | Date Received | Email Subject | Type | App / Area | Description | Source Email From | Formatting: - Header row: bold white Arial 11 on dark blue (`305496`) fill, centered, wrapped - Body: Arial 11, top-aligned, wrapped - Column widths roughly: 16, 32, 20, 28, 60, 38 - Freeze the header row and turn on auto-filter - Increase row heights enough to show wrapped text Use the `xlsx` skill's create-mode Task pattern to generate, save to `output/{user-supplied-filename}.xlsx`, and verify the file exists with `Glob output/**/*.xlsx`. ## Step 5 — Report back Summarize for the user: - Number of emails found from that sender - Number captured as app issues vs. excluded (with one-line reason for each exclusion) - A short table preview of the rows - Confirm the file is saved Tell the user the file is ready — do not expose folder paths or technical details. ## Notes - If the sender returned zero emails in the window, say so plainly and offer to widen the window or check the address spelling. - Keep types consistent across runs: `Bug`, `Enhancement`, `Change`, `Bug / Performance`. Combine with `/` only when an item legitimately spans two categories. Copy all of that and save it as SKILL.md (sorry I couldn't make it a straight download) Go to your OneDrive > Documents > Cowork > skills If skills isn't there then create that empty folder. All lowercase In the skills folder create a new folder named app-issue-tracker all lower case Put your new SKILL.md file in that folder. Wait a minute then refresh your Cowork window, start a new chat and type / you should see your skill. 🤩 I take zero responsibility for anything that happens with this, so make sure like with everything you read on the internet, you read the file before you create it. It doesn't hurt anything but you should confirm. Be Creative, That Is the Real Skill Here is the thing I want you to walk away with. The demos in this guide are about app bugs and AI newsletters, but those are not your problems. Your problems are different. The pieces I just showed you; searching your inbox, reading and classifying messages, writing to Excel, generating a Word doc, posting to Teams, etc. Those are the building blocks. The folks getting the most out of AI right now are the ones being creative with the building blocks. Look at your week. What do you do over and over? What sequence of steps would you love to skip? That is your skill. Wrapping Up You now know what custom skills are, you have seen a real one in action, and you have two ways to build your own. The in-Cowork builder is the friendliest path. Solve the problem first, then turn it into a skill. The manual ChatGPT route is there when you want more control or when you want to understand exactly what is happening. (Or just steal my work) Either way, the win is the same: stop typing the same long instructions every time. Save them once. Use them forever. Need a Hand? If you are trying to make sense of how Copilot, Cowork, Copilot Studio, vibe coding, and the rest of the Microsoft AI ecosystem fit together for your team, that is exactly the kind of thing we help with every day. Reach out to the team at PowerApps911 and let's build something awesome together. Just click the Contact Us button and a human, not AI, will help you out.
- Install the Power Apps Canvas Apps MCP for GitHub Copilot
Are you looking to get started with this awesome new Power Apps MCP Server for Canvas apps but don’t really have clue one how to install all of this? If yes then below is my instructions written for those of us who are not ninjas when it comes to all of this VS Code stuff. You will get step by step on how to install everything, VS Code, all of the random weird things, and then how to test it all worked. I have done this process like a dozen times to try to get this down to the easy instructions you have come to expect. Now, keep in mind that the more weird things you (or more likely IT) has done to your PC, the more likely your journey will vary. Every machine I have done the process has been slightly different but, at the end of the day, you need all of these pieces. Be a trooper, you will get through this. Also, remember while the Power Apps Canvas MCP is free, you need a GitHub Copilot license to use it in this scenario. You could also use the MCP server with Claude Code or Codex or a dozen other services but one way or another you have to have an LLM coding companion to utilize this. Finally, these instructions are focused on what you need to get in place to use the MCP server, on Windows via VS Code and GitHub Copilot. There are other ways to use this MCP. This isn't meant to be the be a be all, end all for developing with VS Code and AI, just the pieces you need to get rolling to use it with your Canvas Apps. Enjoy! PS - The video walkthrough of these instructions are here, probably a lot easier to use Install and Configure Power Apps MCP Install VS Code via Download Go to this site and download Visual Studio Code (VS Code). Download Visual Studio Code - Mac, Linux, Windows For most people the defaults are going to work well. So do the good ole Next, Next, Finish method. Open VS Code from the Start menu if it isn't already open. Click the Use AI Features Click Continue with GitHub to authenticate Sign in or create an account (reminder you are going to need a paid account to do this). Click the button to Authorize VS Code. Now you can click on the head in the bottom right corner to confirm you have GitHub Copilot running. Now close VS Code. We will be back later. Install NodeJS Go to this website Node.js — Download Node.js® Download the Windows Installer MSI and run it. Same deal, that Next, Next, Finish is what I did. There are a lot of questions and some optional stuff but, I didn't need it for this to work so I didn't install them. Install Git for Windows Go to this website Git for Windows Click the big Download button and then run it. Once again use Next, Next, Finish. And honestly? I have no clue what most of those settings are, but the defaults worked so I stuck with them. 😊 Feel free to adjust anything, it is your computer after all. Install Dot NET 10 SDK Go to this website Download .NET 10.0 (Linux, macOS, and Windows) | .NET Download the Windows SDK and run it. Click Install. There is nothing to choose but it is a slow install. Install PowerShell 7 Go to this website https://aka.ms/PSWindows Click the Get PowerShell 7 button. Click Install PowerShell on Windows Download the MSI Package and run it. You guessed it, click Next, Next, Finish Install GitHub Copilot CLI Open VS Code From the toolbar click Terminal > New Terminal At the prompt Type: Copilot Install GitHub Copilot CLI when prompted Choose Yes when asked if you trust the folder (assuming you do) Type /login at the prompt. Choose your account type. Press the Enter key, this opens a browser, and now walk through the authorization steps. Switch back to VS Code. Finally, install the Power Apps MCP Still in the Terminal type: /plugin marketplace add microsoft/power-platform-skills After you see Added Successfully type: /plugin install canvas-apps@power-platform-skills Type Exit to close Copilot. Type Copilot to open it back up. Test your Hard work Open a browser to make.PowerApps.com and create a blank canvas app. Save it. Settings > Enable Coauthoring. This will automatically save and refresh the app. Refresh the browser again, this makes Coauthoring happier. Copy the URL for your App. Return to VS Code. Still in Copilot, in the Terminal, type Configure Canvas MCP Choose Configure Globally when it asks. Paste your canvas app url when asked. Type Exit to close Copilot Type Copilot to open it back up Type Create a Green welcome screen with a blue button After a while if you get a green screen in Power Apps canvas app with a blue button then you have SUCCESS! Microsoft’s Documentation If you want their official info on installing and such it is here: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/create-canvas-external-tools Also, their GitHub repository for this MCP server is here: https://github.com/microsoft/power-platform-skills/tree/main/plugins/canvas-apps Nothing you need but sometimes the official documentation is good to check out also. Next Steps Now you are ready to start playing with GitHub Copilot. You can use it to create apps, edit apps, audit apps, and probably more. And while I think creating apps, especially with data sources (even SharePoint) is interesting the real value is review. Having the agent look for bugs and make recommendations in your existing apps. Having a second set of eyes just can't be overappreciated. If you want to see the Power Apps Canvas MCP server in action for creating and auditing apps check out this video: Build Canvas Apps in VS Code with AI (NEW Power Apps Tool) Or if you are looking for help with what you should and shouldn't be doing with AI and Power Apps then we can help. Just hit the Contact button and let us know. We are happy to help with anything from a quick call to taking on your full project.
- How to Build Canvas Apps Faster with VS Code and the Power Platform MCP Server
What if you could describe the canvas app you want in plain English, hit enter, and have a real, editable Power App waiting for you seconds later? Not a mock-up. Not some locked-down, AI-only creation. An honest-to-goodness canvas app you can open in Power Apps Studio and tweak with every skill you already have. That's exactly what the new Power Platform MCP server for VS Code or Claude Code unlocks and in this post, you're going to learn how to use it two ways: to generate a new canvas app from a prompt , and to run an AI-powered code review on an app you've already built . This isn't vibe coding. This isn't a new type of Power Apps app to learn. It's a faster front door into the canvas apps you already know and love. If you'd rather watch the full walkthrough, check out the video here: Build Canvas Apps in VS Code with AI (NEW Power Apps Tool) Why This Is Different (and Why You Should Care) Before we dive in, here's the key idea: the MCP server doesn't replace canvas apps. It coauthors them with you. Whatever the AI generates is a standard canvas app with real controls, real formulas, and real YAML under the hood. You can open it in Power Apps Studio right now and edit it the exactly like you always have. Nothing locks you in. That means this is a tool for two groups of people: Canvas app builders who want a huge head start on the boring scaffolding (screens, galleries, navigation, filter formulas, forms) Canvas app builders who want a second set of eyes reviewing their existing apps for bugs and improvements Both are genuinely useful. Let's walk through each. What You'll Need Before You Start A quick heads-up: this post assumes you already have VS Code, GitHub Copilot, and the Power Platform MCP server installed and configured. If you're starting from a brand-new machine, don't worry, a dedicated setup walkthrough is coming that holds your hand through every prerequisite. For today, you'll want: VS Code (free) GitHub Copilot (this post uses it, but Claude Code and other AI coding tools work too) The Power Platform MCP server configured in VS Code A Power Apps environment where you can create apps and connect to data Part 1: Generating a Canvas App from Scratch Here's where things get interesting. You don't start in VS Code. You actually start in Power Apps. The MCP server needs an app to co-author with , so step one is creating an empty shell. Step 1: Create a Blank Canvas App Head to Power Apps in your browser, click Create , and choose Blank app → Blank canvas app . Tablet or phone? It doesn't really matter. I went with tablet for this demo. Give the app a name (I went with the highly creative "VS Code Video Demo") and save it. Saving first isn't optional; the MCP server needs something to point at. Step 2: Enable Co-Authoring (Don't Skip This!) This is the step a lot of people miss, and it'll cause you pain later if you skip it. In the canvas app, go to Settings → Updates → Co-authoring and flip it on. Save, let the app reload, and then pop back into Settings to confirm co-authoring is actually enabled. Here's why this matters: the MCP server pushes its changes into the app live, while you might also have it open in Studio. Co-authoring is what makes that two-way street work. Step 3: Add Your Data Source The AI won't add data connections for you. That's on you. Click Data → Add data , search for SharePoint (or Dataverse, or whatever you're working with), and connect to your list. For this walkthrough, I connected to a SharePoint list called Employees . Step 4: Save a Version You Can Roll Back To Before you unleash the AI, save with version notes, something like "Ready to rock." It's not strictly required, but it gives you a clean restore point if the AI goes off the rails and you want to start over. Then close the app in the browser. Yeah, actually close it. A fresh reload tends to avoid weird co-authoring hiccups. And just a good reminder, if at any point things don't look quite right, a quick refresh can help. Step 5: Point VS Code at Your App Grab the app's URL from your browser and head back to VS Code. Open the terminal, start Copilot (copilot), and type: configure canvas app You can also hit / to browse available commands if you can't remember it, just look for the canvas app configuration skill. Copilot will check your .NET version (you'll need it installed), then ask for the URL. Paste in the full app URL and hit enter. Here's the slick part: the MCP server parses that URL to figure out the app ID and environment ID for you. No more digging around in settings panels for GUIDs. Kudos to the product team for that one. You might see an error the first time, no big deal, that's usually just because the configuration file doesn't exist yet. It creates it for you. When it prompts you to restart Copilot, type exit, then copilot again to reload. Step 6: Pick Your Model (and Be Smart About It) Before you prompt, check the bottom-right of VS Code to see which model is active. Type model to switch. You'll see options like GPT-5.4, Sonnet 4.6, and Opus 4.7. Here's my 2 cents: Opus 4.7 is phenomenal, but it's expensive. In my test, a single "build me an app" prompt burned over 30% of my monthly capacity. For most work, Sonnet 4.6 is the sweet spot. It is fast, smart, and doesn't destroy your credit budget. Step 7: Write a Good Prompt Now the fun part. Type what you want, but give it some structure. Here's the prompt I used: Create a canvas app for employee management. This app has a SharePoint list named Employees. Use that, build the app to display that data, provide search and filtering, and a way to create and edit the employee data. The app should have a welcome screen, a browse employee screen, and an edit/create employee screen. For the color palette, our primary color is #752874. Use complimentary colors. For design layout, use a very modern feel. A few things to notice: I named the exact data source (Employees) I specified the screens I wanted I gave it a color palette I told it to be modern but didn't micromanage the design Here's the key idea: don't try to cram everything into one prompt. This is a starting point, not a final deliverable. The more you pile in, the longer it takes and the more confused it gets. Get 80% of the way there, then iterate, either in Studio or by chatting with the agent for follow-ups. Step 8: Approve the Tools, Authenticate, Wait Partway through, Copilot will ask if it can use the MCP server's tools. Say yes and approve all tools from the server . That lets it do the canvas authoring without prompting you over and over. You'll also need to authenticate to the MCP server. Just close the auth window(s) when they're done. Don't panic when you see red text in the chat. It's usually the agent looking for a file that doesn't exist yet, then creating it. Red doesn't automatically mean broken. Leave the agent be and let it finish its plan. Step 9: Witness the Magic When it finishes, you'll see "Validation passed." That's not just a checkmark; that's when the app gets pushed to the server. Flip back to your browser tab and... the app is already there. No refresh, no republish. Co-authoring wrote it live. Hit play. Click "Browse Employees." Your data is loaded, your gallery is populated, and there are your team members looking back at you. Common Gotchas (and How to Fix Them) This is where things get real. The AI does great work, but it's not perfect... especially in these early weeks. Here are the two mistakes I've seen most often, and how to fix them. Gotcha #1: "I Click the Gallery Row and Nothing Happens" If clicks don't navigate, it's almost always because the label on top of the gallery row is swallowing the click. The label's OnSelect is set to false instead of Select(Parent). Two ways to fix it: Click the label, change OnSelect to Select(Parent) manually Or tell the agent: "All the labels in the gallery have OnSelect set to false. Please change them to Select(Parent)." Gotcha #2: Text Is Invisible or Clipped Sometimes labels render black-on-black (so your data looks "missing") or they're too short and you get tiny scroll bars on every row. Both are easy fixes: Flip the font color to white (or whatever contrasts with your background) Enable Auto Height, or drag the label taller Or again just tell the agent: "All of the gallery labels are clipping and need to be taller. Set the font color to white and set the labels to use Auto Height" A pro tip: don't ask for three fixes at once if you want tight control. It usually handles it fine, but you'll get cleaner results one change at a time. Gotcha #3: Changes Don't Appear in the Browser Sometimes the AI makes a change, but clicking in the browser still doesn't work. This is almost always a coauthoring sync hiccup , not a code problem. Two things to do: Save in the browser. The agent writes the change, but co-authoring waits for an auto-save or your manual save before it commits. Refresh the browser tab. After that, click again and it should work. Part 2: Using AI to Review an App You've Already Built Here's where this tool gets genuinely surprising. You can point the MCP server at an existing canvas app and ask it to do a code review. I grabbed a random app I built months ago for a deep linking video. The app was totally untouched, no gotchas planted. Just honest old code. I figured it'd be a clean demo. Yep. Turns out past-me made some mistakes I didn't know about. Shocked? Me too. 🤣 Step 1: Restore or Open the App Pick an existing app. In my case, I opened the versions panel and restored an older version to make sure I was working with the original. Then I opened it to edit. Step 2: Enable CoAuthoring If the app is older, it probably doesn't have co-authoring turned on yet. Go to Settings → Updates → Co-authoring and enable it, just like with a new app. Step 3: Point VS Code at This App Copy the new app's URL, head back to VS Code, and run configure canvas app again with the new URL. Exit and relaunch Copilot so it picks up the new configuration. Step 4: Ask for a Review Here's the prompt I used: Connect to the server to get the current app and then do a review looking for bugs and places that I could easily improve the app. Only list your thoughts. Do not change the app this time. That last line matters: "do not change the app" keeps it in advisor mode so you can read the review before committing to anything. Step 5: Read Your Humbling Results What it found in my app: Delete didn't actually delete. I forgot to wire up the Remove() call. The trash can was just a pretty icon. A gallery parameter could be wrapped better for performance A variable wasn't being saved after the form's OnSuccess event A few other minor improvements This is why this matters: even if you never use this tool to build an app, using it as a second set of eyes on existing apps is a massive win. It's like having a senior dev review your code every time you ship. Step 6: Let It Fix What You Choose Once you've read the review, you can cherry-pick fixes. I asked it to handle the delete bug: Will you fix bug 1 for me? Add the logic for delete. Seconds later, it wrote the Remove() call for my trash can icon. Flipped back to the browser, clicked delete on an employee, and... gone. That's pretty slick. What You Actually Built Today In one session, you learned how to: Set up a canvas app shell for MCP co-authoring Generate a full employee management app from a single prompt Spot and fix the common quirks (gallery clicks, label sizing, sync issues) Run an AI code review on an app you've already shipped Let the AI apply fixes while you stay in control That's a lot. And the best part? Every app the MCP server touches is a normal canvas app . If the AI gets it 80% of the way, your existing canvas skills get it the rest of the way. No lock-in, no weirdness. Ready to Level Up Your Power Platform Game? This stuff is moving fast, and it's easy to feel like you're falling behind. You don't have to figure it all out alone. If you want help building solutions like this, reviewing your existing apps, or figuring out how to sprinkle AI into your flows and apps in a way that actually makes sense for your business, the team at PowerApps911 is ready to help. Click the Contact button on this page and let's build something awesome together.
- How to Restore a Deleted Power Apps Canvas App (Step-by-Step with PowerShell)
Accidentally deleted a Power Apps canvas app? Yeah… that “oh no” moment is real, I know I did it last Tuesday while on a flight. Whoops! The good news: you can restore a deleted Power Apps app The bad news: Microsoft doesn’t give you a button to do it Instead, you’ll use PowerShell and it’s actually pretty easy once you know how. Quick Answer To restore a deleted Power Apps canvas app: Install Power Apps PowerShell modules Run Add-PowerAppsAccount to sign in Run Get-AdminDeletedPowerAppsList to find the app Copy the App Name (GUID) Run Get-AdminRecoverDeletedPowerApp Provide App Name and Environment ID Notes: Deleted apps can be recovered for up to ~28 days Requires Power Platform Admin or Global Admin Restored app will have a timestamp added to name but same link works Before we continue, if you are more of a visual leaner then here is a YouTube video of me doing all of these steps: How to Restore a Deleted Power Apps Canvas App Step by Step Can You Restore a Deleted Power Apps Canvas App? Yes, but only if: The app was deleted within ~28 days You have admin permissions You use PowerShell (not the UI) There is no restore button in the Power Apps interface. Where People Look First (But Won’t Find It) Let’s save you some time and frustration, I already checked all of these places. Power Platform Admin Center ❌ No way to restore individual apps Restore Environment ❌ Restores everything, which is not practical Power Automate Admin Actions ❌ No restore actions exists COE Toolkit ❌ No recovery option At this point most people assume the app is gone forever! UGH. What You Need Before You Start Windows + PowerShell Power Platform Admin or Global Admin access Step 1: Install Power Apps PowerShell Modules Run PowerShell as Administrator and install: Install-Module -Name Microsoft.PowerApps.Administration.PowerShell Install-Module -Name Microsoft.PowerApps.PowerShell -AllowClobber If you are prompted about trusting repository PSGallery click Y if you trust it (I do) to allow the install to continue. It will not work if you say no. Step 2: Sign In to Power Apps This will cause a pop-up screen where you need to choose your M365 Account that has permissions to do the restore. Add-PowerAppsAccount Step 3: List Deleted Power Apps Now we want to find the app. Use the following Screenshot to put the puzzle together. First enter the cmdlet in the PowerShell window. (Shown with red underline) Get-AdminDeletedPowerAppsList Now, you’ll need your Environment ID (Shown with green highlighter) How to Find Your Environment ID In a browser go to the home of Power Apps and from the URL (between /e/ and /a/). Remember you need to be in the environment where you deleted the app from. Also, in green is my ID, it will not work for you. 🙃 Step 4: Restore the Deleted App From PowerShell enter this cmdlet. Get-AdminRecoverDeletedPowerApp Enter YOUR values for: App Name (Yellow Above) Environment ID (Green Above) Step 5: Wait for the App to Reappear Usually takes 5 minutes Refresh your apps list What Gets Restored? This is the best part: App returns Version history remains Connections still work App functions normally The name will include “restored” + timestamp ❓ FAQ How long can you restore a deleted Power Apps app? Up to ~28 days after deletion. Can a maker restore a deleted Power Apps app? No. You must be a Power Platform Admin or Global Admin. Is there a restore button in Power Apps? No. You must use PowerShell. Does restoring an app bring back data and connections? Yes. In most cases, connections and version history remain intact. Can you restore a Power Apps app without PowerShell? No, PowerShell is currently the only supported method. Quick Recap Deleted Power Apps apps are recoverable Recovery window is ~28 days No UI option exists PowerShell is required Use: Get-AdminDeletedPowerAppsList Get-AdminRecoverDeletedPowerApp Need Help with Power Apps? If you want help building, fixing, or avoiding disasters like this: PowerApps911 can help with: Consulting Training Governance Troubleshooting Basically… everything you wish you had before clicked delete.
- Streamlining Your Workflow with the Power Platform and QuickBooks
Here at PowerApps911, we are big fans of practice what you preach. We ourselves use a variety of home-built Power Platform applications to make things run as smooth as possible. One of the latest upgrades we implemented is a connection from our CRM model-driven app (where we track all of our time) into QuickBooks (where we do all of our invoicing and billing). We’re a consulting firm – we track all the time we spend working with our clients (we have to keep the lights on somehow, right?). Timesheets are one of those painful pesky duties that our consultants must adhere to and they do a great job of it. We were failing ourselves with the disconnect between our consultants entering their timesheets and how that tracked time eventually made its way into QuickBooks for invoicing. The disconnect being there was literally no connection between the two systems, and we were manually entering all that time into QuickBooks – resulting in inefficiency and errors. Enter, the QuickBooks API connector. Our team was able to take the QuickBooks API connector and wire it up to our CRM model-driven app, connecting the correct project to the correct client in QuickBooks, finding the correct project to log the time against and ensuring that only the time that is approved gets added to QuickBooks. Talk about hitting the efficiency jackpot. No more manual data entry, no more head-scratching over whether we billed for the right hours. Every time entry that is submitted gets a quick approval from the project manager, and if it meets the criteria to be added to QuickBooks, then quickly makes its way there. It's not just about saving time and reducing errors; it's about creating a smoother, more hassle-free operation that keeps everyone on the same page. We are not stopping there. Next up is bringing the invoicing information back into the CRM. Allowing our team to quickly see if an invoice has been paid and creating a one-stop dashboard for each client! Project Management, Account Management, and Financial information for the client all in one spot – no more 5 browser windows open at once here! If you use QuickBooks and want to look at the ways you could connect it to your other systems, PowerApps911 is here to help! This is something that we’d love to help you and your business out with! Click the button below to contact us!
- Import Excel Data to SharePoint List with Power Apps and Power Automate
You got Excel data (man, do you have lot's of it) and sometimes you need that data into SharePoint. In one off scenarios, no big deal, you go to SharePoint and upload it to the list and life is good. But, what about when that is a daily challenge? That is where automation comes into play. In this guide, we will walk through what it would look like if you had a Power Apps app for the user to upload the Excel file to, then the xlsx file will be passed to Power Automate to extract, filter, and then save the rows directly to a SharePoint list. The key here is Power Automate cloud flows and their ability to interact with Excel files for bulk import and SharePoint. Now, while this will focus on starting at Power Apps, keep in mind that the flow mechanics could be applied to many other scenarios. When a file is uploaded to SharePoint When you receive the Excel file as an email attachment Or even if you had another format like CSV Alright, let's walk through the process of Import Excel Data to a SharePoint list with Power Apps and Power Automate but, before we do, I have another option. If you want more details and to see all of this in action, check out the video I mport Excel Data to SharePoint List with Power Apps and Power Automate Using Power Apps for the User Upload The Power Apps app is pretty straightforward. Give the user an Attachment control, when the Excel file is attached, then run a Power Automate cloud flow to do bulk import. Once the flow finishes successfully, then Refresh the SharePoint list so the user can see their data in the app. Now, if you are not used to the upload method for Power Apps, I have another blog post here: Upload to SharePoint from Power Apps v2 . Using the Power Apps attachment control and the Power Apps v2 trigger in Power Automate, the process is pretty straightforward. Because to make this process easiest, the flow will create the file in SharePoint, then read it, then delete it. Seems like extra steps but it is the best path. Power Automate does the bulk of the work Now lets look at the flow. We will do it in mini sections to make it easier to follow but, everything below is all in one flow. Power Apps v2 trigger and SharePoint Create file The Power Apps v2 trigger for your cloud flow has one input of File type. This allows the app to pass the Excel file to Power Automate. Then the Create file in SharePoint action needs you to configure the site and the document library you want to store the Excel in. Keep in mind, we are only storing it long enough to process it, we will delete it at the end. Or if you want to keep it, that is great also. Either way we need to store it for a hot minute to do the following steps For the File Name and File Content, with the new flow designer they are easily added as dynamic content. Get Tables from Excel The Excel file must have a table, and in this example only one table. This action is getting the list of Tables from the XLSX file so you can reference it in the following action. The Id is the dynamic content from the Create File step. But Shane, my file is a CSV or doesn't have a table. Well, then you are going to have to do something about that. For the last customer, they just made it a requirement that someone turn the data into an Excel Table before upload. Other options, could include using an Office Script to do it for you. That is a little trickier but there is a video here to help: Using Excel Scripts with Power Automate to convert CSV List Rows present in a Table The first three fields are repeats of above but that Table one, that is a tad tricky because you have to use an Expression. first(outputs('Get_tables')?['body/value'])?['Id'] That grabs the Id of the first table from the previous action. Back to the concept of, if you are doing a bulk, repeating upload like this, you are going to have to have a planned structure for your Excel. This has never been a problem for a customer but, I wanted to make sure you were aware. And speaking of customers - What can we do to help you? Just hit the Contact button and let us know. We can help for 30 minutes or 30 months, whatever you need, we got it. Also, at the bottom check out the DateTime Format. If you are going to import dates make sure you have set the format to ISO 8601, the other serial method is confusing and somehow involves 1899. No thanks. Filter Array if Necessary Hopefully you have clean data but I didn't, so I used a Filter Array action to remove all of the unclean rows. Using a formula like: @and( not(empty(item()?['Name'])), not(empty(item()?['Amount'])), not(empty(item()?['Date'])), not(empty(item()?['Email'])) ) This returns only the rows that don't have blanks in any of those columns. Why? Because blank fields will make the whole thing fail. Now in my example, I just threw away the bad rows, but really, you should probably tell the user they had bad data. Loop Through the Rows and Create SharePoint List Items This Apply to each action is looping through all of the Excel rows from the Filter action. For each row of Excel data it is using the SharePoint Create Item action. This is how you do the bulk import from Excel to a SharePoint list. Nothing fancy at this point. Now if you go to set this up with the dynamic file and tables you will have challenges with your dynamic content not showing up. It is annoying. In the first video way back at the top I talk you through that challenge. Long story short, you have to use a static file when configuring the flow. Then once everything is setup you will go back and change things to be dynamic. It is confusing and a big part of the video, so if that is new to you, go watch. Sorry, to much to explain in text. Delete the File Flow is annoying, whoops I shouldn't say that, flow is annoying because sometimes it locks files even though it doesn't really have the file. Is that better? Either way, if you want to delete the Excel file you will need this. You are going to hit the API using the HTTP action as shown above. This will override the file lock that was causing errors. Don't over think it, just use this and move on. Wrapping up for Import Excel Data to SharePoint List with Power Apps and Power Automate There you go my friends. You let a user upload a file with a Power Apps app, then you sent it to Power Automate. Power Automate did all of the hard work of saving the file, grabbing all of the Excel rows, importing them to SharePoint, and then deleting the file. Pretty cool! Remember, if you need help with this or anything else Power Automate just hit that Contact button. We got you!











