<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Microsoft Mission Critical Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/bg-p/MicrosoftMissionCriticalBlog</link>
    <description>Microsoft Mission Critical Blog articles</description>
    <pubDate>Sat, 27 Jun 2026 12:32:41 GMT</pubDate>
    <dc:creator>MicrosoftMissionCriticalBlog</dc:creator>
    <dc:date>2026-06-27T12:32:41Z</dc:date>
    <item>
      <title>Azure OpenAI Architecture: The Decisions That Actually Matter (Part 3)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4528901</link>
      <description>&lt;H1&gt;Introduction&lt;/H1&gt;
&lt;P&gt;Part 1 of this series tackled the architectural decisions that shape any Azure OpenAI / Microsoft Foundry Models workload — capacity model, deployment scope, governance layer, grounding strategy, and quota engineering. Part 2 turned those decisions into a Well-Architected Framework discipline. Part 3 looks at the part that makes GenAI architecture genuinely different from a traditional service: the platform itself never stops moving.&lt;/P&gt;
&lt;P&gt;Models are released, promoted to GA, moved to Legacy, deprecated, and eventually retired. New regions come online; certain features (such as Priority Processing) light up only on specific model versions and deployment scopes. Fine-tuned models inherit the lifecycle of their base. Performance characteristics shift between releases. Reliability in this world is not just uptime — it is the ability to absorb continuous change without disrupting production.&lt;/P&gt;
&lt;P&gt;That discipline is GenAIOps: the people, processes, and tooling that turn model upgrades from emergency events into routine operations. Part 2 already covers the core lifecycle mechanics and upgrade policy trade-offs through a Well-Architected lens. Part 3 stays focused on the operational and architectural practices that make change safe: evaluation of pipelines, observability, routing patterns, prompt governance, and abstraction. Where details are time-sensitive — stage thresholds, SLA windows, regional rollout delays, capacity tier eligibility — they are flagged with "At the time of writing". Always confirm current behavior against Microsoft Learn before committing to a design.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Who is this series for?&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Cloud and Solution Architects&lt;/LI&gt;
&lt;LI&gt;Platform and product owners&lt;/LI&gt;
&lt;LI&gt;Senior developers responsible for operating Azure OpenAI workloads in production&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;What you’ll learn in Part 3:&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;How to build an evaluation pipeline that promotes model upgrades the way CI/CD promotes code.&lt;/LI&gt;
&lt;LI&gt;How to instrument full-stack observability so regressions surface early (latency, errors, token trends, quality drift).&lt;/LI&gt;
&lt;LI&gt;How the Model Router pattern, canary releases, and tier-aware fallbacks turn model change into a configuration concern.&lt;/LI&gt;
&lt;LI&gt;How to govern prompts as production artifacts with versioning, feature-flagged rollouts, and regression testing.&lt;/LI&gt;
&lt;LI&gt;How to manage lifecycle-dependent assets (fine-tuned models) and regional rollout realities without firefighting — plus a GenAIOps Decision Matrix you can reuse as a checklist.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;We’ve also included a summary decision matrix at the end of this post for quick reference.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;1. Model lifecycle (recap)&lt;/H1&gt;
&lt;P&gt;Azure OpenAI/Microsoft Foundry models are living dependencies: new versions are released, promoted from Preview to GA, then eventually move through deprecation toward retirement. To avoid surprises, treat every deployed model version as having an expiration date and design so you can swap versions without rewriting application code. In general, use the Standard deployment auto-upgrade mode that preserves stability but guarantees continuity at retirement, and plan to deliberate blue/green migrations for dedicated (provisioned) capacity where auto-upgrade is not available. For the deeper mechanics (upgrade modes, retirement behavior, and migration playbooks), refer to Part 2’s Reliability section; the rest of this article focuses on the GenAIOps practices that make those upgrades routine.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Figure 1 — Models lifecycle&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;2. GenAIOps: Evaluating Before Promoting&lt;/H1&gt;
&lt;P&gt;Upgrading a model should not be a manual, subjective exercise. Azure AI Foundry provides evaluation capabilities that, combined with a regression prompt suite, turn model upgrades into measurable, repeatable decisions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Side-by-side prompt comparisons across model versions.&lt;/LI&gt;
&lt;LI&gt;Automated quality scoring (relevance, coherence, groundedness, safety, and fluency).&lt;/LI&gt;
&lt;LI&gt;Structured-output validation (JSON conformance, schema validation).&lt;/LI&gt;
&lt;LI&gt;Batch testing across comprehensive prompt libraries representative of real production traffic.&lt;/LI&gt;
&lt;LI&gt;Custom evaluation metrics tailored to your domain.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Architectural best practice:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Maintain a curated regression prompt suite that mirrors real production traffic &lt;/STRONG&gt;— including the long tail.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Run evaluation pipelines against candidate models&lt;/STRONG&gt; before any production cut-over.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Integrate evaluation into CI/CD &lt;/STRONG&gt;using Azure DevOps, GitHub Actions, or similar automation.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Define quality gates that must pass before promotion&lt;/STRONG&gt; (e.g., groundedness ≥ a target threshold, p95 latency under a target budget). Pick numbers that fit your workload, not the article.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Model promotion should require passing the evaluation gates &lt;/STRONG&gt;the same way application code requires passing unit tests. Without automated evaluation, model upgrades become high-risk, low-visibility events that teams avoid until forced by retirement deadlines — the exact pattern that keeps lifecycle work in the "emergency" column instead of the "scheduled" column.&lt;/P&gt;
&lt;P&gt;Example evaluation workflow:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Trigger — a new model version reaches GA, or your migration playbook hits the R-90 step.&lt;/LI&gt;
&lt;LI&gt;Deploy — the candidate model goes to a staging deployment.&lt;/LI&gt;
&lt;LI&gt;Regress — the prompt suite (typically several hundred to several thousand prompts) is run against the candidate.&lt;/LI&gt;
&lt;LI&gt;Compare — the candidate's outputs are scored against the current production model.&lt;/LI&gt;
&lt;LI&gt;Inspect — humans review flagged differences; metrics, latency distributions, and cost-per-request go on the dashboard.&lt;/LI&gt;
&lt;LI&gt;Gate — an approval step (manual or automated) decides whether the candidate proceeds to blue/green production deployment.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Figure 2 — Evaluation Pipeline&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;3. Observability: Full-Stack or It Didn't Happen&lt;/H1&gt;
&lt;P&gt;GenAIOps is more than one-time evaluation. Once a candidate's model has been promoted, you need continuous, end-to-end observability across the request path — not just at the model boundary. Without it, you are operating blind during model transitions.&lt;/P&gt;
&lt;P&gt;At a minimum, instrument:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Prompt processing time&lt;/STRONG&gt; (gateway through model invocation).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Model inference latency&lt;/STRONG&gt;, expressed as p50, p95, and p99 — averages hide the experience of the slowest 5% of users.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Token consumption &lt;/STRONG&gt;(prompt tokens, completion tokens, total) trended over time.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Error rates by class&lt;/STRONG&gt; (429 throttling, 503 service unavailable, 400 validation errors, content-filter rejections).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Model version distribution&lt;/STRONG&gt; — which versions are actually serving traffic right now.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;User-satisfaction signals&lt;/STRONG&gt; (thumbs-up/down, explicit feedback, session abandonment).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Many performance regressions only surface at scale. A model version that performs well in evaluation against a few hundred prompts may behave differently under production traffic patterns. Plan for that.&lt;/P&gt;
&lt;P&gt;A practical metrics architecture on Azure tends to combine:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Application Insights for end-to-end request tracing across the application and gateway.&lt;/LI&gt;
&lt;LI&gt;Azure Monitor for infrastructure, quota, and PTU utilization of metrics.&lt;/LI&gt;
&lt;LI&gt;Custom telemetry for prompt-level success/failure tracking and quality scoring.&lt;/LI&gt;
&lt;LI&gt;Log Analytics for forensic analysis when a regression is suspected.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Drift in model behavior rarely shows up as a single broken request — it surfaces as a slow shift in tail latency, fallback rate, or user-satisfaction signal. Monitoring that only looks at average will miss it.&lt;/P&gt;
&lt;H1&gt;4. The Model Router Pattern&lt;/H1&gt;
&lt;P&gt;As GenAI systems mature, a static single-model architecture becomes both limiting and expensive. A Model Router introduces dynamic, intelligent model selection in front of one or more model deployments.&lt;/P&gt;
&lt;P&gt;Typical responsibilities of a router:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Send simple queries to a smaller, faster model and complex reasoning to a larger one.&lt;/LI&gt;
&lt;LI&gt;Run canary releases of new model versions with percentage-based rollouts.&lt;/LI&gt;
&lt;LI&gt;A/B test model variants to measure quality, latency, and cost differences.&lt;/LI&gt;
&lt;LI&gt;Route to the right capacity tier — including falling back from Provisioned to Standard during migrations or capacity constraints.&lt;/LI&gt;
&lt;LI&gt;Where the workload also needs lower-variance latency on the Standard side, route latency-critical traffic through Priority Processing on a Global Standard or Data Zone Standard (US) deployment, on a model version that supports it. (At the time of writing, Priority Processing is enabled by setting the service_tier attribute on the request and requires a model version released on or after 2025-12-01 — verify both eligibility constraints on Microsoft Learn before depending on it.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Decision logic can be driven by any combination of:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Query complexity (simple heuristics or a lightweight classifier).&lt;/LI&gt;
&lt;LI&gt;User tier (e.g., free vs premium).&lt;/LI&gt;
&lt;LI&gt;Response-time requirements (interactive vs background).&lt;/LI&gt;
&lt;LI&gt;Cost constraints — pick the cheapest model that meets the quality bar.&lt;/LI&gt;
&lt;LI&gt;Regional model availability and capacity.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Implementation options:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure API Management &lt;/STRONG&gt;— built-in routing policies, weighted backends, retry policies.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure Front Door&lt;/STRONG&gt; — global routing with health probes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Custom routing service&lt;/STRONG&gt; — maximum flexibility, more operational overhead.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Semantic Kernel or LangChain &lt;/STRONG&gt;— framework-level routing logic embedded in the application.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Beyond cost and performance, the Model Router pattern decouples the application layer from any single model version. That decoupling is what makes lifecycle management tractable: when a model moves to Legacy, you change a router rule, not application code.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Figure 3 — Model Router Architecture vs Blue/Green Deployment&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;5. Prompt Lifecycle Governance&lt;/H1&gt;
&lt;P&gt;Prompts are not strings embedded in code. They are production artifacts that influence quality, cost, and safety, and they evolve almost as often as the models behind them. Treat them as first-class assets.&lt;/P&gt;
&lt;H3&gt;Prompt templates&lt;/H3&gt;
&lt;P&gt;Separate stable system instructions from dynamic content (user input and retrieved context). This lets you version, test, and audit each layer independently.&lt;/P&gt;
&lt;H3&gt;Version control&lt;/H3&gt;
&lt;P&gt;Store prompts in Git — full history, code review, branching, and tagging. Treat prompt changes the way you treat code changes: pull request, review, and test before merging.&lt;/P&gt;
&lt;H3&gt;Feature-flagged rollouts&lt;/H3&gt;
&lt;P&gt;Roll out prompt changes gradually using feature flags. Monitor the impact on a subset of users before exposing the change broadly. The same observability stack that watches model upgrades should watch prompt rollouts.&lt;/P&gt;
&lt;H3&gt;Regression testing&lt;/H3&gt;
&lt;P&gt;Maintain a regression suite of expected prompt behaviors and run it whenever prompts or models change. The suite reuses the same evaluation pipeline you built in Section 2.&lt;/P&gt;
&lt;H3&gt;Prompt-level metrics&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Success rate — did the prompt achieve its intended outcome?&lt;/LI&gt;
&lt;LI&gt;Fallback rate — how often did users rephrase or abandon?&lt;/LI&gt;
&lt;LI&gt;Satisfaction score — explicit user feedback.&lt;/LI&gt;
&lt;LI&gt;Token efficiency — average tokens per successful completion (a leading indicator of cost regression).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;PII and privacy safeguards&lt;/H3&gt;
&lt;P&gt;Customer prompts and completions are not used to train base models. That means logging is safe for debugging — but defense in depth still applies:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Redact PII&lt;/STRONG&gt; (names, emails, phone numbers, addresses) before logs are written.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apply RBAC &lt;/STRONG&gt;on Log Analytics workspaces so only the right roles can access raw prompt data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Govern data retention&lt;/STRONG&gt; with automated purging after a defined window.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Keep audit&lt;/STRONG&gt; trails of who accessed which logs and when.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Prompt quality is not a one-time effort. It is an ongoing operational discipline that needs tooling, processing, and measurement, in the same way application code does.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Figure 4 — Prompt Lifecycle Governance&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;6. Fine-Tuned Models: The Hidden Retirement Risk&lt;/H1&gt;
&lt;P&gt;Fine-tuned models inherit the lifecycle of their base model. That creates a cascading retirement risk that many teams overlook.&lt;/P&gt;
&lt;P&gt;During base-model deprecation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;New fine-tuning jobs against that base are blocked — you can no longer create new fine-tuned versions.&lt;/LI&gt;
&lt;LI&gt;Existing fine-tuned deployments continue serving inference, with no immediate impact.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;When the base model is retired:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Fine-tuned deployments stop responding (HTTP 404), exactly like any other deployment pinned to a retired version.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The migration imperative is straightforward: retrain fine-tuned models on the successor base model well before the retirement date, ideally during the predecessor's Legacy or Deprecated stage.&lt;/P&gt;
&lt;P&gt;Architectural considerations:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Track base-model dependencies explicitly in your asset inventory — the same place you track library and runtime versions.&lt;/LI&gt;
&lt;LI&gt;Schedule retraining workflows aligned with base-model lifecycle dates, not with team availability.&lt;/LI&gt;
&lt;LI&gt;Validate fine-tuned model quality on the new base; behavior can shift between base versions.&lt;/LI&gt;
&lt;LI&gt;Keep training datasets in version-controlled storage, so retraining is reproducible.&lt;/LI&gt;
&lt;LI&gt;Re-evaluate whether fine-tuning is still necessary; newer base models, combined with better prompting (few-shot, chain-of-thought, structured outputs), sometimes remove the need entirely.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Common mistake: investing heavily in fine-tuning without budgeting for the recurring retraining cost and lifecycle overhead. Improved prompting on a newer base model is often the cheaper path.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;7. Regional Rollouts and Multi-Region Strategy&lt;/H1&gt;
&lt;P&gt;Successor models are not always available in every Azure region simultaneously. Microsoft typically releases a new version in a subset of regions first, with broader rollout following over weeks or months. At the time of writing, the regional rollout schedule is published per model on Microsoft Learn — confirm before assuming a particular region will receive a release on a particular day.&lt;/P&gt;
&lt;H3&gt;Maintain staging deployments in early-release regions&lt;/H3&gt;
&lt;P&gt;Even if production runs elsewhere, maintain a staging deployment in regions that tend to receive new models earliest. That gives you visibility into the successor's behavior before it auto-upgrades into your primary region.&lt;/P&gt;
&lt;H3&gt;Pre-test successor models before primary auto-upgrades&lt;/H3&gt;
&lt;P&gt;If your production deployment uses "Once the current version expires", the upgrade will happen automatically. Pre-testing in an early-release region lets you catch behavioral changes before they hit live traffic.&lt;/P&gt;
&lt;H3&gt;Multi-region routing for lifecycle flexibility&lt;/H3&gt;
&lt;P&gt;Azure Front Door or Azure API Management with multi-region back-ends lets you route based on model availability, capacity headroom (one region may have quota while another is exhausted), and latency. Combined with the Model Router pattern from Section 6, this turns regional staggering from a constraint into an option.&lt;/P&gt;
&lt;H3&gt;Account for capacity-tier eligibility in your routing&lt;/H3&gt;
&lt;P&gt;Some capacity tiers are scoped to specific deployment scopes — Priority Processing, for example, is offered on Global Standard and Data Zone Standard (US) deployments at the time of writing. Bake those eligibility constraints into routing rules, so a fallback path does not silently land in an ineligible deployment.&lt;/P&gt;
&lt;P&gt;Multi-region strategy is no longer just a disaster-recovery concern. It is also lifecycle resilience — the ability to test, stage, and absorb model changes without coupling your platform to a single region release schedule.&lt;/P&gt;
&lt;H1&gt;8. Future-Proofing Through Abstraction&lt;/H1&gt;
&lt;P&gt;Future-proofing is architectural, not procedural. The goal is to design systems that adapt to change without requiring code rewrites every time a model is promoted, deprecated, or retired.&lt;/P&gt;
&lt;H3&gt;Abstract model calls behind a service layer&lt;/H3&gt;
&lt;P&gt;Avoid calling Azure OpenAI APIs directly from the application code. Introduce an internal Model Service that owns model selection, retry and fallback, prompt-template lookup, and response validation. The application asks for an outcome ("summarize this", "classify that"); the Model Service decides which model and which prompt to use.&lt;/P&gt;
&lt;H3&gt;Externalize model names and configuration&lt;/H3&gt;
&lt;P&gt;Store model identifiers, versions, and parameters in configuration or feature flags — never as hard-coded strings. Changing models then becomes a configuration change, not a deployment.&lt;/P&gt;
&lt;H3&gt;Centralize prompt logic&lt;/H3&gt;
&lt;P&gt;Maintain prompts in a registry or template repository, not scattered across codebases. This enables centralized versioning, A/B testing without code changes, and prompt optimization that is decoupled from application releases.&lt;/P&gt;
&lt;H3&gt;Avoid scattering model identifiers across the codebase&lt;/H3&gt;
&lt;P&gt;Use constants, enums, or configuration references rather than literal model strings repeated across many files. The number of files that have to change at upgrade time is a leading indicator of how painful the upgrade will be.&lt;/P&gt;
&lt;P&gt;Benefits of abstraction:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Seamless model replacement — swap models without touching application logic.&lt;/LI&gt;
&lt;LI&gt;Multi-model strategies — the Model Router pattern becomes trivial to add.&lt;/LI&gt;
&lt;LI&gt;Provider flexibility — integrating additional or alternative providers becomes a service-layer change, not an application to rewrite.&lt;/LI&gt;
&lt;LI&gt;Faster adoption of new capabilities — reasoning controls, function calling, structured outputs land in one place.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Common mistake: Prototyping with direct API calls for speed and never refactoring. The technical debt accumulates until a model upgrade requires an emergency engineering sprint.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Figure 5 — Abstraction Layer for Future-Proofing.&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;Final Perspective&lt;/H1&gt;
&lt;P&gt;The most important shift this article asks for is a change in operational mindset:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Model upgrades are not emergencies. They are scheduled events.&lt;/LI&gt;
&lt;LI&gt;Retirement deadlines are not surprising. They are published timelines, often with months of notice.&lt;/LI&gt;
&lt;LI&gt;Architecture fails when teams treat models as static dependencies. They succeed when they treat models as evolving infrastructure.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In practice, GenAIOps means:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Automated evaluation that runs continuously&lt;/STRONG&gt;, not just during migrations.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Controlled rollouts using blue/green or canary patterns&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Observability-driven decisions based on metrics, not intuition.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Lifecycle-aware planning&lt;/STRONG&gt;, with retirement dates tracked alongside library and runtime upgrades.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Modular design that decouples applications&lt;/STRONG&gt; from specific model versions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Across the three parts of this series we have covered the architectural decisions that frame an Azure OpenAI / Microsoft Foundry Models workload (Part 1), the Well-Architected Framework discipline that keeps it sustainable (Part 2), and the GenAIOps practices that let it evolve without firefighting (Part 3). The organizations that succeed long-term are the ones that plan for model evolution from day one, invest in evaluation and observability tooling, decouple application logic from model specifics, and treat prompts and configurations as versioned artifacts.&lt;/P&gt;
&lt;P&gt;Generative AI architecture is not about deploying a model endpoint. It is about building a platform that absorbs change gracefully as the AI landscape shifts. The retirement of a model should be a routine operational event, not a crisis. If your architecture makes model upgrades feel risky or expensive, refactor before the next retirement deadline forces your hand.&lt;/P&gt;
&lt;H1&gt;Lifecycle &amp;amp; GenAIOps Decision Matrix&lt;/H1&gt;
&lt;P&gt;Use this as a checklist when reviewing or signing off on the GenAIOps posture of an Azure OpenAI / Microsoft Foundry Models platform. One row per decision; one rule of thumb per row.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Area&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Decision&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Watch out for&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Lifecycle&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Version expiry tracking&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Treat model versions as expiring dependencies: inventory every deployed model/version, track deprecation/retirement dates, and design so swapping versions is a configuration change (details on upgrade modes in Part 2).&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pinning versions without an owner; discovering retirement dates after an outage or emergency migration window.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Evaluation&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Promotion gates&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pass the regression suite + meet domain-specific quality and latency thresholds before promoting any model.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Subjective "feels better" sign-off; gates that exist on paper but never block a release.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Evaluation&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pipeline integration&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Evaluation runs in CI/CD on every candidate; the same suite watches prompt changes.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Manual evaluation runs that only happen under retirement pressure.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Observability&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Latency and error metrics&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Track p50/p95/p99 latency, 429/503/4xx rates, token trend, and model-version distribution. Alert on tail latency and sustained throttling.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Average-only dashboards; missed Service Health notifications for model retirements.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Observability&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Quality drift&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Trend per-prompt success rate, fallback rate, and user-satisfaction signals; surface drift before users complain.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Treating quality as a one-time evaluation event.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Architecture&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Model Router&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Centralize model selection, canary, and fallback (including Priority Processing on eligible deployments) behind a router service.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Application code that calls a specific model deployment by name; routing logic scattered across services.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Architecture&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Abstraction layer&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Application code asks for an outcome; the Model Service decides which model and prompt; configuration drives model selection.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Hard-coded model identifiers across many files; bypass paths that skip the service layer.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Prompts&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Prompt governance&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Prompts in Git, behind feature flags, with regression tests, prompt-level metrics, and PII redaction in logs.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Prompts copy-pasted across services; PII in logs; no rollback path for a regressed prompt.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Fine-tune&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Fine-tuned model lifecycle&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Track fine-tuned models against base-model dates; schedule retraining during the predecessor's Legacy/Deprecated window.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Treating fine-tuned models as permanent infrastructure; lost or unversioned training datasets.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Regional&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Multi-region for lifecycle resilience&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Maintain staging in early-release regions; route across regions to absorb staggered rollouts and capacity gaps.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Single-region production with no early-release staging; routing rules that ignore tier-eligibility constraints.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1&gt;Disclaimer&lt;/H1&gt;
&lt;P&gt;&lt;EM&gt;I am a Microsoft employee. The views and opinions expressed in this article are my own and do not necessarily reflect those of Microsoft. This content is informational and educational; it is not an official Microsoft statement, recommendation, or commitment. Service tiers, model availability, lifecycle stages, deprecation timelines, regional rollouts, pricing, and SLAs evolve — always validate against the latest Microsoft Learn documentation before making architectural or migration decisions.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;References&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/model-retirements" target="_blank"&gt;&lt;STRONG&gt;Azure OpenAI model deprecations and retirements&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/working-with-models" target="_blank"&gt;&lt;STRONG&gt;Working with Azure OpenAI models — versioning and upgrades&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/provisioned-throughput" target="_blank"&gt;&lt;STRONG&gt;Provisioned throughput for Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/priority-processing" target="_blank"&gt;&lt;STRONG&gt;Enable Priority Processing for Microsoft Foundry Models&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/evaluation-approach-gen-ai" target="_blank"&gt;&lt;STRONG&gt;Azure AI Foundry — evaluation of generative AI applications&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/monitoring" target="_blank"&gt;&lt;STRONG&gt;Monitor Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/genai-gateway-capabilities" target="_blank"&gt;&lt;STRONG&gt;Azure API Management — GenAI Gateway capabilities&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/frontdoor/front-door-routing-architecture" target="_blank"&gt;&lt;STRONG&gt;Azure Front Door routing for AI back-ends&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/managed-identity" target="_blank"&gt;&lt;STRONG&gt;Use managed identities with Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/content-safety/" target="_blank"&gt;&lt;STRONG&gt;Azure AI Content Safety&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/fine-tuning" target="_blank"&gt;&lt;STRONG&gt;Fine-tune models with Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/well-architected/" target="_blank"&gt;&lt;STRONG&gt;Azure Well-Architected Framework&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 17 Jun 2026 16:39:08 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4528901</guid>
      <dc:creator>luciacasucci</dc:creator>
      <dc:date>2026-06-17T16:39:08Z</dc:date>
    </item>
    <item>
      <title>Power Platform tenant inventory — a community showcase of the API-first management surface</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/power-platform-tenant-inventory-a-community-showcase-of-the-api/ba-p/4519598</link>
      <description>&lt;img /&gt;
&lt;P data-line="8"&gt;Source:&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps" data-href="https://github.com/SweetsNSavories/VerseOps" target="_blank"&gt;github.com/SweetsNSavories/VerseOps&lt;/A&gt;&amp;nbsp;· MIT.&lt;/P&gt;
&lt;P data-line="8"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;EM&gt;Figure 1 — VerseOps loaded against a live tenant. Per-row capacity (DB / File / Log / FinOps DB / FinOps File GB) is computed from the BAP&amp;nbsp;$expand=properties.capacity&amp;nbsp;call; per-env asset counts are joined client-side from the Inventory API result set. Tenant identifiers redacted; everything else is real.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;EM&gt;Figure 2 — One environment row expanded. The row-details template fans out the inventory: Solutions / Apps / Flows / Agents (joined from the Inventory API and per-env Dataverse Web API calls), Power Pages sites (mspp_website&amp;nbsp;table on the env's Dataverse), and the env's&amp;nbsp;systemusers&amp;nbsp;(with their assigned licenses joined from Microsoft Graph). All asset counts (9 / 3 / 53 / 241) are real.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="16"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;EM&gt;Figure 3 — Total Assets drawer (click the Total Assets KPI tile). The whole panel is fed by a single tenant-wide Inventory API query; the per-type counts are computed client-side from&amp;nbsp;assetType. The "most recent" name surfaces the freshest asset of each kind so an admin can sanity-check that the tenant feed is current.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="19"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;EM&gt;Figure 4 — Licenses Consumed drawer (click the Licensed Users KPI tile). The list is the union of every assigned&amp;nbsp;servicePlan&amp;nbsp;from&amp;nbsp;/users?$select=assignedLicenses&amp;nbsp;rolled up to the SKU level using the tenant's&amp;nbsp;subscribedSkus&amp;nbsp;catalog from Microsoft Graph. SKU codes are public; the only tenant-specific data is the per-SKU seat count on the right.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="24"&gt;Why this exists&lt;/H2&gt;
&lt;P data-line="26"&gt;The recurring questions at the start of every governance cycle are well known:&lt;/P&gt;
&lt;P data-line="28"&gt;&lt;EM&gt;"How many environments do we actually have? Who owns the apps in them? How much Dataverse capacity is sitting in places no one remembers creating? Which makers left the company three months ago and still own production flows?"&lt;/EM&gt;&lt;/P&gt;
&lt;P data-line="30"&gt;The official answers — Power Platform admin center (PPAC), the&amp;nbsp;&lt;STRONG&gt;Power Platform inventory&lt;/STRONG&gt;&amp;nbsp;page, and the&amp;nbsp;&lt;STRONG&gt;Usage&lt;/STRONG&gt;&amp;nbsp;page — already exist and are the right starting point for daily work; they cover the common cases comprehensively. There are still moments, however, when an administrator needs:&lt;/P&gt;
&lt;OL data-line="32"&gt;
&lt;LI data-line="32"&gt;A&amp;nbsp;&lt;STRONG&gt;single offline snapshot&lt;/STRONG&gt;&amp;nbsp;they can search, sort, filter, and ship to a stakeholder without exposing the live admin center.&lt;/LI&gt;
&lt;LI data-line="33"&gt;A&amp;nbsp;&lt;STRONG&gt;diff&lt;/STRONG&gt;&amp;nbsp;between this morning and last Friday —&amp;nbsp;&lt;EM&gt;what changed?&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-line="34"&gt;&lt;STRONG&gt;Joined views&lt;/STRONG&gt;&amp;nbsp;that the portal doesn't ship out of the box: per-env capacity × per-env asset count × per-env user count, all in one sortable grid.&lt;/LI&gt;
&lt;LI data-line="35"&gt;The&amp;nbsp;&lt;STRONG&gt;raw JSON&lt;/STRONG&gt;&amp;nbsp;behind every row, one click away, when something doesn't match what the portal shows.&lt;/LI&gt;
&lt;LI data-line="36"&gt;A&amp;nbsp;&lt;STRONG&gt;starting point&lt;/STRONG&gt;&amp;nbsp;— code they can fork, instrument, and turn into the governance tool they actually wanted.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-line="38"&gt;VerseOps targets that long tail. The UI surface is roughly five files; every outbound call is enumerated in&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/docs/network-endpoints.md" data-href="../network-endpoints.md" target="_blank"&gt;docs/network-endpoints.md&lt;/A&gt;. The codebase is deliberately small, read-only by design, and positioned as a foundation that adopting teams are expected to fork, instrument, and extend.&lt;/P&gt;
&lt;H2 data-line="42"&gt;How it complements the official "Inventory" and "Usage" pages&lt;/H2&gt;
&lt;P data-line="44"&gt;Microsoft's&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" data-href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" target="_blank"&gt;Power Platform inventory&lt;/A&gt;&amp;nbsp;gives administrators a unified view of agents, apps, and flows tenant-wide, refreshed within ~15 minutes. The&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/usage" data-href="https://learn.microsoft.com/power-platform/admin/usage" target="_blank"&gt;Usage page&lt;/A&gt;&amp;nbsp;tracks engagement and adoption. Both ship in the admin center today and should be every admin's first stop.&lt;/P&gt;
&lt;P data-line="46"&gt;VerseOps is positioned as a&amp;nbsp;&lt;STRONG&gt;complement, not a replacement&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Need&lt;/th&gt;&lt;th&gt;PPAC Inventory / Usage&lt;/th&gt;&lt;th&gt;VerseOps&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Daily inventory browsing in a portal&lt;/td&gt;&lt;td&gt;✅ Recommended&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Filter / sort / search on any column&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Resource-detail drill-in (owner, env, dates)&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Export to Excel&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅ (CSV / cache copy)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Capacity (DB / File / Log / FinOps GB) joined per env on the same row as asset count&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Partial&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;One-click "show me the raw Dataverse / PPAC JSON" inspector&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Local SQLite cache for offline browsing on a plane / in an air-gapped review&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Diff between today's snapshot and yesterday's&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ (cache-based, on roadmap)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Source you can fork&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;td&gt;✅ MIT, single solution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Telemetry sent to Microsoft / vendor&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;per Microsoft's data policy&lt;/td&gt;&lt;td&gt;&lt;STRONG&gt;None — zero outbound calls beyond Microsoft's own APIs&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-line="61"&gt;If you only ever need 1–4 above, stay in the admin center; it's faster and always up to date. VerseOps shows up when you need 5–11.&lt;/P&gt;
&lt;H2 data-line="65"&gt;Architecture in one diagram&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="114"&gt;Key architectural properties:&lt;/P&gt;
&lt;UL data-line="116"&gt;
&lt;LI data-line="116"&gt;&lt;STRONG&gt;Single process, no server-side footprint.&lt;/STRONG&gt;&amp;nbsp;Every call runs in the signed-in user's security context. There is no daemon, no sync job, no message bus. The operating system schedules the network calls; the user triggers a refresh.&lt;/LI&gt;
&lt;LI data-line="117"&gt;&lt;STRONG&gt;Two distinct cloud planes.&lt;/STRONG&gt;&amp;nbsp;Management-plane calls (api.powerplatform.com,&amp;nbsp;api.bap.microsoft.com,&amp;nbsp;graph.microsoft.com) are kept separate from data-plane calls ({org}.crm.dynamics.com&amp;nbsp;per environment), with audience switching handled centrally by the auth layer.&lt;/LI&gt;
&lt;LI data-line="118"&gt;&lt;STRONG&gt;The local SQLite database is the only state.&lt;/STRONG&gt;&amp;nbsp;Removing&amp;nbsp;%LOCALAPPDATA%\VerseOps\&amp;nbsp;returns the application to a blank slate. No other persistence exists.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="122"&gt;What's actually feasible with the Power Platform API today&lt;/H2&gt;
&lt;P data-line="124"&gt;Microsoft has been very public about its&amp;nbsp;&lt;A href="https://devblogs.microsoft.com/powerplatform/power-platform-api-and-sdks-from-ux-first-to-api-first/" data-href="https://devblogs.microsoft.com/powerplatform/power-platform-api-and-sdks-from-ux-first-to-api-first/" target="_blank"&gt;shift from a UX-first to an API-first development model for Power Platform programmability&lt;/A&gt;: new capabilities ship in the API first, then propagate to SDKs, CLI, PowerShell cmdlets, and connectors. The&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-extensibility-overview" data-href="https://learn.microsoft.com/power-platform/admin/programmability-extensibility-overview" target="_blank"&gt;Programmability and extensibility overview&lt;/A&gt;&amp;nbsp;lays out the full toolchain — REST API, .NET SDK (&lt;A href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" data-href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" target="_blank"&gt;Microsoft.PowerPlatform.Management&lt;/A&gt;), Python SDK, Power Platform CLI, PowerShell cmdlets, and the Power Platform for Admins V2 connector.&lt;/P&gt;
&lt;P data-line="126"&gt;VerseOps is a deliberately small showcase of what the&amp;nbsp;&lt;STRONG&gt;.NET SDK + Inventory API&lt;/STRONG&gt;&amp;nbsp;combination unlocks once you put a UI on it:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Capability&lt;/th&gt;&lt;th&gt;API used&lt;/th&gt;&lt;th&gt;SDK / endpoint&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;List every environment in the tenant with name / region / SKU / version / security group / default-flag&lt;/td&gt;&lt;td&gt;Power Platform API (PPAC)&lt;/td&gt;&lt;td&gt;Microsoft.PowerPlatform.Management&amp;nbsp;SDK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Per-tenant capacity (DB / File / Log / FinOps DB / FinOps File GB)&lt;/td&gt;&lt;td&gt;Power Platform API (PPAC)&lt;/td&gt;&lt;td&gt;SDK&amp;nbsp;Licensing.Tenant.GetCurrentCapacityAllocations()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Per-environment capacity in&amp;nbsp;&lt;STRONG&gt;one tenant-wide call&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;BAP capacity (legacy GA)&lt;/td&gt;&lt;td&gt;GET /providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2020-10-01&amp;amp;$expand=properties.capacity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Every&lt;/STRONG&gt;&amp;nbsp;canvas app, model-driven app, code app, cloud flow, agent flow, and Copilot Studio agent in the tenant in&amp;nbsp;&lt;STRONG&gt;one POST&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Inventory API (preview)&lt;/td&gt;&lt;td&gt;POST https://api.powerplatform.com/resourcequery/resources/query?api-version=2024-10-01&amp;nbsp;(KQL-style query against&amp;nbsp;PowerPlatformResources)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DLP policies + connector classification (Business / Non-Business / Blocked)&lt;/td&gt;&lt;td&gt;BAP Governance v2&lt;/td&gt;&lt;td&gt;GET /providers/PowerPlatform.Governance/v2/policies?api-version=2018-01-01&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Per-env solutions / Power Pages sites / system users / roles / app + flow status&lt;/td&gt;&lt;td&gt;Dataverse Web API v9.2&lt;/td&gt;&lt;td&gt;GET {org}/api/data/v9.2/solutions,&amp;nbsp;appmodules,&amp;nbsp;workflows,&amp;nbsp;canvasapps,&amp;nbsp;systemusers,&amp;nbsp;mspp_websites&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;User license SKU resolution + security-group display names&lt;/td&gt;&lt;td&gt;Microsoft Graph&lt;/td&gt;&lt;td&gt;GET /v1.0/subscribedSkus,&amp;nbsp;/users,&amp;nbsp;/groups,&amp;nbsp;/directoryObjects/getByIds&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-line="138"&gt;The headline shape of this:&amp;nbsp;&lt;STRONG&gt;one tenant-wide POST replaces what used to be N×6 per-environment GETs.&lt;/STRONG&gt;&amp;nbsp;For a tenant with 700 environments, that's the difference between ~4,000 round-trips per refresh and ~10. The same&amp;nbsp;Microsoft.PowerPlatform.Management&amp;nbsp;SDK that powers the new admin-center surfaces is the same one your tooling uses — there's no longer a "fast official one and a slow community one".&lt;/P&gt;
&lt;H2 data-line="142"&gt;A note on the BAP API deprecation path&lt;/H2&gt;
&lt;P data-line="144"&gt;Several BAP routes the community has relied on for years are now in a clear&amp;nbsp;&lt;EM&gt;consolidation&lt;/EM&gt;&amp;nbsp;track rather than a&amp;nbsp;&lt;EM&gt;deprecation&lt;/EM&gt;&amp;nbsp;one — but the destination is the same. From the official&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-versioning-support" data-href="https://learn.microsoft.com/power-platform/admin/programmability-versioning-support" target="_blank"&gt;Versioning and support&lt;/A&gt;&amp;nbsp;page:&lt;/P&gt;
&lt;P data-line="146"&gt;&lt;EM&gt;"The 2020-10-01 Generally available version of Power Platform API is specific to environment management and is also commonly referred to as&amp;nbsp;&lt;STRONG&gt;Business Application Platform (BAP) API&lt;/STRONG&gt;. The functionality of this set of endpoints are made available in the newer versions of Power Platform API along with many additional features after version 2022-03-01-preview."&lt;/EM&gt;&lt;/P&gt;
&lt;P data-line="148"&gt;In practice, what this means for tools like VerseOps:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;BAP route VerseOps uses today&lt;/th&gt;&lt;th&gt;Status (May 2026)&lt;/th&gt;&lt;th&gt;Modern equivalent on&amp;nbsp;api.powerplatform.com&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;/scopes/admin/environments?$expand=properties.capacity&lt;/td&gt;&lt;td&gt;GA (api-version=2020-10-01); functionally superseded but still recommended for tenant-wide capacity&lt;/td&gt;&lt;td&gt;Will move to a Licensing namespace endpoint as parity completes; track&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-whats-new-changed" data-href="https://learn.microsoft.com/power-platform/admin/programmability-whats-new-changed" target="_blank"&gt;Programmability what's new&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PowerPlatform.Governance/v2/policies&amp;nbsp;(DLP)&lt;/td&gt;&lt;td&gt;Stable&lt;/td&gt;&lt;td&gt;Watch the new Connectivity / Governance namespace endpoints (e.g.&amp;nbsp;&lt;A href="https://learn.microsoft.com/rest/api/power-platform/connectivity/connectors/list-connectors" data-href="https://learn.microsoft.com/rest/api/power-platform/connectivity/connectors/list-connectors" target="_blank"&gt;List Connectors&lt;/A&gt;, shipped July 2025)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Microsoft.BusinessAppPlatform&amp;nbsp;provider routes&lt;/td&gt;&lt;td&gt;All being mirrored under&amp;nbsp;api.powerplatform.com&amp;nbsp;namespaces (Licensing, EnvironmentManagement, AppManagement, Authorization, Governance, Connectivity)&lt;/td&gt;&lt;td&gt;Use the SDK — Microsoft maintains the mapping for you&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-line="156"&gt;Microsoft's official guidance is unambiguous:&amp;nbsp;&lt;STRONG&gt;use the Power Platform API surface (api.powerplatform.com) and one of the official SDKs&lt;/STRONG&gt;&amp;nbsp;(&lt;A href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" data-href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" target="_blank"&gt;.NET&lt;/A&gt;,&amp;nbsp;&lt;A href="https://pypi.org/project/powerplatform-management/" data-href="https://pypi.org/project/powerplatform-management/" target="_blank"&gt;Python&lt;/A&gt;, CLI, PowerShell,&amp;nbsp;&lt;A href="https://learn.microsoft.com/connectors/powerplatformadminv2/" data-href="https://learn.microsoft.com/connectors/powerplatformadminv2/" target="_blank"&gt;Power Platform for Admins V2 connector&lt;/A&gt;) for any new automation. BAP routes won't disappear without a deprecation cycle, but new features ship to&amp;nbsp;api.powerplatform.com&amp;nbsp;first and may never come back to BAP.&lt;/P&gt;
&lt;P data-line="158"&gt;VerseOps reflects this exactly: every new feature added since April 2026 went to&amp;nbsp;api.powerplatform.com, the BAP capacity client is isolated to a single ~150-line file (&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/VerseOps.App/Inventory/Services/BapCapacityClient.cs" data-href="../../VerseOps.App/Inventory/Services/BapCapacityClient.cs" target="_blank"&gt;BapCapacityClient.cs&lt;/A&gt;) so it can be swapped out the moment the per-env capacity surface lands on the new API, and the token-acquisition layer (&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/VerseOps.App/Auth/AuthService.cs" data-href="../../VerseOps.App/Auth/AuthService.cs" target="_blank"&gt;AuthService.cs&lt;/A&gt;) supports both audiences side by side until that day comes.&lt;/P&gt;
&lt;H2 data-line="162"&gt;Who this helps&lt;/H2&gt;
&lt;P data-line="164"&gt;The MIT license permits unrestricted internal adaptation; adopting teams are encouraged to fork, re-brand, and re-sign the binary with their own enterprise code-signing certificate as part of internal distribution. Typical adopters include:&lt;/P&gt;
&lt;UL data-line="166"&gt;
&lt;LI data-line="166"&gt;&lt;STRONG&gt;Power Platform administrators&lt;/STRONG&gt;&amp;nbsp;running quarterly governance reviews who need a single defensible snapshot of current tenant state.&lt;/LI&gt;
&lt;LI data-line="167"&gt;&lt;STRONG&gt;Center-of-Excellence (CoE) leads&lt;/STRONG&gt;&amp;nbsp;who previously relied on the&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/guidance/coe/" data-href="https://learn.microsoft.com/power-platform/guidance/coe/" target="_blank"&gt;CoE Starter Kit&lt;/A&gt;&amp;nbsp;and are&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" data-href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" target="_blank"&gt;moving to the in-product Inventory + Usage pages&lt;/A&gt;, but still require a code-level surface to extend.&lt;/LI&gt;
&lt;LI data-line="168"&gt;&lt;STRONG&gt;FinOps and capacity owners&lt;/STRONG&gt;&amp;nbsp;identifying the ~5% of environments that consume 80% of Dataverse storage, with FinOps DB / FinOps File / Log GB visible on the same row as the environment name.&lt;/LI&gt;
&lt;LI data-line="169"&gt;&lt;STRONG&gt;Mission-critical and regulated workloads&lt;/STRONG&gt;&amp;nbsp;(financial services, healthcare, public sector) where a desktop tool that authenticates as the human administrator, emits zero telemetry, and stores all state locally is materially easier to risk-accept than a SaaS dashboard.&lt;/LI&gt;
&lt;LI data-line="170"&gt;&lt;STRONG&gt;Security and penetration-test teams&lt;/STRONG&gt;&amp;nbsp;who require a reproducible, auditable, signed Windows binary and a clear inventory of what it touches. The&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/sbom.cdx.json" data-href="../../sbom.cdx.json" target="_blank"&gt;SBOM&lt;/A&gt;,&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/SECURITY.md" data-href="../../SECURITY.md" target="_blank"&gt;SECURITY.md&lt;/A&gt;,&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/SIGNING.md" data-href="../../SIGNING.md" target="_blank"&gt;SIGNING.md&lt;/A&gt;, and&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/.github/workflows/codeql.yml" data-href="../../.github/workflows/codeql.yml" target="_blank"&gt;CodeQL workflow&lt;/A&gt;&amp;nbsp;are committed to the repository.&lt;/LI&gt;
&lt;LI data-line="171"&gt;&lt;STRONG&gt;Engineering teams learning the Power Platform API&lt;/STRONG&gt;&amp;nbsp;who want a non-trivial, well-commented .NET sample that exercises every major namespace.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="175"&gt;Where this could go next&lt;/H2&gt;
&lt;P data-line="177"&gt;The same API surface that powers VerseOps today can support a substantially richer set of experiences. Candidate directions follow; community input on prioritization is welcome via the&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps/issues" data-href="https://github.com/SweetsNSavories/VerseOps/issues" target="_blank"&gt;issue tracker&lt;/A&gt;.&lt;/P&gt;
&lt;H3 data-line="179"&gt;1. An&amp;nbsp;&lt;EM&gt;agentic&lt;/EM&gt;&amp;nbsp;governance assistant&lt;/H3&gt;
&lt;P data-line="180"&gt;Wrap the local SQLite cache + the same auth pipeline behind a Microsoft 365 Copilot agent (or a Foundry agent), and let an admin ask things like:&lt;/P&gt;
&lt;UL data-line="182"&gt;
&lt;LI data-line="182"&gt;&lt;EM&gt;"Which environments grew the most this week and who owns the new flows?"&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-line="183"&gt;&lt;EM&gt;"List every canvas app with a deprecated connector that's still 'On' in a production env."&lt;/EM&gt;&lt;/LI&gt;
&lt;LI data-line="184"&gt;&lt;EM&gt;"Show me orphaned resources owned by users disabled in Entra in the last 30 days."&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="186"&gt;The Power Platform API + Inventory API already returns everything you need to answer these in seconds. The agent surface is just a new face for the same data — and because the cache is local, the agent can run&amp;nbsp;&lt;STRONG&gt;without ever sending tenant data to a third party&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3 data-line="188"&gt;2. Periodic snapshots → drift report&lt;/H3&gt;
&lt;P data-line="189"&gt;A scheduled task that runs&amp;nbsp;VerseOps.App --refresh --headless&amp;nbsp;once a day, writes the SQLite snapshot to a versioned folder, and emails a delta. "Today vs yesterday: +12 canvas apps in the Default env, –3 envs decommissioned, capacity climbed 4.1 GB on org-prod-eu."&lt;/P&gt;
&lt;H3 data-line="191"&gt;3. Multi-tenant fan-out for MSPs / consultancies&lt;/H3&gt;
&lt;P data-line="192"&gt;Same EXE, multiple tenant profiles, side-by-side comparison view. The auth layer already supports&amp;nbsp;--tenant &amp;lt;guid&amp;gt;; the cache schema is per-tenant-keyed.&lt;/P&gt;
&lt;H3 data-line="194"&gt;4. Plug-ins for the Inventory API custom queries&lt;/H3&gt;
&lt;P data-line="195"&gt;The Inventory API's&amp;nbsp;POST /resourcequery/resources/query&amp;nbsp;accepts arbitrary KQL-style projections. A plug-in directory of "common admin questions as queries" (orphaned apps, oldest unused flows, premium connector usage by env) could grow organically.&lt;/P&gt;
&lt;H3 data-line="197"&gt;5. Sister tools in Python / TypeScript&lt;/H3&gt;
&lt;P data-line="198"&gt;The&amp;nbsp;&lt;A href="https://pypi.org/project/powerplatform-management/" data-href="https://pypi.org/project/powerplatform-management/" target="_blank"&gt;Python SDK&lt;/A&gt;&amp;nbsp;is GA; a Jupyter notebook that mirrors VerseOps' three core panels (env list + capacity + assets) would be ~200 lines and would land instantly with the data-science crowd.&lt;/P&gt;
&lt;P data-line="200"&gt;The repository is intended as a working base for these explorations: the foundational ~80% — authentication, caching, paging, retry, redaction, error capture, and theming — is already implemented and exercised against a live ~700-environment tenant. Proposals for any of the directions above can be filed on the&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps/issues" data-href="https://github.com/SweetsNSavories/VerseOps/issues" target="_blank"&gt;issue tracker&lt;/A&gt;.&lt;/P&gt;
&lt;H2 data-line="204"&gt;What's in the repository&lt;/H2&gt;
&lt;P data-line="206"&gt;Everything below is on&amp;nbsp;main&amp;nbsp;at&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps" data-href="https://github.com/SweetsNSavories/VerseOps" target="_blank"&gt;github.com/SweetsNSavories/VerseOps&lt;/A&gt;, MIT-licensed:&lt;/P&gt;
&lt;UL data-line="208"&gt;
&lt;LI data-line="208"&gt;The single WPF EXE —&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/VerseOps.App/" data-href="../../VerseOps.App/" target="_blank"&gt;VerseOps.App/&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="209"&gt;API clients, one per Microsoft service —&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/VerseOps.App/Inventory/Services/" data-href="../../VerseOps.App/Inventory/Services/" target="_blank"&gt;VerseOps.App/Inventory/Services/&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="210"&gt;SQLite catalog schema —&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/VerseOps.App/Inventory/Sql/schema.sql" data-href="../../VerseOps.App/Inventory/Sql/schema.sql" target="_blank"&gt;VerseOps.App/Inventory/Sql/schema.sql&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="211"&gt;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/README.md" data-href="../../README.md" target="_blank"&gt;README.md&lt;/A&gt;&amp;nbsp;— install, run, build&lt;/LI&gt;
&lt;LI data-line="212"&gt;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/SECURITY.md" data-href="../../SECURITY.md" target="_blank"&gt;SECURITY.md&lt;/A&gt;&amp;nbsp;— disclosure policy + threat model&lt;/LI&gt;
&lt;LI data-line="213"&gt;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/SIGNING.md" data-href="../../SIGNING.md" target="_blank"&gt;SIGNING.md&lt;/A&gt;&amp;nbsp;— three publish-with-signature paths (self-signed dev, Azure Trusted Signing, OV/EV)&lt;/LI&gt;
&lt;LI data-line="214"&gt;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/docs/network-endpoints.md" data-href="../network-endpoints.md" target="_blank"&gt;docs/network-endpoints.md&lt;/A&gt;&amp;nbsp;— every outbound host + OAuth scope&lt;/LI&gt;
&lt;LI data-line="215"&gt;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/THIRD-PARTY-NOTICES.md" data-href="../../THIRD-PARTY-NOTICES.md" target="_blank"&gt;THIRD-PARTY-NOTICES.md&lt;/A&gt;&amp;nbsp;+&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/sbom.cdx.json" data-href="../../sbom.cdx.json" target="_blank"&gt;sbom.cdx.json&lt;/A&gt;&amp;nbsp;— full dependency attribution + CycloneDX SBOM&lt;/LI&gt;
&lt;LI data-line="216"&gt;CI: build, vulnerability scan, CodeQL —&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/.github/workflows/" data-href="../../.github/workflows/" target="_blank"&gt;.github/workflows/&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="217"&gt;Branch protection ruleset (PR required, force-push blocked) —&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/.github/branch-protection.json" data-href="../../.github/branch-protection.json" target="_blank"&gt;.github/branch-protection.json&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="221"&gt;Try it&lt;/H2&gt;
&lt;P&gt;git clone https://github.com/SweetsNSavories/VerseOps.git cd VerseOps dotnet build VerseOps.sln -c Release .\VerseOps.App\bin\Release\net10.0-windows\VerseOps.App.exe&lt;/P&gt;
&lt;P data-line="230"&gt;Sign in with a tenant admin account (Power Platform Administrator or Dynamics 365 Administrator), click&amp;nbsp;&lt;STRONG&gt;Refresh&lt;/STRONG&gt;, and the first cold pull populates the local cache. Subsequent launches are instant from the cache; click Refresh again whenever you want a fresh snapshot.&lt;/P&gt;
&lt;H2 data-line="234"&gt;Closing thought&lt;/H2&gt;
&lt;P data-line="236"&gt;The thesis behind this post is straightforward: an API-first Power Platform management surface puts a complete tenant inventory within reach in roughly 3,000 lines of C#. The official Inventory and Usage pages remain the right tool for daily-driver scenarios. The SDK and Inventory API together cover the long tail — the cases where an organization needs a specific join, requires offline operation, or needs the answer the same week.&lt;/P&gt;
&lt;P data-line="238"&gt;VerseOps is offered to the community as that starting point. Issues and pull requests are welcome on the&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps/issues" data-href="https://github.com/SweetsNSavories/VerseOps/issues" target="_blank"&gt;public tracker&lt;/A&gt;; security disclosures should follow the process documented in&amp;nbsp;&lt;A href="https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/pravth/Downloads/VerseOps/VerseOps/SECURITY.md" data-href="../../SECURITY.md" target="_blank"&gt;SECURITY.md&lt;/A&gt;.&lt;/P&gt;
&lt;P data-line="240"&gt;—&amp;nbsp;&lt;EM&gt;Praveen T · maintainer,&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/VerseOps" data-href="https://github.com/SweetsNSavories/VerseOps" target="_blank"&gt;VerseOps&lt;/A&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;H3 data-line="244"&gt;References&lt;/H3&gt;
&lt;UL data-line="246"&gt;
&lt;LI data-line="246"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" data-href="https://learn.microsoft.com/power-platform/admin/power-platform-inventory" target="_blank"&gt;Power Platform inventory&lt;/A&gt;&amp;nbsp;— the in-product surface VerseOps complements&lt;/LI&gt;
&lt;LI data-line="247"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/usage" data-href="https://learn.microsoft.com/power-platform/admin/usage" target="_blank"&gt;Power Platform admin center Usage page&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="248"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-extensibility-overview" data-href="https://learn.microsoft.com/power-platform/admin/programmability-extensibility-overview" target="_blank"&gt;Programmability and extensibility overview&lt;/A&gt;&amp;nbsp;— official tooling map&lt;/LI&gt;
&lt;LI data-line="249"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-versioning-support" data-href="https://learn.microsoft.com/power-platform/admin/programmability-versioning-support" target="_blank"&gt;Versioning and support&lt;/A&gt;&amp;nbsp;— the BAP-vs-PPAC story&lt;/LI&gt;
&lt;LI data-line="250"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-whats-new-changed" data-href="https://learn.microsoft.com/power-platform/admin/programmability-whats-new-changed" target="_blank"&gt;Programmability — What's new or changed&lt;/A&gt;&amp;nbsp;— monthly release log&lt;/LI&gt;
&lt;LI data-line="251"&gt;&lt;A href="https://learn.microsoft.com/rest/api/power-platform/" data-href="https://learn.microsoft.com/rest/api/power-platform/" target="_blank"&gt;Power Platform API REST reference (latest)&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="252"&gt;&lt;A href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" data-href="https://www.nuget.org/packages/Microsoft.PowerPlatform.Management/" target="_blank"&gt;Microsoft.PowerPlatform.Management on NuGet&lt;/A&gt;&amp;nbsp;— the .NET SDK VerseOps consumes&lt;/LI&gt;
&lt;LI data-line="253"&gt;&lt;A href="https://learn.microsoft.com/connectors/powerplatformadminv2/" data-href="https://learn.microsoft.com/connectors/powerplatformadminv2/" target="_blank"&gt;Power Platform for Admins V2 connector&lt;/A&gt;&amp;nbsp;— the no-code path to the same API&lt;/LI&gt;
&lt;LI data-line="254"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/programmability-tutorial-create-daily-capacity-report" data-href="https://learn.microsoft.com/power-platform/admin/programmability-tutorial-create-daily-capacity-report" target="_blank"&gt;Tutorial: Create a daily capacity report&lt;/A&gt;&amp;nbsp;— Microsoft's own end-to-end SDK example&lt;/LI&gt;
&lt;LI data-line="255"&gt;&lt;A href="https://learn.microsoft.com/power-platform/admin/online-requirements" data-href="https://learn.microsoft.com/power-platform/admin/online-requirements" target="_blank"&gt;Power Platform URLs and IP address ranges&lt;/A&gt; — for network allow-lists&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 08 Jun 2026 13:54:14 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/power-platform-tenant-inventory-a-community-showcase-of-the-api/ba-p/4519598</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-06-08T13:54:14Z</dc:date>
    </item>
    <item>
      <title>Archiving Years of Dataverse Audit History
Before You Prune It — A Pragmatic, Open
Source Pattern</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/archiving-years-of-dataverse-audit-history-before-you-prune-it-a/ba-p/4519575</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Why the audit table is special&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The&amp;nbsp;&lt;STRONG&gt;audit&amp;nbsp;table&lt;/STRONG&gt;&amp;nbsp;is different from the rest of Dataverse in two ways that matter for an archive design:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;It’s an immutable, append-only record of&amp;nbsp;&lt;EM&gt;who changed what, when, and from where&lt;/EM&gt;&amp;nbsp;— the closest thing Dataverse has to a forensic ledger.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;The valuable part of an audit row is not the row itself; it’s the diff (old value → new value, attribute mask, related-record context). The audit row stores that diff in a packed&amp;nbsp;changedata&amp;nbsp;column, and the bound&amp;nbsp;RetrieveAuditDetails&amp;nbsp;function is what decodes it into a structured&amp;nbsp;OldValue&amp;nbsp;/&amp;nbsp;NewValue&amp;nbsp;/&amp;nbsp;ChangedAttributes&amp;nbsp;shape your downstream tools can actually query. Synapse Link with the Delta Lake profile&amp;nbsp;&lt;EM&gt;will&lt;/EM&gt;&amp;nbsp;carry the&amp;nbsp;changedata&amp;nbsp;column to the lake, but you still need a parser on the other side; this pattern calls&amp;nbsp;RetrieveAuditDetails&amp;nbsp;at archive-time so what lands in the destination is already decoded and immediately queryable.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;That combination makes the audit table the single most useful Dataverse table for:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Regulatory and compliance investigations&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;“Why did this opportunity status change in Q3 of 2022?” forensic queries (years after the fact)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Internal analytics on user behaviour and process adoption&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;It’s also the table that grows the fastest. The Dataverse default retention is 90 days, but in practice many enterprises extend that to several years — or set it to&amp;nbsp;&lt;EM&gt;never delete&lt;/EM&gt;&amp;nbsp;— to retain evidence for compliance and forensic review. The result, often after five to seven years, is an audit table holding tens of GB to multiple TB of capacity, dominating the entitlement bill, and rarely accessed in normal operations.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;At that point the storage conversation becomes unavoidable. The realistic choices are:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Keep buying entitlement.&lt;/STRONG&gt;&amp;nbsp;Predictable, but unbounded.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Move the cold tail somewhere cheaper that you control, then let Dataverse’s audit-deletion job reclaim the space.&lt;/STRONG&gt;&amp;nbsp;The hot months stay in Dataverse where users expect them; the years of historical evidence live in your own storage account, queryable when you need them.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This pattern is for option 2 — specifically, for the&amp;nbsp;&lt;EM&gt;one-time bulk export of multi-year history&lt;/EM&gt;, with the option to keep a slow trickle running afterwards if you want to top up.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;A crucial point that often gets lost: this pipeline does not need to run live. It is perfectly reasonable to be deliberately months or years behind real-time. The goal is to get a defensible copy of&amp;nbsp;&lt;EM&gt;cold&lt;/EM&gt;&amp;nbsp;data out — the rows you are about to allow Dataverse to delete — not to mirror the audit feed in real time.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;What “good” looks like for an external audit copy&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Before showing any code, here’s the rubric I held this design to. If you build your own, hold yours to the same rubric:&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;SPAN class="lia-text-color-20"&gt;Property&lt;/SPAN&gt;&lt;/th&gt;&lt;th&gt;&lt;SPAN class="lia-text-color-20"&gt;Why it matters&lt;/SPAN&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Idempotent&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Re-running the same time window must not duplicate rows. Network blips happen.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Crash-safe (exactly-once-effective)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;If the process dies mid-window, the next run must replay the same window cleanly. The watermark advances&amp;nbsp;&lt;EM&gt;only&lt;/EM&gt;&amp;nbsp;after the data is durable in the destination.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Bounded memory&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;A backlog of millions of audits cannot be loaded all at once.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Backpressure-aware&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Dataverse rate-limits aggressively. Throttle responses must not drop rows.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Observable&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Every window logs&amp;nbsp;[entity] mode=BACKLOG/LIVE, lag=Nmin, window=10min, records=N&amp;nbsp;so you can watch it work.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Sink-agnostic&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;The “where does it land” decision is config, not code. Storage choices change; the orchestrator shouldn’t.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Field-level discretion&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Audit details can carry PII. The pattern should let admins narrow which attributes leave the platform.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;The pattern&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The pipeline is conceptually four stages, repeated per entity, per time window:&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Three details in this picture do most of the resiliency work. They are deceptively simple:&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;Detail 1: Half-open time windows (ge&amp;nbsp;/&amp;nbsp;lt)&lt;/SPAN&gt;&lt;/H3&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The boundary moment (09:10:00.000) belongs to window 2, not window 1. So adjacent windows never overlap and never gap, no matter how many times you replay. This is the same trick Kafka uses for offsets — it’s why you can run the loop with confidence.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;Detail 2: The destination document key is the Dataverse&amp;nbsp;auditid&amp;nbsp;GUID&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Dataverse already assigns a globally unique GUID to every audit row. That GUID becomes the document&amp;nbsp;id&amp;nbsp;in the sink. So when you upsert the same audit twice, the second write is a no-op overwrite of the first — idempotency for free, no client-side dedupe table to maintain.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;Detail 3: The watermark moves&amp;nbsp;&lt;EM&gt;after&lt;/EM&gt;&amp;nbsp;the write, not with it&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The naive version of this pipeline does:&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;The resilient version raises a typed exception when&amp;nbsp;&lt;EM&gt;any&lt;/EM&gt;&amp;nbsp;record fails, and the watermark update is conditional on a clean write:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This single change is the difference between “best effort” and “exactly-once-effective.” It’s also the mistake most often made when people roll their own.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;Choosing where it lands&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The orchestrator is sink-agnostic — it talks to a single&amp;nbsp;AuditSink&amp;nbsp;interface (get_state,&amp;nbsp;update_state,&amp;nbsp;write_audits) and the destination is a config switch, not a code change. The reference implementation ships with four production-shaped sinks plus a no-op for testing. None of them is&amp;nbsp;&lt;EM&gt;the&lt;/EM&gt;&amp;nbsp;answer; they map to platforms enterprises already operate:&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;SPAN class="lia-text-color-20"&gt;Sink&lt;/SPAN&gt;&lt;/th&gt;&lt;th&gt;&lt;SPAN class="lia-text-color-20"&gt;When to consider it&lt;/SPAN&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Azure Cosmos DB (NoSQL API)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Operational lookups — “show me everything user X did to record Y in 2022” in milliseconds. Hierarchical partition keys (/entity&amp;nbsp;+&amp;nbsp;/auditYearMonth) keep partitions small as the archive grows over years. Document TTL doubles as a retention policy if you want one. Serverless mode suits a slow-trickle archive workload.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Azure Data Lake Storage Gen2 (Parquet)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;The cheap-cold-storage option. Years of audit history land as partitioned Parquet files (entity=…/year=…/month=…/), readable from Fabric notebooks, Synapse Serverless SQL, Databricks, or any Parquet engine. Costs scale with bytes, not throughput — ideal when the archive is rarely queried but must exist.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;OneLake (Parquet)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;Same Parquet shape as ADLS, but landed inside a&amp;nbsp;&lt;A href="https://learn.microsoft.com/fabric/onelake/onelake-overview" target="_blank"&gt;Microsoft Fabric&lt;/A&gt;&amp;nbsp;Lakehouse. Immediately queryable from a Fabric SQL endpoint, notebooks, and Power BI without further plumbing. The natural choice if your downstream BI is Fabric.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Snowflake (MERGE INTO)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;The natural choice when Snowflake is already the analytics platform of record and adding a separate Microsoft analytics estate just for audit data isn’t on the table.&amp;nbsp;MERGE INTO ... ON audit_id&amp;nbsp;keeps the same idempotency contract as the Cosmos upsert, and the warehouse stays paused between archival batches.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;No-op (logs only)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;td&gt;&lt;SPAN class="lia-text-color-20"&gt;First-day connectivity testing. Confirms the Dataverse side works before you provision any storage.&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;A reasonable default split many enterprises arrive at:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;ADLS Gen2 / OneLake&lt;/STRONG&gt;&amp;nbsp;(or&amp;nbsp;&lt;STRONG&gt;Snowflake&lt;/STRONG&gt;, if that’s your platform) holds the durable historical archive — cheap, partitioned, queryable when (rarely) needed.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Cosmos DB&lt;/STRONG&gt;&amp;nbsp;holds the most recent N months for fast operational lookup if there is a use case for it; otherwise skip it entirely.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Adding a sink for storage you already own (e.g., BigQuery, Redshift, on-prem object storage) is roughly 100 lines of Python and one factory entry.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;What real-world numbers will look like&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The worked test run above shows what a clean sandbox run looks like. Real numbers in your tenant will vary by orders of magnitude depending on:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;How many entities have auditing enabled&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;The shape of&amp;nbsp;RetrieveAuditDetails&amp;nbsp;calls (more changed attributes per row = more bytes per call)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Dataverse Web API rate limits applicable to your environment&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Concurrency you allow (max_concurrent_entities&amp;nbsp;in the config)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Sink throughput (Cosmos serverless RU autoscale, ADLS upload bandwidth, Snowflake warehouse size)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The useful operational signal is not the absolute throughput — it’s that the throughput is&amp;nbsp;&lt;EM&gt;stable&lt;/EM&gt;&amp;nbsp;and the per-window log lines tick predictably. If they don’t, look at lag, sink errors, or 429 responses from Dataverse before scaling up concurrency.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;When to reach for it (and when not to)&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Reasonable fit:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You have multiple years of accumulated audit history in Dataverse and need to move the cold tail off the platform before pruning to reclaim entitlement.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You want the&amp;nbsp;&lt;EM&gt;decoded&lt;/EM&gt;&amp;nbsp;RetrieveAuditDetails&amp;nbsp;payload (old value → new value, attribute mask, related-record context) landing in the destination ready to query — rather than the packed&amp;nbsp;changedata&amp;nbsp;column Synapse Link delivers, which still needs a parser on the consumer side.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Your analytics platform of record sits outside Azure (most commonly Snowflake) and you don’t want to add Synapse + ADLS + Spark to your stack just to land the audit table.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Synapse Link isn’t an option in your tenant — region pairing, governance review, or the cost floor of running ADLS + a Spark pool 24/7 don’t fit your environment.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You’re comfortable running this as a&amp;nbsp;&lt;EM&gt;batch job&lt;/EM&gt;&amp;nbsp;— once for the historical backfill, then perhaps quarterly or annually to top up — rather than as a live continuous feed. Being deliberately months or years behind real-time is fine and often desirable.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You want field-level control over which attributes leave the platform — useful when audit details contain regulated data.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Not a good fit:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You can run&amp;nbsp;&lt;A href="https://learn.microsoft.com/power-platform/admin/audit-data-azure-synapse-link" target="_blank"&gt;Azure Synapse Link with the Delta Lake profile&lt;/A&gt;&amp;nbsp;&lt;EM&gt;and&lt;/EM&gt;&amp;nbsp;you’re happy parsing the packed&amp;nbsp;changedata&amp;nbsp;column on the consumer side,&amp;nbsp;&lt;EM&gt;and&lt;/EM&gt;&amp;nbsp;your destination is ADLS / Synapse / Power BI. That’s the supported, first-class path for the audit table — use it.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You only need&amp;nbsp;&lt;EM&gt;current state&lt;/EM&gt;&amp;nbsp;of business tables (account, contact, opportunity). Use Synapse Link / Fabric Link — they do exactly that and you don’t need this pattern.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You need sub-second freshness in the destination. The pattern’s natural cadence is one window length (10 min in the reference config); for true real-time, use Dataverse webhooks or change-tracking APIs.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You don’t have somewhere to operate a small Python container, function, or scheduled job — even an annual one.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;You don’t have an internal owner who can be paged when the schedule fails.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-10"&gt;The reference implementation&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The code that backs this post lives at&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/DataverseAuditLogSyn" target="_blank"&gt;https://github.com/SweetsNSavories/DataverseAuditLogSyn&lt;/A&gt;&amp;nbsp;under MIT, with no warranty. The&amp;nbsp;unified-deployment&amp;nbsp;folder is the version this post describes — single Python codebase, swap sinks via&amp;nbsp;config.json, runs locally / in a container / as an Azure Function.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;If you want the implementation depth this post deliberately leaves out — exact API shapes, watermark math, partial-failure drill, sink-author checklist, hosting variants, observability hooks, and the full list of operational responsibilities a self-hosted export carries — it all lives in one place:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;A href="https://github.com/SweetsNSavories/DataverseAuditLogSyn/blob/main/unified-deployment/DESIGN.md" target="_blank"&gt;&lt;STRONG&gt;unified-deployment/DESIGN.md&lt;/STRONG&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Issues, forks, and pull requests welcome via the repo.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Generated 2026-05-14 from&amp;nbsp;&lt;A href="https://github.com/SweetsNSavories/DataverseAuditLogSyn/blob/main/docs/blog/archiving-dataverse-audit-logs.md" target="_blank"&gt;https://github.com/SweetsNSavories/DataverseAuditLogSyn/blob/main/docs/blog/archiving-dataverse-audit-logs.md&lt;/A&gt; · MIT licensed reference implementation, no warranty.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 08 Jun 2026 13:53:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/archiving-years-of-dataverse-audit-history-before-you-prune-it-a/ba-p/4519575</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-06-08T13:53:50Z</dc:date>
    </item>
    <item>
      <title>Azure OpenAI Architecture: The Decisions That Actually Matter (Part 2)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4525983</link>
      <description>&lt;H1&gt;Introduction&lt;/H1&gt;
&lt;P&gt;In Part 1 of this series, we walked through the architectural decisions that shape any Azure OpenAI / Microsoft Foundry Models workload: capacity model, deployment location, governance layer, grounding strategy, and quota engineering. Part 2 moves from decisions to discipline. Once you have made those choices, how do you make sure your design holds up to the Azure Well-Architected Framework (WAF)?&lt;/P&gt;
&lt;P&gt;The five WAF pillars — Cost Optimization, Security, Reliability, Performance Efficiency, and Operational Excellence — apply just as strongly to GenAI systems as they do to traditional cloud workloads. In fact, they matter more, because GenAI systems are not static: models are upgraded and deprecated, quotas shift, usage patterns grow unpredictably, and new capacity tiers (such as Priority Processing) are introduced while you are running in production.&lt;/P&gt;
&lt;P&gt;This post walks through each pillar in the context of Azure OpenAI in Microsoft Foundry, with best practices, common pitfalls, and the trade-offs Cloud Solution Architects (CSAs) tend to hit in real engagements. Where details are time-sensitive — pricing percentages, SLA windows, model retirement timelines, regional rollout delays — they are flagged with "At the time of writing". Always confirm current behavior against Microsoft Learn before committing to a design.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Who is this series for?&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Cloud and Solution Architects&lt;/LI&gt;
&lt;LI&gt;Platform and product owners&lt;/LI&gt;
&lt;LI&gt;Senior developers responsible for operating Azure OpenAI workloads in production&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;What you’ll learn in Part 2:&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;How each WAF pillar maps to concrete Azure OpenAI design choices.&lt;/LI&gt;
&lt;LI&gt;Where Priority Processing fits across cost and performance trade-offs (and what its eligibility constraints are).&lt;/LI&gt;
&lt;LI&gt;How to plan for model lifecycle events — upgrades, deprecations, retirements — without firefighting.&lt;/LI&gt;
&lt;LI&gt;Which signals to monitor day-to-day, and how to bake them into a GenAIOps loop.&lt;/LI&gt;
&lt;LI&gt;A WAF Decision Matrix at the end of the article, to use as a reusable checklist.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In Part 3, we will look at the part that makes GenAI architecture genuinely different from a traditional service: the platform itself never stops moving.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;We’ve also included a summary decision matrix at the end of this post for quick reference.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;1. Cost Optimization: Designing for Sustainable Scale&lt;/H1&gt;
&lt;P&gt;Cost optimization in GenAI is primarily a capacity strategy problem, not just a token-pricing problem. The first question is whether to use pay-as-you-go capacity, reserved capacity, or one of the newer tiers in between.&lt;/P&gt;
&lt;H2&gt;Reserved capacity (Provisioned Throughput Units, PTUs)&lt;/H2&gt;
&lt;P&gt;If your workload is steady or growing predictably, you can significantly reduce costs by reserving capacity up front for 1 or 3 years. At the time of writing, reservations typically yield in the range of 30–50% savings compared to hourly pay-as-you-go rates — but the exact discount depends on term length, region, and the model family, so always confirm against the current Azure pricing page.&lt;/P&gt;
&lt;P&gt;Fully utilizing a reserved (provisioned) deployment turns cloud spend into a predictable infrastructure investment, much like allocating VM or database capacity. This requires a mindset shift: treat a provisioned Azure OpenAI deployment as always-on infrastructure sized for peak demand, not as on-demand burst capacity.&lt;/P&gt;
&lt;P&gt;Importantly, PTU quota is now model-agnostic within a region. You purchase generic throughput units that can be applied to any supported model in that region, so you do not risk stranded capacity when upgrading (say, from one GPT-4 family version to a newer one) or changing model versions. Your investment follows your architecture, not a specific model endpoint.&lt;/P&gt;
&lt;H2&gt;Avoid dynamic PTU "auto-scaling"&lt;/H2&gt;
&lt;P&gt;Unlike VM-based infrastructure, dynamically scaling Azure OpenAI capacity up and down to chase cost savings is not recommended. Additional capacity is not guaranteed to be instantly available when you need to scale up, especially if other tenants are consuming the region's resources. Frequent resizing can also negate the benefits of reservations and introduce performance variability. Unused PTUs are not waste — they are headroom that absorbs burst traffic. In practice, design for the peak load and optimize through reservations rather than trying to constantly dial capacity up and down.&lt;/P&gt;
&lt;H2&gt;Batch tier&lt;/H2&gt;
&lt;P&gt;Use Batch deployments for asynchronous, non-user-facing jobs (large-scale document processing, nightly data enrichment, evals, embeddings backfills). At the time of writing, Batch can reduce cost per token by up to around 50% compared to Standard pay-as-you-go calls, in exchange for a 24-hour completion window. It also takes pressure off your real-time deployments.&lt;/P&gt;
&lt;H2&gt;Priority Processing&lt;/H2&gt;
&lt;P&gt;For workloads that need prompt responses but do not yet warrant a full dedicated PTU deployment, Azure OpenAI offers Priority Processing. Functionally, it is pay-per-token like Standard, but with SLA-backed lower and more consistent latency on the shared infrastructure.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Activation&lt;/STRONG&gt;: set the service_tier attribute on the request to "priority" (other values are "default" and "auto").&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Model eligibility:&lt;/STRONG&gt; at the time of writing, requires model versions released on or after 2025-12-01.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deployment eligibility: &lt;/STRONG&gt;only available on Global Standard or Data Zone Standard (US) deployments.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Pricing:&lt;/STRONG&gt; at the time of writing, roughly 20–40% higher per-token cost than Standard, but still meaningfully cheaper than reserving PTU for a low-volume latency-critical path.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Treat Priority Processing as the natural in-between rung: more predictable than Standard for latency-sensitive production traffic, but without the commitment and capacity-planning effort of PTU.&lt;/P&gt;
&lt;H2&gt;Putting it together&lt;/H2&gt;
&lt;P&gt;Segment your workloads by interaction pattern and performance need, then assign the most cost-efficient capacity model to each. A common anti-pattern is over-provisioning expensive real-time capacity for jobs that could run asynchronously. Evaluate whether each use case truly requires sub-second latency, or whether a longer batch window (minutes or hours) is acceptable. Use real-time capacity for customer-facing queries and time-sensitive tasks; use Batch or Priority Processing for everything else, depending on tolerance for latency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM&gt;Diagram 1 — Cost Strategy Layering]&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;2. Security: Compliance, Isolation, and Data Protection&lt;/H1&gt;
&lt;P&gt;Security in Azure OpenAI begins with deciding where your inference runs and how data is handled. This is often a compliance-driven decision before it is an architectural one.&lt;/P&gt;
&lt;H2&gt;Deployment scope&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Global deployments&lt;/STRONG&gt; — Maximize model availability and capacity by allowing Azure to route inference across regions. Pro: broad elasticity and access to the latest models. Con: data is not confined to a single geography, which may violate strict data residency requirements. Global also adds slight troubleshooting complexity, since requests can be served from various regions.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Zone deployments&lt;/STRONG&gt; — Constrain inference to a specific zone or political boundary (for example, EU-only or US-only Data Zones). Pro: a compliance-friendly middle ground — data processing stays within a defined region set (for example, entirely within the EU to satisfy GDPR), while retaining more elasticity than a single region. Con: slightly reduced model availability and capacity headroom compared to Global.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Regional deployments&lt;/STRONG&gt; — Confine inference to one Azure region. Pro: meets the most stringent data sovereignty requirements and can minimize latency for users in that region. Con: limited to the capacity and models available in one region, with no automatic overflow if the region is saturated. New model versions may also roll out to some regions later than others — at the time of writing we have observed delays of roughly 2–6 months for certain releases in specific regions; check Microsoft Learn for the current rollout schedule.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Choosing among these is a regulatory risk-management decision, not just an infrastructure preference. Engage your compliance and data governance teams early to determine the minimum scope of data movement that satisfies requirements. Many teams initially over-constrain this choice out of caution; it is often better to start with a broader deployment (Global or multi-region Data Zone) where permissible, and tighten the scope later if needed. Conversely, if your organization mandates that all data stay in-country, you might go straight to Regional and invest in architectural mitigation for its limitations (capacity planning, multi-region backup plans).&lt;/P&gt;
&lt;H2&gt;Baseline protections + defense in depth&lt;/H2&gt;
&lt;P&gt;Regardless of deployment type, Azure OpenAI provides baseline protections: it does not use your prompts or completions to train the underlying models, and all data is encrypted in transit (TLS 1.2+) and at rest (AES-256). Defense in depth is still essential — implement compensating controls at multiple layers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Redact sensitive data&lt;/STRONG&gt; from prompts (or prevent it from being entered) at the client or gateway layer. Use Azure API Management policies or custom middleware to strip out PII or secrets before requests reach the model.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apply content filtering&lt;/STRONG&gt; to both prompts and responses. Use the built-in content filters and/or Azure AI Content Safety to detect and block sensitive or undesirable input and output.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Use strong authentication and role-based access control.&lt;/STRONG&gt; Front your Azure OpenAI endpoint with Microsoft Entra ID; scope tokens with least privilege (for example, the Cognitive Services OpenAI User role or managed identity access) instead of distributing master API keys. If a credential is compromised, the blast radius is limited.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Additional best practices&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Managed Identities &lt;/STRONG&gt;— use them for any internal communication between your application and Azure OpenAI (or other Azure services like storage and databases) instead of embedding API keys. This eliminates the risk of leaking secrets and simplifies credential rotation.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Private endpoints&lt;/STRONG&gt; — enable Azure Private Link to keep traffic between your application and the Azure OpenAI service inside your virtual network and the Azure backbone, off the public internet.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Content Safety tooling&lt;/STRONG&gt; — integrate Azure AI Content Safety or custom validation functions to scan prompts and completions for policy violations or confidential data. This extra inspection layer can catch issues the base filter misses, and lets you log or modify disallowed content before it reaches the user.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In short, security for GenAI is not just about encryption or API keys — it is about reducing the blast radius of any potential breach or misuse. Confine inference to approved locations, strip sensitive data before it reaches the model, and strictly limit which identities and networks can call your endpoints.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Diagram 2 — Data Boundary Visualization]&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;3. Reliability: Designing for Change, Not Just Stability&lt;/H1&gt;
&lt;P&gt;Reliability in Azure OpenAI is as much about managing model evolution as it is about traditional uptime. Unlike static services, GenAI models are periodically updated and improved by the provider. New versions are released, older versions are deprecated and eventually retired — so a truly reliable system must plan for these changes just as carefully as it plans for hardware failures.&lt;/P&gt;
&lt;H2&gt;Model lifecycle&lt;/H2&gt;
&lt;P&gt;At the time of writing, Generally Available (GA) models are typically supported for at least 12 months after release, followed by a deprecation phase of roughly 6 months before retirement. Always confirm the current support windows on Microsoft Learn before locking in a design — these timelines have shifted in the past and may shift again as new model families ship.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;When retirement hits:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Standard deployments still pinned to a retired model (with "No Auto-Upgrade" set) stop responding to requests entirely — the API typically returns HTTP 404 (or a similar error) for that model name.&lt;/LI&gt;
&lt;LI&gt;Provisioned deployments using a retired model return HTTP 410 (Gone) errors until you manually switch them to a supported model.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In short, every model version you deploy has a built-in expiration date. Good reliability planning means never being caught unprepared by a model retirement.&lt;/P&gt;
&lt;H2&gt;Auto-upgrade modes for Standard deployments&lt;/H2&gt;
&lt;P&gt;Three modes are available:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Auto-upgrade to the latest version&lt;/STRONG&gt; — the deployment moves to the new default model version as soon as Azure makes it available. Always on a supported version, but you have no control over timing. Generally not recommended for mission-critical production workloads, since new versions can have different behavior.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Upgrade only on retirement&lt;/STRONG&gt; — the deployment stays on its current version until that version is about to be retired, then automatically switches to the latest. Recommended for most production Standard deployments: stability during the model's supported lifespan, with continuity guaranteed at retirement. You still need to test and adjust to the new version, but at least you do not face an outage if you miss the date.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;No auto-upgrade&lt;/STRONG&gt; — the deployment stays pinned to a specific version unless you change it manually. Not recommended for production: it puts the entire burden on you to track retirement timelines.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Most teams choose option 2 ("upgrade on retirement") for Standard. It allows controlled change during the model's supported period and provides a safety net at retirement. Proactively evaluate new versions for quality, performance, and cost before the forced swap, but the setting greatly reduces the risk of surprise outages.&lt;/P&gt;
&lt;H2&gt;Provisioned (PTU) migrations&lt;/H2&gt;
&lt;P&gt;Provisioned deployments do not support auto-upgrade — you must manage these migrations yourself. Azure sends retirement announcements via Azure Service Health alerts and emails, at the time of writing typically 60 days or more in advance. Have a runbook ready. Two approaches are common:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;In-place migration &lt;/STRONG&gt;— upgrade the deployment's model version through the portal or CLI. The endpoint stays the same and the model is updated behind it. Fast, no new connection string, but expect a brief disruption during the switch and rollback is not straightforward (you may need to contact support to re-enable the old version, if at all possible).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Side-by-side (blue/green) &lt;/STRONG&gt;— create a new deployment with the new model version in parallel. Gradually shift traffic (for example, 10% via APIM routing rules), monitor, and roll back instantly if needed. Maximum control and safety, at the cost of running two deployments in parallel for the migration window.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Before any model migration, verify you have sufficient PTU quota in the region for the new model. More advanced models may require more throughput units for the same workload than smaller predecessors — at the time of writing, plan for the possibility that a new generation needs roughly two times (or more) the PTUs to deliver similar throughput. Request quota increases before you hit the upgrade window, not during it.&lt;/P&gt;
&lt;H2&gt;Multi-region strategy&lt;/H2&gt;
&lt;P&gt;Consider a multi-region strategy to improve reliability during model rollouts and deprecations. New model versions do not always appear in all regions simultaneously — at the time of writing, Microsoft often launches a model in one region (frequently East US or West Europe) first.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Maintain a secondary deployment&lt;/STRONG&gt; in a "first-wave" region to evaluate new versions early.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Use a traffic manager &lt;/STRONG&gt;(Azure Front Door, Traffic Manager) to fail over to a region where the model is still available if your primary region lags behind.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Multi-region active-active &lt;/STRONG&gt;designs also protect you against single-region outages.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In essence, reliability for GenAI means designing for change. A highly reliable platform is not one that never changes; it is one that changes gracefully. Model upgrades, deprecations, and capacity adjustments should be routine, well-rehearsed events — not fire drills. Achieving this typically requires automation for detecting and applying updates, redundant deployments or regions for flexibility, and ongoing testing of new models well before your current ones retire.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Diagram 3 — Model Upgrade Strategy]&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;4. Performance Efficiency: Predictability Over Raw Speed&lt;/H1&gt;
&lt;P&gt;Performance in GenAI is multi-dimensional. It is not just about raw throughput or the fastest response on an empty system — it is about consistent, predictable latency at scale. Users care that responses are reliably snappy under load, not just fast in ideal conditions.&lt;/P&gt;
&lt;H2&gt;Performance profiles by capacity model&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Standard &lt;/STRONG&gt;(shared infrastructure) — multi-tenant, no guaranteed latency SLA. Performance fluctuates with regional demand; you may see throttling (HTTP 429) at peak. Best-effort: great for development, testing, and non-critical workloads, but not a fit for consistent low latency under spikes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Priority Processing &lt;/STRONG&gt;— also shared infrastructure, but your requests jump the queue ahead of Standard traffic. At the time of writing, this is the only pay-per-token tier with an SLA on latency. Activated by setting the service_tier attribute to "priority" on each request (other values: "default", "auto"). Requires model versions released on or after 2025-12-01 and is only available on Global Standard or Data Zone Standard (US) deployments. Pricing premium is roughly 20–40% over Standard. The natural fit for latency-sensitive workloads at intermediate scale — better than Standard, without committing to PTU.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Provisioned Throughput &lt;/STRONG&gt;(dedicated capacity) — reserved capacity with isolation from other tenants. The most consistent performance and the strongest Azure SLA on latency (typically bounded p50 and p99 within your provisioned capacity). If your application has strict response-time requirements or user-facing SLAs and the volume justifies it, PTU is the right answer.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A practical pattern: Standard for early-stage and non-critical scenarios; Priority Processing for latency-sensitive paths that have not yet earned a PTU reservation; PTU for steady, high-volume, latency-critical production traffic.&lt;/P&gt;
&lt;H2&gt;Model selection and configuration&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Model size&lt;/STRONG&gt; — smaller models generally respond faster than larger ones. Do not automatically pick the biggest model if a smaller one meets your quality bar.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;max_tokens &lt;/STRONG&gt;— capping response length caps worst-case latency and cost. A 500-token cap finishes sooner than 2000 tokens, even when users ask open-ended questions.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Sampling parameters&lt;/STRONG&gt; — low temperature (more deterministic) and a high top_p can shave a small amount of processing overhead versus highly creative or multi-sample setups. Minor compared to model size and length, but real.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Streaming responses&lt;/STRONG&gt; — enable streaming wherever possible. The first tokens arrive immediately while the model is still generating; perceived latency drops dramatically even when total time is unchanged.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Treat performance as an explicit design goal. Choose the right capacity model for the job, tune model settings to avoid unnecessary slowdowns, and do not over-engineer with a larger model than needed. A common mistake is defaulting to the biggest model "just in case". Benchmark — a smaller model with good prompt engineering often delivers a fraction of the latency at a fraction of the cost, with negligible quality loss.&lt;/P&gt;
&lt;H1&gt;5. Operational Excellence: Running GenAI as a Living System&lt;/H1&gt;
&lt;P&gt;Operational excellence in GenAI means treating your platform as a continuously evolving product. Models change, user behavior shifts, new features ship. Success requires ongoing monitoring, maintenance, and improvement processes — often called GenAIOps (or MLOps for generative AI).&lt;/P&gt;
&lt;H2&gt;Proactive monitoring&lt;/H2&gt;
&lt;P&gt;Set up Azure Service Health alerts for your Azure OpenAI / Foundry resource to be notified about service incidents and, importantly, upcoming model deprecations or retirements. At the time of writing, Microsoft typically gives around 60 days of notice for retirement events — but it is easy to miss those notifications if no one is watching. Early awareness lets you test new models and plan migrations calmly instead of reacting at the last minute.&lt;/P&gt;
&lt;P&gt;Continuously track key metrics in Azure Monitor or Application Insights, with alerts on anomalies:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Latency percentiles &lt;/STRONG&gt;— monitor p50, p95, and p99. A trend up in tail latency is an early warning of saturation or regression.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Error rates&lt;/STRONG&gt; — watch HTTP 429 (throttling) and HTTP 503 (server) error trends. Spikes signal capacity limits or service-side issues.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Capacity utilization&lt;/STRONG&gt; — for PTU, watch utilization continuously. Sustained operation near 100% means no headroom for bursts. On Standard, watch token usage against subscription limits and quotas.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Token consumption trends&lt;/STRONG&gt; — track growth over time. Helps with cost forecasting and reveals runaway usage (unexpectedly popular features, looping clients).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Useful alerting practices: alert on p99 latency breaching a threshold, on any sustained increase in 429s, or when PTU utilization regularly exceeds around 80%. Early warning lets you scale up, optimize, adjust prompts, or throttle specific users before user experience suffers.&lt;/P&gt;
&lt;H2&gt;Evaluation and reproducibility&lt;/H2&gt;
&lt;P&gt;Use the evaluation tooling in Azure AI Foundry to compare outputs from two models side by side on a fixed set of test prompts. Re-evaluate periodically — slowly degrading quality often goes unnoticed without a structured comparison.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Implement Infrastructure-as-Code (IaC) and GitOps practices &lt;/STRONG&gt;for your Azure OpenAI and supporting resources (APIM, storage, key vault, monitoring). Bicep, ARM, or Terraform templates checked into source control make environments reproducible across dev/test/prod, simplify recovery, and enable change tracking. If something breaks, you can roll back to a known-good configuration quickly.&lt;/P&gt;
&lt;P&gt;In summary, operational excellence for GenAI is about continuous learning and improvement. Embrace an AI DevOps culture: invest in monitoring, train your team on model changes, keep optimizing prompts and configurations, and refine processes after each lesson learned. The effort pays off by preventing fire-drills and keeping the platform robust as it evolves.&lt;/P&gt;
&lt;H1&gt;Final Perspective and Key Takeaways&lt;/H1&gt;
&lt;P&gt;Applying the Well-Architected Framework to Azure OpenAI forces a higher level of architectural rigor — exactly what GenAI projects in production need. Each pillar drives concrete decisions.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key takeaways from Part 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Cost Optimization&lt;/STRONG&gt; — align capacity to workload patterns. Reserve for steady, predictable load; use Batch for offline jobs; use Priority Processing for latency-sensitive paths that do not yet justify PTU; do not pay for ultra-low latency you do not need.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt; — match deployment scope (Global, Data Zone, Regional) to compliance requirements, then layer controls (network isolation, identity and access, data sanitization, content filtering) to minimize blast radius.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reliability&lt;/STRONG&gt; — anticipate continuous model evolution. Use upgrade-on-retirement for Standard, run parallel deployments for PTU migrations, and design for multi-region failover where it matters. Reliability is about avoiding surprises, not just outages.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Performance Efficiency&lt;/STRONG&gt; — choose the right capacity model, right-size models and responses, and use streaming. A smaller model with good prompt engineering often beats a bigger one on user experience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Operational Excellence &lt;/STRONG&gt;— treat the platform as a living product. Monitor, alert, automate, evaluate, and version everything as code. The discipline keeps the platform improving instead of decaying.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The organizations that succeed with Azure OpenAI / Microsoft Foundry Models are those that treat capacity planning, security and compliance, model lifecycle management, and governance as first-class design concerns — not afterthoughts. Generative AI architecture is not about deploying a model and walking away; it is about building a resilient, adaptable platform that gracefully evolves as models change and usage grows.&lt;/P&gt;
&lt;P&gt;In Part 3, we bring everything together into a comprehensive reference architecture for an enterprise-grade Azure OpenAI platform — combining scalable capacity strategies, layered security and governance, proactive lifecycle (GenAIOps) practices, and multi-region resiliency into a cohesive blueprint ready for production.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Diagram 4 — WAF pillars summary]&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;WAF Decision Matrix : Quick Reference&lt;/H1&gt;
&lt;P&gt;Use this as a checklist when reviewing or sign-off-ing an Azure OpenAI / Microsoft Foundry Models design. One row per decision; one rule of thumb per row.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Pillar&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Decision&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Watch out for&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Capacity tier mix&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Variable load → Standard. Latency-critical → Priority Processing. Offline bulk → Batch. Steady high-volume → PTU.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Single-tier platforms over-pay for elasticity or under-deliver on latency.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Cost&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Reservation term (PTU)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;1- or 3-year terms for predictable workloads; size for peak, not for average.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dynamic resizing of PTU to chase savings; capacity not guaranteed at scale-up time.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Cost&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Priority Processing eligibility&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Requires service_tier="priority", model 2025-12-01+, Global Standard or Data Zone Standard (US).&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Assuming it works on every region/model — confirm eligibility before committing the design.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Deployment scope&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;No residency rule → Global. Multi-region zone OK → Data Zone. Strict residency → Regional.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Over-constraining out of caution; or under-constraining and missing a compliance requirement.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identity and access&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Microsoft Entra ID + Managed Identity + scoped roles. No master keys in apps.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Long-lived API keys distributed across teams.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Network and data&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Private Link for in-network traffic; PII redaction at the gateway; content filtering on prompts and responses.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Public endpoints, raw PII in prompts, only relying on the built-in filter.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Reliability&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Auto-upgrade strategy&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Standard → "upgrade on retirement". PTU → planned blue/green migration with sufficient quota in advance.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pinning Standard with no auto-upgrade and forgetting; in-place PTU migration with no rollback path.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Reliability&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Multi-region&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Active-active (or first-wave secondary) for critical paths; traffic manager for failover.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Single-region production with no plan for capacity or model-rollout lag.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Capacity match&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Match capacity tier to latency target: Standard for non-critical; Priority for latency-sensitive; PTU for SLA-bound.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Expecting Standard to deliver consistent low latency under spike load.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Model and response sizing&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pick the smallest model that meets quality. Cap max_tokens. Stream responses.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Defaulting to the largest model "just in case"; long uncapped responses; no streaming.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Operations&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Monitoring and alerting&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Track p50/p95/p99, 429/503 rates, PTU utilization, and token trends. Alert on tail latency and sustained throttling.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Average-only dashboards; missed Service Health notifications for model retirements.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Operations&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;IaC and GitOps&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Bicep/ARM/Terraform under source control; reproducible dev/test/prod; pipeline-driven changes.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Click-ops in the portal; environment drift between dev and prod.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1&gt;Disclaimer&lt;/H1&gt;
&lt;P&gt;&lt;EM&gt;I am a Microsoft employee. The views and opinions expressed in this article are my own and do not necessarily reflect those of Microsoft. This content is informational and educational; it is not an official Microsoft statement, recommendation, or commitment. Service tiers, model availability, pricing, SLAs, and feature eligibility evolve — always validate against the latest Microsoft Learn documentation before making architectural decisions.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;References&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/well-architected/" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure Well-Architected Framework&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/overview" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure OpenAI in Microsoft Foundry — overview&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/provisioned-throughput" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Provisioned throughput for Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/priority-processing" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Enable Priority Processing for Microsoft Foundry Models&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/batch" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Batch deployments for Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/model-retirements" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Model deprecations and retirements&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Data, privacy, and security for Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/managed-identity" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Use managed identities with Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/cognitive-services-virtual-networks" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure Private Link for Azure AI services&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/content-safety/" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure AI Content Safety&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/genai-gateway-capabilities" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure API Management — GenAI Gateway patterns&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/monitoring" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Monitor Azure OpenAI&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/evaluation-approach-gen-ai" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Azure AI Foundry evaluation tools&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 08 Jun 2026 13:53:24 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4525983</guid>
      <dc:creator>luciacasucci</dc:creator>
      <dc:date>2026-06-08T13:53:24Z</dc:date>
    </item>
    <item>
      <title>Azure OpenAI Architecture: The Decisions That Actually Matter (Part 1)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4525976</link>
      <description>&lt;P&gt;Generative AI demos often succeed because they hide the hard parts of architecture. They usually run under ideal conditions: low, steady traffic, no sudden bursts, no competing teams, and minimal regulatory scrutiny. In production, however, Azure OpenAI systems face a very different reality – variable loads, service quotas, compliance constraints, evolving model versions, and the need for cost visibility.&lt;/P&gt;
