top of page
hero-bg-1.png

Search Content

168 results found with an empty search

  • Building a Vacation Request App in Power Apps, Approvals without Flow

    In this blog post, we're going to do a high-level overview of Shane’s Vacation Request app. By understanding why he built the app the way he did, it will help to piece everything together. If you would like a step-by-step breakdown, make sure to check out the video below: Understand The Functionality Used First off, and this is important, many of the things you will learn in the video can be applied to all different kinds of apps, which I think gets lost sometimes. So try to also watch the video from that perspective as well. Whether it be the approval process, deep-linking, the controls and galleries, or how the screens are set up. All of these techniques and functionalities can be applied to many different kinds of apps, timesheets, inspections, employee reviews, etc. You may not be building a Vacation request app, and that’s fine, but understanding how the functionality is used and how it could be reused is very important. The Breakdown In the video, Shane walks you through building a vacation request app with approvals, WITHOUT POWER AUTOMATE. He incorporates email notifications and deep-linking so users can easily find and approve/reject requests. This is very important from both a functionality and usability perspective. He also includes modern controls to give the user a simple, clean, easy-to-use design.   No Flow? No problem!  By eliminating a flow(s) from the equation, it keeps everything in one place, the canvas app. This can be important when building apps for both internal use and customer projects. If you were to go the flow route, there would then be another tool that would need to be maintained. So, keeping everything in one place, the Power App, it makes things easier to manage. Important to note:  I’m sure you have either heard of or used the out-of-the-box Approval flow in Power Automate, which isn’t a bad thing. But many times when customers come to us about creating an approval process, we like to share both approaches and let them decide which route to go with. One con of the Power Automate approvals we sometimes bring up is that they are less customizable, and sending reminders can be more difficult. Reminders are not impossible with the approval flow by any means, but can require more steps in the flow to ensure they run as expected, which also adds more complexity. Deep linking magic.  By incorporating deep-linking, which is generally highly recommended for approval-type apps, users can hop directly from the email or button straight into the exact screen they need. This is important when building apps where managers, finance, CEO’s, etc, will need to review something. You want to make it as easy as possible for them to find what they are looking for without clicking through several screens and buttons. Deep-links are embedded in the Office365SendEmail.V2 email, so you will have full control over the email subject, body, formatting, and so on. The app also includes the ability to send reminders, which is a much simpler approach in Canvas apps. Modern, stylish visuals.  By incorporating modern controls and some cool visual flair into the app, you are giving the users something they will want to use. Design and a clean interface can sometimes feel like an afterthought, but it’s actually very important for the user experience. Now you don’t need to go crazy and try to create the greatest-looking app of all time or anything. But being conscious of your users as you are building will help you to create an app that users will want to use. It’s always a good idea to ask yourself a few questions: “Would I want to use this app?” and “Could I just open the app, and understand what I am supposed to do?”. Most apps shouldn’t require extensive end-user training; they should be simple and straightforward in what users are expected to do.     In a Nutshell… Hopefully, you found this breakdown both informational and helpful. Again, the full video is linked above if you want to watch it and get the step-by-step breakdown. As always, if you have any questions or need any Power Platform assistance, just reach out to us; we're always happy to help.

  • No round() in Power Automate? Here's What to Do Instead (Plus Advanced Math via MathJS)

    If you’ve ever tried to round numbers in Power Automate, you’ve probably discovered something annoying:  there’s no built-in Power Automate rounding function. That’s right. You can’t just do: round(3.14159, 2)   …because it doesn’t exist.   But don’t worry - there are workarounds. And suppose you’re looking to go even deeper with math operations (logarithms, powers, roots, algebra). In that case, there’s a powerful solution using the open-source MathJS library included in this blog post as well.   How to Round Numbers in Power Automate Even though there's no official Power Automate  round()  function, you can still round numbers using the  formatNumber()  expression:   formatNumber(3.14159, '#0.00')   outputs  3.14 .   Need a whole number? Just drop the decimals:   formatNumber(3.14159, '#0')   outputs  3 .   This works great for formatting and even for use in simple logic conditions. But if you're doing deeper numeric operations, this approach has its limits. Want Real Math? Create a MathJS Custom Connector For anything beyond basic formatting - like:   round(2.717854, 3) → 2.718 pow(5, 6) → 15625 log(10000, 10) → 4 sqrt(4) → 2   You can even use variables/algebra like this, or use the array concept to pass multiple operations at once: Expression: [ a = 1.2 * (2 + 4.5), a / 2]   Result: [7.8, 3.9] How it Works You pass a math expression (expr) to MathJS via a custom connector. The connector handles the calculation and returns the result.   Power Automate Action Definition:     Power Automate Result: Key Features of MathJS No API key needed  Supports hundreds of math functions - full list at  functions for MathJS  Free service with: 10-second max evaluation time 10,000 requests/day Works well for loops, expressions, conditionals, and calculated values in flows Requires premium licensing   How to Create the Custom Connector You can import the custom connector using the MathJS.swagger.json file. Here's a video on how to import the file.   Once imported: Add it as a step in your Power Automate flow Use the expr field to write any valid MathJS expression Get your result directly back in the response   As always, if you have any questions or you're looking for Power Platform assistance, just reach out; we're always happy to help. Happy Building!

  • Pretty Power Apps Made Easy with Some HTML

    If you've ever felt limited by the default design options in Power Apps, you’re not alone. While the platform makes building functional apps easy, achieving truly stunning UI designs often requires creative use of advanced tools. Enter the HTML Text control . This often-overlooked feature unlocks a world of possibilities for styling and design, letting you create apps that are not just functional but visually engaging. In this post, we’ll explore three powerful HTML Text control tricks that can elevate your app designs: Glassmorphism , Dynamic Badges , and Gradient Backgrounds . Each of these techniques is easy to implement and delivers immediate visual impact, whether you’re designing an internal tool or a customer-facing app. Let’s dive in! If you want to see these concepts in action, check out our YouTube video on Use HTML Gradients and Styling to improve your Power Apps UI . Always a fun time, and of course if you need help with this or any Power Apps concept hit the Contact Us button, we are always happy to help. Glassmorphism: A Sleek, Modern Look What is Glassmorphism?  Glassmorphism is a design trend that creates a frosted-glass effect. You’ve likely seen it in modern user interfaces—semi-transparent backgrounds with a subtle blur and glow, as seen in the Severe Weather Alerts example below. Why Use It? Creates focus while maintaining context by blurring the content behind the element. Adds a polished, professional touch to your app. Makes overlays, modals, or navigation menus more engaging. How to Implement It in Power Apps   To achieve this effect, you’ll use the HTML Text control with inline CSS styling in the HTMLText property. Here’s the code ( Note:  make sure you begin and end with double quotes): "" Key Elements of the Code: background: rgba(7, 42, 200, 0.6 ): Sets the semi-transparency of the background. backdrop-filter: blur( 4px ): Applies the frosted blur effect. border-radius: 10px: Rounds the corners for a smooth, modern look. width:" & Self.Width-50 & "px; height: " & Self.Height-51 & "px:  sets the size of the to match the HTML Text control, adjusting for margins and ensuring the height is 1 pixel less to prevent a scrollbar. Pro Tip:  Use variables in PowerFX to dynamically adjust dimensions or colors based on user interactions or app state. Real-World Applications: Highlight key information with a frosted overlay. Create stylish modals or popups for alerts and confirmations. Design navigation menus that stand out without overwhelming the content. Power Apps Extreme Makeover is a live one day class that teaches all things Pretty Power Apps. Check it out here . Dynamic Badges: Highlight What Matters What Are Dynamic Badges?  Badges are small, attention-grabbing labels often used to display statuses, notifications, or other critical updates. They’re a simple but effective way to improve the usability of your app. Normally, badges with rounded edges are created using a container with a label inside. But it’s difficult to dynamically size such a badge if the label text is dynamic. Enter HTML Text. Using the method below, an HTML tag is used to create perfectly scaled dynamic badges using a single HTML Text control, reducing control count in your app and ensuring pixel-perfect scaling of your badge How to Implement It in Power Apps Here’s how you can create badges using the HTML Text control. Place the following code in the HTMLText property: "Severe Thunderstorm Warning Flood Watch" Key Elements of the Code: background-color: Defines the badge’s color, which can be dynamic based on data. padding and border-radius: Create a pill-shaped badge for a modern look. font-size: Ensures the text is legible even on smaller screens. Real-World Applications: Display task statuses like “Pending,” “In Progress,” or “Completed.” Highlight new notifications or updates. Use color-coded badges to indicate priority levels. If you enjoy learning from reading our blog posts, you will LOVE learning in on Training classes. We have Power Apps training available both on-demand and live. Classes for Power Apps, Power Automate, Power Pages, Power BI, and Copilot AI are all available. Gradient Backgrounds: Add Depth and Style What Are Gradient Backgrounds?  Gradients are smooth color transitions that can make your app visually appealing and professional. Whether used as section dividers or background elements, gradients add a touch of sophistication. Why Use Them? Breaks up monotony in the app design. Helps visually differentiate sections. Makes your app look modern and polished. How to Implement It in Power Apps To create a gradient background, use the HTML Text control with a linear-gradient style: " " Key Elements of the Code: linear-gradient(180deg, rgba(2,7,93,1) 0%, rgba(95,98,141,1) 100%): Creates a top-to-bottom gradient with two colors. width:" & Self.Width & "px; height: " & Self.Height-1 & "px: Fills the the HTML Text control, less the very bottom pixel when is necessary due to the odd behavior of the scrollbar showing up if the element exactly matches the height of the HTML Text control. Pro Tip:  Because this strategy leaves a white 1-pixel line at the bottom of the HTML Text control, set the Fill property of the HTML Text control to match the color at the bottom of the gradient (in the example, RGBA(95,98,141,1)). This will ensure a perfect background! Real-World Applications: Use gradients for section headers or banners. Highlight important data visualization areas. Add visual depth to dashboards and forms. Conclusion The HTML Text control is a powerful tool for transforming the look and feel of your Power Apps. By mastering techniques like Glassmorphism , Dynamic Badges , and Gradient Backgrounds , you can create apps that are not only functional but also visually stunning. These design tricks improve user experience, make your apps more engaging, and help you stand out as a Power Apps developer. Next Steps: Try these techniques in your own apps and see the difference they make. Explore more HTML and CSS tricks to expand your design capabilities. Watch the full video tutorial for a step-by-step guide to implementing these effects. Hit the Contact Us button to get support for this or any other Power Platform challenge you might be having.

  • Filtering SharePoint Data with oData Queries in Power Automate

    When working with SharePoint data in Power Automate, filtering your dataset efficiently is key to building optimized workflows. One of the most powerful ways to filter SharePoint data is by using oData filter queries  in the Get Items  action. This post will walk you through different examples of filtering various column types  and using logical operators  to refine your results. If you want to see all of the concepts from this blog post in action then check out the full length video where we go hand on with these and other examples of oData filtering. You can find the YouTube step-by-step video here: Filter SharePoint Data in Power Automate with oData Understanding oData Filter Queries in Power Automate oData (Open Data Protocol) is a standard query language that enables filtering and querying data efficiently from multiple data sources, including SharePoint, Dataverse, and SQL Server. When used in Power Automate, it allows you to retrieve specific records without pulling unnecessary data, improving performance and efficiency. For the examples in this post, we will be using the Power Automate Cloud Flow action "Get Items"  to filter SharePoint list data. However, it’s important to note that oData queries are widely applicable across various platforms, including Microsoft Dataverse, SQL Server, and even third-party services that support the oData standard. Learning how to construct and apply these queries will benefit you in multiple automation and data retrieval scenarios. An example of the Get Items action with an oData Filter Query for the Created by field in SharePoint Filtering Different SharePoint Column Types Each SharePoint column type has its unique characteristics and filtering them requires different approaches. Below are practical examples of how to filter single-line text, choice, lookup, number, and date columns  using oData. 1️⃣ Filtering a Single Line Text Column For a text-based column , you use the eq (equals) operator. The column name is case-sensitive and must match exactly as it appears in SharePoint. Example: Title eq 'Project X' This retrieves all SharePoint list items where the Title column is Project X . 2️⃣ Filtering a Choice Column Choice columns require the same syntax as text columns. Ensure you use single quotes around the value. Example: Department eq 'Sales' This filters all items where the Department  choice column is set to "Sales." 3️⃣ Filtering a Multi-Choice Column Multi-choice columns can contain multiple values, so filtering them requires an exact match. Example: Skills eq 'Power BI' This filters records where the Skills  column contains exactly "Power BI." For filtering multiple selections: Skills eq 'Power BI' or Skills eq 'Excel' This retrieves items where Skills  include either Power BI  or Excel. Pro Tip:  If you're unsure of a column’s internal name, check the List Settings  in SharePoint or inspect the raw JSON output from a Get Items  action. 4️⃣ Filtering a Lookup Column Lookup columns reference values from another list. The default way to filter is using the ID  of the lookup record. Example: DeptLookUp eq 3 This retrieves all records where the Department lookup field  has an ID of 3. If you prefer filtering by the title  of the lookup field: DeptLookUp/Title eq 'Marketing' This pulls items where the related department’s Title  is "Marketing." 5️⃣ Filtering by Number Values Number fields support operators such as eq, gt, lt, and le. Example: Age gt 30 This retrieves all items where the Age  column is greater than 30. To filter within a range: Age gt 30 and Age lt 50 This gets records where the age is between 31 and 49. 6️⃣ Filtering by Date Values Dates in SharePoint require a special format: YYYY-MM-DDThh:mm:ss. Example: HireDate ge '2020-01-01T00:00:00' This retrieves employees hired on or after January 1, 2020. To find records within a year: HireDate ge '2022-01-01T00:00:00' and HireDate le '2022-12-31T23:59:59' This filters records where HireDate  falls within 2022. 7️⃣ Filtering by Created By (Author) Field The "Created By" field in SharePoint is internally referred to as Author. To filter based on this field, you need to use /Email or /Title depending on whether you want to match an email or a display name. Example: Author/Email eq 'user@example.com' This retrieves all records created by user@example.com . If filtering by display name: Author/Title eq 'John Doe' This pulls items where the Created By  field matches "John Doe." Be mindful that display names are not always unique. Using Logical Operators: and, or, Parentheses oData allows for complex filtering by combining multiple conditions using and, or, and parentheses. Make sure you use them all lower case. Combining Filters with AND Department eq 'HR' and Age gt 25 This retrieves employees from the HR department who are older than 25. Combining Filters with OR Skills eq 'Power Automate' or Skills eq 'SharePoint' This retrieves records where employees have either Power Automate  or SharePoint  skills. Grouping Filters with Parentheses (Department eq 'IT' or Department eq 'Finance') and Age lt 40 This retrieves all employees from IT or Finance  departments who are younger than 40. Conclusion oData filtering in Power Automate is a powerful way to query SharePoint data efficiently. Understanding how different column types work and applying the correct operators ensures that your workflows run faster and return the most relevant data. If you need help with this, remember we have support services where someone will hop on a screenshare with you for as little as 30 minutes to help. Just hist the Contact button and let us know how we can help.

  • The Hidden Cost of Standing Still

    In today's digital landscape, standing still is not a neutral act. We often see organizations clinging to outdated tools: unsupported Access databases, untouched SharePoint workflows, or custom apps only one person understands. These systems may still “work,” but they’re slow, fragile, and prone to failure, leading to lost time, frustrated users, and growing technical debt. Microsoft’s recent announcement about the retirement of  SharePoint Alerts  is a perfect example of how the tech landscape is evolving. Microsoft is phasing out older functionality in favor of modern, secure, and integrated solutions like Power Automate and SharePoint Rules. Waiting to make these updates doesn’t just risk disruption, it can multiply costs when rushed fixes or full rebuilds become unavoidable. This article breaks down what we see every day: the real-world impact of delays, the hidden costs of standing still, and the business case for proactive modernization. You deserve to understand them. Real-World Impact: The cost of delays What starts as a “quick fix” or a decision to “wait until next quarter” can easily turn into a costly scramble when systems fail or can no longer be supported. Delays can: Undermine user trust in outdated tools that are slow, unreliable, or confusing. Increase support costs as IT teams spend more time maintaining/babysitting legacy systems instead of building new value. Limit access to new features and integrations, making it harder to innovate or respond to business needs. Create compliance and security risks when unsupported platforms fall out of alignment with modern standards. Let’s get real. These aren’t just “what ifs,” they’re the stuff of IT urban legends (except they actually happened)! Southwest Airlines faced over $1 billion in losses after its legacy systems failed to adapt during a holiday disruption. The cost of waiting goes far beyond licensing or development, it affects productivity, customer experience, and even brand reputation.   When to Modernize vs. When to Wait Ok, now that we are all on board, let’s make a plan. Not every system needs to be rebuilt today. Knowing when to modernize is critical. Spotting the right moment to modernize doesn’t require a crystal ball. Look for these telltale signs: You’re spending more time maintaining than improving. If your team is constantly fixing bugs or working around limitations, it’s time to consider a rebuild. Your tools are holding back your business. They are flip phones in a smartphone world. Legacy systems that can’t integrate with modern platforms or scale with your needs are costing you more than you think. You’re dependent on a single person to keep things running. If only one person understands how your system works, you’re one resignation away from a crisis. You’re delaying updates due to fear of disruption. The longer you hit snooze on modernization, the bigger the wake-up call when change finally comes. You’re exposed to security or compliance risks. Unsupported platforms and outdated processes can leave you vulnerable. If none of these apply, it might be okay to wait, but with a plan. Set a timeline, budget for the future, and revisit regularly. If any of these scenarios ring a bell, it’s time to sound the modernization alarm. Think “Avengers, assemble!” but with less spandex and more system upgrades. Setting your team up for success Ready to kick off your modernization adventure? Here are some steps to get you started on the right foot! Watch the full free webinar here . This one-hour session will give you tools to plan and prioritize your modernization efforts! Audit your current systems to identify outdated apps, unsupported databases, or manual processes that are slowing your team down. If this sounds daunting, tools like Microsoft’s CoE toolkit  can help with transparency! Get trained. With low-code technology, subject matter experts within your organization can be the ones helping you lead the modernization charge. Shane’s upcoming   Power Apps & Power Automate 201 course offers expert-led sessions designed to help your team build modern Power Platform solutions with confidence. Identify the cost of modernization. Collaborate with technology experts who have experience developing similar solutions; external guidance can be highly valuable. Your partners can assist you in forecasting timelines and costs, enabling the establishment of realistic expectations. Of course, this is where we tell you to contact us . Don’t wait for a system failure or forced retirement; start planning your modernization strategy today.

  • Triaging Incident Reports with Power Platform and Copilot Studio

    Incident reporting is super important for organizations. But how do we keep a simple paper cut from elevating all the way to the CEO? In a recent video, Shane Young introduces how you can use the analytical power of Copilot to analyze your data, including the initial report, witness statements and even incident images, to properly route your report. Does that sound appealing? In this post, we’ll break it all down, showing you how Power Apps , Power Automate , and Copilot Studio can work together to enhance incident management through effective Copilot Studio incident triage. This integration allows for the transformation of raw field data into actionable insights. Though Shane used Dataverse in this example, because it was easier to include in a solution, you can use this technique with any other data source, such as SharePoint or SQL. Step 1: Report the Incident (Power Apps Canvas App) The first piece of the puzzle is a mobile-friendly Power Apps canvas app. Built with field users in mind, the app helps users submit the important data for the initial report including: Incident location Date and severity Category and description Witness statements Photos of the incident Step 1: Report the incident Step 2: Triggering the Flow (Power Automate) Once an incident is submitted, Power Automate jump starts the process. A cloud flow watches a table (in this case Dataverse) and fires every time a new incident record is added. That flow sends the incident data to an Agent built with Copilot Studio , and it tells the agent to get to work. Step 2: Triggering the Flow Step 3: Let the Agent Think (Copilot Studio) What really takes this process to the next level is incorporating a Copilot agent to do some high-level analysis of the data. The agent accesses all the report data from the initial incident report, witness statements, and incident photos. Then it determines if the incident is truly low , medium , or high  severity. Here’s what it does: Pulls the incident report details Retrieves witness statements Gets the photo and uses AI Builder to describe what’s in it Uses a SharePoint-hosted knowledge document to evaluate the severity Saves the AI-generated photo description to Dataverse Sends a summary email and updates the incident record. Step 3: The Copilot agent takes over   Extracting Insights from Photos One highlight Shane makes in this process is how the agent calls another Power Automate flow to analyze the photo. This uses AI Builder’s Image Classification with Prompt action to describe the image and assess urgency. Shane builds this by adding an Agent flow  (Tool) to his agent. The cool thing about this is that it is just like a Power Automate Flow. Shane reminds us how easy this is, and that if you can do flows in Power Automate, you can build capability like this into your Copilot agent! Agent flow calls AI Builder You can then edit instructions for the Image Classification tool by selecting Edit  button under the Prompt, and then simply add natural language instructions for the AI Builder flow action. Using this technique, you can modify how AI Builder handles your image description. Edit the Instructions to AI Builder action Final Output: A Reasoned Response, Not Just a Reaction Instead of blindly escalating reports based on user judgment, this system adds real intelligence to the process. It: Reduces false alarms Stores meaningful, AI-enhanced data for review Empowers business users to evolve incident evaluation rules The image below is an example email that the flow generates. Notice Shane’s description at the top compared with Copilot’s analysis of the witness statements and photos leading to the Action Taken  conclusion. Final Output Build This Copilot Studio Incident Triage Yourself Check out Shane's videos below: Build the Power App Build the Autonomous Agent Consulting, Training, and More If you want help implementing a solution like this in your own organization, or you want to train your team on Power Apps, Power Automate, AI Builder, or Copilot Studio, then reach out to us here at PowerApps911 . We offer consulting as well as live (including in-person) and on-demand online classes to get you there faster. We can also build your entire solution from the ground up! Questions or Ideas? Got thoughts on how this system could go further? Something you'd want to try with your team? Drop your questions or requests on the YouTube video . We strive to make content that appeals to you, so please let us know!

  • How to Use Deep Linking in Power Apps Canvas Apps

    If you’ve ever wanted to launch your app and take your users exactly where they need to go, then you need deep linking in Power Apps Canvas Apps. Deep linking allows you to pass data and navigate directly to specific items or screens in your app using URL parameters. Sounds hard but, it is not. This post will walk you through: What deep linking is and why it matters How to use the Param function in Power FX How to work with multiple parameters Real-world examples of deep linking By the end, you’ll understand how to implement deep linking in Power Apps. Next week, we’ll build on this with a fully functional vacation request app that puts these mechanics to work. Note: While it isn't hard, there are a lot of moving parts. If you are struggling to implement, check out this video for a full walkthrough of Power Apps Deep Linking: Updated: Power Apps Deep Linking What is Deep Linking in Power Apps? Deep linking in Power Apps is the ability to launch an app with URL parameters that can be read by the app to perform actions like navigating to a specific screen, displaying a custom message, or even opening the exact record the user needs to review. Typically, these records are created in your app and then sent to the user via Outlook emails or Teams messages. Why it matters: Better user experience  – take users where they need to go immediately. Simplified navigation  – eliminate extra clicks. Integration with Microsoft tools  – use deep links in email, SharePoint, or Teams. The OnSelect property of a Power Apps button that dynamically generates a deep link for the selected Item in the Gallery. The link has 2 parameters. Cow is set to 1 and EID is set to the ID of the Item. Step 1: Using Param in Power Apps with Power FX The Param function is your starting point for deep linking. It’s a Power FX function that reads data from the URL. Here’s a basic example: Label.Text = Param("Msg") Now, if you open your app with this URL: https://apps.powerapps.com/play/e/default-9416a1d9-2b7f-4847-8223-18c2057145e3/a/a8faf8f2-96b7-45da-9c54-d17f877847f9?tenantId=9416a1d9-2b7f-4847-8223-18c2057145e3&hint=705bc13c-a6b0-438e-97ce-ee04e1d6c65f&sourcetime=1754079731074&Msg=Hello%20World. Your label will display “Hello World.” Note: This is a URL of my app, it will not open for you. You would replace everything before &Msg with the URL of your app. Step 2: Navigating with Param You can also use Param to decide which screen a user should see first. You would place the following code in the App > StartScreen property: If(Param("Screen") = "Approvals", 'Approval Screen', Welcome ) With this setup, if you open your app using: https://apps.powerapps.com/play/e/default-9416a1d9-2b7f-4847-8223-18c2057145e3/a/a8faf8f2-96b7-45da-9c54-d17f877847f9?tenantId=9416a1d9-2b7f-4847-8223-18c2057145e3&hint=705bc13c-a6b0-438e-97ce-ee04e1d6c65f&sourcetime=1754079731074&Screen=Approvals The app will take the user directly to the Approvals screen. Step 3: Using Multiple Params in Power Apps Deep linking gets even better when you combine multiple parameters. So we could combine the two previous examples and have them both in the same URL. https://apps.powerapps.com/play/e/default-9416a1d9-2b7f-4847-8223-18c2057145e3/a/a8faf8f2-96b7-45da-9c54-d17f877847f9?tenantId=9416a1d9-2b7f-4847-8223-18c2057145e3&hint=705bc13c-a6b0-438e-97ce-ee04e1d6c65f&sourcetime=1754079731074&Screen=Approvals&Msg=Hello%20World. This deep link will: Navigate the user directly to the Approvals screen Display “Hello World.” in a label Keep in mind, you can have as many Parameters in your URL as you need, though I have never needed more than two. Typically, one to control the screen and a second to control which record is displayed on that screen. Pro Tips for Power Apps Deep Linking Use clear parameter names  – keep them short and descriptive (e.g., Screen, Msg, RecordID). Combine deep linking with variables  – use Power FX to store Param values and reuse them across screens. Store them in Formulas if they aren't going to change, Global Variables if you need to manipulate the variable throughout the app. Test your links in multiple browsers to make sure URL encoding works correctly. Include deep links in Power Automate notifications , Outlook emails ,  or Teams messages for a seamless experience. Real-World Use Cases Approvals:  Send managers a link that opens directly to their pending approvals. Data-driven navigation:  Link to a specific record for quick access. Notifications:  Add deep links to email or Teams messages to reduce user clicks. What’s Next This post focused on the mechanics of deep linking in Power Apps Canvas Apps. Next week, we’ll take it a step further with a fully functional vacation request app that puts deep linking to work. In the meantime, check out the full deep linking video here: https://www.youtube.com/watch?v=inHj96OGc5I Need Help? If you’re ready to add deep linking or any other Power Apps feature to your app but don’t have the time or want expert guidance, the team here at PowerApps911 is happy to help. Fill out the contact form , and we’ll get to work making your app awesome.

  • New way to add the Attachment Control in Power Apps

    Ready to have your mind blown? That may be a little much, but we are pretty excited for this and think you will be as well. Let’s start with a quick look at how we used to add the Attachment control. Previously, adding the Attachment control involved multiple steps, such as adding a data source, inserting an Edit form, adding the Attachment field, and then manually copying the control outside the form to configure it. That worked for years, still does, and there’s nothing wrong with that approach. Maybe a little excessive on the steps, but hey, it works. But what if I told you there was an easier way to add the Attachment control (or any other control for that matter) in your Power Apps. Odds are if you’re reading this, you are at least somewhat interested ha. You can do this with any existing app or start with a blank app, it’s up to you.  For our example we will be using a blank app to keep things simple. From the Power Apps editor, click the Ellipses at the top and select Settings . On the Settings window, click Support . Make note of the Authoring version, it’s probably 3.25061.7 . We need to change that. Below Authoring version, click Edit . Then, under Authoring version, click the drop-down and select 3.25063.5 . (Your version may be different, but you just want to select the newest version.) Once selected, click Reload + apply version . Power Apps is then going to reload your app and reopen. It’s always a good idea to double-check that your changes were saved and your Authoring version was updated. So, take a moment to confirm your Authoring version now shows as 3.25063.5 or again the version you selected. It’s also important to note that, as a rule of thumb, we don’t recommend doing this in any other cases, as it can get people in trouble. BUT if you need the attachment control working again, you will need to update the Authoring version. And hey, Shane said it’s ok, so it must be alright 😊 Now that the version is updated, you can simply copy and paste the YAML code for the attachment control right into your app. If you’re thinking to yourself, What is YAML code? Let me assure you, it’s fine, you are not alone either 😊. We aren’t even going to get into it, just know that code is what allows you to paste these controls into your apps. Let’s check out how it works. So, from my text editor, you can see the YAML code and properties for the Attachment control. I’ve also included the YAML code below so you can copy and paste it into your app. - Attachment1: Control: Attachments Properties: BorderColor: =Color.Purple BorderThickness: =5 Fill: =RGBA(169,169,169,.5) Height: =268 MaxAttachments: =1 Size: =18 Width: =402 X: =60 Y: =111 All I have to do is copy the code , go into Power Apps, and paste it . Boom! You will see the attachment control is now there and configured with the properties specified in the code. Again, this will work with any of your controls. If you want to get the YAML code for a control, you can add it to your app, right-click on the control, and select View code. If you want to watch the video where Shane walks through these steps, check out the video below.   Whether you are new to Power Apps or an experienced builder, everyone runs into roadblocks. If it happens, just know we are here to help however we can. Just click here , send us a message, and we will be in touch soon.

  • Add Microsoft Forms attachments to SharePoint list attachments via Power Automate

    This blog post is about a reliable technique to capture attachments from Forms and add them to a SharePoint list by using Microsoft Power Automate. We very often use Power Apps as a tool to capture SharePoint data including attachments, but you can also use Microsoft Forms and Power Automate to do it. In the process of figuring this technique out, I did a lot of things that caused the flow to fail. This technique will lead to success. What to know before you try it Why use Microsoft Forms? Microsoft Forms is a tool allowing you to capture data and files in a mobile or desktop experience. To take full advantage of the file upload   capability of Microsoft Forms this technique can only  be used within your organization. When you use a custom form from Microsoft Forms to allow attachments, Forms stores the attachment files in the form author's OneDrive . So that's where Power Automate must go to retrieve them. The OneDrive for business connection of the person who created the form absolutely must be part of the flow or you won't be able to grab these attachment files.   The other "BLL" (big lesson learned) is that using the 'Get file content using path' is nearly impossible to invoke when someone has a complex field name in the form, such as "1 Upload image relative to Performance complaint" (vs. a basic name like "Attachments"). We're talking some really strange encoding for the file path, and given Power Automate's finicky file path translator, you are in for a rough experience if you try to use this action with a hand-crafted file path. Recommendation, always use a 'Get file metadata' action using the ID from a 'Parse JSON' action to discern the exact path ...and I suppose you could use that to get the file content as well, but, in this proven solution I use the "Path" value from the 'Get file metadata' action. Works like a charm!    Flow Steps 1. Use the 'Get response details' action in your flow after a 'When a new response is submitted' flow trigger. Naturally, this step allows you to look at the action's outputs when looking at the Run history. You'll be able to discern which values are for your attachments, since the output only includes alpha-numeric strings . Your attachment will have a string of JSON to the right of the colon. See the image of the Outputs below: Outputs of the 'Get response details' 2. Use SharePoint 'Create item' action to create an entry for the new item related to the form fields (or a filtered 'Get items' to get the item you need to update).   3. Use a 'Compose' action invoking the json() formula on your attachment field: json() You can look up your field (represented in the code above as between the < and >) which may simply be called "Attachments" (or another more challenging name), and when you put that field into the json() formula, the alpha-numeric value should match the attachments field from the outputs of your 'Get response details'. Compose inputs as a json formula 4. Add a 'Condition' action to check that the Outputs from the 'Compose' action are "not equal to" null, so that you don't have an error in the flow when there is no attachment. (Use the formula value for null.) Condition: is not equal to null   5. In the "True" side of the condition, use a 'Parse JSON' step with 'Body' from the compose action as the Content, and the Schema as: {      "type" : "array" ,      "items" : {          "type" : "object" ,          "properties" : {              "name" : {                  "type" : "string"             },              "link" : {                  "type" : "string"             },              "id" : {                  "type" : "string"             },              "type" : {},              "size" : {                  "type" : "integer"             },              "referenceId" : {                  "type" : "string"             },              "driveId" : {                  "type" : "string"             },              "status" : {                  "type" : "integer"             },              "uploadSessionUrl" : {}         },          "required" : [              "name" ,              "link" ,              "id" ,              "type" ,              "size" ,              "referenceId" ,              "driveId" ,              "status" ,              "uploadSessionUrl"         ]     } }   6. Add a OneDrive 'Get file metadata' with the file value of 'Body id' (Power Automate will invoke an 'Apply to each' or 'For each' loop because of the array presented from the 'Parse JSON' action). IMPORTANT: ensure that before testing the flow that the person who created the form adds their connection to the OneDrive actions. If you do not do this, your flow will fail because it lacks permission to go into the OneDrive folder location to grab the attachment.   7. Use a 'Get file content using path' (OneDrive) with the Path value from the 'Get file metadata action' to capture the file content.   8. Still in the loop, add an 'Add attachment' (SharePoint) action. Id is from the 'Create item' (SharePoint), File Name is from the Parse JSON action, and File Content is from the 'Get file metadata' action. Add attachment settings Impossible? Never. Please let us know what you think about this technique!

  • Modern Text Input in Power Apps: What You Need to Know

    If you're building custom forms in Power Apps and want a cleaner, more flexible input experience, you can take advantage of the  Modern Text Input control. It's designed to be simpler, more accessible, and more in line with current design standards. While there are some great features to try, there are some buggy tradeoffs that make us not quite ready to completely give up the Classic Text Input. This post breaks down what matters most—especially for developers skipping the Form control and building a custom form. We'll look at some of the properties that have changed, what the new ones do, and how to handle validation. All in less than 5 minutes. Classic vs. Modern Property Mapping Here's a quick table to highlight what's changed: Modern Property Classic Equivalent Notes Value Default Holds a default input value of "". No need to replace "Text input". Placeholder HintText Shows hint text when empty. Mode Mode SingleLine or MultiLine only (no Password--see Type). Type (None) New. Choose "Text", "Password", or "Search"--see Type below. TriggerOutput DelayOutput New. More flexible—see TriggerOutput below. Required (None) New. Marks the input as required. ValidationState (Manual styling) New. Set to "Error" to show a red border. Note: Values like Type and Align properties are set using text strings (e.g. "Password", "Center")—not Enum syntax like Align.Center . Type property This property gives the text input a specific role: "Text" – Default. Accepts any text. "Password" – Masks input with dots. Shows a selectable view input toggle. "Search" – Meant for search bars. Currently, there's no difference from a "Text" type. (However, it may show a search icon or clear button in the future.) If you're asking for login info or PINs, use Type = "Password". Otherwise, stick with "Text" or "Search". TriggerOutput property This one's important if you're doing logic as you type. It controls when OnChange  fires and when the control's Value updates: "FocusOut" – Default. Fires when the user leaves the field. "Delayed" – About 500ms after typing stops. "WhileTyping" – Updates as the user types, but throttled. "KeyPress" – Fires on every keystroke  (use with caution). Pro tip : Use "WhileTyping" if you're building responsive custom forms. It's smoother than "KeyPress" and doesn’t trigger on every character. If you're tabbing through inputs, use the "FocusOut" . Required and ValidationState These two make field validation easier: Required   = true – Tags the control as required (mostly informational unless you're using forms). ValidationState = "Error" – Turns the border red. You control this manually. Here’s a quick example you can include in OnChange or OnSelect of a control: If(IsBlank(TextInputName.Value) UpdateContext({varNameError: true}), UpdateContext({varNameError: false}) ) Then bind the property: ValidationState = If(varNameError, "Error", "None") Boom—built-in red border. Bonus Tip: Use the Number Input control for Numbers If you're asking for a number, don’t use a text input . The new Number Input control: Opens the right keyboard on mobile Has increment/decrement buttons (with a customizable Step) Enforces numeric input by default It’s mostly better all around. Why We're Not Ready to Give Up the Classic Text Input While the Modern Text Input is sleek and evolving quickly, it’s not quite feature-complete yet. Here are a few frustrations: There is no " Clear button " (or " Enable spell check ") option. The AcceptsFocus  property isn’t available, so using SetFocus() can get wonky, especially when paired wit h TriggerOutput  = "WhileTyping" . Customizing tab navigation isn't an option. The FontSize  property (Size in the Classic Text Input) is too small when you first insert the control, prompting you to adjust it. The OnSelect  pr operty is missing, so if you need to do something when a user taps the field, you’ll need a workaround. Until these gaps are closed, the Classic Text Input still earns its spot in certain custom form scenarios. Wrap-Up As with other Modern controls, the Modern Text Input shows true promise, but it isn't quite what we're expecting, yet. They're stylish and clean and have a growing range of options. They can enhance the look and feel of your app, but some things they still can't do. There's still a place in our toolbox for the Classic Text Input.

  • Power Apps Modern Combo box

    If you've ever felt a bit overwhelmed by the Combo Box control in Power Apps, you're definitely not alone. It's one of the most powerful (and sometimes puzzling) components out there. But don't worry, in this guide, we’re diving into the modern Combo Box, and by the end, you’ll have a solid grip on how to make it work for you. Now if you are more of a visual learner than a reader, there is a full-length video Deep Dive for the Modern Power Apps Combo Box . Me I prefer seeing that reading, so hopefully the video also helps you. Getting Started: Enabling the Modern Combo Box Before you can use the modern Combo Box, you need to turn on the feature in Power Apps: Go to Settings  > Updates  > Modern Controls and Themes  > Toggle ON Insert a Combo Box from Insert  > Input  > Combo Box Populating the Combo Box By default, the Combo Box comes with sample items (Item 1, 2, 3), but that's not what we want. Connect it to a real data source like a SharePoint list, Dataverse table, or SQL. In the video, a list called "Mega" with 10,000+ items is used. One key limitation: the Combo Box only loads the first 800 items . That might sound like a lot, but if your list is bigger, you’ll need to filter or search more effectively. Filtering Items To narrow down the results, you can use the Filter() function. For example: Filter(Mega, AnimalType = "Cow") This helps make large data sources manageable within the 800-item cap. Search Functionality Modern Combo Boxes only search the first 800 items. For a more robust, traditional search, use the Search() function like this: Search(Mega, Self.SearchText, "Title") This makes your Combo Box smarter, especially with large data sets, but keep in mind delegation warnings. Default Selected Items Setting default values can be tricky. The DefaultSelectedItems property expects either a record or a table. To default to a specific item: LookUp(Mega, Title = "Item Title 22") Or use a custom JSON record, but be careful it must be an exact Record match: {Title: "Item Title 22"} If you are struggling with setting the DefaultSelectedItems use this video Power Apps Combo Box DefaultSelectedItems . The video is old but the content has not changed. Multiple Selections Turn on Allow Multiple Selections  to enable checkboxes in the Combo Box. This makes it easy for users to select more than one value. To pull out selected data, use: Concat(ComboBox1.SelectedItems, Title, ", ") This gives you a nice, comma-separated string of all selected titles. Working with People Search Want to select users from Office 365? Add the Office365Users  connector, then set the Combo Box items like this: Office365Users.SearchUserV2({searchTerm: Self.SearchText}).value Use DisplayName for the field shown in the Combo Box, and pull email addresses using: Concat(ComboBox2.SelectedItems, Mail, ";") Bonus: Rounded Corners and Styling Finally, a small but delightful update, modern controls now support border radius ! That means rounded corners are just a click away. Style away to match your app’s vibe. Wrapping Up The modern Combo Box in Power Apps brings a lot of new features and a bit of a learning curve. But once you get the hang of filtering, searching, and managing selected items, it becomes a flexible and user-friendly control. Don’t forget to explore delegation limits and always test with your actual data. Got questions or need help? Hit us up with the Contact button and tell us how we can help.

  • Workaround for Broken Power Apps Attachment Control

    Recently, a change in Microsoft Power Apps affected a common method for enabling file uploads. The attachment control, which users typically copied from a form into a standalone app, no longer functions correctly when used outside the form context. This disruption has affected many makers who relied on that approach since its emergence in 2019. If you've encountered this issue, you're not alone. Fortunately, there's a workaround that helps make it easier to keep file upload functionality in your app—without waiting for a product fix. Shane has documented this in his video: Power Apps Bug & Fix: Attachment Control. What Changed Previously, the process involved: Connecting your app to a SharePoint list. Inserting a Form  control connected to that list. Adding the Attachments  field to the form. Copying the Attachment  control from the form and pasting it elsewhere in your app. Now, when you try to copy and paste that control—even within the same form—it no longer functions properly. The paperclip icon that triggers the file picker disappears, and the control becomes unusable. The Workaround: Drag, Don’t Copy Here’s how to restore file upload functionality: Add a Form to your screen and connect it to a SharePoint list (any list with attachments enabled). Edit the fields in the form to include the Attachments  control. Instead of copying the control, click and drag the entire data card that contains the attachment control outside the form . You’ll see some formula errors. Clean those up by: Removing or correcting the Items property. Setting DisplayMode to Edit. Optionally adjusting styling (e.g., Color to Color.Black ). Once it works, delete the form. The dragged control will remain functional. Why This Works Dragging preserves internal bindings that are lost during copy-paste. This technique isn't documented, and Microsoft hasn't officially acknowledged it as supported behavior. However, it allows your app to continue supporting file uploads until an official fix is released. Known Bug Reference Microsoft has documented this issue as Bug 5096864 , noting that the control "is not designed to work outside of a form." This workaround sidesteps that limitation until the functionality is restored or officially restructured. Final Thoughts If you're building or maintaining apps that rely on file uploads, this drag-and-drop method  offers a workable path forward. We'll share this workaround with Microsoft to help drive resolution. In the meantime, you can keep your apps running smoothly using this approach. For a visual walkthrough, check out the linked video tutorial .

bottom of page