Power Pages is the rebrand of the old Adoxio/Adxstudio portals stack, layered on Dataverse and Bootstrap. It is the right answer for a narrow set of use cases and a costly mistake for the rest.
What Power Pages does well
External-facing Dataverse-bound forms with built-in authentication via Microsoft Entra External ID, LinkedIn, Google, or local accounts. Records created through Power Pages forms hit Dataverse natively, with security controlled by Web Roles and Table Permissions. For partner portals, member portals, and customer self-service tied directly to CRM records, you save months versus building from scratch.
Where it falls down
- Heavy custom front-end interactivity. The Liquid templating model and Bootstrap base do not gracefully accommodate React component patterns. You can embed React but you fight the framework.
- High-volume anonymous traffic. Anonymous request quotas are licensed by tier and metered aggressively. A campaign landing page that gets 100K visits in a day will exceed your tier.
- SEO-critical sites. Server-rendered output is not as tunable as Next.js or Astro. If marketing wants Lighthouse 95+, you are likely happier outside Power Pages.
Table Permissions: the security model that bites
Table Permissions on Power Pages do not equal security roles in model-driven apps. They are a separate access control system layered on top of Dataverse security. Web Roles map portal users to Table Permissions. A developer who confuses the two will publish a portal where authenticated users can read every contact in your tenant. Audit Table Permissions for Global scope on any sensitive table immediately after every release.
Power Pages Management -> Table Permissions
-> Filter: Scope = Global, Table = contact -> Should be empty
Liquid templating reality
Liquid is the template language. It is fine for content interpolation and simple conditional rendering. It becomes painful when you need to compose dynamic forms, paginate complex grids, or call multiple APIs from a single page. Use Web API operations from page-side JavaScript for anything beyond static content.
fetch('/_api/contacts?$select=fullname&$top=10', {
headers: { 'Accept': 'application/json' }
});
Cost model surprise
Power Pages is licensed per authenticated user per month or per anonymous page view per month. Both meters tick. A customer portal with 50,000 monthly authenticated users plus 200,000 anonymous landing-page views can run into six figures annually. Model the cost before scoping.
When to choose differently
If your front-end developers are React-fluent, your portal needs a polished marketing surface, or your users number in the millions, build a Next.js front-end against the Dataverse Web API directly. You give up Power Pages’ authentication-and-Table-Permissions kit and replace it with Entra External ID plus your own permission layer.
What to do this week
Pull your Power Pages metrics report. If anonymous page views consistently exceed 60% of your tier, you are paying for a use case Power Pages was not built for. Either downgrade the tier or move the anonymous workload to a CDN-fronted static site.