&lt;P&gt;The difference between a great demo and a resilient production platform isn’t the model itself – it’s the early architectural decisions. The choices you make from day one determine whether your generative AI solution can handle real-world demand or buckle under pressure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Who is this series for?&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Cloud and Solution Architects&lt;/LI&gt;
&lt;LI&gt;Platform and product owners&lt;/LI&gt;
&lt;LI&gt;Senior developers responsible for operating Azure OpenAI workloads in production&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;What you’ll learn in Part 1: &lt;/STRONG&gt;We’ll walk through five foundational design decisions for Azure OpenAI, explain why they matter, and highlight key trade-offs and pitfalls we’ve seen in real-world deployments:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Capacity Model&lt;/STRONG&gt; – Choosing between Standard (PAYGO), Priority Processing, Batch, or Provisioned Throughput (PTU)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deployment Location&lt;/STRONG&gt; – Global vs. Data Zone vs. Regional hosting&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Governance Layer&lt;/STRONG&gt; – When and why to introduce a GenAI gateway&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Grounding Strategy&lt;/STRONG&gt; – When to use Retrieval-Augmented Generation (RAG)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Quota Engineering&lt;/STRONG&gt; – How to plan for service limits and avoid throttling&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In Part 2, we’ll translate these principles into concrete implementations: multi-region topologies, cost allocation strategies, observability and monitoring patterns, and other best practices for reliability, security, and DevOps in Azure OpenAI. Part 3 will connect these decisions to GenAIOps best practices to help ensure your solution is future-proof.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;We’ve also included a summary decision matrix at the end of this post for quick reference.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;1. Capacity Model: PAYGO, Priority, Batch, or Dedicated Throughput?&lt;/H1&gt;
&lt;P&gt;At the time of writing, Azure OpenAI (now part of Microsoft Foundry Models) offers four capacity models for hosting models, each with distinct cost, latency, and operational characteristics. Most production solutions combine two or more of these tiers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Standard (pay-as-you-go, shared): &lt;/STRONG&gt;Multi-tenant, elastic capacity. You pay per token, with no upfront commitment and no cost when idle.&lt;/LI&gt;
&lt;LI&gt;Pros: Simple and flexible; ideal for dev/test and for moderate or unpredictable traffic patterns.&lt;/LI&gt;
&lt;LI&gt;Cons: No guaranteed throughput or low-latency SLA – performance may vary with regional load. Under heavy usage, you may see high latency or HTTP 429 “Too Many Requests” errors due to shared capacity limits.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Priority Processing (pay-per-token, SLA-backed low latency): &lt;/STRONG&gt;A pay-as-you-go service tier that routes traffic through reserved compute, giving consistent low latency for business-critical, user-facing workloads without buying PTUs. At the time of writing, it is available on Global Standard and Data Zone Standard (US) deployments and requires recent model versions (2025-12-01 or later). It can be enabled per deployment in Microsoft Foundry, or set on individual API calls via the optional service_tier attribute (auto / default / priority) on the chat completions and responses APIs. Always confirm current model and region eligibility in the Microsoft Learn article “Enable priority processing for Microsoft Foundry Models.”&lt;/LI&gt;
&lt;LI&gt;Pros: Predictable, low-latency responses with the simplicity of pay-per-token billing – a strong fit for bursty, business-hour, or latency-sensitive traffic where PTU commitment isn’t justified. Uses the same Standard quota pool, and can be layered on top of PTU for steady-state capacity plus an elastic priority lane for spikes.&lt;/LI&gt;
&lt;LI&gt;Cons: Per-token pricing is higher than Standard PAYGO. Requires eligible deployment types and current model versions, so it is not a drop-in for legacy deployments. Like all PAYGO modes, it is still subject to TPM/RPM limits and the same throttling behaviour if quota is exhausted.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Batch (asynchronous): &lt;/STRONG&gt;Offline job processing. You submit requests in bulk (e.g., via a file) and receive results after up to 24 hours.&lt;/LI&gt;
&lt;LI&gt;Pros: Optimized for high throughput at a much lower cost (roughly 50% less per token than real-time requests at the time of writing). Batch jobs use separate “enqueued tokens” quotas, so they won’t interfere with interactive traffic.&lt;/LI&gt;
&lt;LI&gt;Cons: Not suitable for real-time use – no immediate responses or latency guarantees. Requires extra orchestration (staging requests, handling outputs). At the time of writing, Batch does not support embedding models, so vector indexing jobs must use Standard mode – always check the Azure OpenAI documentation for the latest supported model list.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Provisioned Throughput (dedicated PTUs): &lt;/STRONG&gt;Reserved, dedicated capacity. You purchase a fixed amount of capacity (Provisioned Throughput Units) and pay for it hourly, whether used or not.&lt;/LI&gt;
&lt;LI&gt;Pros: Guaranteed throughput and consistent low latency, since you’re isolated from other tenants; suitable for high-volume services with strict SLAs.&lt;/LI&gt;
&lt;LI&gt;Cons: Requires careful sizing of PTUs to match your peak demand – under-provision and you’ll still get 429s (now self-inflicted), over-provision and you pay for unused capacity. In addition, output tokens count more heavily against PTU usage (e.g., generative tokens from GPT-4 consume multiple capacity units each), so planning must account for both prompt and completion length.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;To right-size your PTU, you’ll need an estimate of the following metrics:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Requests per minute&lt;/LI&gt;
&lt;LI&gt;Average tokens per request&lt;/LI&gt;
&lt;LI&gt;Peak concurrency&lt;/LI&gt;
&lt;LI&gt;Prompt + completion token size&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;By plugging these into the Azure OpenAI PTU Calculator (linked in the References section), you can get a first estimate of the size of purchase you need to make based on your consumption.&lt;/P&gt;
&lt;P&gt;Most production solutions use a hybrid approach: for example, Provisioned capacity for steady, critical real-time traffic, Priority Processing for latency-sensitive bursts that exceed PTU headroom, Standard for overflow or early-stage apps, and Batch for large-scale offline processing. As a rule of thumb: if a user is waiting for a response, use a real-time endpoint (Standard, Priority, or PTU). Use PTU when you need strict latency consistency at high, predictable volume; use Priority Processing when you need SLA-backed low latency without committing to PTUs; use Standard for everything else interactive. If a task can be handled asynchronously, offload it to Batch to reduce cost and keep interactive systems responsive.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Pitfall – Sizing for average load instead of peak burst. &lt;/STRONG&gt;One company provisioned capacity only for typical throughput and was overwhelmed when traffic spiked ~3× beyond normal. They maxed out their PTU allocation, triggering a flood of 429 errors. Lesson: model your peak tokens-per-minute (TPM) and requests-per-minute (RPM), not just the average, and add a safety margin to avoid unexpected throttling.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Insight – Separate real-time and background workloads. &lt;/STRONG&gt;An initial version of a news analytics bot processed all articles on demand, leading to slow, costly responses. The team later moved heavy processing to Batch jobs (pre-computing article embeddings and summaries), cutting end-user latency by 80% and halving costs.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Diagram 1 – Capacity Model and Deployment]&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;2. Deployment Location: Where Does Inference Run?&lt;/H1&gt;
&lt;P&gt;After choosing the capacity model, decide where your Azure OpenAI instance is hosted. This affects latency, scalability, compliance, and model availability. Azure provides three options:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Global – &lt;/STRONG&gt;Your endpoint isn’t tied to a specific region.&lt;/LI&gt;
&lt;LI&gt;Pros: Maximum elasticity and often the best performance stability, since Azure can route traffic to any available regional capacity. You also usually get access to new model releases first on global endpoints.&lt;/LI&gt;
&lt;LI&gt;Cons: Data is processed across multiple regions (may violate strict data residency needs). Troubleshooting can be more complex when calls are served from various locations.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Zone – &lt;/STRONG&gt;Inference is restricted to a defined geography (e.g., all Azure EU regions).&lt;/LI&gt;
&lt;LI&gt;Pros: Ensures data stays within a specific political boundary for compliance (e.g., GDPR) while retaining some elasticity across multiple regional datacenters in that zone.&lt;/LI&gt;
&lt;LI&gt;Cons: Smaller capacity pool than Global, and possibly a slight delay in getting certain new model versions compared to global rollout. A good balance if you require geographic control without completely sacrificing scalability.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Regional – &lt;/STRONG&gt;Inference runs in a single Azure region that you choose.&lt;/LI&gt;
&lt;LI&gt;Pros: Strict data residency and potentially minimal latency if your users are near that region.&lt;/LI&gt;
&lt;LI&gt;Cons: No ability to burst to other regions – you are limited to one datacenter’s capacity. If that region faces high load or an outage, your service is impacted. Some model versions or features may also take longer to become available in a given region than on Global. For current model and region availability, refer to the Azure AI Foundry – Model Deployment Types documentation in the References section.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Pitfall – Over-constraining location without need. &lt;/STRONG&gt;Some teams unnecessarily default to a narrow deployment. For instance, a company chose a local Regional deployment out of habit, then discovered the Azure OpenAI model they needed wasn’t available in that region for several months, forcing a last-minute migration to a broader Data Zone. Lesson: unless you have a clear compliance or latency requirement, start with a less restrictive option (Global or multi-region Data Zone) to avoid capacity or availability issues.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example: &lt;/STRONG&gt;One enterprise began with a Global deployment for performance and simplicity, but later had to move to an EU Data Zone to meet GDPR rules, trading some elasticity for compliance. Conversely, a team that started with a single-region setup ran into scaling limits and delayed feature rollouts; they eventually reconfigured to a Data Zone to tap into a larger resource pool.&lt;/P&gt;
&lt;H1&gt;3. Governance Layer: When a GenAI Gateway Is Needed&lt;/H1&gt;
&lt;P&gt;As Azure OpenAI usage scales to multiple applications or teams, direct API calls from each app become hard to manage. A central API gateway (such as an Azure API Management instance in front of the OpenAI endpoints) is recommended to enforce enterprise policies and provide a single point of oversight. A gateway enables:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Central Authentication &amp;amp; RBAC: &lt;/STRONG&gt;Use Microsoft Entra ID for authentication instead of distributing API keys, and enforce role-based access so each app or team only accesses allowed resources.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Usage Quotas &amp;amp; Throttling: &lt;/STRONG&gt;Allocate token or request quotas per application or client. This prevents one service from monopolizing the OpenAI service and can smooth out bursts by applying backpressure (e.g., returning 429s or queueing requests) before Azure OpenAI’s own limits are exceeded.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Intelligent Routing: &lt;/STRONG&gt;Direct traffic flexibly – route most requests to a primary model deployment, send a fraction to a new model version (canary), or fail over to a secondary region or the Standard tier if the primary is constrained.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Unified Monitoring &amp;amp; Cost Management: &lt;/STRONG&gt;Log all requests in one place. This gives you a clear view of consumption by team or feature, helps with debugging, and supports internal charge-back or cost governance.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A gateway doesn’t make the model faster or more scalable by itself – it’s about control, security, and manageability, not raw performance. That said, for any multi-team or multi-application scenario, a gateway quickly becomes essential to avoid “shadow AI” deployments and chaotic usage patterns.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;When to add: &lt;/STRONG&gt;Introduce a GenAI gateway once more than one application or team is using the service, or whenever you need to enforce cross-cutting policies. Implementing it early can save a lot of headaches compared to retrofitting it later.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example: &lt;/STRONG&gt;An e-commerce company initially allowed several departments to call the Azure OpenAI API directly. Soon, they had no clear visibility into who was using how many tokens, and costs spiked unexpectedly. They deployed an APIM gateway to require proper authentication, impose per-app quotas, and log usage metrics. The result was rapid identification of the top token-consuming app (preventing it from starving others) and much better cost control.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Diagram 2 – GenAI Gateway Functionalities and deployment Location sprectrum]&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;4. Grounding Strategy: When to Use RAG (Retrieval-Augmented Generation)&lt;/H1&gt;
&lt;P&gt;Many enterprise use cases demand that the model’s answers include specific internal knowledge or citations. Retrieval-Augmented Generation (RAG) is the solution when your AI needs to ground its responses in external data. RAG works by retrieving relevant content from your own data sources and providing it to the model in the prompt:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Document Indexing: &lt;/STRONG&gt;First, collect your reference documents (files, knowledge bases, etc.) and break them into chunks, optionally adding metadata (titles, tags). Store these in a vector index or search database after transforming each chunk into an embedding vector.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Relevant Retrieval: &lt;/STRONG&gt;For each user query, create an embedding of the question and retrieve the top-matching document chunks from the index via similarity search.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Augmented Prompt: &lt;/STRONG&gt;Prepend or append the retrieved text snippets to the model’s prompt (often along with instructions to use them for reference).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;LLM Response: &lt;/STRONG&gt;The model (e.g., GPT-4) processes the augmented prompt and generates an answer that incorporates the provided reference information (often with source citations if required).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;By injecting enterprise data at prompt time, RAG can significantly reduce hallucinations and increase the factual accuracy of outputs. Users get answers that reflect real data you’ve provided, rather than just the model’s training data.&lt;/P&gt;
&lt;P&gt;However, RAG adds complexity, latency, and cost. You must maintain additional infrastructure (embedding computation and a vector store or search index). Each query now has extra steps, typically adding 200–500 ms to response time. The vector database and compute for embeddings also incur costs – industry estimates often put a full RAG pipeline at 3–5× the cost of using the base model alone, especially at scale. You’ll need a strategy for keeping your index updated as source data changes, and robust handling for cases where no relevant data is found.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;When to use RAG: &lt;/STRONG&gt;Use RAG if your model must reliably incorporate proprietary, dynamic, or highly specific information that isn’t part of its training data, or when you need to provide source references for answers. If your scenario is more open-ended or doesn’t require up-to-date factual grounding, you can often skip RAG to keep the system simpler and faster.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Pitfall: &lt;/STRONG&gt;Some teams adopt RAG by default, which can slow development and complicate the system unnecessarily. It’s often better to start with a simpler approach and add RAG later if you find the model’s answers need external support.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Examples: &lt;/STRONG&gt;One consulting firm added RAG to their internal Q&amp;amp;A bot to leverage proprietary research. Answers became more accurate, but query latency jumped to ~5 seconds due to the retrieval overhead, forcing them to optimize their embeddings pipeline and caching. Conversely, a health company launched a chatbot without RAG and discovered it gave incorrect medical answers because it couldn’t reference the latest policy documents – a failure that a RAG approach could have mitigated.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Diagram 3 – RAG High Level Flow and Anatomy]&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;5. Quota Engineering: Avoiding Bottlenecks and Throttling&lt;/H1&gt;
&lt;P&gt;The Azure OpenAI Service imposes quota limits to protect the system. If you don’t plan for these, they can become points of failure in production. Key limits include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Tokens per Minute (TPM): &lt;/STRONG&gt;Maximum tokens (input + output) your deployment can process per minute (your primary throughput cap).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Requests per Minute (RPM): &lt;/STRONG&gt;Maximum number of API calls per minute.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Concurrent Requests: &lt;/STRONG&gt;Maximum number of requests processed simultaneously.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Model-specific limits: &lt;/STRONG&gt;Certain model types have their own constraints (e.g., the maximum request rate for GPT-4 may be lower than for GPT-3.5 due to higher computational load).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you exceed these limits, Azure OpenAI will return errors – usually HTTP 429 (Too Many Requests) for quota exhaustion or 503 (Service Unavailable) if the service is stressed. In other words, hitting a quota isn’t a theoretical worry; it will result in rejected requests once you cross the threshold.&lt;/P&gt;
&lt;H2&gt;Quota Tiers and Deployment Types&lt;/H2&gt;
&lt;P&gt;Azure OpenAI uses a tiered quota system where limits depend on your subscription’s access level. Specific numeric quotas change frequently, so always verify against the Azure OpenAI Quota Guide (linked in the References section).&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Tier 1 (Default): &lt;/STRONG&gt;Standard quota allocations suitable for development and moderate production workloads. At the time of writing, GPT-4 deployments in Tier 1 commonly start at quotas in the low tens of thousands of TPM and around a thousand RPM, but exact values vary by region and model – always check the current Azure OpenAI Quota Guide for live numbers.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tier 2 and Above: &lt;/STRONG&gt;Higher quotas available through approval processes, typically for enterprise customers with demonstrated high-volume needs. These tiers can provide significantly more capacity than Tier 1; consult the Quota Guide for current multipliers and approval paths.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Standard (pay-as-you-go) deployments share regional quota pools and are subject to TPM/RPM limits that can vary by region and model. Provisioned Throughput (PTU) deployments operate differently – you purchase dedicated capacity measured in PTUs, and your throughput is determined by your PTU allocation rather than by TPM/RPM limits. PTUs still have implicit rate limits based on the processing capacity of your purchased units.&lt;/P&gt;
&lt;P&gt;The Batch API uses a separate quota system with “enqueued tokens” limits, allowing much higher total throughput (often millions of tokens per day) but without real-time guarantees.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Best practices to manage quotas:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Capacity planning: &lt;/STRONG&gt;Calculate your peak usage requirements (e.g., max prompt+completion tokens per request × peak requests per minute). Ensure your chosen plan or quota can handle this, or request an increase in advance.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Design for bursts: &lt;/STRONG&gt;Traffic often comes in waves. Aim to operate well below your limits so you can absorb sudden surges. As a guideline, keep usage under ~70% of your TPM/RPM limits during normal operation, leaving headroom for peaks. If your usage is spiking above 85% regularly at the 95th percentile, it’s time to scale up capacity or optimize usage.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Graceful degradation: &lt;/STRONG&gt;Implement exponential backoff (with jitter) on the client side when retries are necessary. This prevents a stampede of retries (a “retry storm”) that would otherwise compound the load problem. At the platform level, use queues or token-bucket rate limiters (possibly in your APIM gateway) to smooth bursts.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Circuit breakers: &lt;/STRONG&gt;Have fallback plans for extreme scenarios. Temporarily disable non-critical features or queue requests when approaching critical limits to prevent a total outage.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Example: &lt;/STRONG&gt;A fintech company’s trading chatbot ran fine in testing, but during a market surge their question volume tripled. This breached their tokens-per-minute quota and led to a flood of 429 errors. Worse, their code immediately retried each failed request without delay, intensifying the load and effectively causing a self-inflicted denial-of-service outage. They resolved it by using exponential backoff and partitioning users across multiple deployments.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Diagram 4 – Quota Engineering]&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Final Perspective and Key Takeaways&lt;/H1&gt;
&lt;P&gt;Ultimately, building a production-grade Azure OpenAI solution is much more about well-structured cloud architecture than about the model itself. An advanced model can underperform in a fragile setup, while even a basic model can excel in a solid architecture.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key takeaways from Part 1:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Plan for peak loads. &lt;/STRONG&gt;Design for the worst-case traffic (and add buffer), not the average. If you need strict performance guarantees, invest in dedicated capacity early.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Avoid unnecessary constraints. &lt;/STRONG&gt;Don’t lock into a restricted deployment unless required by compliance or latency – new models and extra capacity reach global deployments first.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Use real-time vs. batch wisely. &lt;/STRONG&gt;Real-time endpoints (Standard, Priority, or PTU) should be reserved for interactive, user-facing tasks; move large or non-urgent jobs to Batch for roughly half the cost per token (at the time of writing).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Pick the right real-time tier. &lt;/STRONG&gt;Use Priority Processing when you need SLA-backed low latency without committing to PTUs, PTU for high, predictable volumes, and Standard for everything else interactive.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement a gateway for scale. &lt;/STRONG&gt;If you have multiple applications or teams, use an API Management gateway for authentication, rate limiting, logging, and multi-region routing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Adopt RAG only if needed. &lt;/STRONG&gt;Don’t introduce a retrieval-augmented generation layer unless your application truly demands external data or source citations.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Engineer for limits and failure. &lt;/STRONG&gt;Treat rate limits and error handling as fundamental design criteria. Build in monitoring, backoff, and fallback mechanisms so the system degrades gracefully.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In short, succeeding with Azure OpenAI in production means treating it as a full-stack architecture challenge rather than just an API integration. By proactively addressing scalability, deployment, governance, data grounding, and quotas, you can turn a promising demo into a stable, cost-efficient, and compliant AI platform.&lt;/P&gt;
&lt;P&gt;In the next part, we’ll explore how to put these principles into practice – including multi-region architectures, cost-sharing strategies for teams, advanced monitoring/logging setups, and other patterns for making Azure OpenAI a robust enterprise service.&lt;/P&gt;
&lt;H1&gt;Decision Matrix: Quick Reference&lt;/H1&gt;
&lt;P&gt;Use this matrix as a fast first cut on the five Part 1 decisions. It is not a substitute for a full design review, but it captures the trade-offs most teams need to evaluate up front.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Decision&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Choose this when…&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Avoid when…&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Primary risk&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity – Standard (PAYGO)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dev/test, unpredictable or bursty traffic, MVPs, overflow&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;You need guaranteed latency or strict SLAs&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;429 throttling under shared load&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity – Priority Processing&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Latency-sensitive, business-critical real-time traffic where you don’t want PTU commitment; burst lane on top of PTU&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Deployment type / model version isn’t eligible; cost-sensitive, low-priority workloads&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Higher per-token cost than Standard; still PAYGO quota-bound&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity – Batch&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Async jobs, embeddings refresh, large offline summarization&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;User is waiting; or model is unsupported (e.g., embeddings, at the time of writing)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Up to 24h turnaround; orchestration overhead&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity – Provisioned (PTU)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;High-volume real-time workloads with strict SLAs and predictable load&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Demand is low or highly variable&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Over-/under-provisioning costs&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment – Global&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;You want widest model availability and best elasticity&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Strict data residency or regulatory constraints&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Less control over where data is processed&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment – Data Zone&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Geographic compliance (e.g., EU/US) with some elasticity&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Single-region residency is mandated&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Some lag on newest model versions&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment – Regional&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Strict data residency or co-located low-latency users&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;You need to scale beyond one region’s capacity&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Capacity ceilings and slower model rollout&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Governance – GenAI Gateway&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Multiple apps/teams, need RBAC, quotas, routing, central logging&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Single small app where overhead exceeds benefit&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adds latency and another component to operate&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Grounding – RAG&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Need proprietary, dynamic, or cited answers&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Open-ended creative tasks where freshness isn’t required&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Latency, cost, and index freshness drift&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Quota – Plan &amp;amp; Tier Up Early&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;You’re close to TPM/RPM ceilings or expecting growth&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Your peak forecast is well below current quota&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Last-minute throttling and outages&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;EM&gt;Tip: If you can only optimize for one decision in Part 1, start with capacity model and quota engineering – they are the two most common sources of production incidents we see in real deployments. Pairing PTUs (or Priority Processing) for steady, latency-sensitive traffic with Standard PAYGO for overflow is a pattern that consistently delivers both reliability and cost control.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;Disclaimer&lt;/H1&gt;
&lt;P&gt;The views expressed in this article are those of the author and do not necessarily reflect the official policy or position of Microsoft. The author is a Microsoft employee.&lt;/P&gt;
&lt;H1&gt;References&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/best-practice-guidance-for-ptu/4152133" target="_blank" rel="noopener"&gt;PTU Best Practice Guidance&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/startupsatmicrosoftblog/azure-openai-best-practices-a-quick-reference-guide-to-optimize-your-deployments/4403546" target="_blank" rel="noopener"&gt;Azure OpenAI Best Practices – Quick Reference&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/quota" target="_blank" rel="noopener"&gt;Azure OpenAI Quota Guide&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/latency" target="_blank" rel="noopener"&gt;Azure OpenAI Latency Optimization Guide&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-models/concepts/deployment-types" target="_blank" rel="noopener"&gt;Azure AI Foundry – Model Deployment Types&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/ai/playbook/solutions/generative-ai/genai-gateway/" target="_blank" rel="noopener"&gt;GenAI Gateway / APIM&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.ptucalc.com/" target="_blank" rel="noopener"&gt;Azure OpenAI PTU Calculator&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-_References" target="_blank" rel="noopener"&gt;Enable priority processing for Microsoft Foundry Models – Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 08 Jun 2026 13:53:07 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-openai-architecture-the-decisions-that-actually-matter/ba-p/4525976</guid>
      <dc:creator>luciacasucci</dc:creator>
      <dc:date>2026-06-08T13:53:07Z</dc:date>
    </item>
    <item>
      <title>Enabling AI-Driven SAP Development with GitHub Copilot: Plans and Usage-Based Billing Transformation</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enabling-ai-driven-sap-development-with-github-copilot-plans-and/ba-p/4526021</link>
      <description>&lt;H5&gt;&lt;STRONG&gt;Introduction:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Empower SAP customers with a strategic understanding of GitHub Copilot offerings, including plan options, value realization, account models, and key considerations for enterprise adoption. Through a guided, step-by-step setup in Visual Studio Code, SAP developers will gain hands-on experience with GitHub Copilot and Copilot Chat in real-world development scenarios. In addition, a practical exercise demonstrates how to configure and optimize Copilot within Visual Studio Code enabling SAP teams to effectively adopt AI-assisted development and accelerate application delivery.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Imagine you are an SAP developer working within a fast-paced enterprise environment, tasked with delivering a new feature or extension for a business-critical application, such as SAP S/4HANA or SAP BTP. With limited familiarity with the existing codebase and tight delivery timelines, ensuring quality, performance, and reliability is essential. GitHub Copilot provides a powerful AI-assisted development experience that can help SAP developers accelerate delivery while maintaining high standards. It can interpret complex code, generate documentation, and assist in writing efficient, error-free code enabling teams to meet deadlines and deliver high-quality solutions with confidence.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot plans for SAP Customers:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Starting June 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;GitHub is transitioning GitHub Copilot from a request-based billing model to a usage-based billing model.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt; For SAP customers, this shift enables more granular cost alignment with actual AI usage across development teams, supporting improved transparency and budget control within SAP programs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Organizations and enterprises can leverage this model to better manage consumption across SAP development scenarios such as S/4HANA extensions, BTP applications, and integrations while optimizing costs based on real usage patterns. Individual SAP developers will also benefit from flexible billing aligned to their actual Copilot usage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Capabilities for SAP Development:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot offers a range of capabilities designed to support SAP developers across the entire development lifecycle from coding and testing to collaboration and deployment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot in the CLI&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;: SAP developers can use a chat-like interface directly in the terminal to interact with command-line tools. Copilot provides command suggestions and explanations, helping streamline development workflows for SAP integrations, deployments, and automation tasks.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;AI-Generated Pull Request Summaries&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;: Copilot generates intelligent summaries of pull requests, highlighting key changes, impacted files, and areas requiring attention. This enables SAP teams to accelerate code reviews and improve collaboration especially in complex enterprise environments. (Not available in the Free plan.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Extensions&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Copilot Extensions allow SAP customers to integrate external tools and systems such as SAP BTP services or other enterprise platforms into the development workflow. These extensions can be customized and shared to support organization-specific SAP scenarios.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Custom Instructions&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;SAP teams can tailor Copilot responses by providing context about development standards, tools and project requirements ensuring outputs align with SAP best practices and enterprise guidelines.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Memory (Public Preview)&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Copilot can learn from and retain context about a repository, improving the relevance and quality of suggestions. This is particularly valuable for SAP projects with complex codebases and domain-specific logic.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Spaces&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Organize SAP project assets such as code, documentation, and specifications into contextual “Spaces.” This ensures Copilot delivers responses grounded in the appropriate SAP business and technical context.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot in GitHub Desktop&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Automatically generate commit messages and descriptions based on SAP code changes, improving consistency, traceability, and developer efficiency.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Agents for SAP Development:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot Chat in Visual Studio Code provides specialized agents designed to support different stages of the SAP development lifecycle ranging from planning to implementation and knowledge exploration.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Agent (Execution Agent)&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Use the Agent when you need to implement a specific SAP development task, such as building extensions, integrations, or enhancements for SAP S/4HANA or SAP BTP.&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;The Agent can autonomously identify relevant files, propose code changes, execute supporting commands, and iteratively refine outputs to complete the task efficiently.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Plan (Planning Agent)&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Use the Plan agent when you want to define a structured, step-by-step approach before implementation. This is particularly useful for SAP scenarios requiring careful design such as complex integrations or multi-system workflows. The Plan agent breaks down requirements into clear steps that can be executed by the Agent.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Ask (Knowledge Agent)&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Use the Ask agent to explore SAP-related code, development patterns, or general technical concepts without making changes. This is ideal for understanding unfamiliar codebases, learning new SAP development paradigms, or clarifying architecture and best practices.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Implementing GitHub Copilot in SAP Environments:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SAP organizations can follow a structured approach to successfully set up and scale GitHub Copilot across development teams:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:360}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Subscribe and Select the Right Plan&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Begin by subscribing to GitHub Copilot and selecting the appropriate plan (Business or Enterprise) based on your SAP landscape, governance needs, and scale of adoption.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Establish Governance and Policies&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Define organizational policies to control how GitHub Copilot is used across SAP development scenarios. This includes enabling or restricting specific features to align with compliance, security, and SAP development standards.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Configure Secure Networking&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Ensure secure connectivity by configuring proxy servers or firewalls to allow required Copilot endpoints. SAP customers may also need to manage SSL certificates to align with enterprise security requirements.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Provision Access to Development Teams&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Enable GitHub Copilot for selected SAP developers or teams such as those working on SAP BTP extensions, integrations, or modernization initiatives. A phased rollout can help identify challenges and demonstrate early value before scaling organization wide.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Drive Adoption Across SAP Teams&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Establish a structured enablement strategy including training, best practices, and internal champions to promote effective usage of Copilot within SAP development workflows. A self-service licensing model can further accelerate adoption.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Support Developer Authentication&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;In enterprise environments, ensure SAP developers complete the required authentication steps to access Copilot from their development tools, such as Visual Studio Code.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Enhance the Copilot Experience&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;SAP organizations can further optimize value by:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="o" data-font="Courier New" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Courier New&amp;quot;,&amp;quot;469769242&amp;quot;:[9675],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;o&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="2"&gt;&lt;SPAN data-contrast="auto"&gt;Integrating knowledge bases to provide SAP-specific context (Enterprise plan)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="o" data-font="Courier New" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Courier New&amp;quot;,&amp;quot;469769242&amp;quot;:[9675],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;o&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="2"&gt;&lt;SPAN data-contrast="auto"&gt;Customizing Copilot through tailored AI models aligned to SAP development needs&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="o" data-font="Courier New" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Courier New&amp;quot;,&amp;quot;469769242&amp;quot;:[9675],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;o&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="2"&gt;&lt;SPAN data-contrast="auto"&gt;Leveraging Copilot Extensions to integrate SAP tools and other enterprise systems into the development workflow&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Set Up GitHub Copilot in Visual Studio Code:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For SAP developers, setting up GitHub Copilot is a simple process:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Ensure you are using the latest version of Visual Studio Code to support modern SAP development workflows (e.g., SAP BTP and full-stack development).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;In the Status Bar, select the GitHub Copilot icon and choose Use AI Features to begin setup.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Sign in with your GitHub account and follow the authentication prompts to enable access.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If your account is already authenticated, select Set up Copilot to complete activation.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Follow the guided steps to authorize Copilot within your development environment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If no subscription is assigned, SAP developers will be onboarded to the GitHub Copilot Free plan for initial evaluation.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Once setup is complete, GitHub Copilot is ready to assist with SAP development tasks such as code generation, documentation, and optimization.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Customize GitHub Copilot Settings for SAP Development:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SAP developers can tailor GitHub Copilot behavior to align with enterprise development standards and project requirements:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Access Settings by selecting the gear icon in the lower-left corner of Visual Studio Code.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Navigate to GitHub Copilot configurations, organized into key areas:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Code Editing Settings&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Configure inline code suggestions, next-edit predictions, and language-specific behaviors to support SAP development languages and frameworks.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Chat Settings&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Customize how Copilot Chat behaves, including terminal integration helpful for managing SAP build, deployment, and integration tasks.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Agent Settings&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Control advanced capabilities such as agent mode, request limits, and tool approvals to align with SAP governance, security, and compliance requirements.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:2,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Selecting Where GitHub Copilot Agents Run in SAP Development:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In addition to selecting the appropriate Copilot agent for a specific task, SAP developers can control where the agent executes using the Agent Target option in the Chat view. This capability determines how the agent interacts with SAP development environments and when results are delivered.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Local Execution&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Runs directly within the developer’s environment with full access to the workspace, tools, and codebase. Ideal for SAP developers working on real-time coding tasks, exploring complex SAP codebases, or making controlled updates where step-by-step review is required.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot CLI (Local Background Execution)&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Executes tasks in the background on the developer’s machine. Suitable for SAP scenarios where predefined tasks such as script generation, automation, or batch updates can run while developers continue working on other SAP components.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Cloud Execution&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Runs remotely in GitHub and integrates with workflows such as issues and pull requests. This option is well-suited for SAP teams collaborating on large-scale projects, enabling developers to delegate tasks, generate pull requests, and streamline code reviews across distributed teams.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Third-Party Execution&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Uses external AI platforms (such as Anthropic or OpenAI) to run agents either locally or in the cloud. This provides flexibility for SAP customers to integrate advanced AI capabilities into their development workflows, depending on enterprise architecture and governance requirements.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Controlling Agent Permissions (for SAP Customers):&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;You can define how much autonomy your digital agents have by using the Permissions settings within the Chat experience. Adjusting these levels allows you to balance operational efficiency with governance and oversight an important consideration in SAP-driven business processes.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Permission Level&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Description&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Default Approval&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Only low-risk, read-only actions are executed automatically. Most agent-initiated actions require user confirmation, ensuring control over business-critical operations and data changes.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Bypass Approvals&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;All agent actions are automatically approved without user prompts. This setting streamlines workflows but should be used with appropriate governance controls, especially in sensitive SAP environments.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Autopilot&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Enables fully autonomous execution. The agent handles actions end-to-end, including responding to clarification requests, without user intervention. Ideal for well-defined scenarios, but requires strong trust, monitoring, and compliance alignment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Conclusion: &lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;GitHub Copilot offers SAP organizations a powerful way to modernize development through AI-assisted engineering. It combines intelligent code generation, contextual insights, and advanced features like agents, CLI integration, and memory to accelerate delivery while maintaining enterprise-grade quality and compliance.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;It’s usage-based billing model further enhances value by aligning costs with actual adoption, providing transparency, scalability, and control across scenarios such as S/4HANA extensions, SAP BTP applications, and integrations. With a structured approach, covering plan selection, governance, secure configuration, and phased rollout, organizations can integrate Copilot effectively while meeting SAP-specific standards. Ultimately, Copilot enables SAP teams to boost productivity, enhance collaboration, and drive innovation at scale, delivering faster time to market and sustained business value.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN data-contrast="auto"&gt;Reference links:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/get-started/plans" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Plans for GitHub Copilot - GitHub Docs&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/concepts/billing/usage-based-billing-for-individuals" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Usage-based billing for individuals - GitHub Docs&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/concepts/billing/usage-based-billing-for-organizations-and-enterprises" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Usage-based billing for organizations and enterprises - GitHub Docs&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 08 Jun 2026 13:52:48 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enabling-ai-driven-sap-development-with-github-copilot-plans-and/ba-p/4526021</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-06-08T13:52:48Z</dc:date>
    </item>
    <item>
      <title>Databricks Lakebase: The operational database for AI agents and apps</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/databricks-lakebase-the-operational-database-for-ai-agents-and/ba-p/4516497</link>
      <description>&lt;H2&gt;Understanding the Evolution: From Lakehouse to Lakebase&lt;/H2&gt;
