Microsoft Power Platform · The Complete Learning Hub

Build apps. Automate work. Analyze everything. Master the Power Platform.

One hub for everything Power Platform — Power Apps, Power Automate, Power BI, Power Pages and Copilot Studio. Learn with guided paths, run real code in the browser playground, copy production-ready snippets, study real-world architectures, and drill interview questions.

0
Core Products
0+
Data Connectors
0
Fx Functions Documented
0
Playground Records
0
Interview Questions
0
Real Scenarios
01 The Platform

Six products.
One connected ecosystem.

Power Platform is Microsoft's low-code stack. Every product below connects to Dataverse and 1,400+ connectors — learn them individually, then combine them to build end-to-end business solutions.

/01
Pa

Power Apps

Build custom apps

Create canvas apps with pixel-perfect drag-and-drop UI, or model-driven apps generated from your Dataverse data model. Powered by the Power Fx formula language.

  • Canvas apps
  • Model-driven apps
  • Power Fx
  • Custom pages
EXPLORE FUNCTIONS & DOCS
/02
Pf

Power Automate

Automate workflows

Cloud flows for event-driven & scheduled automation, desktop flows (RPA) for legacy UI automation, and business process flows for guided stages.

  • Cloud flows
  • Desktop flows / RPA
  • Approvals
  • Expressions
EXPLORE FUNCTIONS & DOCS
/03
Bi

Power BI

Analyze & visualize

Turn raw data into interactive reports and dashboards. Model with Power Query (M), calculate with DAX, and share securely across your org.

  • DAX
  • Power Query / M
  • Semantic models
  • Dashboards
EXPLORE FUNCTIONS & DOCS
/04
Pp

Power Pages

External portals

Build secure, external-facing websites over Dataverse. Design with the studio, extend with Liquid templates, JavaScript and Web APIs.

  • Portals studio
  • Liquid
  • Web roles
  • Lists & forms
EXPLORE FUNCTIONS & DOCS
/05
Cs

Copilot Studio

AI agents & bots

Create conversational copilots and autonomous agents with generative AI, topics, and actions that call Power Automate flows and connectors.

  • Generative answers
  • Topics
  • Agents
  • Channels
EXPLORE FUNCTIONS & DOCS
/06
Dv

Dataverse

The data backbone

The managed data platform underneath it all: tables, relationships, business rules, security roles — plus a full Web API for pro developers.

  • Tables & columns
  • Security roles
  • Web API / OData
  • Plugins
EXPLORE FUNCTIONS & DOCS
02 Learning Path

From first app
to solution architect.

A proven route through the ecosystem — each step maps to an official Microsoft certification.

1

Foundations PL-900 · AB-900

Understand the business value of each product, Dataverse, connectors and AI Builder. PL-900 is the live entry exam (never expires). New for 2026: AB-900 — Copilot & Agent Administration Fundamentals for the AI track. Build your first canvas app and cloud flow in a free developer environment. Time: 2–4 weeks.

2

App Maker PL-300 · APPLIED SKILLS

Go deep on one track: canvas apps + Power Fx via Microsoft's Applied Skills credentials (PL-100 was retired in 2024), or data modeling + DAX (PL-300, still live). Learn delegation, collections, variables, and publishing/sharing patterns.

3

Functional Consultant PL-200 ⚠ RETIRING AUG 2026

Model-driven apps, Dataverse design (tables, relationships, security roles), business process flows, and Copilot Studio bots. Note: PL-200 retires Aug 31, 2026 — only attempt if you can pass before then; otherwise follow the incoming AB-role successor credentials. Solution packaging & ALM basics.

4

Pro Developer PL-400

