PowerLens
All posts
Power AppsJanuary 8, 2026· 4 min read

Top 10 Performance Tips for Power Apps Canvas Apps

J

Juan Carlos Santiago

Top 10 Performance Tips for Power Apps Canvas Apps

Introduction

Performance issues in Power Apps canvas apps can frustrate users and damage adoption rates. After working with dozens of organizations, I've identified the most impactful optimization techniques that consistently deliver results. This guide shares practical, actionable tips you can implement today.

1. Reduce OnStart Logic

The OnStart event runs every time your app launches, blocking user interaction. Many developers cram too much logic here.

Before:

OnStart = ClearCollect(
  colCustomers,
  Filter(
    Customers,
    Status = "Active",
    Region = User().Region,
    Department = "Sales"
  );
  ClearCollect(
    colOrders,
    Filter(Orders, DateValue(Date) > Today()-30)
  );
  Set(varUserRole, LookUp(Users, Email = User().Email, Role))

After:

OnStart = Set(
  varUserEmail,
  User().Email
);

// Load data on-demand when screens become visible
Screen1.OnVisible = ClearCollect(
  colCustomers,
  Filter(
    Customers,
    Status = "Active",
    Region = User().Region
  )
)

Delay non-critical data loading until needed. Your app launches 60-80% faster.

2. Use the Concurrent Function

Instead of loading data sequentially, load multiple datasets simultaneously.

Before:

OnStart = ClearCollect(colCustomers, Customers);
ClearCollect(colProducts, Products);
ClearCollect(colOrders, Orders)

After:

OnStart = Concurrent(
  ClearCollect(colCustomers, Customers),
  ClearCollect(colProducts, Products),
  ClearCollect(colOrders, Orders)
)

Concurrent reduces initialization time from 3 seconds to under 1 second in real-world scenarios.

3. Minimize Controls Per Screen

Every control consumes memory and processing power. Audit your screens ruthlessly.

Strategy:

  • Delete unused controls (use Find & Replace to check formulas)
  • Replace individual controls with containers
  • Use galleries instead of repeating manual controls
  • Hide controls with Visible property rather than deleting (easier to restore)

Reducing 200 controls to 80 on a screen typically improves responsiveness by 40%.

4. Avoid Nested Galleries

Nested galleries create exponential performance degradation.

Before:

// Gallery1 iterates over 50 customers
// Gallery2 (inside Gallery1) iterates over 100 orders each
// Result: 5,000 control instances
Gallery1.Items = Customers;
Gallery2.Items = Filter(Orders, CustomerID = Gallery1.Selected.ID)

After:

// Flatten the data in a collection
OnStart = ClearCollect(
  colCustomerOrders,
  AddColumns(
    Customers,
    "Orders",
    Filter(Orders, CustomerID = [@ID])
  )
);

// Single gallery with grouped content
Gallery1.Items = colCustomerOrders;

// Use containers for nested display
// Container inside gallery shows order details

Alternatively, use Power BI or Dataverse views to handle complex hierarchical data.

5. Use Named Formulas (Power Apps Formula Language)

Named formulas prevent recalculation and improve readability.

Before:

DataCardValue.Value = If(
  IsBlank(DataCardValue1.Value),
  0,
  Value(DataCardValue1.Value) * 1.08
)

After (create as App formula):

// App.Formulas tab
CalculateTax = If(
  IsBlank(DataCardValue1.Value),
  0,
  Value(DataCardValue1.Value) * 1.08
);

// Use it in controls
DataCardValue.Value = CalculateTax

This improves performance because the formula calculates once instead of multiple times per render cycle.

6. Preload Data Strategically

Not all data needs to load immediately. Be intentional about what you cache.

Strategy:

  • Preload reference data (status lists, departments, regions)
  • Load transaction data on-demand
  • Use search/filter to reduce dataset size
// Load small reference tables
OnStart = Concurrent(
  ClearCollect(colDepartments, Departments),
  ClearCollect(colStatuses, Statuses)
);

// Load customer data based on search
OnSearch_Click = ClearCollect(
  colSearchResults,
  Search(
    Customers,
    txtSearchInput.Value,
    "Name", "Email"
  )
)

7. Use App.Formulas for Shared Logic

Define formulas once in the App level and reuse them everywhere.

// Define in App settings (App.Formulas)
FormatCurrency = Text(Value, "$#,##0.00");
IsValidEmail = IsMatch([@Email], Match.Email);
GetUserDepartment = LookUp(Users, Email = User().Email, Department);

// Use throughout your app
Label1.Text = FormatCurrency(DataCardValue.Value);
if(!IsValidEmail(TextInput1.Value), Alert("Invalid email"))

8. Optimize Delegation and Filtering

Filters applied in Power Apps must process client-side, killing performance. Delegate to the data source.

Before:

Gallery.Items = Filter(
  Customers,
  Year(CreatedDate) = 2024 // Not delegable
)

After:

Gallery.Items = Filter(
  Customers,
  CreatedDate >= DateValue("1/1/2024"), // Delegable
  CreatedDate < DateValue("1/1/2025")
)

9. Use Variables Over Collections for Single Values

Collections consume more memory than variables.

// Avoid for simple values
ClearCollect(colUserRole, User().Department);

// Use this instead
Set(varUserRole, User().Department);

10. Monitor and Test Performance

Use the Monitor tool (Alt+Shift+F12) to identify bottlenecks.

  • Record your app usage
  • Look for network calls taking >500ms
  • Identify controls with excessive formula evaluation
  • Profile before and after optimization

Pro Tip

Create a performance checklist and audit every screen before deploying to production:

  • OnStart duration under 2 seconds?
  • No nested galleries?
  • All heavy operations delegated?
  • Control count reasonable for complexity?
  • Monitor tool shows no excessive network calls?

Small optimizations compound. Implementing just 3-4 of these tips typically improves app responsiveness by 50%+, creating noticeably better user experiences that drive adoption.

#power-apps#performance-optimization#canvas-apps#power-platform