Federal IT Service Request Tracker
Build a model-driven Power App with Dataverse, business process flows, and security roles.
Introduction
30 Second Summary
Every time a government employee's laptop breaks or they need access to new software, someone has to track that request from start to finish. Behind the scenes, federal agencies rely on custom-built case management apps to make sure nothing falls through the cracks.
In this project, you will build a model-driven IT Service Request Tracker using Microsoft Power Apps and Dataverse. You'll create the data model, design the app interface, automate the workflow with a business process flow, and lock it down with security roles.
What You'll Build
A government-style IT Service Request Management system where agency staff submit help desk tickets that are triaged by priority, assigned to technicians, and tracked through resolution using a model-driven app.
By the end of this project, you'll have:
- A Dataverse data model with custom tables, relationships, choices, calculated columns, and a rollup column.
- A model-driven app with custom forms, views, charts, and a system dashboard that case workers use to manage requests.
- A business process flow with stage-gating that guides case workers through Triage, Assignment, Resolution, and Closure.
- Custom security roles and field-level security, plus the entire solution exported as a managed package for deployment.
- Secret Mission: Customize the command bar with an Escalate button and add branching logic to the business process flow.
Are there any prerequisites?
You need a Power Apps Developer Plan environment with a Dataverse database already set up. The Developer Plan is free and gives you a full development environment with no time limit.
If you don't have one yet, sign up at the Power Apps Developer Plan page using a work or school email backed by Microsoft Entra ID. All work in this project happens in the browser at make.powerapps.com.
Set Up Your Solution and Data Model
Federal agencies track thousands of IT service requests every day. Equipment failures, software installations, network issues. Each request needs structured data so case workers can triage, assign, and resolve it efficiently.
In this step, you'll create the foundation for your tracker. You'll set up a solution (the container that packages everything for deployment) and build the data model with two related Dataverse tables.
In this step, get ready to:
- Create a solution to organize your app components for deployment.
- Build a Service Request table with custom columns for tracking help desk tickets.
- Create a Service Category table and link it to Service Requests.
Create a new solution in Power Apps
A solution in Power Apps is a container that holds all your app components (tables, apps, flows, security roles) together. Solutions are how federal contractors package and deploy apps between environments.
- In Power Apps, select Solutions in the left navigation.
- If you don't see Solutions in the side panel, select ...More and then select Solutions.
- Select New solution on the command bar.
- Enter Federal IT Service Tracker in the Display name field.
- Under Publisher, select New publisher.
- Enter Contoso Federal as the Display name.
- Enter cfs as the Prefix.
- Select Save to save the new publisher.
- Back on the new solution form, confirm Contoso Federal is selected as the publisher.
- Set Version to 1.0.0.0.
- Select Create.
Why create a custom publisher?
The publisher sets a customization prefix (like cfs_) that gets prepended to every table and column you create. This prevents naming collisions when your solution is deployed alongside other solutions in the same environment.
In federal contracting, teams use publishers to identify which vendor created which components. It is an ALM best practice.
Your new solution opens automatically. You should see an empty solution with the name Federal IT Service Tracker at the top.
Don't see the solution?
Make sure you selected your Developer environment from the environment picker in the top-right corner of Power Apps. Solutions only appear in the environment where you created them.
help me find my solution in Power Apps
Create the Service Request table inside the solution
The Service Request table is the core of your tracker. Each row represents one help desk ticket with all the data a case worker needs to triage and resolve it.
- Inside the Federal IT Service Tracker solution, select New on the command bar.
- Select Table, then select Set advanced properties.
- Enter Service Request in the Display name field.
- Confirm the Plural name auto-fills to Service Requests.
- Under Record ownership, select User or Team.
- Enable Attachments by checking the box (this allows file uploads on records).
- Change the Primary column display name to Request Title.
- Select Save.
What is record ownership?
Setting ownership to User or Team means each service request record can be assigned to a specific person or team. This enables row-level security later, so agents only see their own assigned tickets.
Organization-owned tables give everyone the same access to all rows, which would not work for a multi-team help desk.
Now you'll add the columns that capture the details of each service request. Each column defines one piece of data the form collects.
- With the Service Request table open, select the Columns area.
- Select New column on the command bar.
- Enter Description for the Display name.
- Set Data type to Multiple lines of text.
- Set Column requirement to Business Required.
- Select Save.
What does Business Required mean?
A Business Required column must have a value before the record can be saved. This ensures case workers always provide a description of the problem when submitting a request.
Repeat the same process to add the remaining 8 columns. For each one, select New column, configure the settings below, and select Save.
- Priority column:
- Status column:
- Category column:
- Date Submitted column:
- Target Resolution Date column:
- Resolution Notes column:
- Estimated Cost column:
- Assigned To column:
After saving all 9 columns, select Save table to commit all changes.
Save after each column
Selecting Save after each column creation ensures your work is not lost if something goes wrong. You can also select Save table at the end to commit everything at once, but saving incrementally is safer.
Don't see the Choice data type?
Make sure you are selecting New column from the Columns area of the table, not from a form editor. The Data type dropdown should show Choice as one of the options.
help me add a choice column to my Dataverse table
Create the Service Category table and a relationship
A separate Service Category table lets you manage categories independently from requests. This is a data modeling best practice. Instead of hardcoding categories as a choice column, a related table allows you to add, rename, or retire categories without modifying the Service Request table.
- Return to the Federal IT Service Tracker solution by selecting its name in the breadcrumb navigation at the top.
- Select New on the command bar.
- Select Table, then select Set advanced properties.
- Enter Service Category in the Display name field.
- Change the Primary column display name to Category Name.
- Select Save.
Now add a Description column to the Service Category table.
- With the Service Category table open, select the Columns area.
- Select New column.
- Enter Description for the Display name.
- Set Data type to Single line of text.
- Select Save.
Next, create a many-to-one relationship from Service Request to Service Category. This adds a lookup column on Service Request so each request can reference its category.
- Return to the Federal IT Service Tracker solution and open the Service Request table.
- Select the Relationships area in the Schema pane.
- Select New relationship, then select Many-to-one.
- In the right pane, set the Related (One) table to Service Category.
- Select Done.
- Select Save table.
What is a many-to-one relationship?
A many-to-one relationship means many Service Request rows can reference a single Service Category row. This creates a lookup column on the Service Request table that lets case workers pick a category when filling out a request.
The lookup column acts as a foreign key, linking rows across tables. This is the most common relationship type in Dataverse.
Finally, add sample data to the Service Category table so you have categories to choose from later.
- Return to the Federal IT Service Tracker solution and open the Service Category table.
- Select the Table columns and data area to view the data grid.
- Select New row and enter Hardware Request in the Category Name column.
- Add a second row: Software Installation.
- Add a third row: Network Issue.
- Add a fourth row: Access Provisioning.
- Add a fifth row: General Inquiry.
You should now see 5 rows in the Service Category data grid, each with a unique category name.
Can't add rows to the table?
Make sure you have saved the table first. Columns are not created until you save. If the data grid does not show your columns, select Save table and refresh the page.
help me add sample data to my Dataverse table
Your data model is in place. Next up, you'll add calculated and rollup columns to automate data, then build the model-driven app that brings everything to life.
Add Calculated and Rollup Columns, Then Build the App
Your solution now has a solid data model with Service Request and Service Category tables, relationships, and sample data ready to go.
In this step, you'll add two special column types that automatically compute values from your data. Then you'll create the model-driven app that brings your tables to life as a usable interface.
In this step, get ready to:
- Add a calculated column that tracks how long each service request has been open.
- Add a rollup column that counts how many requests belong to each category.
- Create and publish the IT Service Desk model-driven app.
Add a calculated column for SLA status
Service requests need a way to show how long they have been sitting open. Instead of manually counting days, you can define a calculated column that Dataverse recomputes automatically every time someone views the record.
- In your Federal IT Service Tracker solution, open the Service Request table.
- Select the Columns area, then select New column on the command bar.
- Set Display name to Days Open.
- Set Data type to Whole Number.
- In the Behavior dropdown, select Calculated.
- Select the Save and edit link that appears below the dropdown.
- In the Columns list, open the Days Open column you just saved.
- On the Edit column pane, under the Behavior dropdown, select Edit to open the calculated column definition editor.
- In the ACTION section, select Add action.
- Enter the formula DIFFINDAYS(Date Submitted, Now()) to compute the number of days between submission and today.
- Select the check mark to confirm the action.
- Select Save and Close in the editor.
What is a calculated column?
A calculated column computes its value automatically using a formula you define. The value updates each time the record is retrieved, so you never need to maintain it manually.
The DIFFINDAYS function returns the whole number of days between two date values. By comparing Date Submitted to Now(), you get a live count of how many days the request has been open.
Don't see the Behavior dropdown?
Make sure you selected Whole Number as the data type first. The Behavior dropdown only appears for data types that support calculations (Whole Number, Currency, Date Time, Decimal Number, and others).
If you still don't see it, confirm you are editing the column inside the solution (not from the global Tables area).
Ask for help: Why can't I see the Calculated option in the Behavior dropdown for my Days Open column?
Add a rollup column to Service Category
A rollup column aggregates data from related records. You'll add one to the Service Category table that automatically counts how many Service Requests belong to each category.
- Return to your Federal IT Service Tracker solution and open the Service Category table.
- Select the Columns area, then select New column on the command bar.
- Set Display name to Total Requests.
- Set Data type to Whole Number.
- In the Behavior dropdown, select Rollup.
- Select the Save and edit link that appears below the dropdown.
- Open the saved Total Requests column from the Columns list.
- Under Behavior, select Edit to open the rollup column definition editor.
- In the Related table section, select the Service Requests table (the related table you are aggregating over).
- In the Aggregation section, select COUNT as the aggregate function.
- Select the check mark to confirm, then select Save and Close.
What is a rollup column?
A rollup column aggregates data from related records using functions like COUNT, SUM, MIN, MAX, or AVG. Unlike a calculated column that updates on every read, rollup values are recalculated by a scheduled system job (typically every hour).
Your Total Requests column counts how many Service Request records point to each Service Category. This gives managers an at-a-glance view of where demand is concentrated.
Rollup values may not appear immediately
Dataverse schedules a background job to calculate rollup values. You can trigger an immediate recalculation on any record by selecting the refresh icon next to the rollup field value in the app.
Create the model-driven app
With your data model complete, it's time to surface it in an app. A model-driven app generates its UI directly from the table structure, so changes to your columns and relationships are reflected automatically.
- Return to the Federal IT Service Tracker solution.
- Select New, then App, then Model-driven app.
- In the Name field, enter IT Service Desk.
- Select Create. The modern app designer opens.
- Select Add page on the command bar.
- Choose Dataverse table, select Service Request, then select Add.
- Select Add page again to add a second page.
- Choose Dataverse table, select Service Category, then select Add.
- Select Save on the command bar.
- Select Publish to make the app available.
What is a model-driven app?
A model-driven app builds its forms, views, and navigation automatically from your Dataverse table structure. You define the data model once, and the app adapts the UI to match.
This is the pattern federal agencies use for internal tools like case management systems and help desk trackers because the data model drives consistent behavior across all users.
- Select Play (the play button in the top-right of the app designer) to open the app in a new tab.
- Navigate to Service Requests in the left navigation.
- Open an existing Service Request record (or create a new one) and confirm that the Days Open column displays a number.
You should see both the Service Request and Service Category tables accessible from the left navigation. The Days Open calculated column auto-populates with the number of days since submission.
Days Open shows blank or zero?
Make sure the Date Submitted column has a value on the record you are viewing. The DIFFINDAYS formula requires both dates to be populated.
If the column doesn't appear at all, confirm you saved and closed the calculated column editor, then republished the app.
Ask for help: My Days Open calculated column is not showing a value in the model-driven app. How do I fix this?
Your data model is now complete with intelligent columns that compute values automatically. Next up, you'll customize the forms, views, charts, and dashboard to make the app truly usable for case workers.
Customize Forms, Views, Charts, and Dashboard
Your IT Service Desk app is live with both tables and a calculated column that tracks how long each request has been open. The data model is solid, but the user experience needs work.
Right now, the app uses a default form that dumps every field into a single flat list. Case workers have no way to focus on just the high-priority requests or see trends at a glance. In this step, you'll organize the form into logical tabs, build filtered views for different scenarios, and create a dashboard that surfaces the most important data first.
In this step, get ready to:
- Customize the Service Request main form with tabbed sections.
- Create three filtered views for different work scenarios.
- Build charts and a system dashboard for at-a-glance insights.
Customize the Service Request main form
A well-organized form helps case workers find the right fields quickly without scrolling through a wall of inputs. You'll group the columns into three logical tabs using the modern form designer.
What are form tabs and sections?
In Dataverse forms, tabs are the top-level groupings that appear as horizontal headings across the form. Sections live inside tabs and provide a secondary layer of organization. Each section can hold one or more columns.
- In your Federal IT Service Tracker solution, select the Service Request table.
- Select the Forms area.
- Open the Main form (named Information by default) to launch the modern form designer.
The form designer loads with all your columns in a single tab. You'll restructure it into three tabs.
- Rename the existing tab to General by selecting the tab header and updating the Label in the right-hand Properties pane.
- In the General tab, keep only these columns: Request Title, Description, Priority, Status, Category, and Assigned To.
- Add a section header for this grouping by selecting the section and entering a label like Request Details in the Properties pane.
- Select + Add tab from the Components pane on the left.
- Name this second tab Dates and SLA.
- Drag the Date Submitted, Target Resolution Date, and Days Open columns into this tab.
- Add a section header Timeline for this grouping.
- Add a third tab and name it Resolution.
- Drag the Resolution Notes and Estimated Cost columns into this tab.
- Add a section header Outcome for this grouping.
- Select Save and publish on the command bar.
Why organize into tabs?
Federal IT case workers handle dozens of tickets per day. Tabs keep the most-used fields (General) front and center, while SLA tracking and resolution details are one click away rather than buried in a long scroll.
Don't see your new tabs?
Make sure you selected Save and publish (not just Save). Unpublished changes won't appear in the running app. Also confirm you edited the Main form, not a Quick Create or Quick View form.
Help me troubleshoot my form tabs not showing up.
Create custom views
Views control which records appear in the grid when someone opens the Service Request table. You'll create three views that filter requests by different criteria so case workers can jump straight to what matters.
- Return to the Service Request table in your solution.
- Select the Views area.
- Select New view on the command bar.
- Enter the name Active Service Requests and select Create.
- In the view designer, select Edit filters in the right-hand properties pane.
- In the expression builder, select Add > Add row.
- Set the condition: Status Does not equal Closed.
- Select OK, then Save and publish.
Now create the second view.
- Select New view again and name it High Priority Open Requests.
- Open Edit filters in the expression builder.
- Add a group: select Add > Add group.
- Change the group operator to Or.
- Add the first row inside the group: Priority Equals Critical.
- Add a second row inside the group: Priority Equals High.
- Outside the group, add another row: Status Does not equal Closed.
- Add one more row: Status Does not equal Resolved.
- Select OK, then Save and publish.
How does this filter logic work?
The Or group means the request must have Priority = Critical OR Priority = High. The two Status conditions (combined with And, which is the default) exclude closed and resolved tickets. Together, the filter shows only urgent open work.
Finally, create the third view.
- Select New view and name it My Assigned Requests.
- Open Edit filters.
- Add a row: Assigned To Equals current user.
- Select OK, then Save and publish.
The current user filter
The "Equals current user" operator dynamically resolves to whoever is signed in. Each case worker sees only their own assigned tickets without needing a separate view per person.
Create charts and a dashboard
Charts turn raw data into visual patterns. A dashboard combines multiple charts and a record list onto a single page so managers can assess workload at a glance.
- Return to the Service Request table in your solution.
- Select Charts under Data experiences.
- Select New chart on the command bar.
- Name the chart Requests by Priority.
- In the chart designer, set the Column dropdown to Priority.
- Set the Aggregate to Count: All.
- Set the Chart type to Pie.
- Select Save, then close the chart designer.
Now create the second chart.
- Select New chart again.
- Name the chart Requests by Status.
- Set the Column dropdown to Status.
- Set the Aggregate to Count: All.
- Set the Chart type to Bar.
- Select Save, then close the chart designer.
With both charts ready, create the system dashboard.
- Return to your Federal IT Service Tracker solution.
- On the toolbar, select New, then Dashboard, then choose 2-column overview.
- Enter the dashboard name: Service Desk Overview.
- In the top-left tile, select the chart icon.
- In the Add Component dialog, set Record Type to Service Request, View to Active Service Requests, and Chart to Requests by Priority.
- Select Add.
- In the top-right tile, select the chart icon and add the Requests by Status chart with the same Record Type and View.
- In the bottom section, select the list icon.
- Set Record Type to Service Request and View to Active Service Requests, then select Add.
- Select Save, then Close.
- On the solution toolbar, select Publish.
What is a system dashboard?
A system dashboard is visible to all app users once published. It combines charts and record lists into one page, giving managers an overview of workload and trends without opening individual records.
Now set this dashboard as the default landing page in the app.
- In your solution, locate the IT Service Desk app and select Edit to open the app designer.
- Select Add page on the command bar, choose Dashboard, then select the Service Desk Overview dashboard and select Add.
- Drag the Service Desk Overview page to the top of the left navigation so it appears first when users open the app.
- Select Save, then Publish.
Dashboard not showing when you play the app?
Make sure you added the dashboard as a page in the app designer (not just created it in the solution). Confirm it's positioned at the top of the navigation pane and that you published after making changes.
Help me get my dashboard to appear as the default page.
Verify everything is working by playing the app.
- Select Play on the app designer command bar.
- Confirm the Service Desk Overview dashboard loads by default with both charts visible.
- Navigate to Service Requests in the left navigation.
- Use the view selector dropdown to switch between your custom views: Active Service Requests, High Priority Open Requests, and My Assigned Requests.
- Open any Service Request record and confirm the tabbed form layout appears with General, Dates and SLA, and Resolution tabs.
Your app now has a professional UI with organized forms, targeted views, and a summary dashboard. Next up, you'll add a business process flow that guides case workers through the full lifecycle of a service request from triage to closure.
Build the Business Process Flow and Business Rule
Your app looks great with custom forms, views, and a dashboard. But right now, nothing stops a case worker from jumping straight to closing a request without triaging it first.
In this step, you will build a business process flow that enforces a structured lifecycle for every service request. You will also add a business rule that automatically requires resolution notes before a request can be marked as resolved.
In this step, get ready to:
- Create and activate a 4-stage business process flow with stage-gating.
- Create and activate a business rule that enforces conditional field requirements.
- Test both features by creating a new Service Request record.
Create a business process flow
A business process flow adds a visual stage bar to the top of every record. It guides case workers through a defined sequence of stages and prevents them from skipping required data entry at each stage.
- Return to the Federal IT Service Tracker solution in Power Apps.
- Select New on the command bar.
- Select Automation.
- Select Process.
- Select Business process flow.
- Enter Service Request Lifecycle in the Display name field.
- In the Table dropdown, select Service Request.
- Select Create.
The BPF designer opens with a single default stage. You will now configure 4 stages.
What is a business process flow?
A business process flow ensures that people enter data consistently and follow the same steps every time they work in an app. It appears as a horizontal bar at the top of a record, showing the current stage and what comes next.
In federal IT environments, this pattern enforces compliance. Case workers cannot skip steps or close requests prematurely.
- Select the default stage in the designer.
- In the Properties tab on the right, set Display Name to Triage.
- Select Details in the lower-right corner of the Triage stage to expand the steps area.
- Drag a Step component from the Components tab into the Triage stage.
- In the Properties tab, set Data Field to Priority and check Required.
- Drag a second Step into the Triage stage.
- Set Data Field to Category and check Required.
What is stage-gating?
Marking a step as Required means users cannot advance to the next stage without filling in that column. This is called stage-gating.
If any stage has required columns, users must fill in those columns before they can move to the next stage or save the form.
- Select the + sign after the Triage stage to add a new stage.
- Set Display Name to Assignment.
- Expand the stage details and drag a Step component into the Assignment stage.
- Set Data Field to Assigned To and check Required.
- Add a third stage after Assignment. Set Display Name to Resolution.
- Add a Step to the Resolution stage. Set Data Field to Resolution Notes and check Required.
- Add a fourth stage after Resolution. Set Display Name to Closure.
- Add a Step to the Closure stage. Set Data Field to Status and check Required.
- Select Validate on the action bar to check for errors.
- Select Save.
- Select Activate on the action bar to publish the flow for your team.
- Confirm activation when prompted.
Can't find the Service Request table in the Table dropdown?
Your custom table may need the business process flow option enabled. Open the Service Request table definition, look for the Business process flows (fields will be created) checkbox, and make sure it is selected. This action cannot be undone.
If you still have trouble, ask for help with enabling business process flows on your custom table.
Create a business rule
The business process flow handles the lifecycle stages. Now you need a separate rule that enforces data quality at the field level. When a case worker sets a request's status to Resolved, they must provide resolution notes explaining how the issue was fixed.
- In the solution, open the Service Request table.
- Select Business rules in the table's navigation.
- Select New business rule.
The business rule designer opens with a single condition already created for you.
- Set the rule name to Require Resolution Notes When Resolved in the header area at the top.
- Set Scope to Table (this applies the rule to all forms and server-side).
- Select the Condition component in the designer.
- In the Properties tab on the right, set Field to Status.
- Set Operator to Equals.
- Set Value to Resolved.
- Select Apply.
- From the Components tab, drag a Set Business Required action to the + sign next to the check mark (the true path).
- In the action's Properties, set Field to Resolution Notes.
- Set Status to Business Required.
- Select Apply.
- Select Validate on the action bar.
- Select Save.
- Select Activate.
- Confirm activation when prompted.
Why set scope to Table?
Setting scope to Table means the rule applies to all forms and runs server-side. This ensures the rule works in both model-driven apps and canvas apps, and cannot be bypassed by submitting data through a different interface.
If you set scope to a specific form, the rule only runs when that particular form is used.
Test the business process flow and business rule
Both the business process flow and business rule are now active. Time to verify they work together on a real record.
- Select Play on the IT Service Desk app (from the solution's app list or the Apps area).
- Navigate to Service Requests and select + New to create a new record.
- Enter a Request Title (e.g. Test BPF Request).
You should see the process bar at the top of the record with 4 stages: Triage, Assignment, Resolution, and Closure.
- Try to advance past the Triage stage by selecting Next Stage without filling in Priority or Category.
- Confirm that the stage-gating blocks you from advancing.
- Fill in Priority and Category, then advance to the Assignment stage.
- Set the Status field to Resolved and try to save the record without entering Resolution Notes.
- Confirm that the business rule prevents the save. A red asterisk should appear next to Resolution Notes, indicating it is now required.
What should I see?
The process bar displays 4 stages across the top of the Service Request form. Selecting a stage expands it to show the required fields. When you try to advance without completing required fields, a message blocks progression.
When you set Status to Resolved, the Resolution Notes column immediately shows a red asterisk and the record cannot be saved until you fill it in.
Business process flow not appearing on new records?
Make sure the flow is activated (not just saved). Return to the solution, open the flow, and check that the status shows Active.
Also verify that you are using the IT Service Desk model-driven app. Business process flows only appear in model-driven apps, not in canvas apps.
If the process bar still does not appear, help me troubleshoot why my business process flow is not showing on Service Request records.
Your app now enforces a structured lifecycle for every service request. Next up, you will lock down who can see and do what by configuring security roles and exporting your solution as a managed package.
Configure Security and Export as Managed Solution
Your app now has a working data model, polished forms, and a business process flow guiding case workers through the service request lifecycle.
The final piece is access control. In a federal environment, not everyone should see the same data or perform the same actions. You need to define who can read all requests versus only their own, and who can see sensitive cost data. Once the security model is in place, you will package the entire solution for deployment to another environment.
In this step, get ready to:
- Create custom security roles with different access levels.
- Configure field-level security on a sensitive column.
- Export the solution as a managed package for deployment.
Create custom security roles
Security roles in Dataverse control which tables a user can access and what actions they can perform. Each privilege (Create, Read, Write, Delete, Append, Append To, Assign, Share) can be scoped to different access levels.
You will create two roles that reflect a common federal pattern: an Agent who can see all requests across the organization, and a Requester who can only see their own.
- Return to your Federal IT Service Tracker solution in Power Apps.
- Select New on the command bar.
- Select Security, then Security role.
- Enter Service Desk Agent as the role name.
- Select Save to create the role and open the permissions editor.
You should now see a permissions screen listing all tables in your environment.
- Search for your Service Request table using the search field.
- Select the Service Request row to display the permission dropdowns.
- Set Create to Organization.
- Set Read to Organization.
- Set Write to Organization.
- Set Append to Organization.
- Set Append To to Organization.
- Search for the Service Category table.
- Set Read to Organization for Service Category.
- Select Save and close on the command bar.
What is Organization-level access?
Organization-level means the user can see records owned by anyone in the entire organization. User-level (which you will use for the Requester role next) limits visibility to only records the user owns.
This distinction is critical for federal apps where managers need full visibility but individual requesters should only see their own tickets.
Now create the second role for regular requesters.
- In the solution, select New on the command bar again.
- Select Security, then Security role.
- Enter Service Requester as the role name.
- Select Save.
- Search for the Service Request table.
- Set Create to User.
- Set Read to User.
- Set Write to User.
- Set Append to User.
- Set Append To to User.
- Search for the Service Category table.
- Set Read to Organization for Service Category.
- Select Save and close.
Why User-level for Requesters?
A Requester with User-level Read can only see Service Request records they personally own. They cannot browse other people's tickets.
Both roles still get Organization-level Read on Service Category because categories are shared reference data that everyone needs to see when filling out the request form.
You should now see both security roles listed as components inside your solution.
Configure field-level security
Security roles control access at the table level. Field-level security goes one layer deeper, restricting access to individual columns within a table. This is useful for sensitive data like cost estimates that only certain users should see.
- In the solution, expand Tables and select the Service Request table.
- Under Schema, select Columns.
- Select the Estimated Cost column to open its properties.
- Expand Advanced options.
- Under General, select the Enable column security checkbox.
- Select Save.
What happens when column security is enabled?
Once column security is enabled, only users with the System Administrator role can access the column by default. All other users will see masked values instead of the actual data until you grant them access through a field security profile.
Now create a field security profile to grant the Agent role access to this column.
- Open the Power Platform admin center in a new browser tab.
- Select Environments in the left navigation, then select your developer environment.
- Select Settings on the command bar.
- Expand Users + permissions and select Column security profiles.
- Select New Profile.
- Enter Cost Viewers as the profile name.
- Enter a description such as Grants Read access to the Estimated Cost column.
- Select Save.
- Select the Column Permissions tab.
- Find and select the Estimated Cost column, then select Edit.
- Set Read to Allowed.
- Select Save.
Why is field-level security separate from security roles?
Security roles control which rows a user can see (table-level access). Field-level security controls which columns within those rows are visible. The two layers work together.
In this case, both Agents and Requesters can see Service Request rows. But only Agents (via the Cost Viewers profile) can see the Estimated Cost column. Requesters will see masked values in that field.
Assign the profile to Agent users
In a production environment, you would add users or teams to the Cost Viewers profile using the Users or Teams tab. In your developer environment with a single user, the System Administrator role already bypasses column security. The configuration itself is what matters for the PL-200 exam.
Export the solution as managed
Application Lifecycle Management (ALM) in Power Platform revolves around solutions. Exporting your solution as a managed package creates a locked, deployable artifact that can be imported into a production environment.
Federal contractors use managed solutions to enforce change control and compliance. The development team works in unmanaged, then exports as managed for each release.
- Return to the Solutions list in Power Apps (select Solutions in the left navigation).
- Select the Federal IT Service Tracker solution row (click the row without opening it).
- Select Export on the command bar.
- In the Before you export pane, select Publish all changes, then select Next.
- In the Export this solution pane, keep the version number as 1.0.0.0.
- Under Export as, select Managed.
- Select Export.
The export takes a few moments. Once complete, a .zip file downloads to your default downloads folder.
What is the difference between managed and unmanaged?
An unmanaged solution is your working copy. You can edit its components freely. A managed solution is a sealed package intended for deployment. Its components cannot be directly edited in the target environment.
Federal contractors use managed solutions to ship changes to production environments under strict change-control policies. The development team works in unmanaged, then exports as managed for each release.
Export button greyed out?
Make sure you selected the solution row (the checkbox or the row background) without opening it. The Export button only appears on the command bar when a solution is selected from the list view.
Also confirm you are not inside a managed solution. You can only export unmanaged solutions.
Why can't I export my solution?
Secret mission
Command Bar Customization and Branching BPF
Your app works, but can you make it smarter? Add an Escalate button to the command bar that instantly elevates a request to Critical priority, then modify the business process flow with branching logic so Critical requests route through a Manager Review stage before assignment.
Clean Up Your Resources
Clean Up Your Resources
Decide whether to keep your resources running, pause them to come back later, or delete them entirely.
This project runs entirely on the Power Apps Developer Plan, so there are no ongoing costs. Your developer environment stays active as long as you use it at least once every 30 days.
Resources you used:
- Federal IT Service Tracker solution in Power Apps (includes all Dataverse tables, the IT Service Desk app, business process flow, business rule, security roles, and field security profile).
- Managed solution .zip file on your local machine.
Keep everything running
No action needed. Choose this if you plan to keep building on this project or want to reference it later.
- Your Power Apps Developer Plan environment stays active indefinitely as long as you sign in at least once every 30 days.
- All solution components (tables, app, BPF, security roles) remain in your environment at no cost.
- The managed .zip file stays wherever you downloaded it.
Pause - I'll come back to this later
There is nothing to pause explicitly. Your environment auto-disables after 30 days of inactivity, but you can re-enable it by signing back in.
- If you stop using the environment for 30 days, Microsoft automatically disables it.
- To reactivate, sign back in to make.powerapps.com and select your developer environment. Your data and solution components are preserved.
- No cost accrues while the environment is disabled or active.
Delete - I don't want to use this again
Remove all project resources and start fresh. This permanently deletes the tables, app, flows, and security configuration you built.
- Sign in to make.powerapps.com and select your developer environment.
- Select Solutions in the left navigation.
- Select the Federal IT Service Tracker solution.
- Select Delete on the command bar. This removes all tables, the model-driven app, business process flow, business rule, security roles, and field security profile from your environment.
- Delete the managed solution .zip file from your local Downloads folder.
What about the developer environment itself?
You do not need to delete the environment. It costs nothing and auto-disables after 30 days of inactivity. If you want a completely clean slate, you can create a new developer environment later from the Power Platform admin center.
Nice Work!
Nice Work!
You just built a production-grade IT Service Request Tracker using Microsoft Dataverse and a model-driven app. This is the exact pattern federal contractors build daily to manage help desk tickets, case intake, and service delivery.
You've learned how to:
- Built a Dataverse data model with 2 custom tables, relationships, choices, a calculated column, and a rollup column, then created a model-driven app with custom forms, views, charts, and a system dashboard.
- Implemented a 4-stage business process flow with stage-gating and a business rule that enforces conditional field requirements at the table level.
- Configured custom security roles with User-level vs. Organization-level access, field-level security on sensitive data, and exported the entire solution as a managed package for federal deployment.
- Secret Mission: Customized the command bar with an Escalate button and added branching logic to the business process flow.
Ready to quiz yourself?