Extend with code: PCF components, plugins (C#), JavaScript form scripts, custom connectors, Web API integrations and Azure services. DevOps with pipelines.

5

Solution Architect PL-600 ⚠ RETIRING JUN 2026

Design enterprise solutions: environment strategy, DLP policies, governance (CoE Starter Kit), integration patterns, licensing, and leading delivery teams. PL-600 retires Jun 30, 2026 — architect-level AB credentials are rolling out as successors through 2026.

03 Live Playground

Write code. Run it. Right here.

A real Power Fx expression engine running in your browser with IntelliSense autocomplete, syntax highlighting and line numbers — evaluating against two 100-record datasets (Employees & Orders). Hit ? help to explain any function at your cursor, and 🗄 data to browse the tables. Switch to JavaScript for PCF-style coding.

Output
// Press RUN or Ctrl/Cmd + Enter to evaluate.
// Try: Concatenate("Hello ", "Maker")
// Or pick a sample from the dropdown ↑
98 functions live in this engine: Text (Concatenate, Concat, Text, Upper, Lower, Proper, Trim, TrimEnds, Len, Left, Right, Mid, StartsWith, EndsWith, Find, Substitute, Replace, Split, Char, IsMatch, EncodeUrl) · Math (Sum, Average, Min, Max, Round, RoundUp, RoundDown, Trunc, Int, Abs, Sqrt, Power, Mod, Rand, RandBetween) · Dates (Today, Now, Date, Time, Year, Month, Day, Hour, Minute, Weekday, DateAdd, DateDiff, DateValue, TimeValue, DateTimeValue, IsToday) · Logic (If, Switch, And, Or, Not, IsBlank, IsBlankOrError, IsEmpty, IsNumeric, Coalesce, IfError, With) · Tables (Filter, Search, LookUp, Sort, SortByColumns, Distinct, GroupBy, Ungroup, AddColumns, ShowColumns, DropColumns, RenameColumns, First, Last, FirstN, LastN, Index, ForAll, Sequence, Count, CountA, CountRows, CountIf) · Behavior (Set, UpdateContext, Collect, ClearCollect, Clear, Remove, Patch, Defaults, Notify, Navigate, Reset) · records {a:1} · tables [1,2,3] · datasets: Employees (100), Orders (100)
04 Code Library

Copy-ready snippets for
every language in the stack.

Power Fx formulas, Automate expressions, DAX measures, Power Query M, Dataverse Web API and Liquid — tested patterns you can paste straight into your solutions.

POWER FX
Patch — create a Dataverse record
// Button OnSelect — insert + notify
Patch(Employees,
  Defaults(Employees),
  { Name: txtName.Text,
    Department: ddDept.Selected.Value,
    Salary: Value(txtSalary.Text) }
);
Notify("Employee created ✅", NotificationType.Success);
Reset(txtName); Reset(txtSalary);
POWER FX
Gallery — search + filter + sort
// Gallery.Items property
SortByColumns(
  Filter(Employees,
    (IsBlank(txtSearch.Text) Or
     StartsWith(Name, txtSearch.Text)),
    (ddDept.Selected.Value = "All" Or
     Department = ddDept.Selected.Value)
  ),
  "Name", SortOrder.Ascending
)
⌁ try a live version in the playground
POWER FX
Validate form before submit
// Button DisplayMode — disable until valid
If(
  And(
    Not(IsBlank(Trim(txtName.Text))),
    IsMatch(txtEmail.Text, Match.Email),
    Value(txtSalary.Text) > 0
  ),
  DisplayMode.Edit,
  DisplayMode.Disabled
)
POWER FX
Collections & ForAll loops
// Screen OnVisible — cache + transform
ClearCollect(colTeam,
  Filter(Employees, Department = "IT"));

ForAll(colTeam,
  Collect(colEmails,
    { Mail: Lower(FirstName & "." &
              LastName & "@contoso.com") }));
⌁ try a live version in the playground
EXPRESSION
Dates & time in flows
// Common date expressions
utcNow()                              // current UTC timestamp
addDays(utcNow(), 7, 'yyyy-MM-dd')    // +7 days, formatted
convertTimeZone(utcNow(), 'UTC',
  'India Standard Time', 'dd-MMM hh:mm tt')
formatDateTime(addHours(
  triggerBody()?['CreatedOn'], 2), 'g')
EXPRESSION
Conditionals & null-safety
// Safe navigation + fallback with coalesce
coalesce(
  triggerBody()?['Approver']?['DisplayName'],
  'No approver assigned')

// Inline if — approve anything under $5k
if(lessOrEquals(
     float(outputs('Get_Invoice')?['body/Amount']),
     5000),
   'Auto-Approved', 'Needs Manager')
EXPRESSION
Array magic (no loops)
// Distinct values without Apply-to-each
union(
  body('Select_Departments'),
  body('Select_Departments'))

// Join names with comma for an email body
join(body('Select_Names'), ', ')

// First item / count helpers
first(body('Filter_array'))
length(outputs('Get_items')?['body/value'])
ODATA
Filter queries (delegable)
// SharePoint "Get items" → Filter Query field
Status eq 'Pending' and Amount gt 1000
substringof('urgent', Title)
Created ge @{addDays(utcNow(),-30,'yyyy-MM-dd')}

// Dataverse "List rows" → Filter rows
statecode eq 0 and prioritycode eq 1
createdon ge @{formatDateTime(
  addDays(utcNow(),-7),'yyyy-MM-dd')}
DAX
Core measures with CALCULATE
Total Sales = SUM ( Sales[Amount] )

Sales YTD =
CALCULATE ( [Total Sales],
    DATESYTD ( 'Date'[Date] ) )

Sales vs LY % =
VAR LY = CALCULATE ( [Total Sales],
    SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
RETURN
DIVIDE ( [Total Sales] - LY, LY )
DAX
Rank & running total
Product Rank =
RANKX (
    ALLSELECTED ( 'Product'[Name] ),
    [Total Sales], , DESC, Dense
)

Running Total =
CALCULATE (
    [Total Sales],
    FILTER (
        ALL ( 'Date'[Date] ),
        'Date'[Date] <= MAX ( 'Date'[Date] )
    )
)
M
Power Query — clean & shape
let
  Source = Csv.Document(File.Contents("C:\data\orders.csv"),
             [Delimiter=",", Encoding=65001]),
  Promoted = Table.PromoteHeaders(Source),
  Typed = Table.TransformColumnTypes(Promoted,
    {{"Amount", Currency.Type},
     {"OrderDate", type date}}),
  Clean = Table.SelectRows(Typed,
    each [Amount] <> null and [Amount] > 0)
in
  Clean
M
Custom column + unpivot
let
  Source = Excel.CurrentWorkbook()
             {[Name="SalesTable"]}[Content],
  WithMargin = Table.AddColumn(Source, "Margin",
    each [Revenue] - [Cost], type number),
  Unpivoted = Table.UnpivotOtherColumns(
    WithMargin, {"Region"},
    "Measure", "Value")
in
  Unpivoted
JAVASCRIPT
Dataverse Web API — CRUD
// Create a record (model-driven form / PCF)
const account = { name: "Contoso Ltd",
  revenue: 1500000 };
await Xrm.WebApi.createRecord("account", account);

// Query with OData
const res = await Xrm.WebApi.retrieveMultipleRecords(
  "account",
  "?$select=name,revenue" +
  "&$filter=revenue gt 100000" +
  "&$orderby=revenue desc&$top=5");
JAVASCRIPT
Form scripting — onChange logic
function onIndustryChange(executionContext) {
  const form = executionContext.getFormContext();
  const industry =
    form.getAttribute("industrycode").getValue();

  if (industry === 1) { // Accounting
    form.getControl("creditlimit")
        .setNotification("Requires CFO approval", "warn1");
  } else {
    form.getControl("creditlimit")
        .clearNotification("warn1");
  }
}
⌁ run JS in the playground
REST
Web API via HTTP (flows / Postman)
GET https://org.crm.dynamics.com/api/data/v9.2/
    accounts?$select=name&$top=3
Authorization: Bearer eyJ0eXAiOi...
OData-MaxVersion: 4.0
Prefer: odata.maxpagesize=50

PATCH .../api/data/v9.2/accounts(<guid>)
Content-Type: application/json
{ "telephone1": "555-0199",
  "description": "Updated via Web API" }
LIQUID
Power Pages — secure data loop
{% fetchxml openTickets %}
<fetch top="5">
  <entity name="incident">
    <attribute name="title" />
    <filter><condition attribute="statecode"
      operator="eq" value="0" /></filter>
  </entity>
</fetch>
{% endfetchxml %}

{% for case in openTickets.results.entities %}
  <li>{{ case.title | escape }}</li>
{% endfor %}
05 Power Fx Function Reference

Every function.
Searchable. Runnable.

The complete Power Fx function library — search it, filter by category, read the syntax, and run every example live in the playground against real data. Based on the official Microsoft Learn reference.

06 Real-Life Scenarios

How teams actually ship
Power Platform solutions.

Six production-grade architectures from real industries. Expand any card to see the end-to-end build sequence.

HR · Enterprise

Employee Onboarding Automation

01
The Problem

New hires waited 3+ days for laptops, accounts and access. HR tracked everything in spreadsheets and email threads.

Solution Stack
Power AutomateDataverseApprovalsTeams + OutlookAdaptive Cards
Impact

▲ Day-1 readiness 98% · 12 hrs saved per hire

  1. Trigger: new row in Dataverse "Onboarding" table (created from a Power Apps form by HR).
  2. Parallel branches: IT ticket via ServiceNow connector, AD account via Graph API, hardware approval to manager.
  3. Adaptive Card posted to the manager in Teams with Approve/Reject buttons.
  4. Reminders: scheduled flow nudges outstanding tasks 24h before start date.
  5. Reporting: Power BI dashboard over Dataverse shows cycle time per department.
Finance · Mobile

Expense Approval Canvas App

02
The Problem

Field staff photographed receipts and emailed them; finance re-keyed amounts. Month-end close took 9 days.

Solution Stack
Canvas AppAI Builder OCRSharePointApproval flowPower BI
Impact

▲ Close time 9 → 3 days · zero manual entry

  1. Capture: mobile canvas app with camera control; AI Builder receipt processor extracts merchant, date, total.
  2. Validate: Power Fx rules flag policy violations (>$100 meals, weekend claims).
  3. Route: conditional approval — manager if <$1k, finance director above.
  4. Sync: approved rows flow to the ERP (SAP connector) as journal entries.
  5. Analyze: embedded Power BI tile shows spend by category inside the app.
Retail · Analytics

Executive Sales Command Center

03
The Problem

Leadership made decisions on week-old Excel exports. No single view of pipeline vs. actuals across 40 stores.

Solution Stack
Power BIDataflowsStar schemaRow-level securityTeams embed
Impact

▲ Refresh daily 6am · one source of truth

  1. Ingest: dataflows pull POS, CRM and inventory data nightly into a Lakehouse.
  2. Model: star schema — FactSales + DimDate/Store/Product; measures in DAX (YTD, vs LY, basket size).
  3. Secure: row-level security so regional managers see only their stores.
  4. Distribute: report embedded in a Teams tab + mobile layout for phones.
  5. Alert: data-driven alerts fire a Power Automate flow when a store drops >10% vs target.
Public Sector · Portal

Citizen Service Portal + AI Assistant

04
The Problem

A city council handled 40k calls/month for permits, complaints and status checks. Phone queues averaged 25 minutes.

Solution Stack
Power PagesCopilot StudioDataverseEntra ID / B2CWeb API
Impact

▲ 62% of queries deflected to self-service

  1. Portal: Power Pages site with permit application forms bound to Dataverse, Liquid templates for dynamic pages.
  2. Identity: citizens sign in with Azure AD B2C; table permissions scope rows to the signed-in contact.
  3. Copilot: Copilot Studio bot embedded on the site answers FAQs via generative AI over council documents.
  4. Escalation: unresolved chats create Dataverse cases and route to agents in a model-driven app.
  5. Status tracking: citizens see live case status via secure lists — no phone call needed.
Manufacturing · Field

Offline Equipment Inspection App

05
The Problem

Technicians inspected machinery in plants with no connectivity, logging results on paper and re-entering them weekly.

Solution Stack
Canvas App (offline)DataverseBarcode scannerSaveData/LoadDataFlow sync
Impact

▲ 100% digital audits · 6 hrs/tech/week saved

  1. Scan: technician scans the machine's barcode; app looks up the asset in Dataverse.
  2. Offline-first: checklists cached with SaveData/LoadData; results queued in a local collection.
  3. Evidence: photos + defect annotations captured via camera and pen input controls.
  4. Sync: on reconnection, a flow patches queued records and flags critical defects to supervisors instantly.
  5. Trending: Power BI defect heatmap per production line guides preventive maintenance.
Legal · AI

Intelligent Invoice Processing Pipeline

06
The Problem

2,000 PDF invoices/month arrived by email. AP clerks typed each one into the finance system — error rate ~4%.

Solution Stack
AI BuilderPower AutomateDataverseOutlook triggerException app
Impact

▲ 91% touchless · error rate 4% → 0.3%

  1. Trigger: flow fires when an email with attachment lands in invoices@contoso.com.
  2. Extract: custom AI Builder document model pulls vendor, PO#, line items, totals.
  3. Match: 3-way match against PO + goods-receipt in Dataverse; tolerance ±2%.
  4. Exceptions: low-confidence or mismatched invoices land in a model-driven review queue app.
  5. Post: clean invoices post directly to Dynamics 365 Finance via virtual tables / OData.
07 Interview Prep

Questions interviewers
actually ask.

Real interview questions with model answers, filtered by topic and tagged by difficulty. Click any question to reveal the answer.