Streamlining your tech stack for maximum efficiency

Learn, explore, and grow with our knowledge hub.

Build a Power Apps Asset Tracking App with QR Codes | Smart Statistics
Power Apps Practical Tutorial

Build a QR-Code Asset Check-Out App in Power Apps: Know Who Has Every Piece of Equipment

Laptops, tools, scanners, tablets, test equipment and other shared assets are frequently handed between employees without a reliable record of who currently has them.

A simple Power Apps solution can replace paper registers and uncontrolled spreadsheets with a mobile process: scan the asset, select the employee, confirm the handover and automatically record the movement in SharePoint.

Scan assets Identify equipment from a QR code.
Track ownership Know who currently holds each item.
Record history Keep every issue and return.
Report later Connect the structured data to Power BI.
Current state + movement history Keep the latest holder on the asset record, while every handover is written to a separate movement log.
Why This Pattern Works

Replace the Spreadsheet Register with a Transaction Process

The important change is not the QR code itself. The value comes from turning every equipment handover into a structured transaction.

Fast Identification

Staff scan the code attached to the physical item instead of searching through a long asset register.

  • QR code
  • Barcode
  • Manual code fallback

Clear Accountability

The current holder is visible directly against the asset instead of being inferred from an old email.

  • Current holder
  • Location
  • Issue date

Full Movement History

Every issue, return and transfer can be stored as a separate transaction for later audit.

  • Check-out history
  • Returns
  • Transfers

Reporting Ready

Structured SharePoint data can later feed Power BI for asset utilisation and exception reporting.

  • Assets currently issued
  • Movement volume
  • Long-outstanding assets
SharePoint Data Structure

Use Two Lists: Current State + History

The Assets list stores the current position of every item. The Asset Movements list records every transaction.

List Field Recommended Type / Purpose
Assets AssetID Single line text. Unique identifier printed inside the QR code, for example LT-0248.
Assets AssetName Single line text, for example Dell Latitude 5450.
Assets Category Choice: Laptop, Tablet, Scanner, Tool, Phone or another business category.
Assets Status Choice: Available, Checked Out, Maintenance, Retired.
Assets CurrentHolder Person column storing the employee who currently holds the asset.
Assets CurrentLocation Single line text or Choice depending on how locations are maintained.
Assets LastMovementDate Date and Time.
Asset Movements AssetID Single line text. Keeping the key directly in the history table simplifies reporting.
Asset Movements MovementType Choice: Check Out, Return, Transfer.
Asset Movements Employee Person column.
Asset Movements MovementDate Date and Time.
Asset Movements Condition Choice: Good, Damaged, Needs Review.
Asset Movements ProcessedBy Person column storing the user who completed the handover transaction.
Design principle: do not overwrite history. Update the current asset record, but also create a new movement transaction every time the asset changes hands.
User Journey

Keep the Mobile Process Extremely Simple

1. Scan

Scan the QR code attached to the equipment.

2. Verify

Show the asset name, status and current holder.

3. Assign

Select the employee and location.

4. Confirm

Update the asset and create the movement record.

5. Complete

Display confirmation and return to scanning.

Step-by-Step Build

Build the App from Start to Finish

01

Create the SharePoint lists

Create the two lists described above: Assets and Asset Movements.

Add several test assets before building the app.

Example:

AssetID: LT-0248
AssetName: Dell Latitude 5450
Category: Laptop
Status: Available
CurrentHolder: blank
CurrentLocation: Leicester Office
02

Create a phone canvas app

Create a new blank phone canvas app and connect:

  • Assets
  • Asset Movements
  • Microsoft 365 Users if you want richer employee search

Build the following screens:

  • scrHome
  • scrScanAsset
  • scrAssetDetails
  • scrCheckOut
  • scrReturn
  • scrHistory
03

Add the Barcode reader control

Insert the Power Apps Barcode reader control on scrScanAsset.

Rename it:

brAsset

The Barcodes output contains the codes detected during the scan. To read the first result:

First(brAsset.Barcodes).Value
The Barcode reader scanning experience is designed for supported mobile devices. Include a text-input fallback for users who cannot scan.
04

Find the scanned asset