&lt;P&gt;The modern data landscape has long been characterized by a fundamental schism: Online Transaction Processing (OLTP) systems, designed for high-frequency, low-latency transactions in applications, and Online Analytical Processing (OLAP) systems, optimized for complex queries, reporting, and machine learning on vast datasets. This division historically necessitated intricate and often fragile Extract, Transform, Load (ETL) processes to move and synchronize data between these disparate environments, leading to increased complexity, data duplication, and governance challenges.&lt;/P&gt;
&lt;P&gt;Databricks Lakehouse architecture emerged to unify data warehousing and data lake f&lt;/P&gt;
&lt;P&gt;unctionalities for analytical workloads, offering the flexibility of data lakes with the performance and governance of data warehouses. However, a critical piece remained: native, high-performance OLTP capabilities directly within this unified environment. This is where Databricks Lakebase enters the picture, representing a significant evolution by bringing fully managed PostgreSQL OLTP capabilities directly into the Databricks Data Intelligence Platform.&lt;/P&gt;
&lt;P&gt;Lakebase addresses the need for a single, governed platform that can seamlessly handle both transactional and analytical workloads, thereby simplifying data architectures, reducing operational overhead, and accelerating the development of real-time applications and AI agents. By integrating OLTP at the core of the lakehouse, Databricks aims to create a truly unified data and AI platform.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;1.Visualizing the architectural shift: Lakebase integrates seamlessly within the Databricks Lakehouse ecosystem.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;The Architectural Innovation: Separation of Compute and Storage&lt;/H3&gt;
&lt;P&gt;At the heart of Databricks Lakebase's efficiency and scalability lies its innovative architecture, which fundamentally separates compute from storage. Unlike traditional monolithic databases where these components are tightly coupled, Lakebase decouples them, offering distinct advantages:&lt;/P&gt;
&lt;H4&gt;Elastic Scaling and Cost Efficiency&lt;/H4&gt;
&lt;P&gt;The transactional compute layer in Lakebase is serverless and ephemeral, meaning it can scale up or down dynamically based on demand. This includes the ability to scale to zero during periods of inactivity, significantly optimizing cost by ensuring you only pay for the compute resources actively used. Data, on the other hand, is persisted directly into low-cost, durable cloud object storage (e.g., Azure Blob Storage) using open formats like Delta Lake. This design not only reduces storage costs but also prevents vendor lock-in and allows other engines within the Databricks platform to access the data directly.&lt;/P&gt;
&lt;H4&gt;Open Data Formats and Interoperability&lt;/H4&gt;
&lt;P&gt;By storing data in open formats, Lakebase ensures high interoperability within the Databricks ecosystem and beyond. This approach eliminates the need for complex and time-consuming ETL processes to move transactional data to the analytical layer, as the data is inherently accessible to both. This foundational integration streamlines data pipelines and provides a unified view of data across all workloads.&lt;/P&gt;
&lt;H3&gt;Key Technical Capabilities and Features&lt;/H3&gt;
&lt;P&gt;Databricks Lakebase offers a rich set of features that make it a compelling solution for modern data architectures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL Compatibility:&lt;/STRONG&gt;&amp;nbsp;Lakebase provides full PostgreSQL semantics, including ACID transactions, indexing capabilities, and support for standard JDBC/psql clients. This familiarity allows developers to leverage existing skills and tools, minimizing the learning curve.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fully Managed Service:&lt;/STRONG&gt;&amp;nbsp;Databricks handles the complexities of provisioning, scaling, patching, backups, and ensuring high availability, freeing up development teams to focus on application logic rather than database administration.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Managed Change Data Capture (CDC):&lt;/STRONG&gt;&amp;nbsp;A crucial feature, managed CDC ensures that operational data in Lakebase remains synchronized with Delta Lake tables for analytical consumption. This continuous synchronization is vital for keeping BI models and AI applications updated with the freshest transactional data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Autoscaling (Lakebase Autoscaling):&lt;/STRONG&gt;&amp;nbsp;The latest iteration of Lakebase features intelligent autoscaling of compute resources. It dynamically adjusts Compute Units (CU) based on various metrics like CPU load, memory usage, and working set size, preventing performance bottlenecks and out-of-memory (OOM) issues. It also supports branching and instant restore, enhancing developer agility and operational resilience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Databricks Apps Synergy:&lt;/STRONG&gt;&amp;nbsp;Lakebase is designed to serve as the transactional backend for Databricks Apps, enabling the creation and deployment of interactive applications directly on the platform, leveraging governed data and powerful analytics.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Governance, Security, and Cost Efficiency with Lakebase&lt;/H2&gt;
&lt;P&gt;Adopting Databricks Lakebase brings significant benefits in terms of data governance, security, and overall cost management, aligning with the principles of a modern data intelligence platform.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;2.Reverse ETL with Lakebase simplifies data activation for operational analytics.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;Unified Governance through Unity Catalog&lt;/H3&gt;
&lt;P&gt;One of Lakebase's most powerful integrations is with Unity Catalog, Databricks' unified governance solution. This integration provides a single pane of glass for managing data assets across the entire Databricks Data Intelligence Platform. Lakebase databases can be registered as catalogs within Unity Catalog, extending its robust governance framework to operational data. This means:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Consistent Access Control:&lt;/STRONG&gt;&amp;nbsp;Policies defined for your lakehouse data automatically apply to Lakebase, ensuring uniform security and access management across both operational and analytical workloads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Centralized Auditing and Lineage:&lt;/STRONG&gt;&amp;nbsp;Unity Catalog provides comprehensive auditing capabilities and data lineage tracking for Lakebase assets, simplifying compliance and offering transparent insights into data flows.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Simplified Security Management:&lt;/STRONG&gt;&amp;nbsp;By unifying governance, organizations can reduce the complexity of managing security policies across disparate systems, enhancing overall data security posture.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Robust Security and Data Protection&lt;/H3&gt;
&lt;P&gt;Lakebase is designed with enterprise-grade security in mind, leveraging existing cloud infrastructure and Databricks' security features:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Network Integration:&lt;/STRONG&gt;&amp;nbsp;It integrates seamlessly with cloud networking services (e.g., Azure Private Link) for secure, private connectivity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Identity Management:&lt;/STRONG&gt;&amp;nbsp;Integration with enterprise identity providers (e.g., Microsoft Entra ID) ensures secure authentication and authorization.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Encryption:&lt;/STRONG&gt;&amp;nbsp;Data is encrypted at rest and in transit, protecting sensitive information throughout its lifecycle.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;High Availability and Disaster Recovery:&lt;/STRONG&gt;&amp;nbsp;As a fully managed service, Lakebase inherently provides features for high availability and point-in-time recovery, ensuring operational resilience.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Optimized Cost Efficiency&lt;/H3&gt;
&lt;P&gt;The architectural separation of compute and storage, coupled with advanced autoscaling capabilities, contributes to significant cost savings compared to traditional database architectures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Pay-as-you-go Compute:&lt;/STRONG&gt;&amp;nbsp;With serverless and autoscaling compute, you only pay for the resources consumed during active processing, with the ability to scale down to zero when idle.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Low-Cost Storage:&lt;/STRONG&gt;&amp;nbsp;Leveraging economical cloud object storage for data persistence drastically reduces storage costs.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reduced ETL Overhead:&lt;/STRONG&gt;&amp;nbsp;By eliminating the need for complex ETL pipelines between OLTP and OLAP, organizations save on infrastructure, development, and maintenance costs associated with data movement and transformation. This can lead to reported savings of 40-50% in many environments.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Lakebase in Action: Powering Real-Time Applications and AI Agents&lt;/H2&gt;
&lt;P&gt;Databricks Lakebase opens up new possibilities for building intelligent, data-driven applications that require both transactional capabilities and deep analytical insights. Its unified approach simplifies development and accelerates time-to-market for innovative solutions.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;Real-World Use Cases&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Personalized Recommendations:&lt;/STRONG&gt;&amp;nbsp;Build real-time recommendation engines that leverage fresh transactional data from Lakebase to provide immediate and highly relevant suggestions to users.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Customer Segmentation and Real-Time Updates:&lt;/STRONG&gt;&amp;nbsp;Maintain and update customer profiles and segments in real-time, enabling personalized experiences and targeted marketing campaigns.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Feature Stores for Machine Learning:&lt;/STRONG&gt;&amp;nbsp;Utilize Lakebase as a feature store to serve low-latency features to AI models, ensuring that predictions and decisions are based on the most current data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Stateful AI Agents:&lt;/STRONG&gt;&amp;nbsp;Develop AI agents that can maintain conversational state and interact dynamically with users, using Lakebase as a reliable backend for transactional data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Order Processing Systems:&lt;/STRONG&gt;&amp;nbsp;Implement operational applications that require high-frequency reads, writes, and updates, such as order management or inventory systems, directly on the Databricks platform.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Interactive Workflow Tools:&lt;/STRONG&gt;&amp;nbsp;Create interactive data applications and dashboards that allow users to both view analytical insights and perform transactional updates within the same environment.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;A Practical Code Snippet&lt;/H3&gt;
&lt;P&gt;Developing with Lakebase feels familiar due to its PostgreSQL compatibility. Here’s a simple example demonstrating basic CRUD (Create, Read, Update, Delete) operations within a Lakebase table:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Create a schema for your application

