[object Object]

A maker builds a canvas app for warehouse pickers in two weeks. It looks great on the demo iPad. The first day in production it loads in 11 seconds because the gallery binds to the full inventory table without delegation. The fix is straightforward; the lesson is that canvas apps reward planning the data layer first and the UI second, not the other way around.

Canvas vs Model-Driven

Canvas for custom UX. Model-driven for standard CRUD. Canvas apps handle mobile, tablet, and drop-in kiosks — scenarios where standard D365 UI does not fit. The decision rule: if the user spends most of their time creating and editing records in a CRM-style flow, model-driven wins; if the user follows a workflow that does not match a record-by-record edit, canvas wins.

Canvas wins for:
- Tablet-based field apps with custom photography
- Kiosk apps with limited input
- Wizard-style task flows
- Mobile field service with offline mode
- Highly branded customer-facing experiences

Model-driven wins for:
- Internal data management
- CRM and case-tracking style apps
- Apps that follow the entity relationship diagram

Connectors

Dataverse connector is the native path for D365 data. Other connectors (SharePoint, SQL, Graph API) for non-D365 sources. One canvas app, multiple data sources. Use the Dataverse connector over the older Common Data Service connector; it supports better delegation and is faster on large tables.

Connector hierarchy:
- Dataverse: native D365 data, best performance
- SharePoint: documents and lists
- SQL Server: legacy data
- Custom connector: bespoke APIs via OpenAPI
- HTTP with Azure AD: for Graph and other Microsoft APIs

Standardize connector choice across apps so makers do not reinvent for each project.

Forms for record detail editing. Galleries for lists. EditForm plus SubmitForm for writes. Galleries can bind to a data source; filter and sort in formulas. The form is opinionated; it gives you Save, validation, and field mapping for free. The gallery is freer but you wire the navigation and the actions yourself.

EditForm pattern:
- DataSource = Accounts
- Item = LookUp(Accounts, accountid = currentId)
- DefaultMode = New | Edit | View
- OnSuccess = Navigate to gallery

Use EditForm for the standard create-edit-view flow. Skip it only when the form layout has to be highly custom and SubmitForm cannot save the shape.

Performance

Delegation warning: not all operations delegate to the backend. A Filter() that runs locally on 500 rows works; 500,000 rows does not. Design around delegable functions. The delegation warning shows as a yellow underline in Power Apps Studio; never ship code with a delegation warning.

Delegable in Dataverse:
- Filter with eq, ne, gt, lt, StartsWith, In
- Sort by single column
- LookUp with single condition

Not delegable:
- Filter with computed expressions
- Distinct, GroupBy in some cases
- Filter with Search across many columns

Test delegation by switching the data row limit to 100, loading the gallery, and seeing if the data is wrong. If yes, the operation did not delegate.

Embedding in Model-Driven

Canvas apps embed in model-driven app forms via custom control. Useful for hybrid experiences — standard form with a canvas section for custom UX. The canvas component receives the parent form context as a parameter and can read or write to Dataverse like any canvas app.

// Inside the canvas component
const accountId = Param("recordId");
const account = LookUp(Accounts, accountid = accountId);

The pattern works well for embedded charts, custom gauges, or interactive elements that the standard form cannot render.

Offline Mode

Canvas apps support offline through SaveData and LoadData functions plus the offline data sync feature for Dataverse. The offline sync caches a configured set of tables on the device and queues changes when offline. Configure the offline plan during app design; retrofitting offline is painful.

App Lifecycle

Canvas apps version with the solution. Major version bumps for breaking changes; minor for safe additions. Use the test studio for regression suites; canvas apps are easy to break with small formula changes.

What to do this week

Audit your canvas apps for delegation warnings and fix them. Standardize on Dataverse connector for D365 data. If you have an embedded canvas in a model-driven form, review the load time and trim if it adds more than a second to the parent form.

[object Object]
Share