Set the Barcode reader control's OnScan property to:

Set(
    varScannedAssetID,
    First(brAsset.Barcodes).Value
);

Set(
    varAsset,
    LookUp(
        Assets,
        AssetID = varScannedAssetID
    )
);

If(
    IsBlank(varAsset),
    Notify(
        "Asset not found.",
        NotificationType.Error
    ),
    Navigate(
        scrAssetDetails,
        ScreenTransition.Fade
    )
)

The first variable stores the QR-code value. The second retrieves the matching SharePoint asset.

05

Add a manual-code fallback

Add a Text input called:

txtAssetID

Add a button with:

Set(
    varScannedAssetID,
    Trim(txtAssetID.Value)
);

Set(
    varAsset,
    LookUp(
        Assets,
        AssetID = varScannedAssetID
    )
);

If(
    IsBlank(varAsset),
    Notify(
        "Asset not found.",
        NotificationType.Error
    ),
    Navigate(
        scrAssetDetails,
        ScreenTransition.Fade
    )
)
A manual option also improves accessibility and gives staff a fallback if the physical QR label becomes damaged.
06

Display the asset details

On scrAssetDetails, show:

  • varAsset.AssetID
  • varAsset.AssetName
  • varAsset.Category.Value
  • varAsset.Status.Value
  • varAsset.CurrentLocation

If CurrentHolder is populated, display the user's DisplayName.

If(
    IsBlank(varAsset.CurrentHolder),
    "Not currently assigned",
    varAsset.CurrentHolder.DisplayName
)
07

Control which action is available

The Check Out button should only be active when the asset is available.

If(
    varAsset.Status.Value = "Available",
    DisplayMode.Edit,
    DisplayMode.Disabled
)

The Return button can use the opposite rule:

If(
    varAsset.Status.Value = "Checked Out",
    DisplayMode.Edit,
    DisplayMode.Disabled
)
08

Build the employee selection

Add a people Combo box called cmbEmployee.

You can populate it from your chosen employee source, for example Microsoft 365 Users or an Employees SharePoint list.

Keep the selection single-user so that one clear holder is assigned to each asset.

09

Update the asset during check-out

Use Patch to update the current asset state.

Patch(
    Assets,
    varAsset,
    {
        Status: {
            Value: "Checked Out"
        },
        CurrentHolder: {
            '@odata.type':
                "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
            Claims:
                "i:0#.f|membership|" &
                Lower(cmbEmployee.Selected.Mail),
            DisplayName:
                cmbEmployee.Selected.DisplayName,
            Email:
                cmbEmployee.Selected.Mail,
            Department: "",
            JobTitle: "",
            Picture: ""
        },
        CurrentLocation:
            txtLocation.Value,
        LastMovementDate:
            Now()
    }
);
Person-column structures can vary depending on the data source and control you use. Test the Patch against your actual SharePoint Person column before deploying.
10

Write the movement history

Immediately after updating the asset, create a new history record.

Patch(
    'Asset Movements',
    Defaults('Asset Movements'),
    {
        Title:
            varAsset.AssetID &
            " - Check Out",
        AssetID:
            varAsset.AssetID,
        MovementType: {
            Value: "Check Out"
        },
        Employee: {
            '@odata.type':
                "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
            Claims:
                "i:0#.f|membership|" &
                Lower(cmbEmployee.Selected.Mail),
            DisplayName:
                cmbEmployee.Selected.DisplayName,
            Email:
                cmbEmployee.Selected.Mail,
            Department: "",
            JobTitle: "",
            Picture: ""
        },
        MovementDate:
            Now(),
        Location:
            txtLocation.Value,
        Condition: {
            Value: ddCondition.Selected.Value
        },
        Notes:
            txtNotes.Value
    }
);

The movement table now retains the transaction even after the asset is later returned.

11

Add success confirmation

After both operations complete:

Notify(
    "Asset checked out successfully.",
    NotificationType.Success
);

Refresh(Assets);
Refresh('Asset Movements');

Navigate(
    scrHome,
    ScreenTransition.Fade
);
12

Build the return process

Returning the asset reverses the current-state values.

