Simple Smooth Safe
Insight · Power Platform

Model-driven is excellent, until the screen is not a form.

A code app is not "model-driven but nicer". It is the answer to a specific problem: the screens a form designer was never meant to draw, and what they used to cost as embedded web resources.

Published 10 August 20268 min read

The three surfaces

Model-driven apps generate their UI from Dataverse metadata. You define tables, forms, views and a sitemap; the platform draws it, and gets security, accessibility, responsiveness and auditing right without you doing anything. For record-centric work — a table, a form, a view — very little else is as productive.

Canvas apps give you pixel control and Power Fx. Excellent for focused task apps; less comfortable when the thing you are building is large, needs real state management, or needs a component that does not exist.

Code apps let you build the front end as a normal web application — React, TypeScript, your own libraries, your own build — and have the Power Platform host, authenticate and govern it. You are writing an application; the platform still handles sign-in through Entra ID, DLP and sharing.

The ceiling people actually hit

It is not that model-driven apps are limited. It is that a whole category of business screen is not a form:

You can express these on a model-driven surface, but you are working against the grain. The traditional answer was an embedded custom web resource, and that is where the cost lives — because you end up with several of them.

What the old approach actually costs

We rebuilt a PSA suite that had gone down this road, and the estate looked like this:

None of that is anyone's incompetence. It is what happens when each non-form screen is solved independently over several years.

What a code app changes

One application with client-side routing — no page reload between screens. One component stack, chosen once. Typed services generated per Dataverse table rather than hand-written fetch calls. And one codebase for every client, with variation as configuration rather than a fork.

That last point is the one that compounds. A fix reaches everyone, or it reaches whoever's branch someone remembered.

What does not change, and should not

The platform still owns the things you do not want to own:

How to choose

The screen is…Build it as
A record, a form, a view, a lookupModel-driven. Do not fight this.
One focused task, small, quick to shipCanvas
A grid, board, matrix or queue with real interactionCode app
A suite of several of the aboveCode app, decisively — this is the case it exists for
Reference data maintenance, dozens of tablesModel-driven, or one metadata-driven screen

The honest test is not sophistication. It is: can the form designer draw this? If yes, let it. Every screen you hand to the platform is a screen you are not maintaining.

The mixed answer is usually right

These are not exclusive. PSA Hub is code-app screens for the parts that need them and model-driven surfaces for the parts that do not — 87 registered entities of reference data sit behind one metadata-driven registry screen rather than 45 hand-built subareas, because adding a reference table should be a config entry and not a sprint.

A pilot group can also move to new screens while everyone else stays on the existing app, because both read the same tables. Cut over per team rather than per tenant.

The costs, stated

Which is the argument for buying one rather than building one, if what you need is a category somebody already maintains. That is not a neutral thing for us to say — but it is the same calculation either way, and the maintenance is real whoever does it.