CREATE SCHEMA app AUTHORIZATION CURRENT_USER;

-- Create a table to store session data for an AI agent

CREATE TABLE app.sessions (

  session_id UUID PRIMARY KEY,

  user_id TEXT NOT NULL,

  state JSONB NOT NULL,

  created_at TIMESTAMPTZ DEFAULT now(),

  updated_at TIMESTAMPTZ

);


-- Create an index to optimize queries on agent status

CREATE INDEX ON app.sessions ((state-&amp;gt;&amp;gt;'agentStatus'));



-- Insert a new session record

INSERT INTO app.sessions(session_id, user_id, state)

VALUES (gen_random_uuid(), 'u-123', '{"agentStatus":"active","score":0.82}');


-- Update an existing session's state

UPDATE app.sessions SET state = jsonb_set(state, '{score}', '0.91'::jsonb), updated_at = now()

WHERE user_id='u-123';


-- Query active sessions

SELECT user_id, state-&amp;gt;&amp;gt;'score' as current_score FROM app.sessions WHERE (state-&amp;gt;&amp;gt;'agentStatus') = 'active';&lt;/LI-CODE&gt;
&lt;P&gt;This SQL snippet showcases how developers can interact with Lakebase using standard PostgreSQL syntax, enabling rapid application development within the Databricks environment.&lt;/P&gt;
&lt;H2&gt;The Lakebase Advantage: Performance and Reliability&lt;/H2&gt;
&lt;P&gt;Beyond its unified architecture, Lakebase is engineered for predictable performance and robust reliability, essential for mission-critical operational applications.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;The radar chart above provides an opinionated comparison of Databricks Lakebase against traditional OLTP systems across several key attributes. Lakebase demonstrates superior performance predictability, dynamic scalability, cost efficiency, and ease of management, coupled with strong data governance due to its integration with Unity Catalog. Traditional OLTP systems, while effective for their specific purposes, often score lower in these cloud-native, unified data platform metrics.&lt;/P&gt;
&lt;H3&gt;Reliability Features for Business Continuity&lt;/H3&gt;
&lt;P&gt;Lakebase integrates several critical reliability features that ensure business continuity and data integrity:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Branching:&lt;/STRONG&gt;&amp;nbsp;This feature allows developers to create isolated, production-like environments for testing changes without affecting the main operational database. It promotes safer development practices and faster iteration cycles.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Instant Restore and Point-in-Time Recovery (PITR):&lt;/STRONG&gt;&amp;nbsp;In the event of data corruption or accidental deletion, Lakebase enables quick restoration to a previous state, minimizing downtime and ensuring data resilience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;High Availability:&lt;/STRONG&gt;&amp;nbsp;As a managed service, Lakebase is designed for high availability, with automated failover mechanisms and robust infrastructure ensuring continuous operation.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Validation and Troubleshooting: Ensuring a Smooth Lakebase Experience&lt;/H2&gt;
&lt;P&gt;Successful implementation and ongoing operation of Databricks Lakebase rely on proper validation and an understanding of common troubleshooting steps. This section provides a framework for ensuring your Lakebase deployment meets performance and reliability expectations.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/UQynsu6qklw?si=v-k54HKAoLxaBiLN/1777658794119" data-video-remote-vid="https://youtu.be/UQynsu6qklw?si=v-k54HKAoLxaBiLN/1777658794119" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FUQynsu6qklw%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DUQynsu6qklw&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FUQynsu6qklw%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&lt;EM&gt;An introductory video to Lakebase, explaining its core functionality and benefits for data apps and AI agents.&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;Key Validation Steps&lt;/H3&gt;
&lt;P&gt;After provisioning and configuring your Lakebase instance, it's crucial to perform a series of validation tests:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Connectivity Verification:&lt;/STRONG&gt;&amp;nbsp;Confirm successful connections from your applications or development tools (e.g., psql, JDBC clients) to the Lakebase instance. Ensure that Unity Catalog registration is visible and properly configured for governance.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Performance Baseline:&lt;/STRONG&gt;&amp;nbsp;Conduct baseline QPS (Queries Per Second) tests and monitor latency under expected load conditions. Validate that autoscaling events occur as anticipated and that performance targets are met.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Synchronization (CDC):&lt;/STRONG&gt;&amp;nbsp;Test the end-to-end data flow by inserting/updating records in Lakebase and verifying their timely appearance in Delta Lake tables via managed CDC. If reverse synchronization (Delta to Lakebase) is configured, validate that as well.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Governance and Security Checks:&lt;/STRONG&gt;&amp;nbsp;Confirm that Unity Catalog permissions are correctly enforced for Lakebase assets and that audit logs accurately reflect data access and modification events. Verify network security configurations (e.g., Private Link) are functioning as intended.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Common Troubleshooting Scenarios&lt;/H3&gt;
&lt;P&gt;While Lakebase is designed for stability, understanding potential issues and their resolutions is key to efficient operation:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table style="width: 1078px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Problem Area&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Symptom&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Potential Cause(s)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Troubleshooting Step(s)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;High latency, slow queries, autoscaling not triggering as expected.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Inefficient queries, missing indexes, insufficient compute resources, working set exceeding memory.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Inspect query plans, add appropriate indexes, monitor CU utilization, review autoscaling logs, consider increasing initial compute capacity if persistently underperforming.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Data Sync (CDC)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Stale data in Delta Lake, sync job failures, data inconsistencies.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect Unity Catalog permissions, CDC configuration errors, network issues, regional feature limitations.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Verify Unity Catalog access for CDC process, check CDC job logs for errors, confirm network connectivity between Lakebase and Delta Lake, consult Databricks documentation for regional CDC availability.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Connectivity&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Unable to connect from application, authentication failures.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect connection strings, firewall rules blocking access, misconfigured private endpoints, invalid credentials/tokens.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Double-check connection parameters, review network security group (NSG) and firewall rules, validate Private Link configuration, ensure correct user/service principal credentials.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Governance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Unauthorized access, unexpected data visibility, audit log discrepancies.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect Unity Catalog access policies, schema mismatches, misconfigured external locations.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Review and refine Unity Catalog grants on Lakebase catalogs and schemas, verify external location configurations, ensure consistent data object naming conventions.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Feature Limitations&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Specific PostgreSQL features or extensions not working.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Managed environment restrictions, unsupported extensions.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Consult Databricks documentation for supported PostgreSQL versions and extensions in Lakebase. Adapt application logic to use supported alternatives if necessary.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;By proactively monitoring and understanding these aspects, Cloud Solution Architects can ensure robust and efficient operation of Lakebase within their Databricks ecosystem.&lt;/P&gt;
&lt;H2&gt;Conclusion&lt;/H2&gt;
&lt;P&gt;Databricks Lakebase represents a pivotal advancement in data architecture, fundamentally reshaping how organizations approach operational and analytical workloads. By seamlessly integrating a fully managed PostgreSQL OLTP engine directly into the Databricks Data Intelligence Platform, Lakebase addresses the long-standing challenge of data fragmentation. This unification not only simplifies complex ETL processes and reduces operational overhead but also extends robust governance and security through Unity Catalog across the entire data estate. The innovative separation of compute and storage, coupled with intelligent autoscaling, delivers unparalleled cost efficiency and dynamic performance. For Cloud Solution Architects, Lakebase offers a compelling path to building scalable, real-time applications and sophisticated AI agents, leveraging fresh transactional data alongside comprehensive analytical insights—all within a single, consistent, and highly performant environment. This strategic evolution of the lakehouse architecture empowers enterprises to unlock new levels of agility, innovation, and data-driven decision-making.&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 18:23:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/databricks-lakebase-the-operational-database-for-ai-agents-and/ba-p/4516497</guid>
      <dc:creator>anishekkamal</dc:creator>
      <dc:date>2026-05-01T18:23:22Z</dc:date>
    </item>
    <item>
      <title>Service Principals in Microsoft Power Platform</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/service-principals-in-microsoft-power-platform/ba-p/4516482</link>
      <description>&lt;H4&gt;Shared Passwords Are a Ticking Time Bomb&lt;/H4&gt;
