
Search Content
168 results found with an empty search
- Breaking Free from Gallery.Selected: Better Control in Power Apps with Variables
Are you tired of being stuck with the limitations of Gallery.Selected in your apps? Do you like having control of your app? Tired of confusing sequence for you users? Then take back control by switching to variables instead of Gallery.Selected. In this guide, we’ll dive into how to shift from using Gallery.Selected to a variable-based approach for better control, smoother navigation, and an overall improved user experience in Power Apps. We’ll go step-by-step on how you can introduce a single variable to manage record selections, handle new records more intuitively, and add more customization to your app—all while making your code cleaner and more efficient. And if you are more into seeing is believing then check out my 12-minute YouTube video Don't use PowerApps Gallery Selected Item Why Ditch Gallery.Selected? Using Gallery.Selected feels like a no-brainer when you first start building with Power Apps. It’s straightforward and provides an easy way to reference the record that a user clicks on. But… it’s not without its limitations: Lack of control: Once a user selects a record, Power Apps doesn’t let you control the next steps as much as you might like. This can lead to unintended highlights and inconsistencies, especially when users create or cancel new records. Inconsistent behavior: When a new record is created, the gallery often still highlights the previously selected item. Awkward, right? Limitations in multi-screen apps: Using Gallery.Selected across screens becomes tricky and isn’t as intuitive for users or developers. These limitations make a compelling case for switching to a variable-based approach, where we can leverage context and global variables to create a more reliable, user-friendly experience. Step 1: Setting Up Your Variable First things first, let’s create a variable to replace Gallery.Selected. You’ll use this variable to store the record information whenever a user clicks on an item in the gallery. Go to the gallery’s OnSelect property and add the following line of code to create a new variable (we’ll call it varRecord for simplicity): Set(varRecord, ThisItem) Now, instead of relying on Gallery.Selected, set your form’s Item property to varRecord. This will allow the form to reflect the selected record without directly depending on the gallery's selection. Step 2: Updating the Visual Cues Let’s add a few visual tweaks to make the selection experience smoother and more intuitive for users. This part is all about using varRecord to highlight the selected record, without those pesky issues tied to Gallery.Selected. Go to your gallery’s TemplateFill property and replace any reference to ThisItem.IsSelected with a condition that highlights based on varRecord . Here’s a quick example using the ID of each record: If(ThisItem.ID = VARrecord.ID, Color.LightBlue, Color.Transparent) Update any other properties that rely on ThisItem.IsSelected, like font weight or colors, using varRecord instead. Remember in the example above ID is the primary key column from the SharePoint list. If you are using another data source then you might not have ID as a column. Dataverse, for example, uses a unique identifier column that is named similar to the table name. The key is you need to find the primary column. Step 3: Customizing the New and Cancel Buttons Now that we’ve removed Gallery.Selected from the picture, let’s get our new and cancel record actions working flawlessly. For New Records: When a user clicks the “New” button, update varRecord to a blank value. This way, your gallery won’t highlight a record while the new form is open. Set(varRecord, Blank());NewForm(Form1) You may also want to repeat this step on the Cancel button. Or other places in your app you wish to clear the selected item. This approach ensures that your gallery and forms remain synchronized with each other, providing users with a seamless experience. Step 4: Setting Default Records (Optional) Want your app to open with a specific record highlighted? You can set varRecord to a default record (like “Greg” or “Chewy”) when the app starts. This is perfect if you want a particular item to show up as the default view when users first open the app. Steps: In your app’s OnStart property, add: Set(varRecord , LookUp(YourDataSource, ID = 1)) // Replace ID = 1 with your desired default Now, your app opens with the specific record highlighted automatically. No more blank first screens! In the video, you will see additional functionality, like adding a custom label that appears when the variable is blank and the form isn't in new mode like shown below. Now that you have complete control of when something is or isn't "selected" you can build whatever custom experience you would like. Benefits of Using a Variable Switching to a variable-based approach isn’t just a workaround—it’s an upgrade! Here are a few benefits: Better control : Gain more control over your gallery’s behavior, ensuring that records are only highlighted when and where you want them. More intuitive navigation : New and canceled records are handled seamlessly, without confusing the user with leftover highlights. Cleaner code : Using a single variable simplifies the app’s logic, making your code easier to read and maintain. Final Thoughts So there you have it! Ditching Gallery.Selected and embracing variables can give you and your users a smoother, more reliable experience in PowerApps. And, of course, it’ll make your app code cleaner, giving you less to troubleshoot when things go sideways. If you’re looking for even more PowerApps tips and tricks, we’re constantly adding new tutorials and updates. And if you’re curious about more ways to enhance your PowerApps skills, check out our training sessions. We offer everything from 30 minutes of mentoring to 30 years of project building, just hit the contact button and let us know what you need.
- AI & Me: Nicola's Honest Journey from Skepticism to Excitement
Nicola here, CEO at PowerApps911, sharing my honest thoughts on AI – I'm both thrilled and a little terrified. If you're leading an organization, a department, a team, or working in product development, you've likely been thinking about AI and its potential to boost productivity or enhance your product/service. I know I have. Initially, I felt like many of you – a bit hesitant but happy to use ChatGPT for things like content improvements, brainstorming games for team meetings, or drafting PTO flyers for school. This was easy to jump into since I spend around 14 hours a day with Shane, who brings up something AI-related at least once an hour 😊. I loved the productivity boost, especially since ChatGPT helped in areas that aren’t my strong suit, but I still didn’t quite grasp the game-changing potential. Then, the team working on our AI services asked us to brainstorm problems and inefficiencies in our organization that we’d love to solve. I was hesitant at first, still unclear on AI’s unique capabilities. I even asked, “How is this different from the solutions we already build with the Power Platform?” Their answer? AI doesn’t just follow instructions – it can interpret data and provide insights. Unlike standard automation, AI can think critically about the data it processes and give meaningful answers. And then… the wheels really started turning. I began thinking about areas of our business I’d love to make more efficient to better serve our clients and create a better work environment for our team. Some ideas were: Creating a solution to simplify time entry. We’re a time and materials-based consulting company, and as much as we might wish to avoid timesheets, they’re essential. Making that process easier for our team would be fantastic! We have a lot of meetings; maybe AI could look at calendars and suggest (or even prepopulate!) time entries based on meeting data. It could analyze historical patterns and recommend or prepopulate entries, streamlining the whole process. Improving the resource shuffle. If you manage resources like we do, you know the challenges of adjusting as projects delay, new projects arise, or skill needs change. We have a solid resource management tool and a team of skilled project managers juggling resources constantly. But what if AI could make it just a bit easier? Imagine AI recommending resource shifts that optimize skills and availability or suggesting allocations based on our project pipeline. Before this brainstorming, we were working on an internal project to make it easier to identify completed projects similar to new opportunities. In many organizations, this information is stuck in people’s heads. Someone asks, “Have you ever done a project that uses XYZ?” and we rely on team memory, sometimes asking everyone to find an answer. We tried solving this by tagging documents with skill and technology information and short project descriptions, but with a backlog of projects dating back to 2018, it was slow going. Then Daniel LeMay, one of our AI experts, stepped in and suggested AI could solve it faster and better. Now, he’s working on a solution to analyze all our past project content and automatically tag new ones as they’re completed. These are just a few examples. Once I fully grasped the possibilities, I quickly came up with ten ideas. If you're like me and need a quick discussion with someone to understand AI and its potential, contact us . We’re excited about what AI can do, and we’d love to brainstorm with you. If you decide to move forward with AI, we offer AI Services and Training – we can build for you or teach you to build. We’re here to be the partner you need.
- Power Pages: A Simple and Secure Way to Build Web Pages
Interest in Power Pages as a solution has become one of the fastest growing requests from our clients. And it is pretty easy to see why. Need a student registration website? An ordering portal for your vendors? A scheduling tool for subcontractors? Power Pages offers a secure solution for external users and connects seamlessly to your Dataverse environment. If you have processes that involve people outside of your company and right now rely on manual processes (email!), then consider Power Pages. Yes, there are licensing costs, but we ran some ROI numbers for our own org and building a Power Pages solution will ultimately save us time and money! But how low code is it? Power Platform is working to make application development accessible to people with little to no coding experience, and Power Pages is no exception. However, it is not quite as low code as some of its companion tools. As the child of Dynamics 365 Portals, Power Pages is built on Dataverse and is essentially a model-driven app on the back end. In its current form, you can only achieve so much with out of the box functionality and will need HTML, CSS, JavaScript and/or Liquid to go further. Currently, organizations can make very basic pages using low-code and need to leverage full dev to create more sophisticated interfaces. The Microsoft team is working to include more and more Power FX to Pages , which is great news, but it is still in the early stages. You can build for two different types of users: Authenticated or Anonymous Building for Authenticated Users Power Pages Authenticated users are users who obtain secure access to your website by logging in through an authentication provider website. More simply put, authenticated users are logged in to your website. Before you decide to start building for authenticated users, understand how you want each type of user to use the site. We call this, user roles. User roles help define what each type of user can access, view, and modify within the website. By establishing clear roles, you can tailor content and features to specific user needs, ensuring that sensitive information is only available to authorized users. When planning a Pages project, map out who will use your solution, and the different functions they will perform. Identify what tables in Dataverse they will have access to and make a plan to configure and test each users access role as you develop. Keep in mind that security in Dataverse is not relevant to Power Pages. It has its own thing which operates on the account and contact tables. By carefully planning user roles and enforcing security measures, organizations can create robust, secure websites that serve your audience’s needs without compromising on safety or compliance. Anonymous Users and Power Pages If you have no need to restrict the content to only certain users, then building for Anonymous users might be the right way to go. Anonymous access does not require users to log in. In these cases, your user role planning is focused on one user type- everyone. Even though user roles for anonymous users may seem simple, it is important to carefully plan and control what information is accessible. While sharing event details and documents is straightforward, it’s essential to ensure that sensitive data or internal resources are restricted and properly secured. Defining clear boundaries for anonymous users helps maintain the integrity of your organization’s information while still providing a user-friendly experience. Ready to build? Join our live three day workshop , November 12-14 (only $650!!), which will give you all the tools you need to get started with Power Pages. If you are still not sure, check out these videos or just reply to this email and ask us a question. Intro to Power Pages ( youtube.com ) How to Configure Power Pages for Item Redirection ( youtube.com )
- Export to CSV from Power Apps: A Complete Guide
I feel like just about every commercial app out there has the concept of Export to CSV. Turns out people like to grab their data and open it up in Excel. 🤷 Who Knew. So today, let's walk through how easy it is to add Export to CSV into your Power Apps. Basically, we select some table data, encode it in JSON, and then ship it off to Power Automate which has built in actions to make it super easy. Once the data is in Power Automate you can create a file an then save the file off to SharePoint, OneDrive, send it via an email attachment or basically anything else you can dream of. That is the beauty of flow, once you have the CSV file you can do anything you want. And speaking of Selecting items in a Gallery, we even cover how to Select All and Deselect All in the video version of this. Video: Power Apps Export to CSV with Power Automate Pro Tip: This tutorial assumes you’ve already got your Power App setup and you’re just focusing on the exporting bit. We’re skipping the app creation part today and heading straight into the exciting stuff: generating a JSON, converting it into CSV, and getting it where it needs to go. Check out the video above if you want to see the app creation and item selection. Creating the JSON from Power Apps First things first, we need to get our data into a JSON format. Power Apps can output data in various forms, but for exporting, JSON is the golden ticket. Step 1: Using the JSON Function In Power Apps, the JSON() function is your new best friend. This function allows you to take any table of data (like the items in your app) and convert it into JSON format. That’s the format Power Automate loves to work with. Here's how to create a JSON variable in Power Apps: UpdateContext({varJSON: JSON(yourTable, JSONFormat.IndentFour)}) This will take your data and turn it into a JSON string, which we’ll use in the next step to create our CSV. Now depending on your table, the previous step might be way more complicated. There JSON function doesn't work against controls or some advanced data types. In the video, we go through all of that but below you can see an example of just how complicated things can get. That is intense, and why the video is a bit longer but that is a good insight of what this looks like in the real world. Parsing JSON in Power Automate Next, it’s time to head into Power Automate. This is where the magic of converting our JSON data into a CSV file happens. Step 2: Parsing the JSON Inside your Power Automate flow, the first step after receiving the JSON from Power Apps is to parse it. This basically tells Power Automate what data you’re working with and how it’s structured. Add the Parse JSON action to your flow. Under "Content," insert the JSON data coming from Power Apps. Generate a schema by clicking "Generate from sample" and paste the sample JSON you want to parse. Boom! 🎉 Now Power Automate understands what’s inside your JSON file, and you can start working with that data. Converting JSON to CSV Now that Power Automate knows what your data looks like, let’s convert it into CSV format. Step 3: Create CSV Table Action We’ll use the Create CSV Table action in Power Automate to handle this. Here’s how: Add the Create CSV Table action. Choose your parsed JSON output as the input for this action. If you want to customize the columns, select Custom under "Columns" and specify the fields you want in your CSV (like Order Date, Total Amount, etc.). This action will generate a perfectly formatted CSV file with all your data. Now in the screenshot you can see some Expressions. Reminder, while you will bring over some raw data from Power Apps you can still fix it up. Order Date I updated to make a nicer looking format and Total Amount I set to look like currency. Once again, all of the gory details are covered in the video. Sending Your CSV File via Email With your CSV file ready to go, you can do just about anything with it. In this example, we’re going to email the file as an attachment. Step 4: Sending the CSV as an Attachment Add the Send an Email (V2) action to your flow. Then, use the following settings: To: Your desired recipient (or just yourself to test it out!). Subject: Something like, “Here’s your CSV export!” Body: You can keep this simple for now, like “Check out the attached CSV file.” Attachment Name: Export.csv (or whatever you want to call it). Attachment Content: Use the output from the Create CSV Table action here. Hit "Save," test it out, and if all goes well, you’ll receive an email with your brand-new CSV file attached. Bonus: Embedding Data as HTML Table (Optional) If you want to get even fancier, instead of attaching the CSV file, you can embed the data directly in your email as an HTML table. To do this: Add the Create HTML Table action (instead of CSV). Use the same parsed JSON as the input. In your Send an Email action, insert the HTML table output into the body of the email. Now, instead of a file attachment, your recipients will see a nicely formatted table right in their inbox! 📬 Wrap Up And that’s it! 🎉 You've just learned how to export data to CSV from Power Apps using Power Automate. With this knowledge, you can take your data anywhere it needs to go—whether that’s an inbox, cloud storage, or even SharePoint. Exporting CSVs from Power Apps is a super practical feature, especially if you're working with large datasets or need to automate data sharing across different teams. So go ahead, give it a try, and make your life a whole lot easier! If you need help with this or any apps or flows, just click the Contact button and we are happy to help. We have services that range from 30-minute screen shares to full scale project development.
- AddColumns in Power Apps: A Comprehensive Guide for Data Shaping with Power FX
As Power Apps developers, we frequently encounter situations where we need to manipulate and reshape data dynamically to meet specific app requirements. One powerful tool for this task is the AddColumns function. Whether you're working with SharePoint, Dataverse, or SQL data sources, understanding how to use AddColumns effectively can make your app development process smoother and more efficient. Why do we need tools like AddColumns? There are lots of reasons but the most common two are: One, we don't own the data source. Meaning we can't change the columns or what is avaialable we have to "make due" with what they provide. So adding our own to facilate functionality is a must. Two, we want to do something advanced. Creating a dynamic list of the next 10 Mondays in a dropdown, building an editable grid, or some other complex scenario where you need to be nimble. AddColumns lets you do all of this and more. In this post, we’ll explore practical use cases of the AddColumns function, along with other helpful data manipulation tips. So, grab your Power Apps toolkit, and let’s dive in! BTW - If all of this reading isn't your jam and you prefer video, I have got your covered AddColumns in Power Apps . We do all of this and then some. Handling Delegation and Performance Before you dive into the functions, one of the critical things to understand when using AddColumns or any of the data shaping formulas is delegation. Delegation refers to how much data Power Apps can handle and process on the backend server rather than on the client device. Some functions in Power Apps, including AddColumns, are non-delegable , which means that they can only work on the first 500 (or another limit set by your environment) records of your data. If you're working with large datasets, you must be cautious when applying AddColumns, as it might not return all rows, only the ones within the delegation limit. To prevent this, be mindful of where and how you use the function. To better understand delegation, check out our comprehensive guide on Power Apps delegation . Common things to keep in mind All of these functions are used to generate a table with a new shape. As you will see in the examples you can change a data source table or a table you generate. This generated table doesn't affect the table that is being shaped, meaning if you use AddColumns on a SharePoint list it isn't changing the SharePoint list. These functions are most often used in the Items property of a gallery or dropdown. Or if you need it more available then you can capture the output in a collection. What Is AddColumns and Why Should You Use It? At its core, AddColumns allows you to create a new column in your existing table, based on a calculation or formula, without altering your original data source. This is crucial because in many cases, you’re not allowed (or don’t want) to modify your backend data, especially if you’re dealing with a complex or restricted system like SharePoint or SQL. For instance, imagine you have an employees list in SharePoint with separate columns for First Name and Last Name , but you want to display a Full Name in your app. Instead of modifying the data source to combine these fields, AddColumns allows you to do this directly in Power Apps. Example 1: Creating a Full Name Column Let’s start with a basic example. You want to display the full name of an employee in your Power App. Here’s the formula: AddColumns(Employees, FullName, FirstName & " " & LastName) With this simple line, we’ve created a new column, Full Name , that combines the first and last names without touching the data in the original SharePoint list. Example 2: Sorting by Complex Columns Sorting data in Power Apps is generally straightforward until you deal with complex columns , such as Choice fields. Let’s say you have a Favorite Color choice column in your SharePoint list, and you want to sort your employees by their favorite colors. Sorting a complex column directly might throw errors. Here’s where AddColumns comes to the rescue: AddColumns(Employees, FavoriteColorValue, FavoriteColor.Value) Now that you’ve created a new text column for FavoriteColorValue , you can sort by it without issue: SortByColumns(AddColumns(Employees, FavoriteColorValue, FavoriteColor.Value),"FavoriteColorValue") Example 3: Grouping Data and Using AddColumns for Summarization Another exciting use case for AddColumns is when you need to group your data or calculate summaries. For example, you may have a list of sales transactions, and you want to group the data by department while calculating the total sales for each. Using AddColumns along with GroupBy and Sum functions, you can achieve this seamlessly: AddColumns( GroupBy(Sales, "Department", "GroupedSales"), TotalSales, Sum(GroupedSales, SalesAmount)) This formula adds a new column, TotalSales , to your grouped data, summarizing the sales amount for each department. Note: The screenshot has HourlyWage in place of SalesAmount. My demo data didn't line up exactly with the point I wanted to make. Example 4: Creating Dynamic Date Ranges Using AddColumns Here’s a quick trick for generating dynamic date ranges. Say you want to create a drop-down list of the next 10 same day of the week, starting from today. AddColumns works perfectly with Sequence , a function that generates a sequence of numbers that we can turn into dates. AddColumns( Sequence(10, 0, 7), SameDay, DateAdd(Today(), Value, TimeUnit.Days)) RenameColumns: Adjusting Column Names for Consistency When working with external data sources or collaborating with multiple teams, you may find that column names are not always consistent or easy to work with. That’s where RenameColumns comes in handy. This function allows you to rename one or more columns in your dataset without altering the actual data source. For example, if you’re working with a dataset that uses the column named Department but prefer to display it as Dept in your app, you can quickly rename it using this function: RenameColumns(Employees, Department, Dept) This simple rename action can make your app easier to maintain, especially when aligning with standardized naming conventions across your organization. DropColumns: Clean Up Unnecessary Data Sometimes, you’re working with a dataset that contains more information than you need. Excess data can slow down your app and make your formulas more difficult to manage. That’s where DropColumns can help. This function allows you to remove unwanted columns from a table without affecting the data source. For example, let’s say you have an employees table with a Photo column, but the photo is not needed for a particular view in your app. You can drop that column like this: DropColumns(Employees, Photo) By using DropColumns, you streamline your app's performance and ensure that only relevant data is downloaded to your app. ShowColumns: Focus Only on What’s Needed While DropColumns removes certain columns from a table, ShowColumns works in the opposite direction: it helps you specify exactly which columns you want to have available. This can be particularly useful when you’re dealing with large datasets but only need a few specific pieces of information. For example, if you only want to display an employee’s First Name , Last Name , and Department , you can use ShowColumns to limit the data returned: ShowColumns(Employees, FirstName, LastName, Department) By focusing only on the necessary data, you enhance both performance and readability in your app, ensuring that users see exactly what they need—nothing more, nothing less. Wrapping Up The AddColumns function is an essential tool for shaping and manipulating data on the fly in Power Apps, allowing you to do some really cool stuff. But don't forget about the functions friends. ShowColumns, DropColumns, and RenameColumns all have their magic moment where they are the perfect answer. And the more Power FX you know, the better. If you need help with this, or anything Power Platform related Click the Contact Us button at the top of the page and we would be happy to help.
- Archive SharePoint List Items with Power Automate
Do you use SharePoint as a data source? I bet you do. 🤩 If you do then let's talk about the importance of keeping those list sizes as small as possible and how you can use Power Automate cloud flows to help archive off those unnecessary items. Why Archive SharePoint List Items? Archiving isn't just about tidying up; it's about optimizing your app's performance and enhancing the user experience. 1. Overcoming Power Apps Delegation Limits If you've worked with Power Apps and SharePoint, you've likely encountered delegation limits. By default, Power Apps functions like Search can only work with the first 500 records of your data source (though you can bump this up to 2,000). This means those operations are limited to just those records, leaving the rest of your data untouched. Why is this a problem? Because if your SharePoint list has more than 2,000 items (and let's be honest, they grow faster than weeds), your app can have challenges with data beyond that limit. This can lead to incomplete data views and frustrated users. 2. Boosting App Performance Large datasets can slow down your app. Each time your app loads, it pulls data from your SharePoint list. The more data it has to fetch, the longer it takes. By archiving old or unnecessary items, you reduce the load on your app, making it snappier and more responsive. The way I have always explained this is for every 1,000 more items in your SharePoint list you can feel a slowdown in overall app performance. Purely a Shane made up stat but, that is what it feels like to me. So shrink them lists! 3. Enhancing User Experience Nobody likes sifting through thousands of records to find what they need. A cluttered app can overwhelm users and decrease productivity. Archiving helps keep your app clean and user-friendly. Seriously, I get questions about why can't I have 1000's of items in my dropdown? WHY! Because for starters what users wants to scroll through that much data? Find a way to only show them what they actually need. 4. Compliance and Data Retention Archiving isn't just about performance; it's also about compliance. Many industries have regulations around data retention. Archiving ensures you're keeping necessary records without cluttering your active workspace. So many compliance rules here, I will not even try to list them. But make sure if you are storing data, you are following the rules. Not only for how long you might need to keep it but also who can see it. How to Archive SharePoint List Items Using Power Automate Alright, now that we've covered the "why," let's get into the "how." We'll use Power Automate to create a flow that automatically moves items from your main SharePoint list to an archive list based on criteria you set. Why Power Automate for archiving? The best answer is because it is included. The same license that is letting you build those Power Apps on top of SharePoint lets you use Power Automate cloud flows. So, building a flow to archive your SharePoint lists items is not only easy but it is also "free". If you want step-by-step for building a flow to archive SharePoint list items then click the link to the video. Now building the flow can be easy or it can be hard. That really depends on your level of comfort with Power Automate and the type of SharePoint columns you are using. Most of your common SharePoint columns are easy and just plug and play. Your flow gets the item to be archived and then has a step to create a new item with that dynamic content. You play connect the dots and boom. You can also delete the item if you want. Now for columns like multiple choice they throw a bit of a curve ball. For those you have to use the Select action to get the exact data out and then insert that output into the field. Attachment Column And then finally you have the hardest of the hard, attachment column. It requires a lot of moving parts and multiple actions. I am not even going to try to explain it, if you need to do attachments you will have to watch the video . And then just make sure you go slowly, easy to get confused. Wrapping It Up There you have it! By archiving your SharePoint list items using a Power Automate cloud flow, you're not just cleaning house—you're optimizing your app's performance, enhancing user experience, and sidestepping those annoying delegation limits. So go ahead, give your app (and your users) the boost they deserve! Need a hand setting this up? We're here to help! Click the Contact us button. We can help you with this or any of your Power Platform challenges. We offer 30 minutes Teams calls all the way to full on project consulting.
- Getting Started with Dataverse: A SharePoint User's Guide
Let's be honest, Dataverse is the best data source for Power Apps. It has the best performance, most features, and the most delegable functions. But you started with SharePoint, like 99% of everyone else, because it was easy, and you had the license. No problem, I also started with SharePoint. 😎 But there comes a time you want to do more and Dataverse is usually the answer to doing more. So, let's learn how to get started with Dataverse. And to make it as easy as possible, I am going to explain things in SharePoint terms as much as possible. Leverage all of that knowledge you already have. Also, if you prefer to see things in motion then here is the video Getting Started with Dataverse . What is Dataverse? In simple terms, Dataverse is the underlying data platform for Power Apps , Power Automate , Copilot Studio , and the rest of the Power Platform . If you are looking to build your apps and solutions on the best platform, look no further, Dataverse is the answer. Not that it really matters but, under the hood, both Dataverse and SharePoint are built on top of SQL Server . With the biggest benefit of both is Microsoft worries about all of that database tuning and performance, you just use it. 😎 So what are some of the key components of Dataverse? Dataverse vs. SharePoint: Key Differences If you're a SharePoint user, think of Dataverse tables like SharePoint lists . However, Dataverse offers a more robust and scalable solution. Some of the key differences include: - Environments in Dataverse act like SharePoint site collections , isolating data, apps, and security settings. - Dataverse and SharePoint both support relationship management and complex data types , which allows for more sophisticated app development. Both have things like Lookup and Choice columns to help you build a solid data model and use similar terminology in most cases. - Dataverse’s performance and scalability far exceed what SharePoint can offer, making it the go-to option for apps with extensive data requirements. This is because SharePoint is a collaboration portal that we sometimes use as a database. Dataverse is built from the ground up to be a storage system for the Power Platform. Dataverse Tables Let’s jump into the practical side of things! One of the first things you'll do in Dataverse is create custom tables . This is very similar to creating a custom list in SharePoint. One of the biggest differences you may notice is there isn't different types. In SharePoint there are countless templates to start: Dataverse will always be the equivalent of choosing Blank list in SharePoint. Now to be fair, Dataverse is doing a lot to integrate Copilot so you can use words to create your first table or create a table from an existing data source like SharePoint, so you don't always have to start from blank but that is for another day. 😎 Different Column Types Dataverse and SharePoint have a lot of the same column types, not surprising, who doesn't need to store text or numbers? Below let's call out some key ones and talk about any differences you should know. Single Line of Text : Ideal for storing names, addresses, or other short text data. Defaults to 100 characters, can be increased to 4,000. Multiline can be increased to 1,000,000. SharePoint is 255 and ~64,000 and not adjustable. Number fields : With SharePoint you choose a number and it just works, decimals or not doesn't matter. With Dataverse there are Whole Numbers , Decimal , Float , and some other goofy ones. You do need to take a minute and make sure you choose the correct one. Date and time : SharePoint stores these always as full date and time, but has some UI options. In Dataverse, there is Date and time and Date Only + there are different options for how they are stored and returned. Make sure you spend a few minutes here. Lookup : These fields behave the same from a storage perspective in both. There is some coolness when referencing the data from Dataverse called polymorphic lookups, where you can dot (.) your way through the related record. Choice Fields : Same in both from a storage point of view. Filtering and other usage of Choice fields with Dataverse is clunky, I rarely use Choice fields for either product. Yes/No : Unlike SharePoint’s true/false columns, Dataverse uses a choice field for Yes/No values, which can be a bit confusing for SharePoint veterans. Boo! Currency : SharePoint is just a number field with a currency symbol in front of it. Dataverse... It has a robust system of fields and tables to build a currency conversion and rate system, not for the faint of heart but very cool if you need it and learn it. AutoNumber : Dataverse specific field with one thing of note. It is a text field, not a number, which can be confusing when working with it. But if you want an auto Invoice number like INV-0001 that is self-incrementing? This is it. File : Dataverse doesn't have document libraries 😢, so if you want to store files in Dataverse you need to use a File column, same for Images . They work but just not as convenient as a doc library from SharePoint. Formula : Dataverse's newest column let's use Power FX to create formula driven columns. Think of calculated columns on steroids, a very powerful win for Dataverse. Enjoying this? Do you like the way I explain things? You must, you are still reading. 😋 Be sure to check out my Power Platform Training Classes . Both live and on-demand class are available now! Dataverse Licensing: What You Need to Know Before you jump headfirst into Dataverse, it’s important to understand the licensing implications . Unlike SharePoint, which is included in most Microsoft 365 plans , Dataverse requires a premium license. This means that while you can build apps using Dataverse, your end users will need a premium license to access them. Conclusion: Is Dataverse Right for You? While Dataverse comes with licensing requirements, it’s by far the most powerful and scalable data source for Power Apps. Whether you're building simple apps or large enterprise solutions, Dataverse provides a level of performance and flexibility that surpasses SharePoint. If you’ve been frustrated with SharePoint’s limitations or you need to scale your apps to handle more data, then it’s worth exploring Dataverse. And now that you’ve seen how easy it is to create custom tables and integrate with Power Apps, you’re well on your way to mastering the Power Platform. To get help with this or any other Power Platform topic just scroll down the page a bit more and hit the Contact Us button. We are happy to help with anything from 30 minutes screen shares to long term projects. 😎
- Which SharePoint form are you using?
Welcome to our in-depth guide on leveraging SharePoint forms, Microsoft List, and Power Apps to enhance your data management processes. In our latest video, we dive into these tools, exploring their features, benefits, and limitations. Whether you're new to SharePoint or a seasoned user, this guide will provide you with valuable insights to optimize your workflows. If you want to see all of the tools in action this check out this video on Getting SharePoint Data? Use the right tool! SharePoint Or Microsoft Lists default form The Built in Experience When you create a SharePoint list whether through the SharePoint or Microsoft Lists experience, there is automatically an included experience to Create, Edit, and View your SharePoint data. With that default form you can make some tweaks by using JSON. It let's you make them look a little different but doesn't really change their functionality. Still, sometimes that is all you need and if so cool. It has literally worked for millions of people over the last 20 years. Understanding SharePoint Forms The New SharePoint Forms Button Recently, Microsoft introduced a new forms button in SharePoint, aimed at simplifying data collection. This feature is perfect for quickly setting up forms without needing extensive technical knowledge. However, while it's user-friendly, it comes with some limitations, such as lack of advanced customization and branching logic. Also, keep in mind these forms only work when you send someone the link. They don't change the default SharePoint experience. You cannot change the look and feel much but collecting data simply is where they shine. Use Cases and Limitations Quick Data Entry: Ideal for simple data collection scenarios. Security Considerations: Allows data entry without requiring users to have access to the entire list, which can be useful in controlled data collection environments. Leveraging Microsoft Forms for Data Collection Introduction to Microsoft Forms Microsoft Forms is a versatile tool within the Microsoft 365 suite, designed for creating surveys, quizzes, and forms. Unlike the other tools discussed, Microsoft Forms is not directly tied to SharePoint, but it offers a flexible and easy-to-use interface for collecting data from both internal and external sources. Features and Integration User-Friendly Interface: Microsoft Forms provides a straightforward setup, allowing you to quickly create forms with various question types, including multiple choice, text, and more. External Access: One of the standout features of Microsoft Forms is its ability to collect data from external users, making it ideal for public surveys or feedback forms. Data Storage: Data collected through Microsoft Forms is stored in an Excel file, which can then be integrated into other tools or systems using Power Automate. Limitations and Considerations No Direct SharePoint Integration: While Microsoft Forms is excellent for collecting data, it does not natively integrate with SharePoint lists. This means that additional steps, such as using Power Automate, are needed to transfer the data into SharePoint. Customization Limits: While it offers basic customization, Microsoft Forms does not provide the same level of control and customization as Power Apps. Advanced Customization with Power Apps Power Apps Integration Power Apps is the go-to tool for creating highly customized forms and applications that interact with SharePoint data. It provides extensive capabilities, allowing users to create complex, multi-step workflows and custom interfaces. With Power Apps there are two ways to use it here. First, you can use it to make SharePoint better by replacing the SharePoint default form. This will replace that default SharePoint form with one you build in Power Apps. Making the SharePoint Browser experience better. Second, you can build a complete standalone custom app, and have it save data directly to SharePoint. This works great in those complex business scenarios. One of our specialties here at PowerApps911. Pros and Cons Customization: Power Apps offers unparalleled customization, from simple color changes to complex data manipulation and workflow automation. Security Requirements: Requires proper permissions for users, making it less accessible for broader, anonymous data collection. Choosing the Right Tool Choosing the right tool depends on your specific needs: For simple data collection: The new SharePoint forms are quick and easy to set up. For a more user-friendly interface: Microsoft List offers a clean and straightforward experience. For a flexible experience you can use anywhere: Microsoft Forms allow a host of security options, including anonymous but do require you to build a Power Automate flow to get data into SharePoint. For advanced customization: Power Apps is the best choice, providing a comprehensive suite of tools for building sophisticated applications. Comparison Table To help you choose the right tool, we created a table comparing the options: Conclusion Our goal at PowerApps911 is to help you navigate the complexities of Microsoft 365 and the Power Platform. If you have any questions about these tools or need assistance with other Power Platform or Microsoft 365 solutions, we're here to help. Just scroll down and fill out the contact form, and one of our experts will be in touch!
- Power Apps Text Functions Deep Dive
In today's post, we're diving into the world of text (or string) functions in Power Apps. If you're working with any kind of data, chances are you'll need to manipulate strings at some point. Whether it's reformatting text, cleaning up user inputs, or extracting specific data, these functions are a key ninja skill you should develop. 🥷 Below we will talk through 17 different Power FX functions that allow you to manipulate your Power Apps data in all ways regardless of if it comes from your users via inputs or from your data sources like Dataverse, SharePoint, SQL, or the other twelve hundred that are available. And because I am super nice there is a code example of each so you can see the practical example and easily cut and paste. 😁 Finally, if you want to see the examples and hear the more detailed explanation of using these Power FX functions, then check out my video on Power Apps Text Functions . It might not win an Emmy, but maybe a Golden Globe? Split, Last, and First Functions One of the most common text challenges you'll encounter is splitting and reformatting strings. A classic example is converting names from "Last, First" format to "First Last". Using the Split function, you can break a string into pieces based on a delimiter (like a comma). From there, the Last and First functions come into play, allowing you to rearrange and clean up the data as needed. Example : Suppose you have a name formatted as "Young, Shane." By splitting on the comma and using First and Last, you can easily reformat it to "Shane Young." Trim(Last(Split(TextInput1.Text, ",")).Value) & " " & First(Split(TextInput1.Text, ",")).Value Index Function Need to grab a specific part of a string, like a middle name? The Index function is your go-to tool. This function retrieves a specific row from a table created by a split function. Example : Splitting "Shane Dog Young" on the spaces between the words would create a table with three rows. The Index function allows you to pull out the second row, which would be "Dog" in this case. Index(Split(TextInput2.Text, " "),2).Value Right, Left, Mid, and Find Functions When you're working with structured text, like invoice numbers or IDs, you'll often need to extract a fixed number of characters. The Right and Left functions allow you to grab a specific number of characters from the end or beginning of a string. For more complex cases, the Mid function is a lifesaver. It lets you extract characters from anywhere in a string, based on a starting point and length. Combine it with the Find function to locate specific characters or patterns in your text. Example : Use Right to grab just the last four digits of a string that represent the invoice number. Or use Left to get the first view characters. This works best when you know the structure of the data, and know it will not change. Right(TextInput3.Text, 4) Left(TextInput3.Text, 3) Example : Combining Mid and Find is another way to locate part of a string, like earlier when we used Split. The difference here is you might be finding a specific character(s) within the string to start from. Mid(TextInput5.Text,Find("-", TextInput5.Text) + 1, 3) Len Function Sometimes, you just need to know how long a string is. That's where the Len function comes in. This function counts the number of characters in a string and is particularly useful when validating inputs or calculating positions in more complex formulas. Example : Use Len to ensure that phone numbers or codes meet length requirements before processing them further. Len(TextInput6.Text) Upper, Lower, and Proper Functions Standardizing text case is crucial for data consistency. Whether you need everything in uppercase, lowercase, or proper case, these functions have you covered. The Upper function converts all characters to uppercase, Lower converts them to lowercase, and Proper capitalizes the first letter of each word. This is especially useful for normalizing names or email addresses to avoid case-sensitive issues. Example : Use Lower or Upper to standardize email addresses before comparing them, or Proper to clean up user-entered names. Upper(TextInput7.Text) Lower(TextInput7.Text) Proper(TextInput7.Text) Are you enjoying this learning style? Be sure to check out some of my Power Apps and Copilot Training classes . Both Live and On-demand courses available. Trim and TrimEnds Functions Whitespace can be a sneaky issue in user inputs, causing mismatches and errors in your app. The Trim function removes all extra spaces from a string, including those between words. TrimEnds , on the other hand, only removes spaces from the beginning and end of the string. These functions are perfect for cleaning up user inputs and ensuring data consistency, particularly when dealing with form fields or imported data. Those people writing Power BI reports from your data will thank you. Example : Use Trim to clean up a user-entered address or TrimEnds to remove accidental trailing spaces in email inputs. Trim(TextInput9.Text) TrimEnds(TextInput9.Text) Replace and Substitute Functions Sometimes, you need to swap out certain text in a string. The Replace and Substitute functions allow you to do just that, but with a key difference: Replace targets a specific position in the string and replaces it with new text. Substitute finds all occurrences of a specific text and replaces them. Example : Replace a specific word in a sentence or substitute all instances of a special character in a text field. Replace(TextInput8.Text,9,4,"really love") Substitute(TextInput8.Text,"like","🥰") Concat Function The Concat function is the opposite of Split we learned earlier. It takes a table of data and combines it into a single string. This is extremely useful when you need to generate lists from selected items, such as creating a list of email addresses from a Combo Box SelectedItems output. Example : Use Concat to combine multiple selected values into a semicolon-separated list for an email field. Concat(ComboBox1.SelectedItems,Value,"; ") String Interpolation Finally, let's talk about string interpolation – the newer, fancier way to concatenate strings in Power Apps. With this method, you use dollar signs ( $ ) and curly braces ( {} ) to embed dynamic content within your strings. While the old-school & (Ampersand) method still works just fine, string interpolation offers a cleaner and more intuitive way to build strings. Though, thanks to muscle memory, I still use the old way. 🤷 Example : Use interpolation to dynamically insert user names, dates, or other variables into your strings with minimal fuss. As you can see, both ways produce the same output, really just a matter of what works best for you. $"The user {User().FullName} typed {TextInput10.Text} in the box." "The user " & User().FullName & " typed " & TextInput10.Text & " in the box." Wrapping up Power Apps Text Functions Text manipulation is a fundamental skill in Power Apps, enabling you to clean, structure, and transform your data with ease. Whether you're working on a simple form or a complex data process, mastering these text functions will make your apps more robust and reliable. I hope this guide helps you tackle your text challenges with confidence! As always, feel free to reach out if you need assistance, whether it’s a quick fix or a more involved project. Need Power Apps String Function Help? If you need help with this or any other Power Platform topic we are here to help. We can do everything from a quick 30-minute fix to a 30-year project. We also have lots of training classes. (I really want to say 30 courses to stick with the 30 theme but I'm not sure that is true. 🤣 I guess I should count them.)
- Automate HR Requests with a Chatbot built using Copilot AI and Actions
A lot of businesses are trying to find ways to pilot AI in their organization and for many of them trying out chat bots seem to be the answer. And of course, in the Microsoft ecosystem that means Copilot Studio, formerly Power Virtual Agents. The reason for the popularity of these tools now is their ability to use Generative AI. So instead of going in and defining 100 Human Resources questions and the answers manually now you can point it at your documentation and let it answer the questions using a large language model (LLM). Since most businesses have things like HR policies and procedures, PTO policies, and the Employee Handbook available to all employees in a SharePoint site today building a Copilot can be done in literally minutes. But the fun doesn’t stop there. The latest iteration of these chatbots can also easily include actions. You add actions for things like submitting a request for time off or requesting a meeting and the AI can take those actions for you. This allows for an interactive and action-oriented conversation, a drastic improvement from the wall of text people are used to getting from HR documents. Is it Copilot or Chatbot? Yes. 😊 To build these things we traditionally called chatbots you use Copilot Studio. In Copilot Studio you build a copilot, which we used to call a chatbot. So for this context Copilot and Chatbot are interchangeable. I use both throughout the article to hopefully drive home they are synonymous. Demo of an HR Copilot with Generative AI Since we receive a lot of requests for this specific use case, I built a demo bot to show off some of the cool. Below I will walk you through the key features with screenshots. If you want to see the Copilot in action, then check out this video demo I did HR Assistant Copilot using Copilot Studio for all of the fun. For this Copilot I built and published the bot as a Teams app. Copilot Studio can be used to publish to many different channels that are both publicly and privately accessible. But in case where you are looking to use internal content, like SharePoint, and you want to have authentication then publishing to Teams is the path of choice. Answering HR questions with Copilot Studio Alright, let's ask this bot something. How about an important question like “Can I bring my dog to the office?” Now in this case we have never trained the bot on this topic but the fine folks in HR have addressed it in our employee handbook. So, when the question is asked the Copilot looks through the handbook, finds our pet policy and responds with the appropriate answer. Notice the blue colored 1s at the end of the response. These are the links to the documents that Copilot referenced to come up with this response. So, if you want to dig in deeper or just validate things before you purchase your pup some business attire you can click the link and you will be taken to the document. Now you can see where the pot belly pig stuff came from, not AI’s imagination but from the actual policy. 🤣 Maybe I shouldn’t be in charge of HR. Fun pigs aside, this is really powerful. By just giving Copilot access to the proper content, it is able to provide accurate answers to random questions and provide attribution so you can validate those responses. And look, all I did to set it up was give the Copilot a link to the SharePoint site and made sure everyone had access. That was it. And while SharePoint seems to be the default in our Microsoft 365 based world, there are a lot of other supported data sources in preview right now. Providing a structured response via Topics Now sometimes you don’t want Generative AI to provide an answer, you want to specify exactly how a conversation goes when they ask about a specific subject. In this case you will provide a topic. When a user asks a question topics to take precedence over generative AI. In this case, if they ask anything about getting a raise, I want to simply redirect them to the manager or HR. With topics you can go anywhere from this simple response to full on multi-step conversation with conditions and actions. You could ask them for additional info, you could trigger a flow or action to get more information or submit a ticket, etc. All of the traditional chat bot activities. Add a new employee with a Power Automate action Okay, so far, we have just gotten information but what if we want to take action. You can add actions and/or Power Automate cloud flows to your copilot. When you add them you give it a description of what the action can do and then Copilot will use AI to determine when to invoke to action and how to get the inputs the action may require. For the example of creating a new employee I wanted to add a record to my SharePoint list. I started by creating a flow that is triggered by Copilot and has 4 inputs. These inputs will be used as dynamic content within the flow. Now we add a SharePoint Create Item action, configure the site and list, and then fill in the fields with the Dynamic content. And finally, we set the flow to respond with a message back to Copilot to let it know you are done. Perfect, the flow is ready. Now you add it as an action to your Copilot. As part of adding it you will then tell it how to get the information for each of the inputs. The default, let Copilot figure it out and prompt the user as needed, works great. If you need more, there is extensive customization options available. Same deal with output. You can configure a message saying “Success” or let AI generate the appropriate response or just not respond with anything if it isn’t necessary. Now that you have configured the action the chatbot will call it as necessary. Here you can see I asked it to create an employee and since I provided no other context Copilot asked for the inputs. If you are enjoying this, then be sure to check out our training classes for both Copilot and Power Platform . We have both on-demand and live classes available to help you learn. But, if I ask it to create a new employee and provide all of the context it needs, then it will just do the action. I think the coolest part of that is it understood that Buddy Young was the full name, and it broke it into First name and Last name properly when it created the record in SharePoint. 😲 Remember, I didn’t write any logic or explain to copilot this was what to do. It understood the context and did it itself. This is the power of generative AI at its finest for me. Conclusion Using Copilot Studio to build a copilot or chatbot from existing content today is a powerful first step into bringing AI to your business. And the flexibility of generative AI, topics, and actions allows you to build so much more than we could before. Even if you are thinking “I am not ready to do this yet” I encourage you to dig into Copilot Studio. I think it will play a big role in our AI futures and those of us who have already embraced low code tools like Power Platform are primed to lead that charge. If you need help with this or anything else Copilot or Power Platform related let us know. Just scroll down and fill out the contact us form below. We have free help, quick help, dedicated resources, or traditional project services, all designed to help you be more awesome!
- Event Judging App
This week we are having the PowerApps911 annual get together. Our team is made up of people from all over and we all come together once a year for some good ole fashioned fun. One of the team building things we do is build a solution as a small team. This year, the challenge is to build something that makes the company better. Could be something we sell or something that improves an internal process. Me and a few others are responsible for judging these solutions and grading them across a range of criteria. And to keep it fair, we want each judge to score the event on their own by assigning points to the different criteria. And of course, we want things to be as flexible as possible so we can use it with different criteria or judges all while not having to rework the app. If this sounds interesting to you then follow along and I will give you a closer look. Or if you want to see then there is a full video walkthrough of this app here . In the video, I dive deep into each feature and functionality, showing you how to set it up step-by-step. Key Features of the Event Scoring App Below you will find a list of the various screens and some of their functions. Security The app is configured so only the Event Organizer, and the Judges have access. The Event Organizer has full access to all functionality while the Judges can only see the Score screen, they cannot see what other judges have scored the event nor can they see a team's total, just the scores they entered. Judges Setup The app allows you to configure judges using Azure AD Security Groups. This simplifies the process of granting access to judges, making it easy to manage permissions. By adding someone to the group, they automatically get access to the app. Scoring Criteria Configuration Setting up scoring criteria is a breeze with this app. You can define the criteria and their descriptions, as well as the maximum points available for each category. This ensures that all judges have a clear understanding of the scoring metrics. Team Management The app lets you manage teams by listing all team members and adding any relevant comments. This is particularly useful for keeping track of who is on which team, especially during large events. Both the Criteria and Teams screen are just simple Galleries and Forms, easy data = easy screen. Scoring This screen is kind of complicated to build so it is easy to use for the users. I had to go through a few testing passes with Nicola to get it to her liking. 😻 You start by choosing a team and click Start. This loads the criteria, and any past scores you entered into a collection. This part had to be very dynamic, if someone adds a new criteria everything must work, no hard coding. We do this with collections and a gallery to make an editable grid. All fields automatically update using OnChange so no saving required. There is also validation to make sure you don't award too many points. Once you are done scoring a team you hit Submit and it is pushed back to the data source, which is Dataverse for this app. Lots of little details shown in the video, this screen took the most time to build for me. Results Reporting Now we need to know who won. This screen is made up of a Chart control and then and HTML control. Making the HTML table in the bottom right also dynamic was very tricky, required nested Concat functions and a lot of elbow grease. 😎 In no shock to anyone who has been to the site before, the dogs won by a lot! Mobile Version Because I am a judge, and I want to score from my phone, I built a simple one screen app for scoring only. I built it in less than 10 minutes but literally copying and pasting from the desktop scoring screen and then just resizing. 🤩 Not beautiful but super easy! Get the App You can download this app and start using it for your own events. Just head over to our YouTube library and sign up to get access to the solution package. It includes all the necessary tables, security roles, and both versions of the app. Need Help? If you need any assistance with this app or any other Power Apps project, PowerApps911 is here to help. Just scroll down to the contact form on our website and get in touch. Whether it's training, consulting, or mentoring, our team is ready to support you.
- Pre-Built Power Apps offer budget-friendly solutions to complex problems
The challenge so many organizations face is that out-of-the box programs simply don’t meet their unique needs. Yet the cost and time build solutions from scratch is often prohibitive. So is there a middle-of-the-road option where a company can benefit from customization without the from-scratch price tag? Pre-built PowerApps customized for your organization Pre-built PowerApps developed by PowerApps911 offer the best of both worlds, where an organization can benefit from the economies of scale offered by purchasing a pre-built solution while enjoying the benefits of customization. A perfect example is our newly redesigned Bookings App which we’ve just released for deployment to YOUR Power Platform environment! It builds on the solid foundation of the original version released in 2023, with an updated user interface that is both familiar and innovative, providing time grid and list views that let users quickly visualize availability while also being able to filter resources based on location, amenities, capacity, and more. Our goal in creating this resource was to make it heavily customizable for both large and small organizations. You can adjust work hours; set up multiple locations, each with as many spaces as needed; assign amenities; and more! A photo gallery of each space can help users identify and confirm that the space they’re booking meets their needs. One of the great benefits of Power Apps is the ability to create custom solutions that are on brand, and we were sure to include that functionality even in a pre-built solution like our Bookings App. From the title of the app itself to your logo and color scheme, all are customizable so that your users enjoy the experience of a fully-customized solution while the organization benefits from a budget-friendly solution that’s available for immediate deployment. PowerApps911 offers several pre-built solutions like this one, such as our newly-released Expense Reporting solution that allows management of expense reports and receipts while providing customization options for approval thresholds and spending categories. Integrated Power Automate flows email those in the approval pipeline and various options for storage are available, including SharePoint (no premium licenses required) as well as Azure Blob Storage and SQL Server. You can learn more about these pre-built solutions, as well as our other products by contacting our sales team here or learn more about the Booking App in particular here .
.png)
.png)
.png)
.png)