Patch(
    Assets,
    varAsset,
    {
        Status: {
            Value: "Available"
        },
        CurrentHolder:
            Blank(),
        CurrentLocation:
            txtReturnLocation.Value,
        LastMovementDate:
            Now()
    }
);

Then create another Asset Movements record with MovementType set to Return.

The current Assets list tells you where the equipment is now. Asset Movements tells you everything that happened previously.
13

Add the asset history gallery

On scrHistory, insert a vertical Gallery and set its Items property to:

SortByColumns(
    Filter(
        'Asset Movements',
        AssetID = varAsset.AssetID
    ),
    "MovementDate",
    SortOrder.Descending
)

Display:

  • MovementType.Value
  • Employee.DisplayName
  • MovementDate
  • Location
  • Condition.Value
  • Notes
14

Add useful validation

Do not allow a check-out if no employee has been selected.

If(
    IsBlank(cmbEmployee.Selected.Mail),
    Notify(
        "Select an employee before continuing.",
        NotificationType.Warning
    ),
    /* Run check-out logic here */
)

Also validate:

  • Asset status
  • Location
  • Required condition field
  • Duplicate submission
15

Create QR labels

Each physical asset needs a QR label containing exactly the same value stored in AssetID.

For example:

LT-0248

Keep the encoded value short and stable. Do not encode volatile information such as the employee name or current status.

The QR code should identify the asset, not carry the entire asset record. Power Apps should retrieve the current information from SharePoint after scanning.
16

Test the mobile experience

Test the finished app on the devices employees will actually use.

Confirm:

  • The QR code scans reliably
  • The correct asset appears
  • Unavailable assets cannot be checked out
  • Person fields save correctly
  • The movement record is created
  • Returns clear the current holder
  • History sorts correctly
Operational Controls

Keep the Asset Register Reliable

The app becomes operationally valuable only when users trust the asset status and history.

Named Asset Owner

Assign responsibility for maintaining the master asset records and retiring old equipment.

Controlled Editing

Most users should transact through the app rather than directly editing SharePoint records.

Complete History

Do not delete ordinary movement records simply because an asset has changed hands again.

Review Exceptions

Use Power BI later to surface assets checked out unusually long or equipment repeatedly marked damaged.

Frequently Asked Questions

Power Apps Asset Tracking FAQs

Can Power Apps scan QR codes?
Yes. The Barcode reader control can read QR codes and several supported barcode formats on compatible mobile devices.
Will the scanner work in a desktop browser?
The current Barcode reader control is designed for supported mobile device experiences rather than desktop browser scanning. Provide a manual asset-code field as a fallback.
Can SharePoint handle this type of application?
For relatively lightweight operational tracking, SharePoint Lists can provide a practical backend, particularly when organisations want to remain on standard Microsoft 365 connectors.
Why use a separate Asset Movements list?
The main Assets list should represent the current asset position. A separate movement list preserves every transaction so history is not lost when the current record changes.
Can the app track damaged equipment?
Yes. Add a condition field during check-out and return, and optionally introduce a Maintenance status or separate maintenance workflow.
Can we add photographs?
Yes. Depending on the solution design, images or attachments can be added so users can record asset condition or damage evidence.
Can Power BI report on the asset data?
Yes. The Assets and Asset Movements lists create a strong reporting structure for current asset status, movement trends, utilisation and outstanding assets.
How can Smart Statistics help?
Smart Statistics can design Power Apps, SharePoint, Power Automate and Power BI solutions that replace manual tracking processes with structured, auditable business applications.
Microsoft Technical Note

Test Scanning on the Target Devices

Microsoft documents the Power Apps Barcode reader as supporting QR codes and other barcode types on Android, iOS and Windows devices. The scanning control is not supported in the normal desktop browser experience, so mobile testing should be part of deployment.

Microsoft also recommends providing a visible scan result and an alternative manual input method for accessibility.

Review the current Microsoft Learn documentation →

Still Tracking Equipment in Spreadsheets, Emails or Paper Registers?

Smart Statistics helps UK businesses replace manual operational processes with practical Microsoft 365 applications built around Power Apps, SharePoint, Power Automate and Power BI.

We can help design the data structure, build the app, automate notifications and turn the resulting data into management reporting.