&lt;P&gt;Let’s be blunt: if your Power Platform automation runs on a shared service account password that three people know, you are one resignation away from every flow going dark, one password reset, one MFA change… That is all it takes.&lt;/P&gt;
&lt;P&gt;The fix? A &lt;STRONG&gt;service principal, &lt;/STRONG&gt;a non‑human application identity in &lt;STRONG&gt;Microsoft Entra ID&lt;/STRONG&gt; that authenticates with certificates, never logs in interactively, and keeps running no matter who leaves. In Power Platform, it shows up as an &lt;STRONG&gt;Application User&lt;/STRONG&gt; in Dataverse and can own flows, manage Power BI datasets, run Dataverse operations, and power your CI/CD pipelines.&lt;/P&gt;
&lt;P&gt;Unlike a traditional shared service account (which carries the risk of password expiration, MFA prompts breaking automation, and credentials being overshared), a service principal authenticates using certificates or client secrets, has no mailbox, no interactive login, and cannot be accidentally used by a person.&lt;/P&gt;
&lt;P&gt;For organizations running Power Automate flows, calling APIs, running Power Platform Pipelines or managing environments programmatically, service principals offer a fundamentally more secure, auditable, and manageable identity. They enable least-privilege access, integrate cleanly with Conditional Access policies, and eliminate the single point of failure that comes with tying critical automation to an individual employee's account. This lack of tether to an individual account means workloads do not need to be reassigned once someone leaves your organization. Put more simply, if your Power Platform workloads are still running under a named user or a shared "&lt;A href="mailto:svc_powerautomate@company.com" target="_blank" rel="noopener"&gt;svc_powerautomate@company.com&lt;/A&gt;" account, it's time to reconsider.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Microsoft Advisory: “Best practice is to use service principals as the preferred identity model for Power Automate wherever supported, because shared user‑based service accounts introduce security, audit, and operational risks.”&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.97533%" /&gt;&lt;col style="width: 97.9938%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this blog, we will highlight opportunities to strengthen your security posture across the Power Platform with Service Principals alongside ideas for when a Service Principal may not be applicable for your scenario.&lt;/P&gt;
&lt;H4&gt;Getting Started:&lt;/H4&gt;
&lt;P&gt;Setting up a service principal is straightforward. Everything is documented on Microsoft Learn:&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app" target="_blank" rel="noopener"&gt;Register an app in Entra ID — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/manage-application-users" target="_blank" rel="noopener"&gt;Manage application users — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-automate/service-principal-support" target="_blank" rel="noopener"&gt;Service principal owned flows — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;There are also many good blogs about step-by-step setup of the service principal, assigning permissions and assigning to an application user we won't be covering the setup here. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's go into detail how you can utilize a Service Principal to secure your Power Platform workloads.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Where Service Principals Shine in the Power Platform&lt;/H4&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;⚡&lt;/STRONG&gt;&lt;STRONG&gt; Power Automate&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In Power Automate, service principals establish durable ownership and authentication for enterprise automation. Flows run under a non‑human application identity, eliminating dependency on individual users and preventing failures caused by password rotation, MFA enforcement, or user departure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Flow Ownership:&lt;/STRONG&gt;&lt;BR /&gt;Assign the service principal as the primary owner to ensure flows continue running regardless of personnel changes. Service Principal‑owned flows require either a Process license (~$150/flow/month, stackable up to 10 for 2.5M actions/day) or pay‑as‑you‑go billing via Azure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Authentication:&lt;/STRONG&gt;&lt;BR /&gt;Service principals authenticate using client credentials, removing the standard 90‑day connection expiry. Only the client secret or certificate has an expiration, which can be configured (up to 24 months). For production workloads, store secrets in Azure Key Vault with rotation alerts.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dataverse Connector:&lt;/STRONG&gt;&lt;BR /&gt;Dataverse is the &lt;STRONG&gt;only standard connector with native service principal sign&lt;/STRONG&gt;‑&lt;STRONG&gt;in&lt;/STRONG&gt;. Selecting &lt;EM&gt;Connect with Service Principal&lt;/EM&gt; ensures all Dataverse actions execute under the application identity with full audit attribution.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Non&lt;/STRONG&gt;‑&lt;STRONG&gt;Service Principal&lt;/STRONG&gt;&lt;STRONG&gt; Connectors:&lt;/STRONG&gt;&lt;BR /&gt;Connectors such as SharePoint, Outlook, and Teams require delegated user context by design. Where app‑only execution is required, the HTTP connector can be used to call Microsoft Graph with application permissions, introducing a premium dependency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Service Principal‑Friendly&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;✓ Microsoft Dataverse (native SP sign‑in)&lt;/P&gt;
&lt;P&gt;✓ Custom connectors (app‑only OAuth)&lt;/P&gt;
&lt;P&gt;✓ HTTP via Graph API (app permissions)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;⚠ Requires User Context&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;⚠ SharePoint (standard connector)&lt;/P&gt;
&lt;P&gt;⚠ Outlook / Office 365&lt;/P&gt;
&lt;P&gt;⚠ Teams (many actions)&lt;/P&gt;
&lt;P&gt;⚠ Planner, OneDrive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-automate/service-principal-support" target="_blank" rel="noopener"&gt;Support for service principal owned flows - Power Automate | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗 &lt;A href="https://learn.microsoft.com/en-us/power-automate/dataverse/manage-dataverse-connections" target="_blank" rel="noopener"&gt;Manage connections to Dataverse — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;📱 Power Apps and Dataverse&lt;/H5&gt;
&lt;P&gt;Your Service Principal’s Application User executes Dataverse operations from flows triggered by model‑driven apps. Audit logs clearly separate automated changes from human activity. Assign custom security roles scoped to exact tables (skip System Admin), use separate Service Principalss per solution area, and know that canvas apps can trigger Service Principal‑backed flows behind the scenes.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/create-dataverseapplicationuser" target="_blank" rel="noopener"&gt;Create a Dataverse application user — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;📊 Power BI&lt;/H5&gt;
&lt;P&gt;This is where Service Principals quietly save organizations from one of the most common Power BI failures: &lt;STRONG&gt;dataset refresh breaking because the owner left&lt;/STRONG&gt;. Take over semantic model ownership via the REST API and refreshes never fail from expired tokens again.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Workspace access: add Service Principal as Member or Admin&lt;/LI&gt;
&lt;LI&gt;Semantic model ownership takeover via REST API&lt;/LI&gt;
&lt;LI&gt;Automated refresh from PowerShell, Logic Apps, Azure Data Factory, or custom apps&lt;/LI&gt;
&lt;LI&gt;XMLA endpoint access for model deployment and DAX queries (Premium/Fabric)&lt;/LI&gt;
&lt;LI&gt;App Owns Data embedding for external users without Power BI licenses&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Requirement:&lt;/STRONG&gt; Tenant admin enables “Service principals can use Fabric APIs”. Service Principal added to workspace. API refresh needs Premium, Premium Per User, or Fabric capacity.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.88273%" /&gt;&lt;col style="width: 98.179%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-bi/enterprise/service-premium-service-principal" target="_blank" rel="noopener"&gt;Automate Premium tasks with Service Principals — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-bi/connect-data/asynchronous-refresh" target="_blank" rel="noopener"&gt;Enhanced refresh REST API — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;🛠️ Application Lifecycle Management (ALM) with Pipelines&lt;/H4&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/power-platform/alm/pipelines" target="_blank" rel="noopener"&gt;Power Platform Pipelines&lt;/A&gt; are a built-in option for application lifecycle management native to the Power Platform. Pipelines bring ALM automation and continuous integration and continuous delivery (CI/CD) functionality into a native service that's designed to be usable by all members of your low-code team, regardless of technical capability. To learn how to set up pipelines in Power Platform, Microsoft has some fantastic &lt;A href="https://learn.microsoft.com/en-us/power-platform/alm/set-up-pipelines" target="_blank" rel="noopener"&gt;documentation&lt;/A&gt; as well as a &lt;A href="https://learn.microsoft.com/en-us/training/paths/simplify-power-platform-deployments/" target="_blank" rel="noopener"&gt;learning path on Learn.microsoft&lt;/A&gt; to guide you through the process.&lt;/P&gt;
&lt;P&gt;We can utilize Service Principals in Pipelines as well. By default, a pipeline deploys &lt;EM&gt;as the requesting maker,&lt;/EM&gt; meaning the maker needs elevated permissions to deploy to the target environment. Delegated deployments with Service Principals allow deployment without the maker needing elevated permissions in the downstream environment. The pipeline can run as a service principal (or pipeline stage owner), allowing makers to deploy without needing elevated permissions in target environments like production. Approvals may be required for security reasons, and can be automated or manual depending on your security requirements.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/powerplatform-api-create-service-principal" target="_blank" rel="noopener"&gt;PAC CLI: createserviceprincipal - Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;🛡️ Alternatives for Secure Workloads&lt;/H4&gt;
&lt;P&gt;While service principals offer an avenue to securing most workload scenarios on the Power Platform, they cannot cover all workload scenarios. In these cases, there are alternative approaches.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview" target="_blank" rel="noopener"&gt;Azure Logic Apps&lt;/A&gt; support system-assigned and user-assigned &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/authenticate-with-managed-identity?tabs=consumption" target="_blank" rel="noopener"&gt;managed identities&lt;/A&gt;, allowing workflows to authenticate directly to Azure resources without storing or managing any login credentials. This can offer an option when your workload can live outside Power Automate.&lt;/P&gt;
&lt;P&gt;Some teams opt to retain shared service accounts. This is not best practice, but when undertaken, there are steps to harden these accounts. Dedicated Entra Conditional Access policies to enforce MFA, restricting sign in locations and devices can provide additional protection. For password rotation, Azure Key Vault centralizes credential storage and enables automatic secret rotation, reducing the risk of stale or exposed passwords.&lt;/P&gt;
&lt;P&gt;Each of these approaches can be layered or combined with service principals depending on your organization's risk tolerance, licensing constraints, and connector support limitations.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/entra/architecture/govern-service-accounts" target="_blank" rel="noopener"&gt;Governing Entra service accounts — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;All Your Options at a Glance&lt;/H4&gt;
&lt;P&gt;Not sure which approach fits? Here is every option compared — from the gold standard to the fallback you hope to leave behind:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Option&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;MS Rec?&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Key Benefit&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Main Tradeoff&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Process License&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Gold standard. Certificate auth, clean audit.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;~$150/flow/mo. Solutions required.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Flow Groups&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes (GA May ’26)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;1 license across up to 25 flows.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Shared 250K/day action pool.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Pay-as-you-go&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Available today. No upfront cost.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Variable cost. Azure sub needed.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Hybrid: SP + SA&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pragmatic&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SP owns; SA for delegated connectors.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SA still exists for connections.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Med‑High&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Hardened SA Only&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;No&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Simplest and no migration needed.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Interactive login risk. MS discourages.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Low&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Logic Apps + MI&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes (diff product)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Zero credentials. Consumption billing.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Full platform migration required.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;⚠ All costs are approximate and vary by enterprise agreement. Verify with your Microsoft representative.&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Microsoft‑validated:&lt;/STRONG&gt; The dedicated service account fallback is a supported approach, not a workaround. Any alternative to service principals would need to be designed and accepted at the customer’s own risk.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 2.1306%" /&gt;&lt;col style="width: 97.8385%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Summary&lt;/H4&gt;
&lt;P&gt;Service principals replace shared, user‑based accounts with a non‑human application identity that is secure, auditable, and resilient. Eliminating password risk, improving governance, and ensuring Power Platform workloads continue running independent of employee lifecycle events&lt;/P&gt;
&lt;P&gt;across the entire platform. The result is higher security, operational stability, and governance consistency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;The Bottom Line&lt;/H4&gt;
&lt;P&gt;Service principals are not optional polish. They are how Microsoft expects you to run enterprise automation in 2026. One Entra ID app registration. Four products. Zero shared passwords.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Blocking interactive admin logins is correct.&lt;/STRONG&gt; No supported scenario requires it.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.88273%" /&gt;&lt;col style="width: 98.179%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Hybrid model when needed.&lt;/STRONG&gt; Service Principals where supported, hardened service accounts where not. Both documented by Microsoft.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 2.06792%" /&gt;&lt;col style="width: 97.9938%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Start with pay‑as‑you‑go.&lt;/STRONG&gt; Pilot a batch. Measure costs. Then commit. No upfront purchase needed.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.85288%" /&gt;&lt;col style="width: 98.1162%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Authors: &lt;/STRONG&gt;Sheldon Dsouza + Marc Lotorto | &lt;STRONG&gt;Contributors: &lt;/STRONG&gt;Rasha Al-Silmi, Ahmed Shaalan, Josh Flicker&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;All guidance aligned with Microsoft Learn and validated by Microsoft Advisory, April 2026&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 17:18:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/service-principals-in-microsoft-power-platform/ba-p/4516482</guid>
      <dc:creator>Shdsouza</dc:creator>
      <dc:date>2026-05-01T17:18:09Z</dc:date>
    </item>
    <item>
      <title>The Journey of Copilot: From Setup to Mastery for Azure SAP customers</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/the-journey-of-copilot-from-setup-to-mastery-for-azure-sap/ba-p/4516485</link>
      <description>&lt;H3&gt;&lt;STRONG&gt;Introduction: &lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;GitHub Copilot integrates as an extension or plugin within developer tools commonly used in SAP and Azure scenarios, such as Visual Studio, Visual Studio Code, and other supported IDEs. These tools are often used alongside SAP development (e.g., ABAP, CAP, or integrations with S/4HANA and Azure services).&lt;/P&gt;
&lt;P&gt;Before you begin, ensure you have access to Copilot, through an organizational license (common in enterprise environments).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Install GitHub Copilot&lt;/STRONG&gt;&lt;/H3&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 1: Install Required Extensions&lt;/STRONG&gt;&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Visual Studio Code&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Go to &lt;STRONG&gt;Extensions&lt;/STRONG&gt; (Ctrl + Shift + X)&lt;/LI&gt;
&lt;LI&gt;Install the following extensions:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot Chat&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot for Azure&lt;/STRONG&gt; (Microsoft extension)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/OL&gt;
&lt;P&gt;When installing the Azure extension, it may prompt you to install additional Azure tools, &lt;STRONG&gt;accepting all required components&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 2: Sign in and Authenticate&lt;/STRONG&gt;&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;Sign in to your &lt;STRONG&gt;GitHub account&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Sign in to your &lt;STRONG&gt;Azure account&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Complete authentication in the browser&lt;/LI&gt;
&lt;LI&gt;Return to VS Code&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Both logins are required:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub → enables Copilot&lt;/LI&gt;
&lt;LI&gt;Azure → enables Azure resource access and tools&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 3: Enable and Verify Setup&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Copilot Chat&lt;/STRONG&gt; (Ctrl + Alt + I)&lt;/LI&gt;
&lt;LI&gt;Check that Copilot is active&lt;/LI&gt;
&lt;LI&gt;Verify Azure integration by typing a test prompt:&lt;/LI&gt;
&lt;LI&gt;What Azure resources are deployed and running in my subscription?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you get a response → setup is successful&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 4: Configure Azure Context (Important for SAP)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Set your &lt;STRONG&gt;Azure tenant / subscription (Entra ID)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Ensure correct environment for:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;SAP on Azure (S/4HANA, SAP NetWeaver)&lt;/LI&gt;
&lt;LI&gt;SAP BTP extensions&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Optional: Enable &lt;STRONG&gt;Agent Mode&lt;/STRONG&gt; for automation tasks (deployments, scripts)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Get Started in Your SAP Development Environment&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Open your preferred IDE (Visual Studio, VS Code, or Eclipse with SAP tooling)&lt;/LI&gt;
&lt;LI&gt;Access the &lt;STRONG&gt;Copilot chat or assistant panel&lt;/STRONG&gt; within the IDE&lt;/LI&gt;
&lt;LI&gt;Sign in with your GitHub account (and organizational account if required)&lt;/LI&gt;
&lt;LI&gt;Start using Copilot in your SAP development scenarios&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Use Copilot for SAP Workloads&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Inline suggestions&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Get real-time code suggestions for SAP-related languages (e.g., JavaScript, Java, ABAP extensions, CAP models)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Ask questions in chat&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Understand existing logic, SAP APIs, or integration patterns (e.g., “Explain this service” or “How does this SAP function work?”)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate and improve code&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Create boilerplate logic, unit tests, and integration code faster&lt;/LI&gt;
&lt;LI&gt;Identify performance or design improvements in existing SAP code&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Enhance with SAP Context&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Provide &lt;STRONG&gt;additional context&lt;/STRONG&gt; (files, APIs, or SAP objects) to improve suggestions&lt;/LI&gt;
&lt;LI&gt;Optionally connect Copilot to &lt;STRONG&gt;SAP data or services&lt;/STRONG&gt; using enterprise integrations&lt;/LI&gt;
&lt;LI&gt;Use Copilot to support:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;SAP BTP extensions&lt;/LI&gt;
&lt;LI&gt;S/4HANA integrations&lt;/LI&gt;
&lt;LI&gt;Fiori/UI5 development and APIs&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;Once you start interacting with Copilot, it acts as an AI assistant within your SAP development workflow, helping you write code faster, understand existing logic, and accelerate innovation across your SAP and Azure landscape.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;The Hidden Layer: Network Configuration for SAP Customers&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;As you begin using GitHub Copilot within your SAP development and integration environment, you may notice performance differences, especially when working within corporate networks. In most cases, Copilot connects securely to GitHub services over the internet using HTTPS, without requiring additional setup. However, in SAP enterprise environments where strict governance, security policies, and compliance controls are in place, network traffic is often routed through proxies, firewalls, or VPNs.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;What You Need to Know&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Copilot may require additional configuration when operating behind corporate proxies or firewalls&lt;/LI&gt;
&lt;LI&gt;Proxy settings can be configured:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Directly within your IDE&lt;/LI&gt;
&lt;LI&gt;Or through environment variables such as HTTP_PROXY and HTTPS_PROXY&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Authentication to enterprise proxies may require:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Basic credentials&lt;/LI&gt;
&lt;LI&gt;Or enterprise mechanisms such as Kerberos-based authentication&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;Enterprise Considerations for SAP Landscapes&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Organizations may require custom SSL certificates for secure outbound connections&lt;/LI&gt;
&lt;LI&gt;Network security policies may restrict access to external services&lt;/LI&gt;
&lt;LI&gt;Required Copilot and GitHub endpoints must be allowed to ensure connectivity&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Why This Matters for SAP Customers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In SAP environments especially those involving S/4HANA, SAP BTP, or hybrid/on‑premise systems network security is tightly controlled. Proper configuration ensures that Copilot can securely interact with external services while still complying with enterprise security standards. Once configured correctly, Copilot integrates seamlessly into your SAP development workflow, enabling secure, reliable, and high‑performance AI-assisted development within your governed enterprise environment.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Configure Network Settings (if required) for Azure SAP Environments&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;In Azure‑hosted SAP landscapes (such as S/4HANA on Azure, SAP BTP, or hybrid environments), network configuration plays a critical role in enabling GitHub Copilot securely. Network setup is primarily required in enterprise environments where security controls such as proxies, firewalls, VPNs, or Azure networking policies are enforced.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Default Behavior&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub Copilot connects securely over HTTPS&lt;/LI&gt;
&lt;LI&gt;No additional configuration is required in open network environments&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Proxy &amp;amp; Enterprise Network Configuration&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If your Azure SAP environment uses controlled outbound access:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Configure proxy settings:
&lt;UL&gt;
&lt;LI&gt;HTTP_PROXY&lt;/LI&gt;
&lt;LI&gt;HTTPS_PROXY&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Directly within your IDE (Visual Studio, VS Code)&lt;/LI&gt;
&lt;LI&gt;Or via environment variables:&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Supported authentication methods:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Basic authentication&lt;/LI&gt;
&lt;LI&gt;Kerberos (common in enterprise identity setups)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Additional considerations:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Ensure required GitHub/Copilot endpoints are &lt;STRONG&gt;allowed&lt;/STRONG&gt; in Azure firewall or network security groups&lt;/LI&gt;
&lt;LI&gt;Install &lt;STRONG&gt;custom SSL certificates&lt;/STRONG&gt; if your organization uses SSL inspection&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;Visual Studio typically inherits &lt;STRONG&gt;Windows/Azure VM proxy settings&lt;/STRONG&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Troubleshooting Network Issues in Azure SAP Scenarios&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;If Copilot stops responding or behaves inconsistently, the issue is often related to enterprise network controls in Azure or hybrid SAP architectures.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Common Causes&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Proxy or firewall blocking outbound connectivity&lt;/LI&gt;
&lt;LI&gt;SSL certificate validation failures&lt;/LI&gt;
&lt;LI&gt;VPN or private network restrictions (ExpressRoute / private endpoints)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;Quick Diagnostics: &lt;/STRONG&gt;Test connectivity from your Azure VM or development machine:&lt;/H6&gt;
&lt;P&gt;curl --verbose https://copilot-proxy.githubusercontent.com/_ping&lt;/P&gt;
&lt;H6&gt;&lt;STRONG&gt;If using a proxy: &lt;/STRONG&gt;curl --verbose -x http://PROXY:PORT -i -L https://copilot-proxy.githubusercontent.com/_ping&lt;/H6&gt;
&lt;P&gt;HTTP 200 → Connectivity is working&lt;/P&gt;
&lt;P&gt;Errors → Network blocking or configuration issue&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Recommended Troubleshooting Steps&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Verify proxy settings are correctly configured&lt;/LI&gt;
&lt;LI&gt;Check SSL certificates and trust chain&lt;/LI&gt;
&lt;LI&gt;Review Azure firewall, NSG, or proxy rules&lt;/LI&gt;
&lt;LI&gt;Validate required endpoints are reachable&lt;/LI&gt;
&lt;LI&gt;Enable verbose logs or diagnostics in your IDE for deeper analysis&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Best Practice for Azure SAP Customers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Adopt a structured troubleshooting approach:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Validate connectivity&lt;/LI&gt;
&lt;LI&gt;Trace the network path (proxy, firewall, DNS)&lt;/LI&gt;
&lt;LI&gt;Fix configuration issues systematically&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This aligns with the governance and operational discipline already used in SAP and Azure environments.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Outcome: A Confident Copilot User in Azure SAP&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;By following this approach, you move beyond basic usage and gain full control of Copilot within your enterprise landscape.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;You will be able to:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Deploy and use Copilot across Azure SAP environments&lt;/LI&gt;
&lt;LI&gt;Integrate it securely within enterprise networking constraints&lt;/LI&gt;
&lt;LI&gt;Troubleshoot issues with confidence using systematic diagnostics&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;GitHub Copilot is no longer a black box, it becomes a trusted, secure, and intelligent AI assistant seamlessly integrated into your Azure and SAP development ecosystem. As you adopt it into your workflow, development becomes faster, cleaner, and more efficient. More importantly, you gain a reliable partner that enhances productivity and supports innovation, ensuring that you are no longer coding alone, but collaborating with AI to deliver better outcomes.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Reference links:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension" target="_blank" rel="noopener"&gt;https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/visualstudio/ide/visual-studio-github-copilot-get-started?view=visualstudio" target="_blank" rel="noopener"&gt;Get Started with GitHub Copilot - Visual Studio (Windows) | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/developer/github-copilot-azure/get-started?pivots=visual-studio-code" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/developer/github-copilot-azure/get-started?pivots=visual-studio-code&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/concepts/network-settings" target="_blank" rel="noopener"&gt;Network settings for GitHub Copilot - GitHub Docs&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/how-tos/troubleshoot-copilot/troubleshoot-network-errors" target="_blank" rel="noopener"&gt;Troubleshooting network errors for GitHub Copilot - GitHub Docs&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/github-copilot-for-sap-abap-in-vs-code-setup-guide-for-on-premise-teams/ba-p/14365497" target="_blank" rel="noopener"&gt;GitHub Copilot for SAP ABAP in VS Code: Setup Guid... - SAP Community&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 17:17:14 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/the-journey-of-copilot-from-setup-to-mastery-for-azure-sap/ba-p/4516485</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-05-01T17:17:14Z</dc:date>
    </item>
    <item>
      <title>VDI, Teams, and what’s changing in 2026: VBSS becomes VMSS, and eCDN lands in the core license</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/vdi-teams-and-what-s-changing-in-2026-vbss-becomes-vmss-and-ecdn/ba-p/4515981</link>
      <description>&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Audience:&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Mission Critical customers running Microsoft Teams on&amp;nbsp;virtualized&amp;nbsp;desktop platforms (Citrix, AVD, Windows 365, VMware/Omnissa&amp;nbsp;Horizon).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;TL;DR:&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Two Teams-on-VDI changes are converging:&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is already in Public Preview today&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as the successor to VBSS in the new VDI solution for Teams (&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;Microsoft Learn&amp;nbsp;-&amp;nbsp;Screen sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;), and&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;is now included in Teams&amp;nbsp;core&amp;nbsp;license&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;. This post previews the guidance our Support for Mission Critical (SfMC)&amp;nbsp;Cloud Solution Architects&amp;nbsp;(CSAs) are already walking customers through&amp;nbsp;-&amp;nbsp;because the cost of finding these issues in production is always higher than finding them in a pilot.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Why&amp;nbsp;we’re&amp;nbsp;flagging this now&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SfMC exists to get ahead of changes like these. The&amp;nbsp;SfMC CSA&amp;nbsp;role is built on a simple&amp;nbsp;principle:&amp;nbsp;be a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;trusted advisor&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;embedded alongside the customer team, not a reactive support line.&amp;nbsp;SfMC CSAs&amp;nbsp;work hand-in-hand with platform, network, security and service-ownership teams to build a deep&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;“know-me”&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;picture of the customer&amp;nbsp;-&amp;nbsp;their gold-image strategy, their VDI vendors, their peering topology, their CAB cadence, the history of what was tried and what didn’t stick. That context is the reason a readiness review lands in weeks, not months:&amp;nbsp;your SfMC CSA&amp;nbsp;isn’t&amp;nbsp;starting from&amp;nbsp;zero,&amp;nbsp;they’re&amp;nbsp;starting from knowing the estate.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Goodbye VBSS, hello VMSS&amp;nbsp;-&amp;nbsp;and&amp;nbsp;it’s&amp;nbsp;here now&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Teams on VDI&amp;nbsp;has&amp;nbsp;used&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Video Based Screen Sharing (VBSS)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for years&amp;nbsp;-&amp;nbsp;an efficient, encoded video stream for screen shares. That approach is being replaced by&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Virtual Machine Screen Sharing (VMSS)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as part of Microsoft’s&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This&amp;nbsp;isn’t&amp;nbsp;a future roadmap item&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is available in Public Preview today&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;across Azure Virtual Desktop, Windows 365,&amp;nbsp;Citrix&amp;nbsp;and Amazon&amp;nbsp;WorkSpaces, with&amp;nbsp;Omnissa&amp;nbsp;following. Microsoft’s guidance and support matrix is live on Microsoft Learn:&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;New VDI solution for Teams&amp;nbsp;-&amp;nbsp;Screen sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;. If you have&amp;nbsp;users on&amp;nbsp;a pilot ring on VDI, you can light this up now, simply by activating Public Preview for them.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;Spot the screen sharing stream no longer being offloaded to client side slimcore&lt;/img&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Support depends on three things moving together: the Teams client on the session host, the&amp;nbsp;virtualization&amp;nbsp;vendor’s&amp;nbsp;optimization&amp;nbsp;component&amp;nbsp;(Citrix HDX / AVD Multimedia Redirection / VMware-Omnissa&amp;nbsp;Media Optimization), and the endpoint client (Windows App, Citrix Workspace App, Horizon Client). Where any one of those lags, screen share quietly falls back to a lesser modality&amp;nbsp;-&amp;nbsp;&lt;STRONG&gt;users&amp;nbsp;don’t&amp;nbsp;raise&amp;nbsp;tickets,&amp;nbsp;they just tolerate worse quality&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Because VMSS is already in preview,&amp;nbsp;there’s&amp;nbsp;a real window to get this right before it becomes the default path. On Mission Critical engagements,&amp;nbsp;SfMC CSAs are already sitting with customer teams on&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS readiness reviews&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: confirming client and plugin versions across the gold-image estate, rebuilding CQD dashboards so the baseline survives the cutover, and flagging any inline network appliance that still assumes the old VBSS flow. The “know-me” picture the&amp;nbsp;SfMC CSA&amp;nbsp;has built up makes that work fast&amp;nbsp;-&amp;nbsp;they already know which plugin versions the desktop team is running and which CAB window the next image refresh lands in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;is now in the core Teams&amp;nbsp;license&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;-&amp;nbsp;previously a paid add-on&amp;nbsp;-&amp;nbsp;is now included in&amp;nbsp;the&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Teams&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;core&amp;nbsp;license.&amp;nbsp;It’s&amp;nbsp;a WebRTC-based peer-to-peer mesh that offloads large-scale town halls and live events from the corporate WAN by peering video between clients on the same site.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If the business case for the add-on&amp;nbsp;never&amp;nbsp;cleared, that objection is gone. But “included”&amp;nbsp;doesn’t&amp;nbsp;mean “working”.&amp;nbsp;The failure mode we see is consistent: customers enable&amp;nbsp;eCDN&amp;nbsp;because “it’s free now”,&amp;nbsp;but the peering never works&amp;nbsp;-&amp;nbsp;because the client-to-client path is blocked by security controls nobody remembers adding. The town hall runs, the WAN still&amp;nbsp;saturates,&amp;nbsp;the CIO asks why the thing that was supposed to fix it&amp;nbsp;didn’t.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;Example eCDN portal dashboard&lt;/img&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;The VDI infrastructure question&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Both changes elevate something that has always mattered but rarely been tested:&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VDI-to-VDI network reachability&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;. The new Teams client needs to talk to&amp;nbsp;Microsoft&amp;nbsp;365 media endpoints (usually already open)&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;and&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;to other VDI instances on the same site for&amp;nbsp;eCDN&amp;nbsp;peering.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That second requirement is where customers are consistently caught out. Most VDI builds treat each session host as an island&amp;nbsp;-&amp;nbsp;east-west traffic between session hosts is blocked by NSG, hypervisor&amp;nbsp;firewall, or micro-segmentation policy, because it was never needed. With&amp;nbsp;eCDN&amp;nbsp;in the box,&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;it is now needed&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;and the blocks are often in places the&amp;nbsp;virtualization&amp;nbsp;team&amp;nbsp;doesn’t&amp;nbsp;own.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is where&amp;nbsp;working&amp;nbsp;hand-in-hand&amp;nbsp;with the customer team pays off. The&amp;nbsp;SfMC&amp;nbsp;CSA&amp;nbsp;convenes the platform, network, and security owners, translates the platform change into each team’s language, and makes sure nothing falls through the gaps between them. The specific hostnames, IP ranges, UDP/TCP port requirements, and&amp;nbsp;peering-group configuration are all on Microsoft Learn (links below)&amp;nbsp;-&amp;nbsp;the&amp;nbsp;hard work&amp;nbsp;is&amp;nbsp;operationalizing&amp;nbsp;them against&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;your&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;estate, and&amp;nbsp;that’s&amp;nbsp;the work your&amp;nbsp;SfMC CSA&amp;nbsp;is built to drive.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;two or more&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;of these apply to your estate, book the conversation with your&amp;nbsp;SfMC CSA&amp;nbsp;now:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Client version sprawl&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;multiple Teams versions in flight across gold images, or a long tail of unpatched Citrix Workspace App / Windows App / Horizon Client.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Missing or partial CQD data&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;gaps in building/subnet mapping, “unknown” network location for a meaningful share of streams, dashboards still filtered on legacy VBSS modality tags.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Recent east-west&amp;nbsp;firewall&amp;nbsp;changes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;new micro-segmentation rollout, zero-trust project, or NSG rule consolidation in the last 12 months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Recent live-event pain&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;WAN saturation, buffering, or&amp;nbsp;join&amp;nbsp;failures&amp;nbsp;on&amp;nbsp;the last town hall.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;No&amp;nbsp;eCDN&amp;nbsp;subnet map&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;, or a map that predates your current site/subnet topology.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Proxy or TLS-inspection changes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;forcing&amp;nbsp;Teams&amp;nbsp;media through an inspection device rather than bypassing it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VPN&amp;nbsp;full-tunnel&amp;nbsp;without&amp;nbsp;eCDN&amp;nbsp;VPN exclusion&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="8" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Upcoming&amp;nbsp;large&amp;nbsp;broadcast&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;in the next 90 days.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Closing thought&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is in Public Preview today and&amp;nbsp;eCDN&amp;nbsp;is already in your Teams&amp;nbsp;license. The window to pilot,&amp;nbsp;validate&amp;nbsp;and harden is open right now&amp;nbsp;-&amp;nbsp;and it closes the moment either of these becomes the default path for your users.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That’s what&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Support for Mission Critical&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is built for:&amp;nbsp;Cloud Solution Architects&amp;nbsp;working shoulder-to-shoulder with your team as trusted advisors, investing the time to genuinely know your estate&amp;nbsp;-&amp;nbsp;your platforms, your people, your change windows, your risks&amp;nbsp;-&amp;nbsp;so that when a shift like VMSS or&amp;nbsp;eCDN&amp;nbsp;arrives, the remediation plan is already half-written. Not a&amp;nbsp;ticket-shop. A partnership.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;you’re&amp;nbsp;running Teams on VDI at scale and you&amp;nbsp;haven’t&amp;nbsp;had the VMSS +&amp;nbsp;eCDN&amp;nbsp;conversation with your SfMC&amp;nbsp;CSA&amp;nbsp;yet&amp;nbsp;-&amp;nbsp;that’s&amp;nbsp;the next call to book.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;References&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="9" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams&amp;nbsp;-&amp;nbsp;Screen sharing (VMSS, Public Preview)&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="10" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams (overview)&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/vdi-2&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="11" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Teams for VDI&amp;nbsp;-&amp;nbsp;install requirements&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/teams-client-vdi-requirements-deploy" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/teams-client-vdi-requirements-deploy&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="12" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;networking requirements&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/ecdn/technical-documentation/network-requirements" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/ecdn/technical-documentation/network-requirements&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="13" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;eCDN&amp;nbsp;peering groups and restrictions&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/ecdn/how-to/set-up-peering-groups" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/ecdn/how-to/set-up-peering-groups&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="14" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft 365 URLs and IP address ranges&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/urls-and-ip-address-ranges" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoft-365/enterprise/urls-and-ip-address-ranges&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 30 Apr 2026 07:50:02 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/vdi-teams-and-what-s-changing-in-2026-vbss-becomes-vmss-and-ecdn/ba-p/4515981</guid>
      <dc:creator>jchristie</dc:creator>
      <dc:date>2026-04-30T07:50:02Z</dc:date>
    </item>
    <item>
      <title>Enterprise Security Assessment: A Strategic Lens for Mission Critical Environments</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enterprise-security-assessment-a-strategic-lens-for-mission/ba-p/4515991</link>
      <description>&lt;H2&gt;Understanding Enterprise Security at Scale&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;Understanding security posture at scale requires more than isolated control reviews or point‑in‑time assessments. The Enterprise Security Assessment (ESA) helps organizations understand their security posture across Azure, Microsoft 365, and hybrid environments from a true enterprise perspective. Instead of assessing individual services or workloads in isolation, ESA provides a &lt;STRONG&gt;single, enterprise‑wide view of security&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;By examining identity, data security, endpoints, threat protection, and cloud infrastructure together, ESA helps uncover gaps that often span multiple teams and platforms. This broader perspective enables clearer prioritization, stronger alignment across security teams, and a more resilient foundation for long‑term security improvement.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;ESA complements other Microsoft assessments, such as workload‑specific reviews, by connecting the bigger picture - to align security priorities across teams and platforms, fostering a more cohesive and resilient security approach.&lt;/P&gt;
