Power Apps
App Names
Pattern: [App Name]
There is no restriction on the name of the app
| Example | Notes |
|---|---|
Contoso-CRM-Field | Field app for CRM scenario |
Portal Internal-Contoso | Internal admin portal |
Contoso Inventory Admin | Back-office inventory operations |
Centro | Solution for the Centro app |
Solution Names
Pattern: [Solution Name]
There is no restriction on the name of the solution. However, you must add the Publisher.
If it is a solution that you will deploy to another tenant, make sure to include your company's name as the publisher. If the solution is being used only in your own tenant, make sure to include the department name as the publisher.
| Example | Notes |
|---|---|
Contoso CRM Field | Field app for CRM scenario |
Portal-Internal-Contoso | Internal admin portal |
Centro | Centro app |
Connection Reference Names
Pattern: [App/Service Name] [Connector] - [optional: Short Description] - [Type of Connection]
| Example | Notes |
|---|---|
[Centro] SharePoint - Service User | SharePoint connection for an app called Centro. The service user is used to connect to SharePoint. |
[Centro] Dataverse - Service Principal | Dataverse connection for an app called Centro. The service principal is used to connect to Dataverse. |
[AbsenceManager] Office 365 Outlook - User | Office 365 Outlook connection for an app called AbsenceManager using the end-user's connection. |
[SplitPDFs] Storage Queue - API Key | Office 365 Outlook connection for an app called AbsenceManager using the end-user's connection. |
[MeetingNotes] SharePoint - Project List Agent - User | SharePoint connection used for a Copilot Studio agent to connect to the SharePoint Project List. |
Screen Names
Pattern: scr[PageTopic]
| Example | Notes |
|---|---|
scrHome | App landing screen |
scrOrdersList | Browse/list screen |
scrOrderDetails | Details/edit screen |
scrSettings | Settings screen |
Control Names
Pattern: [prefix][MeaningfulName]
Use a short, consistent prefix per control type, followed by a clear noun or noun-phrase in camelCase. Keep names stable even if the UI moves around.
| Control Type | Prefix | Example | Notes |
|---|---|---|---|
| Label | lbl | lblPageTitle | Static or dynamic text |
| Text Input | txt | txtCustomerName | Single-line input |
| Rich Text Editor | rte | rteDescription | Multi-line rich text |
| Dropdown | drp | drpStatus | Single select |
| Combo Box | cmb | cmbAssignee | Search + multi/single select |
| Checkbox | chk | chkAcceptTerms | Boolean input |
| Toggle | tgl | tglActive | On/Off switch |
| Date Picker | dtp | dtpStartDate | Date selection |
| Slider | sld | sldVolume | Numeric range |
| Button | btn | btnSubmit | Primary action |
| Icon | ico | icoRefresh | Icon-only action/visual |
| Image | img | imgLogo | Static/dynamic image |
| Gallery | gly | glyOrders | Scrollable list of records |
| Data Table | tbl | tblOrders | Tabular display |
| Form (Edit/View) | frm | frmOrder | Connected form control |
| Container/Group | con | conHeader | Layout grouping |
| Timer | tmr | tmrAutosave | Background process |
| HTML Text | htm | htmPreview | HTML rendering |
Variable Names
Use the requested prefixes for clarity and quick scope recognition.
| Scope | Prefix | Example | Notes |
|---|---|---|---|
| Context variable | _ | _IsLoading | Created via UpdateContext() |
| Global variable | gbl | gblCurrentUser | Created via Set() |
Collection Names
Pattern: col[PluralNoun]
| Example | Notes |
|---|---|
colOrders | Temporary orders cache |
colLookupStatuses | Static/lookup values |
Use of camelCase
Use camelCase for most identifiers (controls, data sources, variables, collections) combined with a short prefix that communicates purpose/type. Screen names are an exception and should use a dedicated scr prefix with PascalCase topic words.
Always Format the Code
Break long Power Fx formulas into multiple lines, group related steps, and use semicolons to separate statements. Align property names and function calls for readability.
// Good formatting
// OnSelect of btnSubmit
If(
IsBlank(txtCustomerName.Text),
Notify("Customer name is required", NotificationType.Error),
Collect(colOrders, {
customerName: txtCustomerName.Text,
status: drpStatus.Selected.Value
});
Navigate(scrOrderDetails, ScreenTransition.Fade)
)Always Comment the Code
Use comments to explain why not what. Prefer short, meaningful comments above non-obvious logic.
// Cache lookup values once per session
If(IsEmpty(colLookupStatuses),
ClearCollect(colLookupStatuses, dsDataverse_Statuses)
)Reuse Logic (User-defined functions)
If code repeats, refactor it. Prefer reusable components, named formulas, or component library patterns to centralize logic and UI. Expose input/output properties and call the component where needed.
Loading Screen on App Start
Avoid heavy logic in App.OnStart. Use a dedicatedscrLoading as the start screen, perform initialization in scrLoading.OnVisible, then navigate to the home screen. The Home page has a loading screen example.