&lt;H2&gt;From Standard Engagement to Strategic Partnership&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;An &lt;STRONG&gt;Enterprise Security Assessment&lt;/STRONG&gt; is typically delivered as a focused engagement designed to establish an enterprise‑wide view of security posture. At Microsoft, we begin by reviewing &lt;STRONG&gt;Secure Score insights&lt;/STRONG&gt;, analyzing a defined set of core security datasets, and correlating those signals across Azure and Microsoft 365.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;For many organizations, this approach works well. Collecting and evaluating these datasets provides a high‑level understanding of security posture, highlights common gaps, and identifies priority improvement areas. In standard enterprise environments, ESA delivers actionable insights with minimal disruption and sets a solid foundation for security improvements.&lt;/P&gt;
&lt;H3&gt;How ESA Evolves in Mission‑Critical Environments&lt;/H3&gt;
&lt;P class="lia-align-justify"&gt;In large or mission‑critical environments, security is often distributed across multiple teams and tools. Operational constraints, regulatory requirements, and business dependencies introduce complexity that standard assessments cannot fully capture.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;For mission‑critical customers, ESA goes beyond a baseline review and becomes more consultative. This typically includes:&lt;/P&gt;
&lt;P&gt;📝&lt;STRONG&gt; Structured discovery sessions&lt;/STRONG&gt; across multiple security domains&lt;/P&gt;
&lt;P&gt;🤝&lt;STRONG&gt; Deep‑dive workshops&lt;/STRONG&gt; with specialized teams&lt;/P&gt;
&lt;P&gt;🎯&lt;STRONG&gt; Validation of findings &lt;/STRONG&gt;against real‑world operating models&lt;/P&gt;
&lt;P&gt;🔄&lt;STRONG&gt; Iterative analysis&lt;/STRONG&gt; to validate findings against real operational conditions&lt;/P&gt;
&lt;P&gt;This ensures recommendations reflect how security is actually managed, not just how it is documented.&lt;/P&gt;
&lt;H3&gt;Why Going Deeper Matters to Customers&lt;/H3&gt;
&lt;P class="lia-align-justify"&gt;For organizations operating at scale, this consultative ESA approach delivers significantly more than a standard readout:&lt;/P&gt;
&lt;UL class="lia-align-justify"&gt;
&lt;LI&gt;A realistic, enterprise‑wide &lt;STRONG&gt;understanding of security posture&lt;/STRONG&gt;, grounded in actual configurations and operating models&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear visibility &lt;/STRONG&gt;into cross‑team &lt;STRONG&gt;dependencies and systemic risks&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Prioritized recommendations&lt;/STRONG&gt; aligned to existing licenses, third‑party tools, and regulatory requirements&lt;/LI&gt;
&lt;LI&gt;A realistic, &lt;STRONG&gt;phased security roadmap focused on adoption&lt;/STRONG&gt;, not theory&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-align-justify"&gt;The result is a clear starting point for security improvements that teams can execute with confidence.&lt;/P&gt;
&lt;H2&gt;A Continuous Improvement Model&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;ESA is not a one‑time exercise. For most customers, it becomes the foundation for ongoing security maturity.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;Once a baseline is established, future ESAs are faster and more efficient, allowing organizations to track progress, validate improvements, and maintain alignment as environments evolve. Over time, ESA functions as an annual enterprise security health check, supported by follow‑up reviews and continuous improvement.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;In mission‑critical environments, this means:&lt;/P&gt;
&lt;UL class="lia-align-justify"&gt;
&lt;LI&gt;The &lt;STRONG&gt;first ESA requires deeper engagement investment&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Building &lt;STRONG&gt;cross-team alignment takes time&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Future assessments become smoother and more efficient&lt;/STRONG&gt; once a baseline is established&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-align-justify"&gt;Over time, ESA functions as an enterprise security health check that supports continuous improvement. It works best when treated as a &lt;STRONG&gt;starting point for continuous improvement&lt;/STRONG&gt;, and Enterprise Security Alignment.&lt;/P&gt;
&lt;H2&gt;What Customers Gain from an Enterprise Security Assessment&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A true enterprise view&lt;/STRONG&gt;&lt;BR /&gt;Visibility across identity, data, devices, cloud workloads, and threat signals - without losing sight of critical details.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A customized security roadmap&lt;/STRONG&gt;&lt;BR /&gt;Recommendations aligned to existing licenses, third‑party tools, hybrid footprints, and regulatory requirements - making adoption realistic, not aspirational.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;Momentum and measurability&lt;/STRONG&gt;&lt;BR /&gt;Many organizations track progress using dashboards or scorecards to measure improvement and sustain focus over time.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;Repeatability&lt;/STRONG&gt;&lt;BR /&gt;Once a baseline is established, future ESAs become easier and more efficient - serving as a regular health check rather than a brand‑new effort.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A consultative model&lt;/STRONG&gt;&lt;BR /&gt;ESA delivers far more value than a one‑time assessment by fostering collaboration, shared understanding, and long‑term alignment.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;A Foundation for Continuous Improvement&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;Enterprise security is complex, especially at scale. In &lt;STRONG&gt;mission‑critical environments&lt;/STRONG&gt;, security success depends on embracing complexity, aligning teams, and moving beyond a standard assessment playbook.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;An Enterprise Security Assessment is more than a snapshot. It’s an opportunity to build alignment, inform strategy, and create a &lt;STRONG&gt;resilient security foundation&lt;/STRONG&gt; that evolves with the organization.&lt;/P&gt;</description>
      <pubDate>Wed, 29 Apr 2026 21:34:39 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enterprise-security-assessment-a-strategic-lens-for-mission/ba-p/4515991</guid>
      <dc:creator>lakprasad</dc:creator>
      <dc:date>2026-04-29T21:34:39Z</dc:date>
    </item>
    <item>
      <title>SharePoint Automatic Version History Cleanup (Intelligent Versioning)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-automatic-version-history-cleanup-intelligent/ba-p/4514011</link>
      <description>&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What is SharePoint Automatic Version History Cleanup?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint Automatic Version History Cleanup&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is a feature in Microsoft 365 (SharePoint Online and OneDrive) that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;automatically manages and prunes file version history&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;based on the age of versions and file activity. It is part of the “Version History Limits” functionality that gives admins control over how many versions to keep and for how long. When this&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;mode is enabled (often referred to as&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Intelligent Versioning&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;), SharePoint will no longer&amp;nbsp;retain&amp;nbsp;every single version up to the static limit indiscriminately. Instead, it will&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“thin out” older versions over time&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, keeping a higher density of recent versions and progressively fewer versions as they age. This ensures that most day-to-day edits&amp;nbsp;remain&amp;nbsp;recoverable, while redundant or stale versions from long ago are cleaned up.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Crucially, automatic cleanup&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;does not require administrators or users to manually&amp;nbsp;delete&amp;nbsp;versions or set specific limits&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for each library. In the traditional model (Manual versioning), admins or site owners had to configure each library to keep a fixed number of versions (with a minimum of 100) and&amp;nbsp;possibly specify&amp;nbsp;a time-based deletion for older versions. In contrast, the Automatic setting uses built-in logic to manage versions&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;dynamically&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Microsoft’s internal testing and customer feedback guided this feature to address the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;major pain point of runaway version storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;while&amp;nbsp;maintaining&amp;nbsp;“strong recoverability” for files.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Key characteristics of Automatic (Intelligent) Versioning:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Time-based retention algorithm:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;It looks at the age of each version and the file’s edit frequency to decide which versions to keep. Recent changes are kept in detail,&amp;nbsp;whereas&amp;nbsp;older changes are pruned, keeping only periodic snapshots.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Dynamic, ongoing cleanup:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;As new versions are created, older ones are evaluated and trimmed automatically in the background. This is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;not a one-time job&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, but a continuous policy&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;is applied&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;to the library.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Wider recovery window with fewer versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Users still have access to versions spanning a long&amp;nbsp;time period&amp;nbsp;(e.g.&amp;nbsp;many months or years), but without the full count of every minor change. The system preserves&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;important restore points&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(like the first version of each week or day), assuming those are more valuable for recovery than every tiny edit.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Storage space optimization:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;By cutting down on redundant older versions, organizations see dramatic storage savings. Microsoft reports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;up to a 96% reduction in version storage over a 6-month period&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;using automatic trimming, compared to keeping all versions under a 500-count limit.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Still protective of current versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;The most recent versions (within the last days or weeks) are&amp;nbsp;generally all&amp;nbsp;retained. The&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;current&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;file version is never&amp;nbsp;deleted&amp;nbsp;by the system, and recent version history&amp;nbsp;remains&amp;nbsp;robust for auditing and quick rollback needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Applies to Office documents (and more):&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Intelligent versioning is particularly beneficial for Office files (Word, Excel, PowerPoint) that save&amp;nbsp;frequently, but it works for any files in SharePoint/OneDrive.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How the Automatic Cleanup Algorithm Works&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;When&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic version limit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is in effect, SharePoint uses a built-in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;tiered retention algorithm&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;based on version age. In simple terms,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;the older a version is, the less&amp;nbsp;frequently&amp;nbsp;it’s&amp;nbsp;kept&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Here is a summary of the default intelligent retention logic:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Age of File Version&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Retention by Automatic Cleanup&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;0–30 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep all versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Every saved version from the last&amp;nbsp;30 days&amp;nbsp;is preserved&amp;nbsp;(upto&amp;nbsp;500 versions). This ensures you can track all recent changes in detail.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;31–60 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep hourly versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;For versions in this range, the system prunes away some duplicates, aiming to&amp;nbsp;retain&amp;nbsp;roughly one&amp;nbsp;version per hour of edit activity. In practice, if multiple versions were saved within the same hour, only the latest from that hour might be kept.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;61–180 days&amp;nbsp;old (2–6 mo.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep daily versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Versions older than two months get further thinned out to about one per day, preserving a daily snapshot of the&amp;nbsp;file’s&amp;nbsp;state.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Over&amp;nbsp;180 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep weekly versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Very old&amp;nbsp;versions (beyond ~6 months) are trimmed to approximately one per week,&amp;nbsp;maintaining&amp;nbsp;a weekly snapshot over&amp;nbsp;long periods.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This tiered approach means that if a file is actively edited,&amp;nbsp;you’ll&amp;nbsp;have&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all of&amp;nbsp;its versions from the past month&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, then a representative sampling of versions as you go back in time (hourly→daily→weekly). In effect, the algorithm removes redundant intermediate saves that are&amp;nbsp;likely low-value&amp;nbsp;(e.g.&amp;nbsp;dozens of near-identical saves due to auto-save in&amp;nbsp;a short period) while&amp;nbsp;still keeping&amp;nbsp;a timeline of the document’s evolution. If a file&amp;nbsp;hasn’t&amp;nbsp;been edited in a long time, its last saved versions will remain available at least until they hit the weekly or daily thresholds.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Maximum Number of Versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Even under Automatic mode,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint will not keep more than 500 versions of a file&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. This is a hard cap that&amp;nbsp;remains&amp;nbsp;in place for now. If a file continues to be edited very heavily over months or years, hitting 500 versions, the oldest versions will be trimmed to honor the cap. In practice, however, most files are unlikely to hit 500 retained versions under the automatic algorithm, because many interim versions would already be pruned by age. The 500 limit&amp;nbsp;mainly serves&amp;nbsp;as a safety net.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Expiration Labels in Version History UI:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Once you switch a library or site to Automatic limits, you may notice in the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version History&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;view that older versions get an “expiration date” label. These dates&amp;nbsp;indicate&amp;nbsp;when a given version is scheduled to be removed by the algorithm. For example, a version might show “Expires on 5/10/2026”, meaning the system will automatically&amp;nbsp;delete&amp;nbsp;it on that date (unless it gets preserved longer due to other rules).&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;The most recent version is never assigned&amp;nbsp;an expiration&amp;nbsp;date&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(it does not expire at all), and very new versions may show “Never&amp;nbsp;expires” until they age beyond the no-trim window.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Example of Automatic Cleanup in Action&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Imagine a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;project plan (Excel file)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that multiple team members edit daily over the course of&amp;nbsp;the year. Under the old policy (500 versions, no&amp;nbsp;expiration), if the team saves changes&amp;nbsp;frequently, they might hit 500 versions in a few months, after which SharePoint starts dropping the oldest versions on each new save. If the editing is less frequent, they might not hit 500 for a long time, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;versions (even trivial ones) from throughout the year remain, eating storage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic version cleanup enabled&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, SharePoint will keep every version for the first&amp;nbsp;30 days&amp;nbsp;of rapid collaboration, then automatically trim and compress the version history:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After a few months,&amp;nbsp;you’ll&amp;nbsp;still have&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;complete daily snapshots&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;of how the file looked each day, but not every single save from, say, 4 months ago.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After a year, you might have weekly snapshots&amp;nbsp;remaining&amp;nbsp;from the early months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;The team can restore the file to any week in the past year, or any day in the past 6 months, or any hour in the past&amp;nbsp;60 days, etc., giving ample recovery points.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;The storage used by this&amp;nbsp;file’s&amp;nbsp;version history will be dramatically lower than it would be under the old scheme (potentially just a few dozen versions&amp;nbsp;retained&amp;nbsp;instead of hundreds). In Microsoft’s example, automatic trimming yields&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;~96% storage reduction&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for versions over six months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;From the user perspective,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;nothing special needs to be done&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;— version cleanup happens behind the scenes. Users still go to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version History&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on a document and see a list of versions, but with fewer ultra-fine-grained ones as they get older. Admins benefit by not having to constantly&amp;nbsp;monitor&amp;nbsp;or manually&amp;nbsp;delete&amp;nbsp;old versions to free space.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Configuring Automatic Version History Cleanup in SharePoint Online&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Setting up Automatic version cleanup requires adjusting your SharePoint Online&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;versioning settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;at the&amp;nbsp;appropriate level.&amp;nbsp;Here’s&amp;nbsp;how to configure it:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Organization-Level Default Setting (SharePoint Admin Center)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;To enable intelligent version management across your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;tenant&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;navigate to&amp;nbsp;your&amp;nbsp;SharePoint admin center&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version history limits.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Once this is saved,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint Online will use Automatic (intelligent) version limits by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on any&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;new&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;libraries created in your tenant. Existing sites and libraries, however,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;do not retroactively change&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;just by toggling this setting. They will continue with their current versioning settings until you update them (see below).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Verifying the setting:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;It may take some time for the new setting to propagate. You can confirm that&amp;nbsp;it’s&amp;nbsp;in effect by creating a new document library on a site (after enabling Automatic) and checking the library’s version settings or testing with a file.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If for any reason you need to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;switch back&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to manual settings globally, you can do so similarly in the Admin Center by choosing the manual&amp;nbsp;option&amp;nbsp;and specifying the number of versions and&amp;nbsp;expiration&amp;nbsp;days (if any). By&amp;nbsp;default&amp;nbsp;that might revert to 500 versions, no&amp;nbsp;expiration. You can also manage this via PowerShell (see next section).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Site-Level and Library-Level Configuration&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;There are scenarios where you might not want to use the organization’s default for every site or library. SharePoint allows breaking the inheritance:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Site-level limits:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;A SharePoint site (site collection) can have its own&amp;nbsp;version&amp;nbsp;history policy that overrides the&amp;nbsp;tenant by&amp;nbsp;default for all libraries in that site. However, as of now,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft’s UI does not&amp;nbsp;provide&amp;nbsp;a direct way to&amp;nbsp;set&amp;nbsp;site-level versioning in the admin center&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. You must use PowerShell cmdlets to configure a&amp;nbsp;site’s&amp;nbsp;setting. For example, to enable Automatic mode on a specific site (if the tenant default is not already automatic), you would run:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;This flags that site to use automatic version limits for new libraries. (Add the -ApplyToExistingDocumentLibraries&amp;nbsp;switch if you want to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;apply it to all current libraries on that site&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as well. Otherwise, existing libraries&amp;nbsp;remain&amp;nbsp;as they were, and only newly created libraries on that site use the new policy.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Library-level limits:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Site owners or admins can configure individual document libraries to have their own version limit settings, overriding both site and org defaults for that library. This is done either through the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Library Settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;in the SharePoint site UI or via PowerShell. In the&amp;nbsp;library’s&amp;nbsp;settings page (under&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“Versioning settings”&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;), modern SharePoint should expose fields for the version limit and&amp;nbsp;expiration&amp;nbsp;if the admin has allowed that. For example, you might set one specific library to manual 100 versions, while the rest of the site follows Automatic, or vice versa, depending on needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;In PowerShell, you can use Set-SPOListVersionPolicy&amp;nbsp;to manage a specific&amp;nbsp;library’s&amp;nbsp;policy. For instance, to turn on Automatic for one library:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Or to set a manual limit on a library (say 200 versions, no&amp;nbsp;expiration):&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;You can also specify a time limit (ExpireVersionsAfterDays) in combination with the version count if needed.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep in mind that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;lowering version&amp;nbsp;limits on&amp;nbsp;an existing library does not instantly&amp;nbsp;delete&amp;nbsp;all the extra versions above the new threshold&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Instead, SharePoint will trim them&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;gradually&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as new versions are added, to avoid large sudden deletions. According to Microsoft, if you reduce a library’s limit from 500 to 300, the next time someone edits a file that has, say, 500 versions, the system will purge up to 20 of the oldest versions on that save, then another 20 on the next save, and so on until the file complies with the 300 limit. This process prevents performance issues from mass deletion. (If you want immediate cleanup of a huge backlog of versions, consider using the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;trim job&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;approach&amp;nbsp;below.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Using PowerShell for Tenant-Level Settings&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For completeness, note that you can enable or disable the automatic versioning feature across the tenant via PowerShell as well. The relevant property is&amp;nbsp;EnableAutoExpirationVersionTrim&amp;nbsp;on the tenant:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;To&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;enable Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;globally (equivalent to selecting Automatic in Admin Center):&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;This turns on the new “intelligent” version limits at the org level. After running this, you would typically also specify what you want the manual limits to&amp;nbsp;be,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;in case&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;you switch back or for any site still using manual. By&amp;nbsp;default&amp;nbsp;when turning on auto, SharePoint sets the global&amp;nbsp;MajorVersionLimit&amp;nbsp;to 500 and&amp;nbsp;ExpireVersionsAfterDays&amp;nbsp;to 0 (no time limit) behind the scenes.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;To&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;disable Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and revert to manual, you might run:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;(This example sets a manual policy of 500 versions, no&amp;nbsp;expiration. Adjust the numbers as&amp;nbsp;needed, and&amp;nbsp;note the UI minimums of 100 versions /&amp;nbsp;30 days&amp;nbsp;if&amp;nbsp;setting&amp;nbsp;via&amp;nbsp;UI.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;There are also PowerShell cmdlets to apply settings in bulk to sites. For example, you can iterate through all site collections and activate intelligent versioning for each one using a loop with Set-SPOSite&amp;nbsp;-EnableAutoExpirationVersionTrim&amp;nbsp;$true, as&amp;nbsp;demonstrated&amp;nbsp;in the SharePoint Diary blog. Use caution with such&amp;nbsp;scripts, and&amp;nbsp;run them in batches or during off-hours if you have many sites.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Trimming Existing Version History (On-Demand Cleanup Jobs)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Enabling Automatic mode will govern the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retention of new versions going forward&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. But what about&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;old versions that already&amp;nbsp;exist&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;from&amp;nbsp;before you changed the setting? Those will not magically disappear the moment you switch modes. For example, if a library had 400 versions of a file and you turned on auto (or lowered the manual limit to 100), those 400 will still be there until new edits trigger the algorithm to clean up gradually. In some&amp;nbsp;cases&amp;nbsp;you might want to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;immediately&amp;nbsp;reclaim storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by clearing out old versions in bulk, according to the new policy or other criteria. This is where SharePoint’s&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Trimming Jobs&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;come in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;On-demand trimming&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;allows admins to explicitly remove versions from existing files in a site or library. Microsoft provides PowerShell cmdlets to&amp;nbsp;queue&amp;nbsp;these jobs, which run asynchronously on the server to&amp;nbsp;delete&amp;nbsp;versions matching certain filters. There are three types of trim operations you can choose from:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Manual&amp;nbsp;expiration&amp;nbsp;trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Delete&amp;nbsp;versions older than a specified date threshold (e.g., remove all versions older than 180 days).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Manual count-based trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Delete&amp;nbsp;the oldest versions exceeding a specified count (e.g., keep the latest 100 versions and remove the rest).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Automatic trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Apply the same&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;intelligent algorithm&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to existing versions. This will simulate what the Automatic mode would have done and remove the excess versions accordingly (older ones may be outright&amp;nbsp;deleted&amp;nbsp;or assigned&amp;nbsp;expiration&amp;nbsp;dates depending on their age).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;To use these,&amp;nbsp;you’d&amp;nbsp;run commands like:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Trim versions older than&amp;nbsp;180 days&amp;nbsp;on an entire site&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOSiteFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Identity https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;DeleteBeforeDays&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;180&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;3&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Trim to a count limit of 100 on a specific doc library&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;4&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOListFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Site https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;List&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;"&amp;lt;LibraryName&amp;gt;"&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;MajorVersionLimit&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;100&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;5&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Apply the automatic algorithm to trim versions on a site&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;6&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOSiteFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Identity https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Automatic&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;These jobs permanently&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;delete&amp;nbsp;the matching versions&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(bypassing the recycle bin, so they cannot be recovered once trimmed). Microsoft therefore strongly recommends running a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“What-if” analysis&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;first: you can generate a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Storage Report&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for a site or library and then simulate the trim to see how many versions would be&amp;nbsp;deleted&amp;nbsp;and how much space saved. This helps&amp;nbsp;validate&amp;nbsp;that you&amp;nbsp;won’t&amp;nbsp;accidentally remove something critical. The “What-if” process involves an auditing cmdlet (New-SPOSiteFileVersionExpirationReportJob) that produces a CSV of versions and their would-be deletion status under given rules, which you can review.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Trimming jobs run in the background and can take a significant amount of time for large libraries (possibly hours&amp;nbsp;or days), particularly if thousands of versions are being evaluated. They tend to run during off-peak hours automatically. You can check the status of a job via PowerShell or the SharePoint admin center (there’s&amp;nbsp;a page listing&amp;nbsp;version&amp;nbsp;trim jobs&amp;nbsp;and their progress).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Important:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Always inform site owners before trimming&amp;nbsp;versions, and&amp;nbsp;ideally take a backup or export of version history if the content is&amp;nbsp;mission-critical. Once a version is&amp;nbsp;deleted&amp;nbsp;by a trim job,&amp;nbsp;it’s&amp;nbsp;gone for good (unless you restore the entire site from a backup). Trimming is irreversible and bypasses the recycle bin&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-fontsize="12"&gt;1&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Best Practices for Managing Version History in SharePoint Online&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For IT administrators and power users managing SharePoint, here are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;best practices and considerations&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to get the most out of version history while avoiding pitfalls:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Adopt Automatic Versioning for Most Scenarios:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Microsoft and real-world experience&amp;nbsp;indicate&amp;nbsp;that the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic (Intelligent) mode is&amp;nbsp;optimal&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for&amp;nbsp;the majority of&amp;nbsp;use cases. It&amp;nbsp;greatly reduces&amp;nbsp;storage bloat while preserving the ability to recover recent and important versions. Make this your organization’s default unless you have a compelling reason not to. Many organizations have switched this on tenant-wide to curb runaway storage growth from versioning.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Use Manual Limits Where Necessary:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;There may be cases where a manual policy fits better. For example, a compliance-sensitive library might be&amp;nbsp;required&amp;nbsp;to keep&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;versions for at least 7 years, or conversely you might have a library of large video files where you only want the last 5 versions to save space. In such cases, set a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;specific manual limit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(with or without&amp;nbsp;expiration)&amp;nbsp;appropriate to&amp;nbsp;the scenario. For instance, you might configure 50 versions for a library with huge files, or “200 versions or 2 years” for a regulatory archive library.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Document these&amp;nbsp;deviations&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;so you remember why they differ from the default.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Don’t&amp;nbsp;Go Below 100 Versions/30 Days (UI Enforced Minimum):&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;SharePoint&amp;nbsp;Online’s&amp;nbsp;interface&amp;nbsp;won’t&amp;nbsp;let you set extremely low limits – the rationale is to prevent administrators from accidentally setting a policy that could wipe out too much version history. Under the hood you can technically force lower values via APIs, but Microsoft strongly&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;recommends against&amp;nbsp;using less than 100 versions or trimming earlier than&amp;nbsp;30 days&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Such aggressive limits could result in losing important recent edits and defeat the purpose of having version history. Stick to reasonable values that align with your recovery needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Educate Users on Versioning Impact:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Ensure that site owners and users understand that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;versioning consumes storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. They should know that frequent saves (especially with AutoSave turned on) will generate many versions. This&amp;nbsp;isn’t&amp;nbsp;to discourage saving (the answer is not to turn off versioning!), but to reinforce why your organization manages versions the way it does. Users can also manually&amp;nbsp;delete&amp;nbsp;unnecessary versions from a file’s history if they know certain drafts or changes are not needed – though anything they&amp;nbsp;delete&amp;nbsp;manually goes to recycle bin for a period in case they made a mistake.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Leverage Reporting Tools:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Take advantage of the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Storage Usage report&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that Microsoft provides. This report can be run per site to see which libraries or files are consuming the most space via version history.&amp;nbsp;It’s&amp;nbsp;useful for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;identifying&amp;nbsp;hotspots&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(e.g., a single file with 800+ versions taking 10 GB) and can guide you in applying proper limits or cleaning up. Before doing a large trim, always run the “what-if” analysis report to gauge impact.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Plan for Retention and Compliance:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Be aware that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retention policies and legal&amp;nbsp;holds&amp;nbsp;override version trimming&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If a SharePoint site or an item is subject to a retention policy (through Microsoft Purview Compliance Center) or placed on eDiscovery hold, then&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;no versions can be permanently&amp;nbsp;deleted&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by any limit until that retention period is over. (Microsoft’s documentation explicitly&amp;nbsp;states:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“For items under a retention policy or hold, the document library’s versioning limits are ignored.”&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) This means your storage might continue to grow in those compliance scenarios.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Best practice:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;coordinate with your compliance officers – if certain sites need infinite retention, you might leave their version limits looser (or just accept that storage will climb). Conversely, if you implement trimming, ensure it&amp;nbsp;doesn’t&amp;nbsp;conflict with any data retention requirements. The good news is that if a trim job&amp;nbsp;encounters&amp;nbsp;a version that is under retention/hold, it&amp;nbsp;won’t&amp;nbsp;delete&amp;nbsp;it; it will tag&amp;nbsp;an expiration&amp;nbsp;date and then keep extending it until the hold is released, thereby not violating compliance.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Monitor Critically Important Documents:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;For content that is extremely sensitive or business-critical (e.g., an annually updated Policy document, or a legal contract file with tracked changes), you might want to keep more versions than usual or at least be&amp;nbsp;very cautious&amp;nbsp;with automated deletion. You can opt such libraries out of automatic trimming by&amp;nbsp;setting&amp;nbsp;a manual&amp;nbsp;policy, or&amp;nbsp;simply&amp;nbsp;monitor&amp;nbsp;their&amp;nbsp;version&amp;nbsp;history over time. Generally, Automatic mode is safe for even critical docs (since it preserves a broad range of history), but&amp;nbsp;it’s&amp;nbsp;wise to verify. If a particular version must be&amp;nbsp;retained&amp;nbsp;indefinitely (beyond what the algorithm would do), consider&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;declaring the&amp;nbsp;document&amp;nbsp;a record&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;or using a retention label on that version, which would prevent its deletion.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Conclusion&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint’s Automatic Version History Cleanup (Intelligent Versioning) is a powerful feature that brings much-needed automation to version management. It&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;keeps your SharePoint Online storage lean&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by removing redundant older versions while still providing a rich history of recent changes for recovery and audit purposes. By understanding how this feature works and following best practices — enabling it tenant-wide, adjusting specific libraries as needed, and considering organization-specific compliance requirements — IT administrators can significantly reduce storage costs and maintenance overhead.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With a sensible versioning strategy in place,&amp;nbsp;you’ll&amp;nbsp;ensure that users have the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;file history they need, when they need it, without letting “version sprawl” overwhelm your SharePoint environment&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. By configuring automatic cleanup and using the tools Microsoft provides (like reports and trim jobs), managing version history becomes a set-and-forget policy rather than a constant manual cleanup effort. This lets you and your users enjoy the benefits of versioning (easy recovery from mistakes, audit trails of changes)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;without the downsides of unchecked growth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;in your content databases.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With SharePoint Automatic Version History Cleanup, you can&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;strike the right balance&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;between data retention and storage efficiency – keeping your collaboration environments both agile and&amp;nbsp;compliant.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 09 May 2026 16:53:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-automatic-version-history-cleanup-intelligent/ba-p/4514011</guid>
      <dc:creator>jeresmith</dc:creator>
      <dc:date>2026-05-09T16:53:42Z</dc:date>
    </item>
    <item>
      <title>Breaking the Shackles of Legacy Portals: Power Pages as Enterprise SaaS</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/breaking-the-shackles-of-legacy-portals-power-pages-as/ba-p/4512636</link>
      <description>&lt;H2&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;It's time to stop building "Portals" and start deploying Enterprise SaaS.&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For years, enterprise teams building web portals have been&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;shackled by rigid Dynamics 365 schemas and heavy, template-driven UIs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; Traditional Power Apps Portals&amp;nbsp;required&amp;nbsp;developers to follow the portal's own schema structure—page templates, web forms, lists, content snippets—and inherit data models dictated by D365 modules. That era is over. Power Pages has evolved into&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;a secure, enterprise-grade, low-code SaaS platform for creating, hosting, and administering business websites&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;—and as of early 2026, two milestone GA releases have removed the last remaining constraints.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Here are six ways those shackles are broken: &lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;H5 aria-level="4"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;&lt;EM&gt;🎨 1. UI Liberation with Single-Page Applications — Now GA&amp;nbsp;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Single-Page Application support in Power Pages reached General Availability on February 8, 2026&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;, starting with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;site version 9.8.1.x and later&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Developers can now build fully custom,&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;client-side&amp;nbsp;rendered&amp;nbsp;web applications&amp;nbsp;using&amp;nbsp;React,&amp;nbsp;Angular, or&amp;nbsp;Vue&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and deploy them directly to Power Pages using the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Platform CLI&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. This is not a workaround or a bolt-on—Microsoft describes this GA release as making the SPA experience&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;"production ready".&amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What this means in practice:&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;the traditional portal constructs—ASP.NET and Liquid templates, web forms, lists—become optional implementation details, not architectural constraints&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;. &lt;/SPAN&gt;&lt;/STRONG&gt;Your UI is completely custom and API-driven, calling&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Pages Web APIs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for all data operations. The GA release also resolved issues where Power Pages platform styles could override custom&amp;nbsp;CSS, and&amp;nbsp;included updated guidance for authentication configuration and local development setup. Developers can run SPAs locally with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;full authentication and Web API access&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; enabling&amp;nbsp;JavaScript&amp;nbsp;hot&amp;nbsp;reload&amp;nbsp;and local debugging without deploying changes to the portal on every iteration.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;At this point, the traditional portal schema becomes&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;an implementation&amp;nbsp;option—not a constraint.&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;(Ensure your Power Platform CLI is on the latest version for full&amp;nbsp;capabilities.)&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;🗄️ 2. Data Model Autonomy — Your Entities, Your Rules&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Power Pages connects to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Microsoft Dataverse&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, but you are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;no longer forced to borrow a Dynamics 365 schema&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Teams can design their own data model from scratch—whether it has five tables or hundreds&amp;nbsp;with&amp;nbsp;complex relationships—tailored to the business domain.&amp;nbsp;Those custom Dataverse tables serve the SPA directly via Web APIs,&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;without&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;needing to build model-driven or canvas apps.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is a fundamental departure. The platform uses the same shared business data stored in Dataverse that other Power Platform components can&amp;nbsp;leverage, but your portal is no longer tethered to any pre-existing Dynamics module. You own your entity model entirely. The result:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;headless CMS flexibility&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;backed by the security and reliability of Dataverse, without the overhead of a CRM schema you&amp;nbsp;didn't&amp;nbsp;ask for.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;☁️ 3. Fully Managed Platform — No Infrastructure Burdens&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Goodbye, custom web hosting and plumbing&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Power Pages is a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;fully managed SaaS platform&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;—Microsoft handles provisioning, hosting, CDN, scaling, and availability. Authentication is built in, with full support for enterprise identity providers including&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Entra ID&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Microsoft Entra External ID&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; along with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;table permissions and web roles enforcement on every API call&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Organizations can also allow anonymous access or configure private sites as needed.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Even advanced backend needs are now covered natively.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Server Logic in Power Pages reached General Availability on April 1, 2026&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, delivering native server-side JavaScript execution with the maturity, governance, and extensibility&amp;nbsp;required&amp;nbsp;for enterprise production workloads. Alongside GA, Microsoft announced two enhancements that reinforce enterprise readiness:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;Governance control to disable external calls&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;— administrators can restrict outbound connectivity from the Server Logic layer to&amp;nbsp;comply with&amp;nbsp;internal policies and regulatory requirements.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;Support for unbound Dataverse custom actions&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;— enabling deeper integration with existing business logic layers.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The result? Teams focus&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;only &lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;on business logic, integrations, and user experience&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. As Hope Bradford, Senior Director of IT at Kelly Staffing,&amp;nbsp;stated:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;"&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;Power Pages lets us build personalized client experiences without managing complex infrastructure while maintaining enterprise trust and security.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;"&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Kelly Staffing's Helix UX portal&lt;/STRONG&gt;&lt;/SPAN&gt;, built on Power Pages, Dataverse, and Power Automate, now handles&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;over 38,000 client interactions per day&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;🛡️ 4. Enterprise-Grade Security and Telemetry&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Security and governance are&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;first-class citizens&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on the platform. The 2025–2026 release wave introduced enterprise-grade controls for Power Pages including&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;role-based access and authentication through Entra,&amp;nbsp;Data Loss Prevention (DLP) rules for external data access,&amp;nbsp;IP-based restrictions,&amp;nbsp;maintenance mode options, &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;and&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;built-in diagnostics and monitoring dashboards&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt;&lt;/STRONG&gt; Across the broader Power Platform, Microsoft is investing in enterprise&amp;nbsp;observability—the April 2026 update introduced&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;alerting and data metrics in Power Platform Monitor&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(covering metrics such as app open success rate, time to interactive, data request success rate, and data request latency), enabling IT teams to&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;define health thresholds, receive proactive notifications, and take guided action.&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This level of governance—audit, monitoring, diagnostics—traditionally&amp;nbsp;required&amp;nbsp;significant custom engineering. Now it is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;out of the box&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="4"&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;💲 5. Scalable, Usage-Based Licensing&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;One of the most significant licensing shifts:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Power Pages became its own product,&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;decoupling from&amp;nbsp;Power Apps licensing entirely&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt; Both&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;internal and external users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;now fall under the same licensing model, making Power Pages&amp;nbsp;viable&amp;nbsp;for internal use cases like HR services and request management—not just external portals.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The model is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;usage-based (Monthly Active Users)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;purchased&amp;nbsp;as capacity packs per site:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Authenticated Users (Pre-paid):&amp;nbsp;$200&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per site/month for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;100 users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Anonymous Users (Pre-paid):&amp;nbsp;$75&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per site/month for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;500 users&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Authenticated Users (Pay-As-You-Go):&amp;nbsp;$4.00&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;per user/site/month, on-demand&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Anonymous Users (Pay-As-You-Go):&amp;nbsp;$0.30&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per user/site/month, on-demand&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Each&amp;nbsp;authenticated-user&amp;nbsp;subscription plan includes&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;2 GB database capacity and 16 GB file capacity&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; &lt;/SPAN&gt;For applications serving&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;t&lt;SPAN class="lia-text-color-20"&gt;ens of thousands of users&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;,&lt;/SPAN&gt; this capacity-based model is strategically superior to per-user or per-app seat licenses. Pay-as-you-go costs&amp;nbsp;roughly&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;twice&amp;nbsp;as much&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as pre-paid capacity packs but suits&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;seasonal or unpredictable usage&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;patterns&lt;/STRONG&gt;&lt;/SPAN&gt; (e.g., tax season, annual HR enrollment).&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Tradeoff to consider:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;Pre-paid packs require upfront commitment and do not roll over month to month, so organizations with highly variable traffic must carefully model usage to avoid over- or under-provisioning.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;⚠️ Pricing disclaimer: The figures above are illustrative examples sourced from publicly available Microsoft documentation. Actual costs may vary based on customer type (enterprise vs. corporate), volume commitments, negotiated agreements, and account structure. Final pricing is&amp;nbsp;determined&amp;nbsp;through Microsoft account teams and contracts.&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="4"&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;⚡ 6. Rapid Modernization with AI-Assisted Development&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Power Pages now integrates directly with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;AI-assisted development workflows&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Microsoft announced the public preview of the&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Pages plugin for GitHub Copilot CLI and Claude Code&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on February 24, 2026, providing an AI-assisted workflow for creating, deploying, and managing modern SPA sites on Power Pages. Developers can scaffold pages, configure data&amp;nbsp;access, and wire up logic using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;natural language commands&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, dramatically reducing the time to modernize large enterprise applications.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SPAs are deployed using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power &lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Platform CLI commands&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; and the entire development loop is designed to be streamlined for professional developers. This means that even large, complex in-house enterprise applications—hundreds of tables, complex relationships, tens of thousands of users—can be remodeled on Power Pages far more efficiently than legacy approaches&amp;nbsp;required. You migrate your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;own custom model into Dataverse&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, build your SPA, wire up integrations, and the platform handles everything else.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;The Bottom Line&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you are still managing custom Azure websites,&amp;nbsp;maintaining&amp;nbsp;SQL servers, or stitching together bespoke PaaS stacks for internal business tools,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;you are carrying unnecessary operational weight&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; &lt;/SPAN&gt;Power Pages is no longer just a D365 portal. It is a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;fully managed, enterprise-grade SaaS platform&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that gives you&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;total UI freedom&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(SPA support: GA since February 2026),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;native server-side logic&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(GA since April 2026),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;your own data architecture&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;without D365 schema dependencies,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;built-in security and governance&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; and a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;licensing model that scales to enterprise volumes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The industry is underestimating this shift. The shackles are off.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Deploy,&amp;nbsp;don't&amp;nbsp;build.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 20 Apr 2026 13:20:06 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/breaking-the-shackles-of-legacy-portals-power-pages-as/ba-p/4512636</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-04-20T13:20:06Z</dc:date>
    </item>
    <item>
      <title>LTRDisplay Control - End-to-End Implementation and Usage Guide</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/ltrdisplay-control-end-to-end-implementation-and-usage-guide/ba-p/4510615</link>
      <description>&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;1. Executive Summary&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;LTRDisplay&lt;/STRONG&gt; is a Power Apps Component Framework (PCF) control for model‑driven apps that helps users browse &lt;STRONG&gt;Long Term Retention (LTR)&lt;/STRONG&gt; data in a familiar grid‑and‑form experience.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;A class="lia-external-url" href="https://github.com/SweetsNSavories/LTRDisplay/tree/copilot/vscode-mmljoag6-9sjb/solution" target="_blank"&gt;GitHub SourceCode&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The control is designed for &lt;STRONG&gt;archive‑first usage in Dataverse&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fetch retained records with a selected view clause&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Replay cached data without refetching&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Open row details inside the same control&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Review audit changes and related records&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Minimize retained query calls through user‑local caching and lazy loading&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This document provides:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Purpose and business value&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Solution design and architecture&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Import and validation steps&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Full user manual&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Repository fork and customization workflow&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2. Purpose of the Control&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;2.1 Problem Statement&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Retention data is valuable for:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Investigation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Support&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Compliance&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Historical analysis&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;However, users often require:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fast browsing of retained records&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Predictable filtering and navigation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Minimal load on retained query infrastructure&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;A form‑like experience for details, audit, and related data&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;2.2 LTRDisplay Objectives&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;LTRDisplay addresses these needs by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Surfacing retained records directly in a model‑driven form&lt;/LI&gt;
&lt;LI&gt;Reusing Dataverse views/forms metadata for familiarity&lt;/LI&gt;
&lt;LI&gt;Introducing cache‑first interaction patterns&lt;/LI&gt;
&lt;LI&gt;Supporting drill‑down across related records in one panel&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3. Solution Design&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.1 Runtime Design&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Main runtime behavior:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Archive‑focused mode by default&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Selected view drives retained fetch clause&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Grid renders from cached projection&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related records load only on explicit user action&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Detail form and tabs render from metadata and selected row payload&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.2 Core Components&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;PCF shell:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/index.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;App state orchestration:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/App.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Grid and local filtering:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/DynamicGrid.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Metadata‑driven detail form:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/DynamicForm.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Dataverse access layer:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/services/LtrService.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;View/Form XML parsing:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/utils/XmlParser.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.3 Cache Model&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Per‑user browser cache stores:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;View datasets&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Entity record dictionary by record id&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related datasets&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Forms metadata&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Relationship metadata&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This enables:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Show Cached behavior without server refetch&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Faster row‑open and navigation experience&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Reduced retained query consumption&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.4 UX and Interaction Model&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Fetch Archive button:&lt;/STRONG&gt; calls retained fetch and updates cache&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Show Cached button:&lt;/STRONG&gt; reads cache and applies local filtering&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Column filter flyouts:&lt;/STRONG&gt; local filtering against projected rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Detail tabs:&lt;/STRONG&gt;&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Summary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Record Data&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Audit History&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Form switcher:&lt;/STRONG&gt; choose available main forms for selected entity&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Chrome toggle arrows:&lt;/STRONG&gt; hide/show header and command bar behavior&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.5 Security Intent&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay Main Form is intended for &lt;STRONG&gt;System Administrator users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Role‑based form visibility should restrict exposure to non‑admin users&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4. Solution Packaging and Import&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.1 Distributed Artifacts&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Latest packaged solution files:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_unmanaged_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Unpacked inspection artifacts:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;exports/unpacked_managed&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;exports/unpacked_unmanaged&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.2 Import in Power Platform (Recommended Managed Path)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Open target environment in Maker Portal&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Go to &lt;STRONG&gt;Solutions&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Select &lt;STRONG&gt;Import solution&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Upload&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Complete import and publish customizations&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.3 Post‑Import Validation Checklist&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Validate the following:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay Main Form exists and is enabled&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;SystemUser form maps to&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;ltr_LTRDisplay.LTRDisplayControl&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;System Administrator can open the form&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Non‑admin users do not get the admin‑targeted form&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fetch Archive returns retained rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Show Cached replays cached rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Record Data, Audit History, and Related tabs operate as expected&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5. User Manual – Walkthrough&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 1 – Open form with control visible&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The form opens with &lt;STRONG&gt;Explorer – LTR&lt;/STRONG&gt; and action controls.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 2 – Toggle form chrome for focus&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Use the arrow controls to hide/show header and command bar.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 3 – Start retained fetch&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Click &lt;STRONG&gt;Fetch Archive&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;During loading, controls can be temporarily disabled.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG style="color: rgb(53, 152, 219); font-size: 28px;"&gt;Step 4 – Review fetched grid data&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Rows appear in the grid after retained fetch completes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 5 – Apply local column filter&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Open a column filter, enter a value, and apply the filter.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 6 – Open a row into detail context&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Select a grid row to open detail section and tabs.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 7 – Use form switcher&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Open the detail form dropdown and choose alternate form layouts when available.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 8 – Inspect Record Data tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Review key‑value field output.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 9 – Inspect Audit History tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Review: Changed by, Changed on, Operation, Old and&amp;nbsp;New value.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 10 – Use Related tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Select relationship and click &lt;STRONG&gt;Load&lt;/STRONG&gt; to fetch related rows lazily.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;6. Fork and Customize the Repository&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.1 Fork and Clone&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fork the repository in GitHub&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Clone your fork locally&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Create a feature branch for your changes&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.2 Local Build Setup&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;From repository root:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;npm install npm run build&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.3 Typical Customization Areas&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Most teams customize:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;App‑level behavior and UX flow&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/App.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Grid columns and filter behavior&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/DynamicGrid.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Detail tabs and rendering&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/DynamicForm.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Dataverse query strategy&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;services/LtrService.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Styling and branding&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;css/LTRDisplayControl.css&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.4 Push Changes to Dataverse (Development Loop)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Use your existing PAC workflow in the target environment.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Typical sequence:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;npm run build &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;pac pcf push --publisher-prefix ltr --incremental &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;pac solution publish&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.5 Export and Repackage&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;After validation in environment:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;Export managed and unmanaged solution zips&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;Update:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;LTRDisplay_unmanaged_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;If needed, unpack for review under:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;exports/unpacked_managed&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;exports/unpacked_unmanaged&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.6 Recommended Contribution Workflow&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep changes scoped by feature branch&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Run build before each push&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Capture screenshots for changed UX behavior&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Update docs in docs folder together with code&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Submit PR with:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Short validation checklist&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Test evidence&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;7. Operational Notes and Best Practices&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Use managed package for consumer installation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep unmanaged package for internal customization scenarios&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Treat retained fetches as expensive&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Prefer cache replay when possible&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep related loading on‑demand to control query volume&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Preserve role‑based visibility for admin‑focused forms&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;8. Conclusion&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay provides a practical archive exploration interface for Dataverse model‑driven apps with a strong focus on:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Usability&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Cache efficiency&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Operational control&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;By combining:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Managed distribution&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Clear import validation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;A straightforward customization model&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Teams can adopt it quickly and evolve it safely for enterprise needs.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 14 Apr 2026 14:00:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/ltrdisplay-control-end-to-end-implementation-and-usage-guide/ba-p/4510615</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-04-14T14:00:42Z</dc:date>
    </item>
    <item>
      <title>Getting Started with GitHub Copilot SDK</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/getting-started-with-github-copilot-sdk/ba-p/4510059</link>
      <description>&lt;P&gt;GitHub Copilot has been a staple in developer workflows for a while — it suggests code, completes functions, and generally keeps you from looking up that one syntax for the hundredth time. But what if you could take that same intelligence and embed it directly into your own applications? That's exactly what the GitHub Copilot SDK lets you do.&lt;/P&gt;
&lt;P&gt;Launched in technical preview in January 2026 and entering public preview on April 2nd, 2026, the SDK gives you programmatic access to Copilot's agentic engine. It's the same runtime that powers the Copilot CLI — just exposed as a library you can import into your own code, in your language of choice.&lt;/P&gt;
&lt;H2&gt;What Is the GitHub Copilot SDK?&lt;/H2&gt;
&lt;P&gt;The SDK is a multi-language library — Python, TypeScript, Go, .NET, and Java — that lets your application talk directly to Copilot's agent runtime. You don't have to build your own orchestration layer, manage model contexts, or figure out tool invocation protocols from scratch. All of that is handled for you.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Three core concepts are worth understanding upfront:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;CopilotClient&lt;/STRONG&gt; — your main entry point. It manages the connection to the Copilot CLI running in server mode.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Sessions&lt;/STRONG&gt; — hold a persistent conversational context, meaning the agent remembers what's been said across multiple turns and can handle genuinely stateful workflows.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tools&lt;/STRONG&gt; — regular Python functions you register with the session. The agent calls them autonomously when it needs to interact with the outside world: query a database, hit an API, read a file.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For Python, getting started is a single command:&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;pip install github-copilot-sdk&lt;/LI-CODE&gt;
&lt;P&gt;You'll also need the Copilot CLI (https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli) installed and accessible in your PATH, plus Python 3.11 or higher.&lt;/P&gt;
&lt;P&gt;Read this on how to setup: &lt;A class="lia-external-url" href="https://github.com/github/copilot-sdk/tree/main/python" target="_blank"&gt;copilot-sdk/python&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;Sending Your First Message&lt;/H2&gt;
&lt;LI-CODE lang="python"&gt;import asyncio

from copilot import CopilotClient

from copilot.session import PermissionHandler

async def main():

    async with CopilotClient() as client:

        async with await client.create_session(

            on_permission_request=PermissionHandler.approve_all,

            model="gpt-5",

        ) as session:

            done = asyncio.Event()

            def on_event(event):

                if event.type.value == "assistant.message":

                    print(event.data.content)

                elif event.type.value == "session.idle":

                    done.set()

            session.on(on_event)

            await session.send("Explain the difference between a list and a tuple in Python.")

            await done.wait()

asyncio.run(main())&lt;/LI-CODE&gt;
&lt;P&gt;A couple of things to notice. The `async with` pattern handles all setup and teardown — no manual cleanup required. The `on_permission_request` parameter is required for every session; it's a handler the SDK calls before the agent executes any tool, allowing you to approve or deny the action. `PermissionHandler.approve_all` is the simplest option and perfect for getting started, but in production you'll want something more selective. More on that below.&lt;/P&gt;
&lt;H2&gt;Giving Your Agent Real Capabilities&lt;/H2&gt;
&lt;P&gt;Text in, text out is fine. But the real value of the SDK is that you can give the agent *tools* — functions it can call to interact with real systems. The `@define_tool` decorator makes this clean using Pydantic for parameter validation:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;import asyncio

from pydantic import BaseModel, Field

from copilot import CopilotClient, define_tool

from copilot.session import PermissionHandler

class GetPriceParams(BaseModel):

    ticker: str = Field(description="Stock ticker symbol, e.g. MSFT")

@define_tool(description="Fetch the current stock price for a given ticker")

async def get_stock_price(params: GetPriceParams) -&amp;gt; str:

    # Replace with a real API call

    return f"The current price of {params.ticker} is $150.00"

async def main():

    async with CopilotClient() as client:

        async with await client.create_session(

            on_permission_request=PermissionHandler.approve_all,

            model="gpt-5",

            tools=[get_stock_price],

        ) as session:

            done = asyncio.Event()

            def on_event(event):

                if event.type.value == "assistant.message":

                    print(event.data.content)

                elif event.type.value == "session.idle":

                    done.set()

            session.on(on_event)

            await session.send("What's the current price of Microsoft stock?")

            await done.wait()

asyncio.run(main())&lt;/LI-CODE&gt;
&lt;P&gt;When the prompt arrives, the agent works out that it should call `get_stock_price` with `ticker="MSFT"`, runs your function, and folds the result into its response. You don't wire up the function-calling logic yourself — the SDK handles dispatch, parameter parsing, and return value handling. Your job is just writing the function.&lt;/P&gt;
&lt;H2&gt;Streaming Responses in Real Time&lt;/H2&gt;
&lt;P&gt;If you're building anything interactive, waiting for a complete response before displaying anything feels slow. Setting `streaming=True` and listening for `assistant.message_delta` events fixes that immediately:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;async with await client.create_session(

    on_permission_request=PermissionHandler.approve_all,

    model="gpt-5",

    streaming=True,

) as session:

    done = asyncio.Event()

    def on_event(event):

        match event.type.value:

            case "assistant.message_delta":

                print(event.data.delta_content or "", end="", flush=True)

            case "session.idle":

                done.set()

    session.on(on_event)

    await session.send("Write a Python function that validates an email address.")

    await done.wait()&lt;/LI-CODE&gt;
&lt;P&gt;Each chunk arrives as a `delta_content` string. Print it directly for a terminal UI, or accumulate chunks if you need the full response as a single string.&lt;/P&gt;
&lt;H2&gt;A Few Things Worth Knowing Before You Build&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Billing&lt;/STRONG&gt;: Every prompt counts against your GitHub Copilot subscription's premium request quota. If you're building automated workflows that fire off many requests — think CI pipelines or scheduled jobs — monitor usage. The SDK also supports BYOK (Bring Your Own Key), so you can plug in your own API keys from OpenAI, Azure AI Foundry, or Anthropic, which is a good option if you already have model deployments or want to separate usage billing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Stability&lt;/STRONG&gt;: The SDK is in public preview. It follows semantic versioning, so breaking changes come with a major version bump, but check the release notes between upgrades.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Permissions&lt;/STRONG&gt;: For anything beyond experiments, replace `PermissionHandler.approve_all` with a custom handler. The SDK lets you inspect each tool request by kind — `shell`, `write`, `read`, `url`, `custom-tool` — and return `approved` or `denied` per request. That's where your security posture lives.&lt;/P&gt;
&lt;H2&gt;If You Want to Start — Start Here&lt;/H2&gt;
&lt;P&gt;One thing I've found working is that the best way to help customers adopt a technology is to actually use it yourself first. The Copilot SDK is a good candidate for that approach.&lt;/P&gt;
&lt;P&gt;On the internal side, there are a handful of workflows that translate really well to agents.&lt;/P&gt;
&lt;P&gt;Customer health reviews, for example — instead of manually pulling data from multiple tools before a call, you could build an agent that gathers recent Azure consumption,&lt;/P&gt;
&lt;P&gt;Copilot seat usage, and open support tickets, then produces a plain-language summary. Account preparation used to mean 30 minutes of tab-switching; an agent with the right custom tools can reduce that to a prompt.&lt;/P&gt;
&lt;P&gt;Incident prep is another one. When a customer hits an issue and needs a root cause summary fast, an agent that can read recent deployment logs, scan for known patterns, and draft a timeline is genuinely useful — both internally and as something you can walk through with the customer.&lt;/P&gt;
&lt;P&gt;Building these tools yourself also gives you hands-on credibility when the architecture conversation comes up. You've already worked through the permission model, you've thought about BYOK, and you know where the rough edges are. That context matters more than any slide.&lt;/P&gt;
&lt;H2&gt;How to Help Customers Get Started&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Most enterprise customers land in one of two places: they see Copilot as a developer IDE tool and haven't thought about embedding it in applications, or they've heard about agentic AI and don't know what a framework like this actually handles versus what they need to build themselves.&lt;/P&gt;
&lt;P&gt;The clearest entry point is to start with a specific, bounded use case — not "let's build an AI agent" but "your support team answers the same 40 questions every week; let's route those through an agent that queries your internal knowledge base." That scope is small enough to deliver in a few days, concrete enough to measure, and immediately demonstrates how custom tools connect to real systems.&lt;/P&gt;
&lt;P&gt;A few things worth surfacing early in the architecture conversation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;BYOK vs. Copilot subscription&lt;/STRONG&gt;: Customers with existing Azure AI Foundry or OpenAI contracts can connect their own models. A quick win for enterprises who already have model deployments and don't want to provision Copilot seats for non-developer workloads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Permission governance&lt;/STRONG&gt;: The `on_permission_request` handler is where the security conversation lives. For customers in regulated industries, showing that every tool action can be audited and restricted at the code level — not just policy — tends to land well.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;MCP integration&lt;/STRONG&gt;: Customers with existing tool ecosystems (Jira, ServiceNow, internal APIs) can expose those as MCP servers rather than rewriting everything as custom tools. Worth raising early to avoid unnecessary rework.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Customer Use Cases&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;DevOps and platform engineering&lt;/STRONG&gt; — Agents that validate infrastructure-as-code before deployment, flag security misconfigurations, or triage incidents by reading runbooks and change logs. These are high-value because they touch production workflows and have clear, measurable ROI.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Internal knowledge and support&lt;/STRONG&gt; — An agent over internal documentation — wikis, policies, architecture decisions — that answers employee questions without requiring someone to search three separate systems. Especially valuable for large organizations where institutional knowledge is fragmented.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Developer productivity&lt;/STRONG&gt; — Automating pull request summaries, generating release notes from commit history, or flagging potential issues in code changes. These compound fast: save 10 minutes per PR across a 500-developer org and you notice it quickly.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reporting and operations&lt;/STRONG&gt; — Generating weekly status reports, customer-facing summaries, or executive briefings by pulling from live data sources. The agent handles gathering and formatting; the human handles the judgment call.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The common thread is that the best use cases aren't about replacing people. They're about removing the repetitive connective tissue between tasks — so that your team, and your customers' teams, spend more time on the work that actually requires their expertise.&lt;/P&gt;
&lt;H2&gt;Where to Go from Here&lt;/H2&gt;
&lt;P&gt;The official SDK repo (&lt;A href="https://github.com/github/copilot-sdk" target="_blank"&gt;https://github.com/github/copilot-sdk&lt;/A&gt;) has a Python cookbook with practical recipes, active documentation, and an Issues page that the team monitors closely. Session hooks, MCP server integration, and the system message API are all worth exploring once you're comfortable with the basics.&lt;/P&gt;
&lt;P&gt;The hardest part is usually just the first 20 lines. Once the client is running and you've got a session sending messages, the rest clicks pretty quickly — and that first working agent is a compelling starting point for the customer conversation too.&lt;/P&gt;
&lt;P&gt;The GitHub Copilot SDK is available in public preview at (&lt;A href="https://github.com/github/copilot-sdk" target="_blank"&gt;https://github.com/github/copilot-sdk&lt;/A&gt;). Python 3.11+ required.&lt;/P&gt;
&lt;H2&gt;Recommended Resources for Deeper Insights&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Building%20AI%20agents%20with%20GitHub%20Copilot%20SDK" target="_blank"&gt;Building AI agents with GitHub Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Advanced%20features%20of%20GitHub%20Copilot%20SDK" target="_blank"&gt;Advanced features of GitHub Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Integrating%20custom%20tools%20with%20Copilot%20SDK" target="_blank"&gt;Integrating custom tools with Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Security%20best%20practices%20for%20GitHub%20Copilot%20SDK%20applications" target="_blank"&gt;Security best practices for GitHub Copilot SDK applications&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 09 Apr 2026 21:43:21 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/getting-started-with-github-copilot-sdk/ba-p/4510059</guid>
      <dc:creator>anishekkamal</dc:creator>
      <dc:date>2026-04-09T21:43:21Z</dc:date>
    </item>
    <item>
      <title>Migrating Azure Data Factory and Synapse Pipelines to Fabric Data Factory</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/migrating-azure-data-factory-and-synapse-pipelines-to-fabric/ba-p/4510051</link>
      <description>&lt;P&gt;Migrating data pipelines from Azure Data Factory (ADF) and Azure Synapse Pipelines to&amp;nbsp;&lt;STRONG&gt;Microsoft Fabric Data Factory&lt;/STRONG&gt; represents a significant modernization opportunity and a catalyst for accelerating AI innovation across the enterprise. With Fabric Data Factory, customers can unify their data estate, streamline data engineering workflows, and more effectively leverage real-time analytics, generative AI, and machine learning at scale.&lt;/P&gt;
&lt;P&gt;This article outlines the key technical considerations for a successful migration from ADF/Synapse pipelines to Fabric Data Factory.&lt;/P&gt;
&lt;H2&gt;Fabric Data Factory vs. ADF and Synapse Pipelines: What’s Different?&lt;/H2&gt;
&lt;P&gt;Fabric Data Factory is officially described by &lt;SPAN style="color: rgb(30, 30, 30);"&gt;Microsoft as &lt;EM&gt;the next generation of Azure Data Factory, built to handle your most complex data integration challenges with a simpler, more powerful approach&lt;/EM&gt;. &lt;/SPAN&gt;It retains ADF’s core engine capabilities while introducing major improvements enabled by Fabric’s unified, AI-centric platform including OneLake, expanded activities and native Copilot experiences.&lt;/P&gt;
&lt;P&gt;A fundamental shift is the move to a fully managed SaaS model, with several important differences:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;No infrastructure management&lt;/STRONG&gt;: Fabric eliminates Azure Integration Runtimes entirely. Compute is managed automatically within a Fabric capacity. For on‑premises connectivity, the On‑Premises Data Gateway (OPDG) replaces ADF’s Self‑Hosted Integration Runtime.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;No publish step&lt;/STRONG&gt;: Pipelines are authored directly in the Fabric portal and can be saved or executed immediately, removing the separate publish step required in ADF.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Simplified data connections&lt;/STRONG&gt;: Traditional Linked Services and Datasets are replaced by Connections and inline data properties within activities, reducing configuration complexity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;New native activities&lt;/STRONG&gt;: Fabric introduces capabilities not available in ADF/Synapse pipelines, including Office 365 Outlook email, Teams messaging, semantic model refresh, Fabric notebooks, Invoke SSIS (preview), and Lakehouse maintenance (preview).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enhanced CI/CD&lt;/STRONG&gt;: Built‑in deployment pipelines support cherry‑picking, individual item promotion, Git integration, and SaaS‑native CI/CD beyond ADF’s ARM template–based approach.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI Copilot&lt;/STRONG&gt;: Fabric Data Factory includes Copilot to assist with pipeline creation and management, a capability not available in ADF or Synapse pipelines.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For more details see: &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/compare-fabric-data-factory-and-azure-data-factory" target="_blank"&gt;Differences between Data Factory in Fabric and Azure - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;Common Migration Challenges and Recommended Mitigations&lt;/H2&gt;
&lt;P&gt;Migrating to Fabric Data Factory introduces new choices and challenges. While the move to Fabric offers substantial benefits, success depends on understanding key differences, migration challenges and planning accordingly. The table below summarizes the most important considerations to help guide a smooth and successful transition.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-21 lia-border-style-solid" border="1" style="border-width: 1px;"&gt;&lt;caption&gt;Table 1. Migration Challenges and Mitigation&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Challenge&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Recommended Mitigation&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Feature Gaps&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Some ADF/Synapse features (e.g., SSIS IR, Managed VNets, certain triggers) are not yet fully supported in Fabric.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Delay migration of affected pipelines or redesign using Fabric‑native alternatives. Monitor updates via the &lt;A href="https://roadmap.fabric.microsoft.com" target="_blank"&gt;https://roadmap.fabric.microsoft.com&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Mapping Data Flows&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;ADF Mapping Data Flows don’t directly map to Fabric equivalents.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Rebuild using Dataflow Gen2, Fabric Warehouse SQL, or Spark notebooks. Validate transformation logic and data types post‑migration.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Trigger Redesign&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric lacks centralized trigger management; scheduling must be defined at the pipeline level.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Recreate triggers per pipeline and apply standardized naming conventions and documentation to maintain operational clarity.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Global Parameters&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;ADF Global Parameters must be converted to Fabric Variable Libraries.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Use Microsoft’s conversion guidance and account for differences in data types and runtime usage patterns. See &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/" target="_blank"&gt;Convert Azure Data Factory Global Parameters to Fabric Variable Libraries&lt;/A&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Dynamic Connections&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric does not support dynamic linked service properties in the same way as ADF.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Parameterize connection objects within pipeline activities using dynamic content.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Some environments report slower execution of deployment pipelines in Fabric.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Break deployments into smaller logical units and validate performance during pilot phases prior to production rollout.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity Planning&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric uses a fixed‑capacity compute model instead of ADF’s elastic pay‑as‑you‑go runtime.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Right‑size Fabric capacity based on peak load testing and continuously monitor usage with tools such as the &lt;A href="https://learn.microsoft.com/en-us/fabric/onelake/" target="_blank"&gt;Fabric Capacity Estimator&lt;/A&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Migration Tooling&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Migration Assistant:&lt;/STRONG&gt; Microsoft Fabric includes a built‑in Migration Assistant for both ADF and Synapse pipelines, designed specifically to support pipeline migrations. To assess migration readiness, open your ADF/Synapse pipeline instance, go to the authoring canvas, and select Migrate to Fabric (Preview) &amp;gt; Get started (Preview).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As shown in the assessment summary below, pipelines are grouped into migration readiness categories such as Ready, Needs Review, Coming Soon, and Unsupported. This classification gives engineering teams early visibility into potential migration risks by highlighting activities or configurations that may behave differently in Fabric and require validation or adjustment after migration (&lt;STRONG&gt;Needs review&lt;/STRONG&gt;), features that are not currently supported in Fabric but are planned for future availability (&lt;STRONG&gt;Coming soon&lt;/STRONG&gt;), or not available in Fabric and will require redesign or re‑implementation (&lt;STRONG&gt;Unsupported&lt;/STRONG&gt;).&lt;/P&gt;
&lt;P&gt;In enterprise environments with large pipeline estates, this insight is critical for avoiding unexpected failures or delays during migration.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After completing the assessment, you can proceed with the migration wizard and mount your ADF pipelines into Microsoft Fabric.&lt;/P&gt;
&lt;P&gt;Mounting does not migrate your ADF pipelines to Fabric Data Factory at this stage. Instead, it creates a reference to your existing instances within the Fabric workspace without consuming Fabric capacity. After mounting, run pipelines side by side to validate behavior and results.&lt;/P&gt;
&lt;P&gt;Once the side by side has been validated, select Migrate to Fabric button to proceed with connection mapping and the actual migration to Fabric Data Factory.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After completing the migration process, you will be presented with the&amp;nbsp;&lt;STRONG&gt;Migration Results&lt;/STRONG&gt; page. This view provides a summary of all selected pipeline resources along with their migration status and corresponding Fabric resource names. Successfully migrated pipelines are now available as Fabric‑native items within the workspace, while any errors or unmapped dependencies are flagged for further review.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For Synapse Analytics pipelines, you transition directly into the Fabric Data Factory experience (assess-&amp;gt;map-&amp;gt;migrate flow) rather than mounting first to reference Synapse pipelines externally.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For detailed migration steps, follow this link: &lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/how-to-assess-your-azure-data-factory-to-fabric-data-factory-migration" target="_blank"&gt;Assess your Azure Data Factory and Synapse pipelines for migration to Fabric - Azure Data Factory | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShell automation tool:&lt;/STRONG&gt;&amp;nbsp;Microsoft provides a PowerShell upgrade utility to accelerate migration from Azure Data Factory to Fabric Data Factory. Using the &lt;STRONG&gt;Microsoft.FabricPipelineUpgrade&lt;/STRONG&gt; module, you can translate a large subset of ADF pipeline JSON into Fabric‑native definitions, giving you a fast, scalable starting point for migration. The tool covers common patterns such as Copy, Lookup, Stored Procedure, and standard control flow. Manual follow‑up is still required for edge cases (custom connectors, complex expressions, and some data flow scenarios).&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang=""&gt;Import-AdfFactory -SubscriptionId &amp;lt;your Subscription ID&amp;gt; -ResourceGroupName &amp;lt;your Resource Group Name&amp;gt; -FactoryName &amp;lt;your Data Factory Name&amp;gt; -PipelineName "pipeline1" -AdfToken $adfSecureToken | ConvertTo-FabricResources | Export-FabricResources -Region &amp;lt;region&amp;gt; -Workspace &amp;lt;workspaceId&amp;gt; -Token $fabricSecureToken&lt;/LI-CODE&gt;
&lt;P&gt;For step‑by‑step guidance, see: &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/migrate-pipelines-powershell-upgrade-module-tutorial" target="_blank"&gt;Detailed Tutorial for PowerShell-based Migration of Azure Data Factory Pipelines to Fabric - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;Open‑Source Migration Tooling&lt;/H5&gt;
&lt;P&gt;In addition to Microsoft‑supported migration utilities, the Fabric Toolbox provides a set of open‑source tools designed to assist with migration planning, readiness analysis, and pipeline translation from ADF and Synapse to Fabric Data Factory.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Data Factory Migration Assistant PowerShell&lt;/STRONG&gt;: An open‑source tool from the Fabric Toolbox that supports migration from both Azure Data Factory and Synapse ARM templates and built as a browser‑based single‑page application (SPA). &lt;A href="https://github.com/microsoft/fabric-toolbox/tree/main/tools/FabricDataFactoryMigrationAssistant" target="_blank"&gt;https://github.com/microsoft/fabric-toolbox/tree/main/tools/FabricDataFactoryMigrationAssistant&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Assessment Tool&lt;/STRONG&gt;: An open‑source command‑line utility used to connect to and scan workspaces in order to extract inventory data and assess migration scope by creating a structured export of assets for planning and analysis.&amp;nbsp;&lt;BR /&gt;&lt;A href="https://github.com/microsoft/fabric-toolbox/tree/main/tools/fabric-assessment-tool" target="_blank"&gt;https://github.com/microsoft/fabric-toolbox/tree/main/tools/fabric-assessment-tool&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;When to Use What?&lt;/H2&gt;
&lt;P&gt;Organizations typically adopt one of three migration strategies when transitioning ADF or Synapse pipelines to Fabric Data Factory:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Lift‑and‑Shift to accelerate transition timelines with minimal pipeline refactoring.&lt;/LI&gt;
&lt;LI&gt;Modernization to re‑architect orchestration logic and fully leverage Fabric‑native analytics and AI capabilities.&lt;/LI&gt;
&lt;LI&gt;Hybrid to balance migration velocity with targeted modernization of high‑value or low‑parity workloads.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The appropriate migration paths should be aligned with business priorities, existing integration patterns, and the desired pace of platform transformation, and is largely determined by the feature parity between existing ADF/Synapse assets and their Fabric Data Factory equivalents.&lt;/P&gt;
&lt;P&gt;A range of migration tooling options are available depending on migration scope and pipeline complexity:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Built-In Fabric UI Assistant – Migrate to Fabric&lt;/STRONG&gt;: Use this assistant to assess pipeline readiness across both ADF and Synapse environments, mount existing ADF pipelines into a Fabric workspace, perform side‑by‑side validation, or migrate supported Synapse pipelines directly into Fabric Data Factory experience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShell Upgrade Tool (Microsoft‑supported)&lt;/STRONG&gt;: Use this for bulk ADF migrations at scale, repeatable upgrades, and CI/CD‑driven pipeline conversion with a supported path.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Data Factory Migration Assistant PowerShell (Open Source)&lt;/STRONG&gt;: Use for early analysis, connector mapping, and generating a migration starting point outside the Fabric UI.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Assessment Tool (Open Source)&lt;/STRONG&gt;: Use before migration to understand scope, inventory, dependencies, and readiness across your Fabric and data estate.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Manual migration&lt;/STRONG&gt;: best suited for complex, low‑parity pipelines and provides an opportunity to modernize architecture using Fabric’s native capabilities, delivering long‑term benefits in maintainability, performance, and cost.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Key Considerations for a Smooth Transition&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Before migrating, it’s important to understand the architectural differences between Azure Data Factory or Synapse pipelines and Fabric Data Factory. &amp;nbsp;Reviewing these differences early helps determine which pipeline components can be reused, translated, or redesigned for Fabric‑native execution.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Start by prioritizing low‑risk, high‑parity pipelines that can be migrated with minimal redesign.&lt;/LI&gt;
&lt;LI&gt;Mounting existing ADF pipelines into Fabric enables gradual migration and side‑by‑side testing, allowing teams to validate compatibility before using conversion tools or replatforming workloads.&lt;/LI&gt;
&lt;LI&gt;For larger environments, the &lt;EM&gt;Microsoft.FabricPipelineUpgrade&lt;/EM&gt; PowerShell module or Open-Source tools can be used to migrate pipelines at scale while mapping linked services to Fabric connections.&lt;/LI&gt;
&lt;LI&gt;Where possible, leverage Fabric‑native capabilities such as Copilot for pipeline authoring, and code fix, deployment pipelines for CI/CD, and OneLake shortcuts to access external data without duplication.&lt;/LI&gt;
&lt;LI&gt;It’s also recommended to validate migrated pipelines under production‑like workloads to confirm performance and reliability before cutover.&lt;/LI&gt;
&lt;LI&gt;For complex or large‑scale enterprise migrations, engaging Microsoft partners can help accelerate modernization efforts while minimizing operational risk. &lt;A href="https://www.microsoft.com/en-us/microsoft-fabric/partners" target="_blank"&gt;Partners | Microsoft Fabric&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For detailed best practices guidance, refer to:&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/migration-best-practices" target="_blank"&gt;Migration Best Practices for Azure Data Factory to Fabric Data Factory - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Summary&lt;/H2&gt;
&lt;P&gt;Migrating from Azure Data Factory or Synapse pipelines to Microsoft Fabric Data Factory represents a key step toward building a unified, AI‑ready analytics platform. By leveraging the built‑in migration assessment and associated tooling, organizations can perform pipeline‑level compatibility analysis, identify unsupported activities or configuration dependencies, and implement a phased modernization strategy aligned with workload readiness.&lt;/P&gt;
&lt;P&gt;Successful transitions require a clear understanding of the architectural shift from ADF/Synapse’s PaaS to Fabric’s SaaS‑managed model, where compute is fully managed within the Fabric capacity, traditional Integration Runtimes are no longer required, and datasets and linked services are replaced with connection‑based configurations defined inline within pipeline activities.&lt;/P&gt;
&lt;P&gt;By adopting Fabric‑native capabilities such as deployment pipelines for CI/CD, Copilot‑assisted pipeline authoring, and OneLake, organizations can standardize pipeline lifecycle management, enable governed access to shared data assets across domains, and support multi‑cloud integration through virtualized data access allowing pipelines to operate on distributed datasets without duplicating or relocating data across Lakehouse, Data Warehouse, and Real‑Time Analytics workloads within a unified Fabric workspace.&lt;/P&gt;</description>
      <pubDate>Thu, 09 Apr 2026 19:36:15 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/migrating-azure-data-factory-and-synapse-pipelines-to-fabric/ba-p/4510051</guid>
      <dc:creator>claudiodasilva</dc:creator>
      <dc:date>2026-04-09T19:36:15Z</dc:date>
    </item>
    <item>
      <title>Chaos Engineering vs. STAF for SAP: Resilience Validation vs. Functional Assurance</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/chaos-engineering-vs-staf-for-sap-resilience-validation-vs/ba-p/4507483</link>
      <description>&lt;H3&gt;&lt;STRONG&gt;Introduction:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;As SAP environments transition to cloud platforms such as Azure, one strategic question consistently surfaces:&lt;/P&gt;
&lt;P&gt;“STAF proves SAP works, Chaos Engineering proves it survives. Why do we need both?”&lt;/P&gt;
&lt;P&gt;The short answer: STAF and Chaos Engineering serve different purposes and treating them as interchangeable can expose SAP production environments to unseen risk.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;A Quick Comparison for Mission Critical SAP Engagements&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;In the world of SAP on Azure, reliability and resilience are non-negotiable. Two powerful approaches. Chaos Engineering for SAP and SAP Testing Automation Framework (STAF) help ensure mission-critical workloads remain robust. But what sets them apart, and how do they complement each other?&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Why This Matters&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;SAP workloads often underpin core business processes. Downtime or misconfiguration can lead to significant operational and financial impact. While both Chaos Engineering and STAF aim to improve system reliability, they do so in very different ways.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Chaos Engineering for SAP&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Chaos Engineering is about &lt;STRONG&gt;proactively testing resilience&lt;/STRONG&gt; by introducing controlled failures into your environment. Using tools like &lt;STRONG&gt;Azure Chaos Studio&lt;/STRONG&gt;, engineers simulate real-world disruptions such as VM shutdowns, DNS failures, or network latency, to validate how SAP systems recover under stress.&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Benefits:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Identifies hidden weaknesses in architecture.&lt;/LI&gt;
&lt;LI&gt;Improves operational resilience through real-world failure scenarios.&lt;/LI&gt;
&lt;LI&gt;Enables &lt;STRONG&gt;game days&lt;/STRONG&gt; and &lt;STRONG&gt;BCDR drills&lt;/STRONG&gt; for mission-critical workloads.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;STAF focuses on &lt;STRONG&gt;automating high availability (HA) and configuration compliance testing&lt;/STRONG&gt; for SAP clusters on Azure. It uses &lt;STRONG&gt;Ansible playbooks and Python modules&lt;/STRONG&gt; to execute controlled failover scenarios like node crashes or process termination and generates auditable reports.&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Benefits:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Speeds up deployment readiness.&lt;/LI&gt;
&lt;LI&gt;Reduces manual testing effort.&lt;/LI&gt;
&lt;LI&gt;Validates HA configurations against best practices.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;Side-by-Side Comparison&lt;/STRONG&gt;&lt;/H6&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-18" border="1" style="width: 680px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Aspect&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering for SAP&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Primary Goal&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Validate resiliency under unpredictable conditions&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Automate HA and configuration compliance testing&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Scope&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Infrastructure-level stress and failure injection&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;SAP cluster failover and HA validation&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Approach&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Simulate real-world outages (VM shutdown, DNS failure)&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Controlled failover scenarios (node crash, process kill)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Tools Used&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Azure Chaos Studio&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Ansible playbooks + Python modules&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Observability insights, recovery behavior reports&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Auditable HTML compliance reports&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Use Case&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;BCDR drills, game days, proactive risk identification&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Pre-go-live readiness, periodic HA audits&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Complementarity&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Tests resilience beyond planned scenarios&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Ensures HA configuration meets best practices&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;STRONG&gt;When to Use Each&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;STAF&lt;/STRONG&gt; → Before go-live or during periodic audits to validate HA setup.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering&lt;/STRONG&gt; → For resilience testing under unexpected failures and operational stress.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Takeaway&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;These approaches are &lt;STRONG&gt;complementary&lt;/STRONG&gt;, not competing. Use STAF for structured HA validation and compliance. Use Chaos Engineering for real-world resilience testing and operational confidence.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Next Steps&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Explore &lt;STRONG&gt;Azure Chaos Studio&lt;/STRONG&gt; for chaos experiments.&lt;/LI&gt;
&lt;LI&gt;Download &lt;STRONG&gt;STAF&lt;/STRONG&gt; from GitHub and integrate it into your SAP deployment pipeline.&lt;/LI&gt;
&lt;LI&gt;Combine both for a comprehensive resiliency strategy.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The two concepts of STAF and Chaos Engineering are not alternatives but complements to each other. While the former tests the accuracy of the SAP system and the business processes involved in its functionality, the latter tests the system in the real world with failures to confirm its ability to cope with such failures in the cloud environment of Azure.&lt;/P&gt;
&lt;P&gt;Therefore, the use of the STAF concept alone gives us the confidence that the SAP system works as expected, but the addition of Chaos Engineering gives us the confidence that the system will still work even when things go wrong.&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Ref links:&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sap/automation/testing-framework" target="_blank" rel="noopener"&gt;About SAP Testing Automation Framework | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sap/automation/testing-framework-high-availability" target="_blank" rel="noopener"&gt;SAP Testing Automation Framework High Availability Testing | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/anukarnam/SAPTesting-Automation-Framework-" target="_blank" rel="noopener"&gt;anukarnam/SAPTesting-Automation-Framework-: The SAP Test Automation Framework is a set of tools and solutions developed to simplify and automate the process of testing SAP systems and other associated third-party applications. It helps to overcome the challenges associated with manual testing by offering strong automation solutions.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering – Resilience &amp;amp; Failure Readiness:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/chaos-studio/chaos-studio-overview" target="_blank" rel="noopener"&gt;What is Azure Chaos Studio? - Azure Chaos Studio | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/chaos-studio/chaos-studio-chaos-engineering-overview" target="_blank" rel="noopener"&gt;Understand chaos engineering and resilience with Chaos Studio - Azure Chaos Studio | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/sapapplications/using-azure-chaos-studio-to-fortify-sap-systems-testing-and-resiliency/4387503" target="_blank" rel="noopener"&gt;Using Azure Chaos Studio to Fortify SAP Systems Testing and Resiliency | Microsoft Community Hub&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2026 13:38:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/chaos-engineering-vs-staf-for-sap-resilience-validation-vs/ba-p/4507483</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-04-01T13:38:38Z</dc:date>
    </item>
    <item>
      <title>Legacy SharePoint Authentication (IDCRL) Is Retiring — What to Do Before May 1, 2026</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/legacy-sharepoint-authentication-idcrl-is-retiring-what-to-do/ba-p/4499131</link>
      <description>&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Audience:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;SharePoint admins, M365 admins, and anyone running automations that access SharePoint Online/OneDrive. This post explains&amp;nbsp;what’s&amp;nbsp;changing, how to detect legacy sign-ins, and the practical steps to move to modern authentication (OAuth) before the cutoff dates.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft is turning off a legacy SharePoint sign-in method called&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL &lt;STRONG&gt;(Identity Client Run Time Library)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If you only access SharePoint and OneDrive through the browser or Microsoft 365 apps, you’re probably fine—but if you run scripts, Power BI refreshes, Power Automate flows, or third-party tools that store a username/password, you’ll want to update those connections to&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Modern Authentication (OAuth/OpenID Connect)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;now to avoid outages.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;TL:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;DR&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;(What you need to know)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Who’s&amp;nbsp;most affected:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Any non-interactive connection that stores a SharePoint&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;username/password&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(scripts, scheduled jobs, Power BI refreshes, Power Automate flows, and third-party tools).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;What’s&amp;nbsp;changing:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Microsoft is retiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;legacy SharePoint authentication (IDCRL)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint Online and OneDrive for Business.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;What to do:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Move those connections to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(OAuth/OpenID Connect) using supported connectors, modules, or app registrations.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Key dates:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(legacy logins blocked by default),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(last day an admin extension can keep legacy auth temporarily allowed), and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(IDCRL fully retired and cannot be re-enabled).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Quick checklist&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Inventory:&lt;/STRONG&gt; list SharePoint connections you own (scripts, Power BI, Power Automate, third-party tools).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Spot legacy auth: &lt;/STRONG&gt;saved passwords, “Basic” auth, or PowerShell -Credential/SharePointOnlineCredentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Migrate: &lt;/STRONG&gt;switch to Modern Authentication (OAuth) using supported connectors/modules.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Test:&lt;/STRONG&gt;&amp;nbsp;run&amp;nbsp;the script/refresh/flow end-to-end and confirm it still works.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Finish early:&lt;/STRONG&gt; complete updates ahead of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and no later than&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What Is IDCRL and Why Is It Going Away?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL (Identity Client Run Time Library)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is an older SharePoint sign-in approach used by some legacy apps and scripts. In plain terms,&amp;nbsp;it’s&amp;nbsp;the “just pass a username and password” style of authentication. While most interactive sign-ins moved to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;years ago, some behind-the-scenes tools still use IDCRL—often without the person who set them up realizing it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Why is Microsoft&amp;nbsp;retiring&amp;nbsp;it?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Because password-based legacy flows are harder to protect and&amp;nbsp;don’t&amp;nbsp;align well with today’s security controls.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Modern Authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;uses&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OpenID Connect and OAuth 2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with short-lived tokens (not stored passwords) and works cleanly with protections like&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MFA&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and Conditional Access. This is part of Microsoft’s broader “secure by default” direction—and it reduces risk for both individual accounts and the organization.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;From Microsoft’s guidance, the main shift&amp;nbsp;is&amp;nbsp;stop&amp;nbsp;sending passwords to&amp;nbsp;SharePoint and&amp;nbsp;start&amp;nbsp;acquiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth access tokens&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;via the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft identity platform&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. For custom solutions, that typically means using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MSAL&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(Microsoft Authentication Library) and either an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;interactive sign-in&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(delegated permissions) or an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;app-only&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;approach (application permissions) depending on your scenario.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Key Dates and Impact on Users&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here’s&amp;nbsp;the timeline Microsoft shared for SharePoint Online and OneDrive for Business:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is when&amp;nbsp;remaining&amp;nbsp;legacy (IDCRL) logins will be&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;blocked by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If customers need&amp;nbsp;additional&amp;nbsp;time to complete migration, tenant admins can temporarily allow legacy authentication again &lt;STRONG&gt;(extension)&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;until April 30, 2026&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&amp;nbsp;Then, on&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, IDCRL is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;fully retired&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;cannot be re-enabled&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In other words,&amp;nbsp;anything still&amp;nbsp;connected&amp;nbsp;with an embedded username/password is likely to break. The risk is concentrated in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;custom&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;integrations and automations (scripts, refreshes,&amp;nbsp;flows,&amp;nbsp;vendor tools) that still rely on legacy auth.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How Do I Know If&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;I’m&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;Using Legacy Authentication?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you only access SharePoint/OneDrive through the browser, Microsoft 365 apps, or standard Microsoft connectors,&amp;nbsp;you’re&amp;nbsp;typically already using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. A simple rule of thumb:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;if a script, dataset, flow, or tool stores a SharePoint username/password, plan to modernize it&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. For the most common patterns and what to switch to, see&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;How to Transition to Modern Authentication (Action Plan)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;below.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Check Microsoft Purview audit logs (recommended)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you want a definitive answer (beyond “does this script store a password?”), review your tenant’s activity in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;events.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Open the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview portal&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and go to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="16" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Audit search&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for an appropriate time range (start with the last&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;30–60 days&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Under &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Activities (operation&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;s name)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, select&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Submit the search, review results, then&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;export&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(download) the results for deeper filtering in Excel.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;What to look for in the export&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;results, focus on the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;user/account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;time pattern&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and any available&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;client/app details&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(for example, user agent, application name, or client IP) to pinpoint&amp;nbsp;what’s&amp;nbsp;generating the legacy sign-ins.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Look for patterns that match automation&lt;/STRONG&gt;: recurring events (hourly/daily), service accounts, or sign-ins that line up with scheduled refreshes/flows. Then map those timestamps back to&amp;nbsp;likely owners:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power BI datasets&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power Automate&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;flows, scripts, or vendor tools.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If your export includes &lt;STRONG&gt;client/app identifiers&lt;/STRONG&gt;, note any&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;unexpected apps&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;accessing SharePoint; those are the best candidates to&amp;nbsp;validate&amp;nbsp;and migrate first.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Cross-check suspicious entries&lt;/STRONG&gt; with your inventory (scripts, Power BI datasets, Power Automate flows, vendor tools) and then update the matching connection to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Not sure whether something you own is using legacy auth? A good starting point is to check how the connection was set up: if it relies on a stored password, plan to update it.&amp;nbsp;If&amp;nbsp;you’re&amp;nbsp;still unsure, reach out to IT support or the vendor/developer of the tool—many providers have already published “modern auth” upgrade steps.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How to Transition to Modern Authentication (Action Plan)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you own anything that connects to SharePoint behind the scenes, the goal is simple:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;move every connection to Modern Authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;test it end-to-end&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;well before the cutoff. Below are the most common “legacy” patterns and what to switch to.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Common legacy scenarios (and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;modern&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;&amp;nbsp;replacement)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;1) PowerShell scripts or custom code that pass a username/password&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If you’re using older SharePoint Online PowerShell patterns like &lt;STRONG&gt;-Credential, &lt;/STRONG&gt;&lt;STRONG&gt;Get-Credential &lt;/STRONG&gt;or&amp;nbsp;&lt;STRONG&gt;SharePointOnlineCredentials&lt;/STRONG&gt;, plan to update.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Use updated modules that default to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;or&amp;nbsp;use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;PnP PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with interactive sign-in or an Entra app (certificate/client ID) rather than stored credentials.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Additionally&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;according to&amp;nbsp;Microsoft’s announcement in the M365 admin center (MC1188595), the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft.Online.SharePoint.PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;module (&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;version 16.0.26712.12000 or newer&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) supports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;app-only authentication with a certificate&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Entra app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(instead of legacy username/password patterns), using Connect-SPOService.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For custom apps, adopt token-based auth via&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MSAL&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;supported&amp;nbsp;SharePoint libraries.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Example:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559685&amp;quot;:360,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;$appID = "1e499dc4-1988-48ef-8f4f-9756f4f04548" # This is your Entra App ID 
$tenant = "9cfc52cb-53da-4154-67e9-b20b170b7ba3" # This is your Tenant ID 
$thumbprint = "6EAD7303b5C7E27Dc4245989AD554642940BA093" # This is certificate thumbprint 
$cert = Get-ChildItem Cert:\LocalMachine\My\$thumbprint 
Connect-SPOService -Url 'https://contoso-admin.sharepoint.com' -Certificate $cert -ClientId $appID -TenantId $tenant &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335557856&amp;quot;:16777215,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;2) &lt;STRONG&gt;Power BI reports&lt;/STRONG&gt; that connect to SharePoint using “Basic” credentials&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;In Power BI Desktop, open&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Data source settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint connections and switch the authentication method to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft (Organizational) Account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;/&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth2&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After updating,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;re-publish&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and confirm scheduled refresh still works.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;3) &lt;STRONG&gt;Power Automate flows &lt;/STRONG&gt;(or workflows) that store a username/password&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Prefer the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;official SharePoint connector&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(modern auth by default) over custom HTTP calls with stored credentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For custom connectors, use an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Azure AD app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and configure&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&amp;nbsp;2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;so the flow uses tokens, not passwords.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;4) &lt;STRONG&gt;Third-party tools&lt;/STRONG&gt; (migration/sync/reporting) that use “other user” or stored credentials&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Update the tool to the latest version and confirm it supports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint Online.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run a full test (connect, read/write, scheduled jobs) well before the cutoff dates.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;A few best practices while&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;you’re&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;&amp;nbsp;updating&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Don’t&amp;nbsp;delay:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Modernize your connections&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;before mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(when legacy logins are blocked by default), and no later than&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Extension (if needed):&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;If you need more time, tenant admins can temporarily allow legacy authentication&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;until April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Treat this as short-term mitigation while your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;complete&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;migration and validation—not a long-term solution.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Use official solutions:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Where possible, use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft’s supported clients and connectors&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(like updated SharePoint PowerShell modules,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power BI’s OAuth login&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power&amp;nbsp;Automate&amp;nbsp;SharePoint actions&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) instead of hard-coding credentials.&amp;nbsp;These default options&amp;nbsp;are already used by&amp;nbsp;modern auth and will help ensure access continues.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Improve security:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Embrace modern authentication to&amp;nbsp;benefit&amp;nbsp;from&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;better security&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(support for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MFA&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, conditional access, etc.) and to&amp;nbsp;eliminate&amp;nbsp;reliance on outdated passwords or legacy API calls.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Get help if needed:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;If&amp;nbsp;you’re&amp;nbsp;unsure how to update a specific application or script, contact your IT support team or the vendor/developer of the tool.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;PowerShell: temporarily allow legacy authentication (extension)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If an extension is&amp;nbsp;required, tenant admins can use SharePoint Online PowerShell to temporarily allow legacy authentication by setting&amp;nbsp;AllowLegacyAuthProtocolsEnabledSetting&amp;nbsp;and&amp;nbsp;LegacyAuthProtocolsEnabled&amp;nbsp;to $true.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Set-SPOTenant -AllowLegacyAuthProtocolsEnabledSetting $true 
Set-SPOTenant -LegacyAuthProtocolsEnabled $true  &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Recommendation:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Block time now to inventory and modernize your SharePoint connections, then run a full end-to-end test. Doing this early helps you avoid last-minute troubleshooting when a refresh, script, or workflow suddenly fails.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Next steps (recommended)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run a Purview audit search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(last 30–60 days) and&amp;nbsp;identify&amp;nbsp;the owners of each recurring legacy sign-in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Prioritize and modernize the highest-impact items first (scheduled Power BI refreshes, production automations, service accounts, and vendor tools), then test end-to-end.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If you must use the temporary extension, set a firm internal deadline to turn it back off and complete migration before&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Helpful Resources and Support&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For further reading and technical guidance, please see the following official resource:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;A href="https://devblogs.microsoft.com/microsoft365dev/migrating-from-idcrl-authentication-to-modern-authentication-in-sharepoint/" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Microsoft 365 Developer Blog –&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Migrating from IDCRL to Modern Authentication in SharePoint&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;– Explains the retirement decision and provides developer-oriented steps for migrating code and scripts to MSAL/OAuth.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Conclusion and call to action&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL retirement is one of those changes&amp;nbsp;that is&amp;nbsp;easy to miss until something breaks—because the impact shows up in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;background jobs&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, not in day-to-day browser use. The good news is that the fix is straightforward:&amp;nbsp;identify&amp;nbsp;anything still using stored credentials and move it to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication (OAuth)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;well before the deadline.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Inventory:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;list&amp;nbsp;every script, dataset, flow, and vendor tool that connects to SharePoint/OneDrive.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Modernize:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;replace embedded usernames/passwords with OAuth via supported connectors, updated modules, or an Entra app registration.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Test:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;run each workload end-to-end (including scheduled runs) and confirm it behaves as expected.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Timeline reminder:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;legacy logins are blocked by default in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, extensions (if used) run through&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and IDCRL is fully retired on&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Q&amp;amp;A&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: Will this impact end users who only use SharePoint in a browser or the Microsoft 365 apps?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Typically, no. Most interactive sign-ins already use modern authentication. The main risk is with background processes that still send stored usernames/passwords.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q:&amp;nbsp;What’s&amp;nbsp;most likely to break?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Anything non-interactive that connects to SharePoint/OneDrive using embedded credentials—PowerShell scripts, scheduled jobs, Power BI refreshes configured with “Basic” credentials, Power Automate flows/custom connectors that store passwords, and some third-party tools.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: How can I confirm whether my tenant is still using IDCRL?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Export the results and look for recurring patterns (service accounts, scheduled times, consistent client/app details) to&amp;nbsp;identify&amp;nbsp;the source.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What happens in mid-February 2026 vs. May 1, 2026?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: In&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, legacy (IDCRL) logins are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;blocked by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;—so legacy-dependent workloads may start failing unless updated (or temporarily re-enabled).&amp;nbsp;On&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, IDCRL is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;fully retired&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and cannot be re-enabled.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: We need more time—what does the “extension” do?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: It temporarily allows legacy authentication again&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;through April 30,&amp;nbsp;2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;while&amp;nbsp;you&amp;nbsp;complete migration. You can enable it with:&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Set-SPOTenant&amp;nbsp;-AllowLegacyAuthProtocolsEnabledSetting&amp;nbsp;$true&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Set-SPOTenant&amp;nbsp;-LegacyAuthProtocolsEnabled&amp;nbsp;$true&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Use this as a short-term mitigation and set a firm plan to turn it back off after you modernize.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q:&amp;nbsp;What’s&amp;nbsp;the recommended modern auth approach for PowerShell?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Use modern modules and token-based sign-in (OAuth). For automation, use an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Entra app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with a certificate (app-only) where&amp;nbsp;appropriate. The updated&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft.Online.SharePoint.PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;module (v16.0.26712.12000+) also supports Connect-SPOService&amp;nbsp;with certificate-based app-only authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What should I do for Power BI datasets that connect to SharePoint?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: In Power BI Desktop, update the SharePoint data source authentication to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft (Organizational) Account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;/&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth2&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, then republish and&amp;nbsp;validate&amp;nbsp;that scheduled refresh succeeds.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What about Power Automate flows or custom connectors?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Prefer the built-in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint connector&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(modern auth by default). If&amp;nbsp;you’re&amp;nbsp;using custom HTTP actions or custom connectors, update them to use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth 2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with an Entra app registration rather than stored credentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Admin email template (notify owners&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;identified&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;in Purview)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Use the template below to contact the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;user/account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;you found in your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;audit export. Copy/paste it into Outlook, then fill in the placeholders (timestamps, site, and any client details) so the recipient can quickly&amp;nbsp;identify&amp;nbsp;the workload.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Subject:&amp;nbsp;Action&amp;nbsp;required: Update a SharePoint/OneDrive connection using legacy authentication (IDCRL)&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Hi &amp;lt;Name&amp;gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;We’re&amp;nbsp;reaching out because Microsoft is&amp;nbsp;retiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;legacy SharePoint authentication (IDCRL)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Our audit review&amp;nbsp;indicates&amp;nbsp;a legacy sign-in associated with your account. If the underlying workload&amp;nbsp;isn’t&amp;nbsp;updated, it may fail when legacy authentication is blocked/retired.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What we&amp;nbsp;observed&amp;nbsp;(from Microsoft Purview audit)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;User/account: &amp;lt;UPN or service account&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Activity:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Timestamp(s): &amp;lt;YYYY-MM-DD HH:MM TZ&amp;gt; (add 2–3 examples if recurring)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint site (if known): &amp;lt;site URL&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Client details (if available): &amp;lt;client/app, user agent, IP&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What we need from you&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="31" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Please confirm&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;what workload&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is generating this sign-in (for example: Power BI dataset refresh, Power Automate flow, PowerShell script, scheduled job, or a third-party tool).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="31" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;you’re&amp;nbsp;not the owner, please reply with the correct owner/contact (a team name or distribution list is fine).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Timeline&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Mid-February 2026:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;legacy logins blocked by default&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;IDCRL fully retired (cannot be re-enabled)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Note:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;if an extension is used, it is temporary and runs through&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;How we&amp;nbsp;can help&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;We can&amp;nbsp;help update the connection to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication (OAuth)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. In many cases this is as simple as re-authenticating with “Microsoft (Organizational) Account”/OAuth (Power BI), using the SharePoint connector (Power Automate), or updating scripts to use an Entra app registration with certificate-based authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Please reply by: &amp;lt;target response date&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Thanks,&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Your name&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Team/Role&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Contact info&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Tip:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Consider including 2–3 sample timestamps from the export (especially recurring ones) and, if you have it, the dataset/flow name or server/job name that matches the schedule. If you&amp;nbsp;don’t&amp;nbsp;get a response, follow up with the&amp;nbsp;user’s&amp;nbsp;manager or the&amp;nbsp;owning&amp;nbsp;team for the workload, and consider using the temporary extension only as a short-term mitigation while ownership is confirmed.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Mar 2026 20:15:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/legacy-sharepoint-authentication-idcrl-is-retiring-what-to-do/ba-p/4499131</guid>
      <dc:creator>mikeleemsft</dc:creator>
      <dc:date>2026-03-03T20:15:00Z</dc:date>
    </item>
    <item>
      <title>SharePoint and OneDrive Site User ID Mismatch Explored</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-and-onedrive-site-user-id-mismatch-explored/ba-p/4496476</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;SharePoint / OneDrive request access dialog&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this post, we walk through why users who look ‘healthy’ on the surface can still experience issues, and we cover practical ways to prevent and fix them across identity lifecycle management, rehire scenarios, tenant changes, and operational hygiene.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Who this is for&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Microsoft 365 / SharePoint admins troubleshooting unexpected &lt;EM&gt;Access denied&lt;/EM&gt; issues in SharePoint or OneDrive.&lt;/LI&gt;
&lt;LI&gt;Identity admins managing offboarding, rehiring, account restores, or account recreation in Microsoft Entra ID.&lt;/LI&gt;
&lt;LI&gt;Migration teams performing tenant-to-tenant migrations, domain changes, or identity consolidation.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-BackgroundDesign" class="lia-anchor"&gt;&lt;/a&gt;Background Design Explained&lt;/H1&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;When a user is created in Microsoft Entra ID, there is no guarantee that the User Principal Name (UPN) is unique so there is a unique id (historically known as PUID) that is created and passed to SharePoint. When a user is granted permission to a SharePoint or OneDrive Site or file explicitly the user information is added to a hidden list User Information List (UIL) that&amp;nbsp;stores basic details&amp;nbsp;about the users.&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;For users that are given permission via Office 365 Group, Security group, sharing link, the user profile information is not added until the first time the user interacts with the site or file.&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The users unique id, UPN, and other user information will be added to the UIL.&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;The User Information List (UIL) is maintained&amp;nbsp;per site collection&amp;nbsp;and is separate from Microsoft Entra ID and SharePoint User Profile Service.&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;As part of authorization, the unique id that is found in the UIL is evaluated to the unique id that is passed via the authentication token and if they do not match then the authorization fails and the user receives “Access Denied”.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Scenario:&lt;/STRONG&gt; Taylor Smith (UPN &lt;A href="mailto:taylor.smith@contoso.com" target="_blank" rel="noopener"&gt;&lt;EM&gt;taylor.smith@contoso.com&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;)&amp;nbsp; has &lt;/EM&gt;confidential SharePoint/OneDrive access. Sometime after Taylor leaves the company, a new user joins the company with the same name and is assigned the same UPN. &amp;nbsp;The new Taylor should not inherit the former Taylor’s access or content. SharePoint prevents this by checking a unique identifier via the User Information List (UIL), ensuring only matching IDs can access content.&lt;/P&gt;
&lt;H1&gt;&lt;a id="community--1-Considerations" class="lia-anchor"&gt;&lt;/a&gt;Considerations for users removed from Entra ID&lt;/H1&gt;
&lt;P&gt;It’s common to notice users removed from Entra ID still showing up in SharePoint or OneDrive. SharePoint intentionally retains these accounts in the site’s User Information List to preserve:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Document meta data such as “Created By” or “Modified By” information&lt;/LI&gt;
&lt;LI&gt;Audit and compliance records&lt;/LI&gt;
&lt;LI&gt;Legacy permission references&lt;/LI&gt;
&lt;LI&gt;Sharing and version history integrity&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;As a result, terminated or mail-disabled users may still appear in:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Site People lists (e.g., _layouts/15/people.aspx)&lt;/LI&gt;
&lt;LI&gt;Group‑connected site membership views&lt;/LI&gt;
&lt;LI&gt;SharePoint user pickers&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This visibility is expected and &lt;STRONG&gt;not&lt;/STRONG&gt; a security risk because:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A disabled or deleted Entra ID&amp;nbsp;account&amp;nbsp;cannot authenticate&lt;/LI&gt;
&lt;LI&gt;SharePoint permissions are not re‑granted&lt;/LI&gt;
&lt;LI&gt;The presence of the user record does not re‑enable access&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-PreventativeMeasures" class="lia-anchor"&gt;&lt;/a&gt;Preventive Measures to Avoid Site User ID Mismatches&lt;/H1&gt;
&lt;P&gt;Preventing Site ID mismatches is largely about identity management. The goal is to avoid situations where a SharePoint site has one ID for a user and Entra ID has another. Here are strategies to minimize the chances of a mismatch occurring:&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Identity lifecycle best practices&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Avoid reusing a former employee’s UPN&lt;/STRONG&gt;: If possible, do not create a new account with the same username. If you must reuse, ensure you’ve cleaned up the old account’s SharePoint presence (see next points) before the new user starts using SharePoint.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Rehire scenarios&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Leverage account restores when rehiring&lt;/STRONG&gt;: If an employee returns within Entra ID’s 30-day soft-delete window, restore the original account in Entra ID instead of creating a new one. This way, the user’s PUID is the same, and no mismatch will occur because as far as SharePoint is concerned it’s the same account. If outside the 30 days, restoration isn’t possible then extra cleanup will be needed.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Educate and coordinate with HR/IT for re-hires&lt;/STRONG&gt;: Often, IT might not realize that creating a returning employee’s account from scratch can cause access issues. Train staff on Site ID mismatches so they know to restore the old account when possible or run diagnostics/cleanup quickly after creating a new account. A standard operating procedure for &lt;EM&gt;rehired employee account setup&lt;/EM&gt; that includes checking for SharePoint conflicts is valuable.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Change UPNs by renaming, not recreating&lt;/STRONG&gt;: If you need to change a user’s UPN (for example, after a name change or domain change), &lt;STRONG&gt;rename the existing account&lt;/STRONG&gt; (&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/howto-troubleshoot-upn-changes" target="_blank" rel="noopener"&gt;Plan and troubleshoot User Principal Name changes in Microsoft Entra ID&lt;/A&gt;) rather than delete and create new. Entra ID allows updating the UPN of a user. SharePoint will typically update the user info entry’s UPN on next sync. This way, the user’s PUID stays consistent. &lt;EM style="color: rgb(30, 30, 30);"&gt;Documentation:&lt;/EM&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/upn-changes" target="_blank" rel="noopener"&gt;How UPN changes affect OneDrive - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://learn.microsoft.com/en-us/sharepoint/change-your-sharepoint-domain-name" target="_blank" rel="noopener"&gt;Change your SharePoint domain name - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Tenant/domain changes&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Gracefully handle corporate domain transitions&lt;/STRONG&gt;: In tenant-to-tenant migrations or domain swaps (such as consolidating two Entra ID tenants), be aware of PUIDs. Use migration tools that map old IDs to new ones or plan to run the fixes post-migration if users receive new IDs. If user/profile mapping isn’t available, treat it like bulk rehiring.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Operational hygiene&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement a UPN reuse delay or alteration&lt;/STRONG&gt;: Some organizations choose to alter the UPN of departing users for a period to prevent accidental reuse (for example, rename jdoe@company.com to jdoe_deactivated@company.com) before deletion. If your policies allow, avoiding UPN reuse entirely is the simplest way to prevent identity confusion.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maintain documentation of user’s site access&lt;/STRONG&gt;: Knowing which sites a user previously accessed makes it easier to clean up conflicts and restore access for legitimate rehires. Centralized, group-based permission management can also simplify re-permissioning once the mismatch is fixed. We have seen this accomplished in the following ways:
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/microsoft_graph_data_connect_for_sharepo/links-about-microsoft-graph-data-connect-for-sharepoint/4069045" target="_blank" rel="noopener" data-lia-auto-title="Microsoft Graph Data Connect for SharePoint" data-lia-auto-title-active="0"&gt;Microsoft Graph Data Connect for SharePoint&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Custom scripts and Tools&lt;/LI&gt;
&lt;LI&gt;Third Party Tools&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear SharePoint user info on departure (if feasible)&lt;/STRONG&gt;: For users who are permanently gone, you can remove them from SharePoint site collections, so old UIL entries don’t linger and later conflict with a reused UPN. This cleanup can be part of an offboarding checklist when appropriate. The cleanup will be 2 steps:&amp;nbsp;
&lt;OL&gt;
&lt;LI&gt;Locate which sites a user previously had access to:
&lt;UL&gt;
&lt;LI&gt;If the user has been deleted from Entra then the use of custom scripts will be needed to identify sites that the user previously had access to. &amp;nbsp;Example Script &lt;A class="lia-external-url" href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-FindAccess-SPO.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-FindAccess-SPO.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;If the user still exists in Entra, use the SharePoint Data Access Governance reports to locate sites accessible for a given user. &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/data-access-governance-site-permissions-users-report" target="_blank" rel="noopener"&gt;Data access governance reports - get site permission report for given users&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Once you have a list of sites that the user has accessed, you will need to remove them from that site.
&lt;UL&gt;
&lt;LI&gt;Create a script utilizing remove-spouser (&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/remove-users#remove-people-from-the-userinfo-list" target="_blank" rel="noopener"&gt;Remove users from SharePoint&lt;/A&gt;) for&amp;nbsp;all sites that the user had access to previously.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Process for guest users&lt;/STRONG&gt;: If you remove guest users, consider also cleaning them from site permissions if they might be re-invited later.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-Cleanup" class="lia-anchor"&gt;&lt;/a&gt;Cleanup Site User ID Mismatches&lt;/H1&gt;
&lt;P&gt;Once there is a user encountering a Site User ID Mismatch then you will have to do a cleanup reactively. &amp;nbsp;Review the article and use the tools outlined to address the OneDrive site as well as critical sites.&lt;/P&gt;
&lt;P&gt;If you do not need an inventory of sites, the user had access to previously to facilitate restoring access to those files/sites then you could do a cleanup of the user through script. The following is an example of such a script: &amp;nbsp;&lt;/P&gt;
&lt;P&gt;If a user encounters a Site User ID Mismatch, follow these steps to resolve the issue:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Review the article "&lt;A href="https://learn.microsoft.com/en-us/troubleshoot/sharepoint/sharing-and-permissions/fix-site-user-id-mismatch" target="_blank" rel="noopener"&gt;Fix site user ID mismatch in SharePoint or OneDrive&lt;/A&gt;" for guidance on addressing mismatches. Use the tools outlined in the article to fix issues with the OneDrive site and any other critical sites.&lt;/LI&gt;
&lt;LI&gt;If you do not need an inventory of sites the user previously accessed, proceed with cleaning up the user using a script. Refer to &lt;A href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-SPOUserRemover.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-SPOUserRemover.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt; for details that could be used. Use this option if restoring access to those files or sites is not required.&lt;/LI&gt;
&lt;LI&gt;If you need an inventory of sites that the user previously had access to provide access later, then you will need a script or report of the permission inventory for the site prior to removing the user from the site.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Users can then move forward with sharing or resharing content/sites to the new user instance, which will write a new entry to the user information list, with the correct unique ID, allowing access.&lt;/P&gt;
&lt;H1&gt;&lt;a id="community--1-Summary" class="lia-anchor"&gt;&lt;/a&gt;Summary&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;User Site ID mismatches occur when a user is recreated with the same UPN but a different underlying identity, leading to SharePoint or OneDrive access issues.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;SharePoint authorizes access using a unique ID (PUID) stored per site in the User Information List (UIL), not just the users' UPN.&lt;/LI&gt;
&lt;LI&gt;Disabled or deleted users may still appear in SharePoint by design to preserve audit history and document ownership—this is not a security issue.&lt;/LI&gt;
&lt;LI&gt;Prevention focuses on avoiding UPN reuse through process changes.&lt;/LI&gt;
&lt;LI&gt;Resolution options depend on the scenario: admins can either remove the old user entry directly if access history is not needed, or inventory and clean up affected sites before resharing content to the new account, so the correct ID is written.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-FurtherReading" class="lia-anchor"&gt;&lt;/a&gt;Further Reading&lt;/H1&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/troubleshoot/sharepoint/sharing-and-permissions/fix-site-user-id-mismatch" target="_blank" rel="noopener"&gt;Fix site user ID mismatch in SharePoint or OneDrive - SharePoint&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/remove-users" target="_blank" rel="noopener"&gt;Remove users from SharePoint&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://gist.github.com/joerodgers/a0655669d9184b31ee0b027a73997435" target="_blank" rel="noopener"&gt;This script will create a report containing OD4B sites and the value of the AadObjectId stored in SharePoint and Azure Active Directory. This data can be used to help detect Site ID mismatches of OD4B site owners. · GitHub&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-SPOUserRemover.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-SPOUserRemover.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Mar 2026 17:00:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-and-onedrive-site-user-id-mismatch-explored/ba-p/4496476</guid>
      <dc:creator>Tania Menice</dc:creator>
      <dc:date>2026-03-03T17:00:50Z</dc:date>
    </item>
    <item>
      <title>Finding and Remediating EWS App Usage Before Retirement</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/finding-and-remediating-ews-app-usage-before-retirement/ba-p/4497659</link>
      <description>&lt;P&gt;In this post, we wanted to share a practical walk-through of discovering which Azure AD app registrations are still using Exchange Web Services (EWS), plus what the Kiosk/Frontline license changes mean as you plan your move to Microsoft Graph.&lt;/P&gt;
&lt;P&gt;Microsoft has announced that Exchange Online EWS blocking with start on October 1, 2026. If you have line-of-business apps, third-party tools, or automation that still depends on EWS, you need two things: (1) an inventory of what’s using EWS today, and (2) a migration plan to supported alternatives – typically Microsoft Graph.&lt;/P&gt;
&lt;H1&gt;What’s changing (and why you should care now)&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/exchange/retirement-of-exchange-web-services-in-exchange-online/3924440" target="_blank"&gt;&lt;STRONG&gt;EWS retirement in Exchange Online&lt;/STRONG&gt;&lt;/A&gt;: Microsoft will start blocking EWS requests to Exchange Online on &lt;STRONG&gt;October 1, 2026&lt;/STRONG&gt;. The guidance is to migrate integrations to &lt;STRONG&gt;Microsoft Graph&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/exchange/update-to-ews-access-for-kiosk--frontline-worker-licensed-users/4474299" target="_blank"&gt;&lt;STRONG&gt;EWS access changes for Kiosk / Frontline licenses&lt;/STRONG&gt;&lt;/A&gt;: Starting at the &lt;STRONG&gt;end of June 2026&lt;/STRONG&gt;, Microsoft will start blocking EWS access for users &lt;STRONG&gt;without license rights to EWS&lt;/STRONG&gt; (for example, certain Kiosk and Frontline Worker license types). This can cause EWS-based integrations for such licensed users to fail &lt;EM&gt;before&lt;/EM&gt; the broader October retirement date.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Even if you plan to complete your Graph migration well ahead of October 2026, the end-of-June 2026 licensing-related blocks mean you should validate whether any users with those licenses assigned use EWS. That’s where the &lt;A href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting" target="_blank"&gt;Exchange-App-Usage-Reporting&lt;/A&gt; script is useful: it helps you find app registrations with EWS permissions and correlate them with recent sign-in activity so you can prioritize remediation.&lt;/P&gt;
&lt;H4&gt;Start here: check your Message Center first&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-ogsc="rgb(36, 36, 36)"&gt;The first thing you can do is to check your tenant&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ogsc="rgb(0, 120, 215)"&gt;&lt;A href="https://go.microsoft.com/fwlink/p/?linkid=2070717" data-outlook-id="2caf9581-3d88-449d-9d8b-b13052e2ad6e" data-ogsc="rgb(0, 120, 215)" target="_blank"&gt;Message Center&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN data-ogsc="rgb(36, 36, 36)"&gt;&amp;nbsp;(you need either Global Admin or Privacy Reader roles) and search for "Update active Exchange Web Services Applications" in Inbox or Archive. If you do not have such messages, you&amp;nbsp;&lt;EM&gt;likely&lt;/EM&gt;&amp;nbsp;do not have EWS usage in your tenant and are not impacted by this deprecation. We started to send EWS usage messages to all tenants in late December 2025.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;What the Exchange-App-Usage-Reporting script does&lt;/H1&gt;
&lt;P&gt;The script is designed to answer a practical question: &lt;EM&gt;Which Azure AD app registrations in my tenant have EWS permissions, and are they still being used?&lt;/EM&gt; At a high level, it:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Discovers application registrations that have permissions associated with Exchange/EWS-related access.&lt;/LI&gt;
&lt;LI&gt;Queries sign-in activity for those applications to determine active applications.&lt;/LI&gt;
&lt;LI&gt;Queries audit logs for EWS activity within the tenant.&lt;/LI&gt;
&lt;LI&gt;Outputs report files that you can sort and share with app owners.&lt;/LI&gt;
&lt;LI&gt;Outputs a user license report to help identify kiosk or frontline workers.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1&gt;How the script complements the Microsoft 365 admin center EWS usage report&lt;/H1&gt;
&lt;P&gt;For customers in our WW service, the &lt;A href="https://learn.microsoft.com/microsoft-365/admin/activity-reports/ews-usage?view=o365-worldwide" target="_blank"&gt;Microsoft 365 admin center EWS usage report&lt;/A&gt; is a great starting point because it summarizes EWS activity across your tenant and breaks down which EWS SOAP actions are being called and their volumes over time. That helps you quantify overall EWS dependency and spot the heaviest EWS workloads.&lt;/P&gt;
&lt;P&gt;Where teams often get stuck is turning that usage signal into an actionable remediation plan (for example, identifying the exact Entra ID app registration/service principal, determining whether it is still actively used, and finding the people and mailboxes affected). Exchange-App-Usage-Reporting script is intended to bridge that gap by adding identity and operational context around EWS usage by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;App registration and ownership context: identifies Entra ID app registrations/service principals with EWS-related permissions so you can immediately pivot from “an app is calling EWS” to “this is the app object to remediate,” then route it to the right owner/team.&lt;/LI&gt;
&lt;LI&gt;Recency and “is it still used?” signals: correlates apps to sign-in activity so you can prioritize the apps that are actively authenticating today versus stale registrations that may be safe to validate/decommission.&lt;/LI&gt;
&lt;LI&gt;Authentication + permission model visibility: helps you distinguish whether usage is tied to application permissions versus delegated patterns, which matters for choosing the right Microsoft Graph migration approach and designing least-privilege access.&lt;/LI&gt;
&lt;LI&gt;Mailbox population risk (Kiosk/Frontline): adds a user license report so you can quickly identify whether the EWS-dependent workflow touches mailboxes that may lose EWS access earlier (end of June 2026).&lt;/LI&gt;
&lt;LI&gt;Exportable, app-centric worklists: produces CSVs you can sort/share (for example, by last sign-in) to drive an engineering backlog: confirm owner, confirm scenario, map EWS operations to Graph endpoints, and track progress to zero.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In practice, use the admin center report to understand &lt;EM&gt;what&lt;/EM&gt; EWS operations are happening and at what scale, then use this script to determine &lt;EM&gt;which&lt;/EM&gt; app registrations are responsible, &lt;EM&gt;who&lt;/EM&gt; owns them, &lt;EM&gt;whether&lt;/EM&gt; they’re still active, and &lt;EM&gt;which&lt;/EM&gt; mailbox/license populations are most likely to experience impact first.&lt;/P&gt;
&lt;P&gt;Customers with tenants that are not in our WW cloud should rely heavily on the script as admin center reports are not available.&lt;/P&gt;
&lt;H1&gt;Step-by-step: run the script and generate the report&lt;/H1&gt;
&lt;H2&gt;1) Download the code&lt;/H2&gt;
&lt;P&gt;The repository for this solution can be found &lt;A href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting/archive/refs/heads/main.zip" target="_blank"&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Note: The following permissions are required for the application:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AuditLogsQuery.ReadAll&lt;/STRONG&gt; to query the audit logs for EWS activity&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Application.Read.All&lt;/STRONG&gt; to locate app registrations&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AuditLogs.Read.All&lt;/STRONG&gt; to query sign-in activity&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Directory.Read.All&lt;/STRONG&gt; to query user license information&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Read &lt;A class="lia-external-url" href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting/blob/main/Create%20an%20App%20registration.md" target="_blank"&gt;this &lt;/A&gt;to create the Entra Admin Center application for the script.&lt;/P&gt;
&lt;H2&gt;2) Get active applications&lt;/H2&gt;
&lt;P&gt;Open a PowerShell session and change to the folder where you downloaded the script. You may need to unblock the files (for example, by using &lt;EM&gt;Unblock-File&lt;/EM&gt;) before execution. Run the script with the following example syntax:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application -Operation GetEwsActivity&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The output provides a list of applications with EWS permissions and the last sign-in for the associated service principal. A CSV file called App-SignInActivity-yyyyMMddhhmm will be created in the specified output path.&lt;/P&gt;
&lt;H2&gt;3) Get sign-in activity report for an application&lt;/H2&gt;
&lt;P&gt;Use the output from the previous step to get the sign-in activity for an application (you need to run this step for each application). Depending on the size of your tenant, you may also need to adjust the StartDate, EndDate, and have the Interval be 1 hour.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d&amp;nbsp; -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application -Operation GetAppUsage -QueryType SignInLogs -Name TJM-EWS-SoftDelete-Script -AppId 86277a5c-d649-46fc-8bf6-48e2a684624b -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date).AddDays(-14) -Interval 8&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The output provides a list of users that have signed into the application in the specified period requested. A CSV file called &amp;lt;AppId&amp;gt;-SignInEvents-yyyyMMddhhmm will be created in the specified output path.&lt;/P&gt;
&lt;H2&gt;4) Get user license information (Kiosk and Frontline identification)&lt;/H2&gt;
&lt;P&gt;For those organizations that have users with licenses that may be impacted by the upcoming enforcement in June, a report of user licenses can also be generated to help identify potential impact. The output from the previous step can be used to generate this license report. A single CSV file with the results from each application can also be merged into a single user license report.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d&amp;nbsp; -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application &lt;/EM&gt;&lt;EM&gt;-Operation GetUserLicenses -AppUsageSignInCsv C:\Temp\Output\86277a5c-d649-46fc-8bf6-48e2a684624b-SignInEvents-20260203122538.csv&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;How to interpret the output (and prioritize fixes)&lt;/H1&gt;
&lt;P&gt;Once you have the output files, sort by “last sign-in”. Apps with recent activity are your highest priority because they’re more likely to break production workloads when EWS is blocked. Apps with no sign-in data may be dormant, misconfigured, or retired—treat these as “needs validation,” not automatically “safe to ignore.”&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Identify the owner&lt;/STRONG&gt; of each app registration (or the business system it belongs to).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Confirm the workload&lt;/STRONG&gt;: mailbox access patterns (read, send, calendar, contacts, etc.) and whether it uses application or delegated access.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Check mailbox populations&lt;/STRONG&gt; the app touches—especially if any are assigned Kiosk / Frontline licenses that may lose EWS access at the end of June 2026.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Choose the migration target&lt;/STRONG&gt;: Microsoft Graph API equivalents, supported Exchange Online features, or a vendor upgrade that removes EWS dependency.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1&gt;Don’t miss the Kiosk / Frontline Worker EWS blocks (end of June 2026)&lt;/H1&gt;
&lt;P&gt;Recommended validation playbook:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use the script output to build a shortlist of actively used EWS-enabled apps.&lt;/LI&gt;
&lt;LI&gt;For each app, determine which mailboxes it accesses (application access policies, RBAC, service accounts, shared mailboxes, or user populations).&lt;/LI&gt;
&lt;LI&gt;Cross-check those mailboxes’ license assignments for Kiosk / Frontline SKUs that may not include EWS rights.&lt;/LI&gt;
&lt;LI&gt;Run a controlled test (non-production where possible) to confirm whether the integration depends on EWS for those mailboxes and whether the vendor has a Graph-based update available.&lt;/LI&gt;
&lt;LI&gt;Evaluate if adding a different type of license for specific users is needed (for example, adding an Exchange Online Plan 1 or 2, which can still use EWS until October deprecation.)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;Remediation options (what to do when you find an EWS dependency)&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Upgrade or reconfigure the product: Many vendors have already moved to Microsoft Graph. Engage the vendor and request their Graph migration guidance and timelines.&lt;/LI&gt;
&lt;LI&gt;Refactor custom code: Map EWS operations (mail, calendar, contacts) to Microsoft Graph endpoints and re-test auth flows, throttling, and permissions. More information on mappings can be found &lt;A href="https://learn.microsoft.com/en-us/graph/migrate-exchange-web-services-api-mapping" target="_blank"&gt;here&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Reduce blast radius: If an app truly must remain temporarily, scope it tightly using least-privilege permissions and (where applicable) scope the mailbox it has access to using RBAC—then treat it as a short-term exception with an expiration date.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;Quick checklist&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Run Exchange-App-Usage-Reporting and identify apps with recent EWS sign-in activity.&lt;/LI&gt;
&lt;LI&gt;Track down app owners and document which mailboxes/workloads each app touches.&lt;/LI&gt;
&lt;LI&gt;Assess exposure to the end-of-June 2026 licensing-related EWS blocks (Kiosk/Frontline).&lt;/LI&gt;
&lt;LI&gt;Prioritize migrations to Microsoft Graph and validate functionality end-to-end.&lt;/LI&gt;
&lt;LI&gt;Re-run the report periodically to confirm EWS usage is trending to zero.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 26 Feb 2026 22:18:04 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/finding-and-remediating-ews-app-usage-before-retirement/ba-p/4497659</guid>
      <dc:creator>thejimmartin</dc:creator>
      <dc:date>2026-02-26T22:18:04Z</dc:date>
    </item>
  </channel>
</rss>

