Thursday, April 30, 2026

SharePoint Classic Blank-Fallback Redirect Page via CEWP

SharePoint Classic — Blank-Fallback Redirect Page via CEWP

Query Parameter Routing · jQuery · Content Editor Web Part · Site Assets · window.top


Table of Contents

  1. What This Does and Why You Need It
  2. How It Works — Logic Flow
  3. The Redirect Map
  4. Behaviour Reference
  5. Full Script
  6. Deployment Steps
  7. Technical Notes
  8. Cheat Sheet — Quick Reference

1. What This Does and Why You Need It

The problem

In SharePoint classic, there is no built-in way to route a user to different pages based on a URL parameter. If you are linking to SharePoint from an external system — a PLM tool, a Power Automate notification, an email — and you want one stable URL that fans out to different destinations depending on a short code, you need to build it yourself.

This script gives you exactly that:

  • A single SharePoint page (/SitePages/Redirect.aspx)
  • A ?q= query parameter that maps to any destination URL
  • Instant redirect when a valid key is found
  • A completely blank white screen when no key matches — no error, no broken layout, nothing

Why client-side?

SharePoint Online does not give you access to web.config or IIS redirect rules. Without a custom SPFx solution or an Azure Function in front, a lightweight jQuery script loaded via the Content Editor Web Part is the most practical approach.


2. How It Works — Logic Flow

Page loads
     ↓
Read window.top.location.search → extract ?q= parameter
     ↓
Look up value in redirectMap object
     ↓
Match found?
  YES → window.top.location.replace(url)   ← instant redirect, no history entry
  NO  → $(document).ready → hide all body children → white background

The key detail: the redirect fires before the DOM renders. When a valid ?q= value is present, the user never sees the SharePoint page at all — they land directly on the destination.

When no match is found, the script waits for $(document).ready and then hides every child element on the parent page, leaving a clean white screen.


3. The Redirect Map

The redirect map is a plain JavaScript object. Keys are short identifiers (numbers, codes, slugs). Values are full absolute URLs.

var redirectMap = {
    "1": "https://[tenant].sharepoint.com/SitePages/Page1.aspx",
    "2": "https://[tenant].sharepoint.com/SitePages/Page2.aspx"
};

To add a new destination, add a new key-value pair:

"3": "https://[tenant].sharepoint.com/SitePages/NewTarget.aspx"

Keys can be any string — numbers work well for short external references. Values must be full absolute URLs.


4. Behaviour Reference

URL Result
/SitePages/Redirect.aspx?q=1 Redirects to destination 1
/SitePages/Redirect.aspx?q=2 Redirects to destination 2
/SitePages/Redirect.aspx Blank white page
/SitePages/Redirect.aspx?q=99 Blank white page (no match)

5. Full Script

Save this as an .html file (e.g. redirect-handler.html). Upload it to your Site Assets library. Point the Content Editor Web Part's ContentLink property to its URL.

<!DOCTYPE html>
<html>
<head>
    <style>
        body { margin: 0; padding: 0; background-color: #fff; }
    </style>
</head>
<body>

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript">

    // Redirect map — add or change entries here as needed
    var redirectMap = {
        "1": "https://[TENANT].sharepoint.com/SitePages/Page1.aspx",
        "2": "https://[TENANT].sharepoint.com/SitePages/Page2.aspx"
    };

    // Read ?q= from URL immediately (before DOM renders)
    // window.top used because this script runs inside a CEWP iframe
    var params = new URLSearchParams(window.top.location.search);
    var qValue = params.get("q");

    if (qValue && redirectMap[qValue]) {
        // Redirect instantly — page content never renders
        // replace() avoids adding the redirect page to browser history
        window.top.location.replace(redirectMap[qValue]);

    } else {
        // No match — hide all SharePoint content, show blank white page
        $(document).ready(function () {
            $(window.top.document).find("body").children().hide();
            $(window.top.document.body).css({
                "margin": "0",
                "padding": "0",
                "background-color": "#ffffff",
                "overflow": "hidden"
            });
        });
    }

</script>
</body>
</html>

6. Deployment Steps

  1. Replace [TENANT] placeholders in the redirect map with your actual SharePoint site URLs.
  2. Save the file as redirect-handler.html (or any name you prefer).
  3. Upload the file to your Site Assets library.
  4. Copy the full URL of the uploaded file (e.g. https://[tenant].sharepoint.com/SiteAssets/redirect-handler.html).
  5. Open the SharePoint classic page (Redirect.aspx) in edit mode.
  6. Add a Content Editor Web Part to the page.
  7. Open the Web Part tool pane → set the ContentLink property to the file URL from step 4.
  8. Save and publish the page.
  9. Test with ?q=1, ?q=2, and with no parameter.
Tip: To add more redirect destinations later, just edit the HTML file in Site Assets. No changes to the SharePoint page or Web Part are needed.

7. Technical Notes

Why window.top?

The Content Editor Web Part loads your HTML file inside a hidden <iframe>. The SharePoint chrome — suite bar, page title, content zones — lives on the parent frame. Without window.top, the script can only see the tiny iframe it's running in, not the actual page. All DOM manipulation and URL reads must go through window.top.

Why location.replace() instead of .href?

window.top.location.replace(url) replaces the current history entry rather than pushing a new one. If the user hits the browser back button after being redirected, they will not loop back through the redirect page — they will land on the page they were at before.

Why host the file in Site Assets?

SharePoint Online blocks inline <script> tags inside CEWP rich text fields. The only way to run JavaScript through a CEWP is to upload an external HTML file and reference it via the ContentLink property. Site Assets is the conventional library for these files — it is accessible to all site members by default.

Cross-origin requirement

window.top access requires the CEWP iframe and the parent page to share the same origin. Since both the HTML file (Site Assets) and the SharePoint page are on the same tenant, this is never a problem in practice. It would break if the file were hosted on a different domain.

Browser history note

The redirect uses location.replace(), so the redirect page itself does not appear in the browser's back-navigation history. Destination pages behave normally.

Warning: This approach uses DOM manipulation via window.top, which depends on the CEWP iframe pattern specific to SharePoint classic pages. It will not work on modern SharePoint pages, which do not support the Content Editor Web Part.

8. Cheat Sheet — Quick Reference

File locations

Item Location
Script file /SiteAssets/redirect-handler.html
SharePoint page /SitePages/Redirect.aspx
Web Part type Content Editor Web Part (CEWP)
Web Part zone LeftColumn
jQuery version 3.7.1 (CDN)

Key concepts

CEWP (Content Editor Web Part)
→ Classic SharePoint web part
→ Loads external HTML via ContentLink property
→ Creates a hidden iframe — script runs inside it

window.top
→ Reference to the parent (SharePoint) frame from inside the CEWP iframe
→ Required for all URL reads and DOM manipulation

location.replace(url)
→ Redirect without adding to browser history
→ Use instead of location.href for redirect pages

redirectMap
→ Plain JS object: { "key": "destination-url" }
→ Add entries here when new destinations are needed
→ No other changes required

Troubleshooting

Symptom Likely cause Fix
Page loads normally, no redirect Script file not loading Check ContentLink URL is correct and file exists in Site Assets
Redirect works but page briefly flashes DOM renders before script runs Expected — redirect fires before DOM in all modern browsers; flash is negligible
Blank page not fully white CSS from SharePoint theme overriding Ensure background-color: #ffffff and overflow: hidden are applied to window.top.document.body
Script errors in console Cross-origin block Confirm HTML file is on the same SharePoint tenant, not an external domain
Works in Chrome, not Edge/Firefox Browser security policy difference Verify same-origin requirement; check browser console for specific error

Top 5 tips

  1. ContentLink, not rich text — always reference the HTML file via the ContentLink property, never paste script into the CEWP rich text editor. SharePoint Online strips inline scripts.
  2. window.top for everything — any reference to the parent page (URL, DOM) must go through window.top. Plain document or window only reaches the CEWP iframe.
  3. location.replace() not .href — prevents the redirect page from appearing in browser history. Users can navigate back cleanly.
  4. Extend via list, not hardcode — if destinations change frequently, consider loading the redirect map from a SharePoint list via REST API instead of hardcoding it in the file.
  5. Classic pages only — this technique relies on the Content Editor Web Part, which is not available on modern SharePoint pages. For modern pages, use a SPFx web part or redirect via Power Automate.


Wednesday, April 29, 2026

Dynamics 365 Customer Service Complete Guide


Dynamics 365 Customer Service — Complete Guide

Case Management · Omnichannel · Knowledge Base · AI Copilot · Unified Routing · SLA · Scenarios · Cheat Sheet


Table of Contents

  1. Core Concepts — Basics
  2. Case Management — Deep Dive
  3. Omnichannel for Customer Service
  4. Knowledge Management & AI Copilot
  5. Unified Routing & Skills
  6. SLA & Entitlements
  7. Analytics & Reporting
  8. Customisation & Integration
  9. Scenario-Based Questions
  10. Cheat Sheet — Quick Reference

1. Core Concepts — Basics

What is Dynamics 365 Customer Service and what does it do?

Dynamics 365 Customer Service is a Microsoft customer relationship and service management application built on Dataverse. It enables organisations to manage customer support operations across multiple channels.

Core capabilities:

  • Case management: create, track, route, escalate, and resolve customer issues
  • Omnichannel: handle conversations across chat, email, voice, SMS, social media in a unified agent workspace
  • Knowledge management: author, publish, and surface relevant knowledge articles to agents and customers
  • SLAs: define and enforce response/resolution time commitments with automatic escalations
  • AI and Copilot: agent assist, sentiment analysis, case summarisation, and smart routing
  • Customer Service workspace: unified agent desktop combining all channels and case management

What are the main tables (entities) in Dynamics 365 Customer Service?

Table Description
Case (incident) Central entity — represents a customer issue or service request
Account Business/organisation customer
Contact Individual customer
Queue Work item bucket — cases and activities routed here for agents
Queue Item Links a work item (case, email, chat) to a queue
Knowledge Article Published support article for agents and customers
Entitlement Defines support terms — number of cases, response SLA
SLA Defines KPIs (first response time, resolution time) and breach actions
Activity Email, Phone Call, Task, Chat, Voice — interactions linked to a case

What is the Customer Service workspace vs Customer Service Hub?

Customer Service Hub: traditional model-driven app for case management. Provides clean interface for managing cases, knowledge articles, and queues. Does NOT include Omnichannel channels (chat, voice, SMS).

Customer Service workspace: modern unified agent desktop. Includes all Customer Service Hub features PLUS Omnichannel channels — live chat, voice, SMS, social messaging — all in a single tabbed multisession interface.

Tip: For any new D365 Customer Service implementation, Customer Service workspace is the recommended agent interface. Customer Service Hub is used by administrators and supervisors for configuration and oversight.


What are the D365 Customer Service licensing tiers?

Licence Key Features
Customer Service Professional Core case management, knowledge base, SLAs, basic routing. No Omnichannel.
Customer Service Enterprise All Professional + advanced routing (Unified Routing), AI features, Copilot, analytics
Omnichannel add-on Live chat, SMS, social messaging, voice — on top of Enterprise
Copilot for Service AI assistant for agents — case summarisation, response drafting, knowledge search

Warning: Omnichannel is a separate add-on — not included in base Customer Service Enterprise. Voice channel requires an additional Azure Communication Services resource and licensing.


2. Case Management — Deep Dive

What is the Case lifecycle and what are the key statuses?

Case Status (statecode):
Active (0)    → Case is open and being worked
Resolved (1)  → Case has been resolved — resolution logged
Cancelled (2) → Case cancelled (duplicate, invalid, customer withdrew)

Status Reasons under Active:
In Progress         → agent is actively working the case
On Hold             → waiting for customer or third party
Waiting for Details → waiting for customer to provide more info
Researching         → agent is investigating

Status Reasons under Resolved:
Problem Solved       → issue fixed
Information Provided → customer needed guidance
Cancelled            → not a valid issue

Case Lifecycle:
[Created] → [Assigned/Routed to Queue] → [In Progress]
→ [On Hold if awaiting info] → [Resolved] → [Closed after X days]

Key rules:
→ SLA KPIs start when case is created
→ SLA pauses when Status Reason = On Hold (configurable)
→ Resolution records time spent, resolution type, and description
→ Closed cases cannot be re-opened — create new case or follow-up

What are Queues in D365 Customer Service?

Queues are work item buckets holding cases and activities waiting to be picked up by agents.

Queue types:

Type Visibility Use Case
Public All agents with access General team queues
Private Specific users/teams only Specialist team queues
Personal Each user's own queue Individual workload
Queue workflow:
Case created → assigned to Queue (manually or routing rule)
Agent opens Queue → sees all items → clicks "Pick" to take ownership
OR: supervisor assigns directly to agent (bypasses queue pick)

Queue Item states:
Queued      → waiting to be picked up by an agent
In Progress → assigned to and being worked by an agent

Tip: In Omnichannel, queues are extended to handle live conversations (chat, voice, SMS) in addition to cases — the same queue concept applies across all work types.


What is the Parent-Child Case relationship?

Parent-Child cases allow one complex case to be broken into sub-cases worked by different teams in parallel.

Use case: Customer reports complete system failure

Parent case: "System Outage — Customer X" (Account Manager)
  Child case 1: "Network investigation" → Network team queue
  Child case 2: "Database connectivity" → DBA team queue
  Child case 3: "Application error" → Dev team queue

Status sync options:
→ Auto-resolve parent when ALL child cases are resolved
→ Or: manual — parent managed independently

SLA: each child case has its own SLA clock
Customer view: sees one parent case — internal complexity hidden

What are the Case subject tree and categories?

The Subject tree is a hierarchical classification structure for cases — enabling consistent categorisation, routing, and analytics.

Subject tree example:
Products
  └── Product A
       ├── Technical Issues
       │    ├── Installation
       │    └── Performance
       └── Billing Issues
            ├── Invoice Query
            └── Refund Request
Services
  └── Professional Services
       └── Onboarding

Benefits:
→ Consistent case classification across teams
→ Routing rules: IF subject = 'Billing Issues' → Finance queue
→ Analytics: case volume and resolution time by topic
→ Knowledge article association: link articles to subject areas

3. Omnichannel for Customer Service

What is Omnichannel and what channels does it support?

Omnichannel for Customer Service is the real-time customer engagement layer routing customer conversations from multiple digital channels to agents in a unified desktop.

Channel Description
Live Chat Web chat widget embedded on websites or portals
Voice Inbound/outbound phone calls via Azure Communication Services
SMS Two-way text messaging
Microsoft Teams Internal escalation from Teams to D365 agent
Email Enhanced email routing within agent workspace
Facebook Messenger Social messaging
WhatsApp Messaging via Business API
Twitter/X, WeChat, LINE, Telegram Via third-party providers
Custom channel Direct Line API integration for any custom channel

Tip: All channels surface in the same Customer Service workspace — agents see one unified inbox regardless of channel.


What is the Omnichannel agent workspace and its key features?

  1. Active Conversation screen: central workspace — customer conversation alongside customer summary (name, account, open cases, recent history)
  2. Multisession: agents handle multiple conversations simultaneously via tabbed sessions
  3. Customer 360 summary: contact details, account info, recent cases, sentiment score, conversation history
  4. Communication panel: channel-specific interaction (chat transcript, call controls, email compose)
  5. Productivity pane: agent assist — knowledge search, similar cases, AI-suggested responses, Copilot
  6. Presence management: agent sets availability (Available, Busy, Do Not Disturb, Away) — routing only assigns to available agents
  7. Supervisor dashboard: real-time monitoring of agent workloads, queue depths, sentiment, SLA compliance

What is agent capacity in Omnichannel?

Agent capacity defines the maximum workload an agent can handle simultaneously. Each work type consumes capacity units.

Example capacity configuration:
Agent total capacity: 100 units

Work item costs:
Live Chat:   20 units per conversation
Voice call:  50 units (prevents multi-tasking during calls)
SMS:         10 units per conversation
Case:         5 units per case

Concurrent handling:
→ 1 voice (50) + 2 SMS (20) + 2 cases (10) = 100 (full)
→ 5 chats (100) = 100 (full)
→ 4 chats (80) + 2 SMS (20) = 100 (full)

When capacity = 0: no new assignments
When presence = Busy: capacity treated as 0 for new work

Tip: Configure voice capacity close to total agent capacity to prevent agents receiving chat while on a call.


How does the Copilot Studio bot-to-human handoff work in Omnichannel?

Customer journey:
1. Customer starts chat on website
2. Copilot Studio bot handles conversation:
   → Answers FAQs from knowledge base
   → Collects customer details (name, account, issue type)
   → Resolves simple issues (password reset, account balance)
3. Bot cannot resolve → escalates to D365 Omnichannel

Context passed to agent:
→ Customer name, email, account ID (collected by bot)
→ Issue category (determined by bot intent recognition)
→ Full bot conversation transcript
→ Bot escalation reason ("Cannot resolve: Complex billing issue")

D365 uses context to:
→ Pre-populate case fields (customer, subject, description)
→ Route to correct queue based on bot-determined category
→ Show agent a summary of the bot interaction

Result: customer never repeats themselves — agent continues from
exactly where the bot left off

Tip: Bot-to-human escalation with full context handoff is one of the most commonly asked D365 CS architecture scenarios in senior .


4. Knowledge Management & AI Copilot

What is the Knowledge Base lifecycle?

Knowledge Article statuses:
Draft → In Review → Approved → Published → Expired

Draft:     Author creates article — title, content, keywords, related products
In Review: Submitted to knowledge manager for review
Approved:  Reviewed and approved — not yet visible to external users
Published: Live — visible to agents AND customers on self-service portal
Scheduled: Auto-publishes on a future date
Expired:   Past expiry date — auto-unpublished, needs renewal

Key features:
→ Versioning: each edit = new version, previous versions preserved
→ Translation: articles translated into multiple languages
→ Feedback: agents/customers rate articles (helpful/not helpful)
→ Analytics: views, likes, dislikes, cases linked to article
→ Internal vs external: internal-only (agents) or external (portal)
→ Keywords: improve search relevance
→ Related articles: link related content for agent context

How does Copilot for Customer Service work?

Copilot is an AI assistant in the agent productivity pane powered by Azure OpenAI.

Capability Description
Ask a question Searches knowledge base + similar cases → synthesised answer with citations
Draft a response Generates contextually appropriate reply based on conversation + KB
Case summary One-click AI summary: customer issue, steps taken, current status
Conversation summary Auto-generates end-of-conversation notes for case records
Suggested articles Surfaces most relevant KB articles based on case context

Tip: Copilot for Customer Service measurably reduces Average Handling Time (AHT) and improves First Contact Resolution (FCR). Know its capabilities for any AI-focused question.


What is real-time sentiment analysis?

Real-time sentiment analysis uses Azure AI to analyse customer messages in live chat or voice conversations and display a sentiment score — updated as the conversation progresses.

Sentiment levels: Positive, Slightly Positive, Neutral, Slightly Negative, Negative

How it's used:

  • Supervisor sees sentiment for ALL active conversations in the Supervisor Dashboard
  • Agent sees their own conversation's sentiment in the conversation panel
  • When sentiment drops to Negative: supervisor can be alerted and may intervene
  • Sentiment stored on conversation record — available for historical analysis

5. Unified Routing & Skills

What is Unified Routing and how does it work?

Unified Routing is the intelligent work distribution engine routing both cases (record routing) and Omnichannel conversations to the most appropriate queue and agent.

Unified Routing pipeline:

Work item arrives (case created OR conversation started)
        ↓
[Classification] — AI or rule-based
  → Set: priority, skills required, category, sentiment, language
        ↓
[Route to Queue] — routing rules
  Rule: IF language = 'French' → France Support Queue
  Rule: IF priority = 'Critical' → Tier3 Escalation Queue
  Rule: IF topic = 'Billing' → Finance Queue
  Rule: IF entitlement_tier = 'Gold' → Gold Priority Queue
        ↓
[Assignment] — assignment method
  1. Highest capacity → assign to agent with most available capacity
  2. Round robin → distribute evenly across available agents
  3. Least active → agent with fewest active sessions
  4. Skills-based → match required skills to agent skill profile

Tip: Unified Routing replaces both the older basic routing rules for cases AND handles real-time Omnichannel conversation routing in a single engine. Always use Unified Routing for new implementations.


What are Skills and how do you implement skills-based routing?

Skills setup:
1. Define skill types: Language, Product Knowledge, Technical Level
2. Create skills: French (10), SAP ERP (8), Network+ (9), Level2 (7)
3. Assign skills to agents with proficiency (1-10):
   Maria: French(10), SAP ERP(8), Level2(7)
   John:  English(10), Network+(9), Level1(5)

Skills classification on work item:
AI-based: NLP analyses case content → auto-assigns required skills
  → Detects language → requires Language skill
  → Detects "SAP" keyword → requires SAP ERP skill
Rule-based: IF product = 'SAP' THEN require SAP ERP skill ≥ 7

Assignment with skills:
→ Exact match: agent has ALL required skills at required proficiency
→ Closest match: if no exact, find closest skill profile
→ Skill relaxation: after 5 min, lower proficiency requirement
                    after 10 min, relax to any available agent

Tip: Skill relaxation is critical to prevent long wait times. Balance quality (exact skill match) with responsiveness (relaxation over time).


What are the Omnichannel Supervisor capabilities?

The Supervisor Dashboard provides real-time visibility into:

View Metrics
Conversations Active conversations, status, channel, sentiment, duration, agent
Agents Agent presence, active conversations, capacity utilised
Queues Queue depth, average wait time, longest waiting item
Ongoing conversations Ability to monitor, assign, transfer, or join conversations

Supervisor actions:

  • Monitor: silently observe a conversation (agent unaware)
  • Barge-in: join an active conversation (agent and customer see supervisor join)
  • Transfer: move a conversation from one agent to another
  • Assign: pull a queued item directly to a specific agent

6. SLA & Entitlements

What are SLAs in D365 and what are the two types?

Standard SLA: basic SLA with a single KPI. When breached, a warning flag shows on the case. No automatic actions.

Enhanced SLA (recommended): supports multiple KPIs, pause/resume, and automatic breach actions.

Enhanced SLA example — "Gold Customer SLA":

KPI 1: First Response By
  Warning: 30 minutes → action: email agent's manager
  Failure: 1 hour → action: escalate to Tier2, email customer

KPI 2: Resolve By
  Warning: 6 hours → action: alert supervisor
  Failure: 8 hours → action: escalate to manager, notify account team
  Pause condition: Status Reason = "Waiting for Details"
  Resume: when Status Reason changes back to "In Progress"

SLA timer on case form:
→ Countdown timer: time remaining until breach
→ Amber indicator: warning threshold reached
→ Red indicator: SLA breached
→ Paused indicator: case on hold

Warning: Always use Enhanced SLA for production. Standard SLA lacks pause/resume and automated breach actions. Enhanced SLA is the current standard.


What are Entitlements?

Entitlements define the support terms for a customer — how many cases they are entitled to, applicable SLA, and which channels they can use.

Entitlement structure:
Entitlement → linked to Account or Contact
  Allotment type: Number of cases (e.g., 10 per year)
                  OR Hours (e.g., 40 hours per year)
  Total terms: 10
  Remaining terms: auto-decremented when case is created
  Start/end date: validity period
  Associated SLA: Gold SLA (applied automatically to cases)
  Channels: Phone + Chat + Email (Gold) or Email only (Bronze)

When case created for customer with entitlement:
→ D365 auto-associates the entitlement to the case
→ Remaining terms decremented by 1
→ When terms = 0: agent sees warning — entitlement exhausted
→ Supervisor can override and continue or reject new case

Tip: Entitlements are the bridge between sales contracts and service delivery — they ensure customers receive exactly what they paid for. Agents see entitlement status directly on the case form.


7. Analytics & Reporting

What analytics are available in D365 Customer Service?

Built-in Power BI dashboards:

Dashboard Key Metrics
Summary Total cases, AHT, FCR rate, CSAT, SLA compliance
Agent Cases handled, avg resolution time, CSAT, SLA compliance per agent
Queue Avg wait time, queue depth, abandon rate, longest waiting item
Omnichannel Conversations by channel, abandonment, avg conversation time, sentiment trends
Knowledge Article views, likes/dislikes, articles linked to resolved cases
Bot Self-service deflection rate, escalation rate, bot CSAT

Key KPIs:

CSAT  → Customer satisfaction score (post-resolution survey rating)
FCR   → First Contact Resolution % (resolved without re-open or follow-up)
AHT   → Average Handling Time (total agent time per case/conversation)
ASA   → Average Speed of Answer (arrival to agent assignment time)
Abandon Rate → % customers who left queue before being answered
SLA Compliance → % cases resolved within SLA target

What is Customer Service Insights?

Customer Service Insights provides AI-driven analytics identifying topics driving case volume and opportunities to reduce it.

  1. Topic clustering: AI groups similar cases into topics automatically — no manual categorisation
  2. Impact analysis: topics with highest volume, longest resolution time, or worst CSAT
  3. Emerging issues: alerts when a new topic suddenly spikes in volume — early warning for product issues
  4. Deflection opportunities: identifies topics where knowledge articles or chatbot could deflect live agent contacts

8. Customisation & Integration

What are the key customisation points in D365 Customer Service?

Layer Customisation
Forms Customise Case, Contact, Account forms — add/remove fields, sections, tabs
Views Configure list views for queues, cases, knowledge articles
Business rules Field show/hide/set/validate logic (client-side or server-side)
Business process flows Stage-based guidance for agents working complex cases
Plugins C# server-side logic on case create/update (e.g., auto-assign, validation)
Power Automate flows Automated actions triggered by D365 events (SLA breach, case status change)
PCF controls Custom UI components on case forms
API Dataverse Web API for external system integration

How do you integrate D365 Customer Service with external systems?

Common integration patterns:

  1. Dataverse Web API: CRUD operations on cases, contacts, accounts from external systems
  2. Power Automate: event-driven integration — when case created → notify Slack/Teams, update ERP
  3. Webhooks: real-time push notifications to external systems on D365 events
  4. Azure Service Bus: reliable async messaging for high-volume case creation from external portals
  5. Embedded experience: embed D365 widgets (chat, case history) in external portals via iFrame or JS API
  6. CTI (Computer Telephony Integration): connect third-party phone systems to Omnichannel via Channel Integration Framework (CIF)

What is the Channel Integration Framework (CIF)?

CIF is a JavaScript API framework that allows third-party telephony and communication providers to integrate with the D365 Customer Service workspace. It provides:

  • CIF v1: Single-session — one communication provider in the side panel
  • CIF v2: Multi-session — multiple providers, integrates with Omnichannel routing

Use cases:

  • Connect existing Avaya, Cisco, Genesys, or Five9 phone systems to D365
  • Surface caller information (screen pop) in D365 before agent answers
  • Enable click-to-call from D365 records
  • Log call activities automatically to case records

9. Scenario-Based Questions

Scenario: Design a D365 Customer Service solution for a bank with Gold/Silver/Bronze customer tiers.

Architecture:

  1. Entitlements per tier:

    • Gold: unlimited cases, phone + chat + email, 1h first response / 4h resolution
    • Silver: 20 cases/year, chat + email, 4h first response / 24h resolution
    • Bronze: 5 cases/year, email only, 24h first response / 72h resolution
  2. Enhanced SLAs: three SLAs with appropriate KPIs and breach actions. Auto-associate via entitlement.

  3. Queues: Gold Priority Queue, Silver Queue, Bronze Queue — segregated so Gold is never affected by Bronze volume.

  4. Unified Routing rule: check entitlement tier on case creation → route to tier-appropriate queue → assign with highest capacity method.

  5. Channels: Gold gets Omnichannel (chat + phone). Silver/Bronze get email only.

  6. Agent skills: senior agents tagged "Gold" skill → assigned to Gold queue. Junior agents handle Bronze.

  7. Reporting: SLA compliance by tier. Escalation alerts when Gold SLA approaching breach.


Scenario: A case is stuck in queue for 2 hours without being picked up. How do you handle this?

Prevention (proactive):

  1. SLA breach actions: configure "First Response By" KPI — at 1h warning: email queue manager. At 2h breach: auto-escalate to supervisor, change priority to Critical.
  2. Power Automate escalation: trigger on SLA KPI breach → Teams notification to supervisor with case link and customer tier
  3. Supervisor real-time dashboard: "Longest Wait" column — supervisors see queue depth and waiting time, can manually assign

Reactive (when it happens):

  1. Supervisor opens case from dashboard → assigns directly to available agent
  2. Or: supervisor uses "Assign" from queue view to push to specific agent
  3. Post-incident: review routing rules and agent capacity allocation for the queue

Scenario: How do you implement seamless chat-to-voice escalation in Omnichannel?

Requirement: Customer on live chat → issue is complex → needs a phone call without losing chat context.

  1. Agent initiates: in chat session → clicks "Consult/Transfer" → selects Voice → enters customer's phone number
  2. D365 initiates outbound call via Azure Communication Services
  3. Multisession merge: voice opens in a new tab. Original chat transcript remains visible alongside.
  4. Context preserved: agent has full chat history during the voice call — customer never repeats
  5. Single case record: both chat and voice activities linked to the same case — unified timeline
  6. Transfer to specialist: if escalating further, all context (chat transcript + call notes) transfers with the conversation

Key value: customer never repeats themselves. Context travels with the conversation across channel escalations.


Scenario: How do you measure and improve First Contact Resolution (FCR) rate?

Measuring FCR in D365:

FCR = cases resolved in first contact without re-open

Power BI calculation:
FCR = (Cases resolved without follow-up) / (Total resolved cases) × 100

Track in D365:
→ Cases with no follow-up case linked (no re-open)
→ Cases where resolvedon = first contact date
→ Monitor re-opened cases (cases resolved then re-activated)

Improving FCR:

  1. Knowledge base quality: Knowledge Analytics → find articles rated unhelpful or linked to re-opened cases → improve or replace
  2. Copilot for agents: AI-suggested responses and case summaries reduce resolution errors that cause re-opens
  3. Skills-based routing: route complex issues to specialist agents first time — avoid unnecessary tier 1 escalations
  4. Customer Service Insights: identify topics with worst FCR rates → target for KB article creation or agent training
  5. Root cause tracking: add "Reason for re-open" field on re-opened cases → analyse patterns (wrong resolution, incomplete fix)

Scenario: How do you configure D365 Customer Service to handle a sudden spike in cases during a product outage?

  1. Increase agent capacity: temporarily raise agent capacity units during the spike — allows agents to handle more simultaneous conversations
  2. Deploy Copilot Studio bot: configure a bot to handle the most common outage-related queries (status updates, workarounds) — deflect volume from live agents
  3. Create outage knowledge article: publish immediately with known issue, workaround, and estimated resolution time — agents share this rather than typing individual responses
  4. Bulk case creation: if customers are proactively notified, pre-create cases for affected accounts with status "Researching" — no customer needs to call
  5. Copilot case summary: agents use Copilot to rapidly understand incoming cases and apply the known resolution faster
  6. Supervisor dashboard: monitor queue depths and agent sentiment — intervene early before queues back up significantly
  7. Post-incident: Customer Service Insights will cluster outage cases into a topic — use for retrospective analysis and knowledge base improvement

10. Cheat Sheet — Quick Reference

Case Status Quick Reference

statecode (Status):
0 = Active    1 = Resolved    2 = Cancelled

statuscode (Status Reason) — Active:
1 = In Progress    2 = On Hold    3 = Waiting for Details    4 = Researching

statuscode (Status Reason) — Resolved:
5 = Problem Solved    1000 = Information Provided    6 = Cancelled

SLA behaviour:
→ SLA starts: on case creation
→ SLA pauses: when statuscode = 'On Hold' or 'Waiting for Details'
→ SLA resumes: when statuscode returns to 'In Progress'
→ SLA stops: when statecode = Resolved or Cancelled

Unified Routing Quick Reference

Components:
Workstream → defines channel + routing mode (push/pick)
Routing rules → classify and assign to queues
Queue → holds work items
Assignment method → how agents are selected from queue

Assignment methods:
Highest capacity → most available capacity units
Round robin      → even distribution
Least active     → fewest active sessions
Skills-based     → skill + proficiency match

Skill relaxation:
After X minutes: lower required proficiency
After Y minutes: accept any available agent in queue

SLA vs Entitlement

SLA (Service Level Agreement):
→ WHAT response/resolution time is committed
→ Defines KPIs, warning thresholds, breach actions
→ Linked to: Entitlement or applied globally
→ Timers shown on: case form

Entitlement:
→ HOW MANY cases/hours a customer is entitled to
→ Tracks remaining support terms
→ Defines: channels available, associated SLA
→ Linked to: Account or Contact
→ Consumed when: case is created

They work TOGETHER:
Entitlement → defines TERMS + specifies which SLA
SLA → defines the TIME commitments for those terms

Omnichannel Channel Architecture

Customer channels:
Website      → Live Chat widget → Chat workstream → Queue → Agent
Phone        → ACS PSTN → Voice workstream → Queue → Agent
SMS          → ACS/TeleSign → SMS workstream → Queue → Agent
WhatsApp     → WhatsApp Business API → Messaging workstream → Queue → Agent
Facebook     → Facebook App → Social workstream → Queue → Agent
Custom       → Direct Line API → Custom workstream → Queue → Agent

All conversations surface in:
→ Customer Service workspace (agent side)
→ Omnichannel Supervisor Dashboard (supervisor side)

Context passed with every conversation:
→ Customer identity (if authenticated)
→ Bot transcript (if escalated from bot)
→ Pre-chat survey responses
→ Routing context variables

Key KPIs Reference

CSAT  = Customer Satisfaction Score
        (post-interaction survey, scale 1–5 or 1–10)

FCR   = First Contact Resolution Rate
        (resolved in first contact / total cases × 100)

AHT   = Average Handling Time
        (total agent time: hold + talk + wrap-up)

ASA   = Average Speed of Answer
        (queue arrival → agent pick-up time)

ABN   = Abandon Rate
        (customers who left queue before answered / total arrivals × 100)

SLA%  = SLA Compliance Rate
        (cases resolved within SLA / total cases × 100)

Deflection Rate = cases resolved by bot / total contacts × 100

NPS   = Net Promoter Score (would you recommend? 0-10)

Top 10 Tips

  1. Case = incident table — the central entity in D365 CS. Know its key fields: subject, description, priority (1=High, 2=Normal, 3=Low), status, status reason, customer (polymorphic: Account or Contact), owner, SLA.
  2. Enhanced SLA over Standard — Enhanced SLA supports multiple KPIs, pause/resume, and automatic breach actions. Standard SLA is legacy. Always recommend Enhanced for production.
  3. Unified Routing replaces basic routing — Unified Routing handles both cases (record routing) and Omnichannel conversations in one engine. Know the pipeline: Classification → Route to Queue → Assignment.
  4. Omnichannel add-on is separate — chat, voice, SMS are not in base Customer Service Enterprise licence. Always confirm add-on requirements when asked about Omnichannel architecture.
  5. Bot-to-human handoff with context — the key architecture pattern: Copilot Studio bot handles first contact → escalates to Omnichannel with full conversation context → agent continues seamlessly.
  6. Agent capacity controls concurrency — voice typically consumes 50+ units to prevent multi-channel conflicts. Know how to configure and why.
  7. Skill relaxation prevents queue backup — gradually lower skill proficiency requirements over time to prevent long waits when exact-match agents are busy.
  8. Entitlements connect contracts to service — they auto-associate SLAs to cases and track remaining support terms. Know the allotment types (cases vs hours).
  9. Copilot reduces AHT and improves FCR — the AI capabilities (ask a question, draft response, case summary) are the primary D365 CS differentiators in 2025. Know all five capabilities.
  10. Customer Service Insights = proactive improvement — topic clustering identifies volume drivers automatically. Deflection opportunities guide knowledge base priorities. This is the data-driven continuous improvement story.


Microsoft Fabric & OneLake Complete Guide

 

Microsoft Fabric & OneLake — Complete Guide

OneLake · Lakehouse · Data Warehouse · Direct Lake · Medallion Architecture · Real-Time Intelligence · Scenarios · Cheat Sheet


Table of Contents

  1. Core Concepts — Basics
  2. OneLake — The Foundation
  3. Fabric Workloads
  4. Data Engineering — Notebooks, Pipelines & Medallion
  5. Security & Governance
  6. Performance Optimisation
  7. Scenario-Based Questions
  8. Cheat Sheet — Quick Reference

1. Core Concepts — Basics

What is Microsoft Fabric and what problem does it solve?

Microsoft Fabric is an all-in-one analytics platform that unifies data engineering, data integration, data warehousing, real-time analytics, data science, and business intelligence into a single SaaS platform.

Before Fabric (fragmented):

  • Azure Synapse → warehousing
  • Azure Data Factory → pipelines
  • Azure Databricks → Spark
  • Power BI Premium → BI
  • Separate storage, separate governance, separate billing, complex integration

With Fabric (unified):

  • All workloads in one platform
  • Single copy of data in OneLake
  • Unified security and governance via Microsoft Purview
  • Single capacity billing model (F SKUs)

Key insight: Fabric is NOT a new product — it is a platform that unifies existing Microsoft data tools under one roof with OneLake as the shared storage layer. Everything reads and writes from the same data lake.


What are the core workloads in Microsoft Fabric?

Workload Description Evolution From
Data Factory Data integration and orchestration — pipelines and dataflows Azure Data Factory
Data Engineering Big data processing — Lakehouses, Spark notebooks Azure Synapse Spark
Data Warehouse SQL-based analytics warehouse — T-SQL querying Azure Synapse SQL Dedicated Pool
Real-Time Intelligence Streaming ingestion and KQL analytics Azure Data Explorer
Data Science ML experiments, models, Python/R notebooks Azure Synapse ML
Power BI Business intelligence (Direct Lake mode) Power BI Premium
Data Activator No-code data alerting and automation New in Fabric

What is a Fabric Workspace and how does it relate to capacity?

Workspace: collaboration container holding all Fabric items (Lakehouses, Warehouses, Notebooks, Pipelines, Reports, Semantic Models).

Capacity: the compute allocation powering Fabric workloads. Every workspace must be assigned to a capacity.

SKU Type Use Case
Trial Free 60 days Evaluation
F2–F2048 Fabric SKUs Pay-as-you-go or reserved
P SKUs Power BI Premium Existing Premium → Fabric compatible

Tip: Capacity is shared across ALL workloads in assigned workspaces. A Spark job, pipeline run, and Power BI report refresh all consume from the same capacity pool. Size based on peak concurrent workload requirements.


How does Microsoft Fabric relate to Azure Synapse Analytics?

Fabric is the strategic successor to Azure Synapse Analytics:

Synapse Feature Fabric Equivalent
Synapse Spark Fabric Data Engineering (Lakehouses + Notebooks)
Synapse SQL Dedicated Pool Fabric Data Warehouse
Synapse Pipelines Fabric Data Factory Pipelines
Synapse Link Fabric Mirroring
Azure Data Explorer Fabric Real-Time Intelligence (Eventhouse/KQL DB)

Key additions in Fabric vs Synapse: OneLake (shared storage), Direct Lake Power BI mode, Data Activator, unified Purview governance, simpler capacity-based pricing.

Warning: Azure Synapse is not deprecated — existing workloads continue. But all new analytics projects should be built on Fabric. Microsoft's investment is entirely focused on Fabric going forward.


What is the Fabric item hierarchy?

Microsoft Fabric Tenant
└── Capacity (F64, F128, etc.)
    └── Workspace (collaboration container)
        ├── Lakehouse (data lake + Delta tables)
        ├── Data Warehouse (T-SQL warehouse)
        ├── Notebook (Spark development)
        ├── Spark Job Definition (packaged Spark job)
        ├── Data Pipeline (orchestration)
        ├── Dataflow Gen2 (Power Query ETL)
        ├── Semantic Model (Power BI dataset)
        ├── Report (Power BI report)
        ├── KQL Database / Eventhouse (real-time)
        ├── Eventstream (streaming ingestion)
        └── Reflex (Data Activator alerts)

2. OneLake — The Foundation

What is OneLake and what makes it architecturally significant?

OneLake is a single, unified, tenant-wide data lake that is the storage foundation of Microsoft Fabric.

Key architectural principles:

  1. One copy of data: all Fabric workloads read from the same data — no copies between workloads
  2. Automatic with Fabric: every Fabric tenant has exactly one OneLake, automatically provisioned
  3. Built on ADLS Gen2: fully compatible with any tool supporting Azure Data Lake Storage
  4. Open formats: data stored in Delta Parquet — readable by any engine (Spark, Trino, DuckDB) without conversion
  5. Hierarchical: Tenant → Workspace → Lakehouse/Warehouse → Tables/Files

analogy: OneLake is the "OneDrive for data" — just as OneDrive gives every user one place for files, OneLake gives every organisation one place for data.


What is the OneLake folder structure?

OneLake (tenant-level)
└── Workspace: ContosoAnalytics
    ├── Bronze_Lakehouse.Lakehouse/
    │   ├── Tables/                    ← Delta tables (queryable via SQL)
    │   │   ├── raw_orders/            ← Delta Parquet files
    │   │   └── raw_customers/
    │   └── Files/                     ← Raw files (CSV, JSON, Parquet, images)
    │       ├── raw/
    │       └── processed/
    ├── Gold_Lakehouse.Lakehouse/
    │   └── Tables/
    │       ├── FactSales/
    │       └── DimProduct/
    └── Finance_Warehouse.Warehouse/
        └── Tables/                    ← Warehouse tables (Delta format)

Access paths:
ADLS DFS:  abfss://workspace@onelake.dfs.fabric.microsoft.com/Bronze_Lakehouse.Lakehouse/Tables/raw_orders
OneLake:   https://onelake.dfs.fabric.microsoft.com/ContosoAnalytics/Bronze_Lakehouse.Lakehouse/Tables/raw_orders

What are OneLake Shortcuts and how do they enable a "single copy" architecture?

Shortcuts are virtual pointers to data stored outside the current Lakehouse — appearing as folders but not copying data.

Supported shortcut sources:

  • Another workspace in OneLake
  • Azure Data Lake Storage Gen2
  • Amazon S3
  • Google Cloud Storage
  • Dataverse (via Fabric Mirroring)
Shortcut scenarios:

1. Cross-workspace data sharing (zero copy):
   Finance Lakehouse → shortcut → Sales Gold Lakehouse/Tables/FactSales
   Finance queries FactSales without any data duplication
   Sales updates are immediately visible to Finance

2. External ADLS access:
   Lakehouse → shortcut → abfss://existing-lake.dfs.core.windows.net/raw
   Query existing ADLS data from Fabric without migration

3. Multi-cloud data access:
   Lakehouse → shortcut → AWS S3 bucket
   Spark notebooks query S3 data alongside OneLake data

Tip: Shortcuts eliminate the need to copy data between teams, workspaces, and clouds. This is how Fabric implements "single copy of truth" across a large organisation — no ETL duplication pipelines.


What is the Delta Lake format and why does Fabric use it as the standard?

Delta Lake is an open-source storage format adding ACID transactions, schema enforcement, time travel, and efficient upserts to Parquet files.

Feature Benefit
ACID transactions Concurrent reads/writes without corruption
Time travel Query data as of previous point in time
Schema evolution Add columns without breaking existing readers
Efficient upserts MERGE INTO for CDC patterns
Open format Any Spark, Trino, DuckDB engine can read
Direct Lake Power BI reads Delta files at in-memory speed
-- Time travel:
SELECT * FROM silver_orders VERSION AS OF 5
SELECT * FROM silver_orders TIMESTAMP AS OF '2025-01-01'

-- Upsert (MERGE):
MERGE INTO silver_orders AS target
USING new_orders AS source
ON target.OrderId = source.OrderId
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *

-- View Delta history:
DESCRIBE HISTORY silver_orders

3. Fabric Workloads

What is a Fabric Lakehouse and how does it differ from a Data Warehouse?

Lakehouse Data Warehouse
Schema On-read (Files) + on-write (Tables) Strict schema-on-write (DDL required)
Data types Structured + semi-structured + unstructured Structured only
Primary interface Spark (Python, Scala, SQL) T-SQL (INSERT, UPDATE, DELETE, MERGE)
Secondary interface Auto SQL Endpoint (read-only T-SQL)
Stored procedures No Yes
Best for Data engineering, data science, raw→curated Business analysts, BI, structured semantic layer
Storage OneLake (Delta Parquet) OneLake (Delta Parquet)

Tip: Both store data in OneLake as Delta Parquet. The Lakehouse auto-generates a SQL Endpoint — so a Lakehouse IS also queryable via T-SQL (read-only). A Warehouse is T-SQL read-write. This overlap confuses many candidates.


What is Direct Lake mode in Power BI and why is it a breakthrough?

Direct Lake is a new Power BI connectivity mode that reads Delta Parquet files directly from OneLake into Power BI's VertiPaq in-memory engine.

Three Power BI connection modes:

Import:
→ Data COPIED into VertiPaq memory
→ Fastest queries | Stale (last refresh only) | Size limited

DirectQuery:
→ Live queries to source on EVERY visual interaction
→ Always current | Slow (source DB performance) | No size limit

Direct Lake (NEW — Fabric only):
→ Reads Delta Parquet from OneLake into VertiPaq ON DEMAND
→ Import-speed performance (in-memory columnar)
→ Always current (reads latest Delta files automatically)
→ No dataset size limit
→ "Framing": loads column segments on first access
→ Falls back to DirectQuery if framing not complete

Tip: Direct Lake eliminates the Import vs DirectQuery trade-off — Import-level performance + DirectQuery-level freshness. This is the biggest Power BI innovation in years and a guaranteed question for any Fabric role.


What is Real-Time Intelligence in Fabric?

Component Description
Eventstream No-code streaming ingestion — capture, transform, route events from Event Hubs, IoT Hub, Kafka, CDC
KQL Database (Eventhouse) High-performance analytical DB for time-series data. KQL queries. Billions of rows in seconds.
KQL Queryset Saved KQL queries for reuse
Real-Time Dashboard Auto-refreshing dashboards (sub-second) powered by KQL
Data Activator (Reflex) No-code alerting — trigger email/Teams/flows when data conditions are met
Real-time pipeline:
IoT sensors / Event Hubs / Kafka / CDC
  → Eventstream (ingest + route + transform)
  → KQL Database / Eventhouse (store + query)
  → Real-Time Dashboard (visualise live)
  → Data Activator (alert on anomalies)

What is Fabric Mirroring and what databases does it support?

Fabric Mirroring replicates operational database data into OneLake as Delta Parquet tables in near real-time — using Change Data Capture (CDC), not traditional ETL.

Supported sources:

  • Azure SQL Database
  • Azure Cosmos DB
  • Snowflake
  • Azure SQL Managed Instance
  • Azure Database for PostgreSQL
  • MongoDB Atlas
How it works:
Source DB (Azure SQL)
  → CDC captures inserts/updates/deletes
  → Fabric replicates changes into OneLake
  → Latency: typically < 1 minute
  → Stored as Delta tables (queryable via Spark, SQL Endpoint, Power BI)
  → Appears as a shortcut in the workspace

Benefits:
→ No ETL pipeline to build or maintain
→ Near real-time analytics on operational data
→ Zero duplication — reads directly from CDC log
→ Combines with medallion architecture for Silver/Gold transformation

Tip: Mirroring eliminates complex ADF pipelines for operational DB analytics. It is the recommended pattern for near real-time analytics on Azure SQL, Cosmos DB, and Snowflake.


What is the Semantic Model in Fabric?

A Semantic Model (previously called a Power BI Dataset) is the reusable analytical layer between data storage and reports. In Fabric:

  • Created directly on a Lakehouse or Warehouse
  • Uses Direct Lake mode by default (no data import needed)
  • Contains measures (DAX), hierarchies, relationships, and security roles
  • Multiple reports can share a single semantic model
  • Can be certified/endorsed for enterprise use
  • Accessible via XMLA endpoint for external tools (Excel, Tabular Editor, SSMS)

4. Data Engineering — Notebooks, Pipelines & Medallion

What is the Medallion Architecture and how is it implemented in Fabric?

The Medallion Architecture organises data into three progressive quality layers stored as Delta tables in Lakehouses.

Bronze (Raw) layer:
→ Raw data as-is from source systems
→ No transformations, append-only or full snapshot
→ Preserves source fidelity for reprocessing
→ Lakehouse: Tables/bronze/ or Files/bronze/

Silver (Cleansed) layer:
→ Cleaned, validated, deduplicated
→ Standardised data types and naming conventions
→ Joined/enriched from multiple Bronze sources
→ Optimised: partitioned, Z-ordered
→ Lakehouse: Tables/silver/

Gold (Business) layer:
→ Business-level aggregations and metrics
→ Conformed dimensions and fact tables (star schema)
→ Ready for Power BI Direct Lake consumption
→ Domain-specific: Sales Gold, Finance Gold, HR Gold
→ Lakehouse: Tables/gold/

Recommended Fabric implementation:
Bronze Workspace   → Bronze Lakehouse
Silver Workspace   → Silver Lakehouse (shortcuts to Bronze)
Gold Workspace     → Gold Lakehouse (shortcuts to Silver)
Reporting          → Semantic Models → Power BI Reports

Separate workspaces = separate security roles per layer

Tip: Separate Lakehouses per medallion layer is the recommended enterprise pattern — different security roles, workspace assignments, and access control per layer.


What are Fabric Notebooks and what do they support?

Fabric Notebooks are interactive Spark development environments supporting:

  • PySpark (Python + Spark) — primary language
  • Spark SQL — SQL against Delta tables
  • Scala — JVM Spark code
  • R (SparkR) — R with Spark
  • %%sql magic — inline SQL in Python notebooks
# Read from Bronze Lakehouse
df = spark.read.format("delta").load("Tables/raw_orders")

# Transform (PySpark)
from pyspark.sql.functions import col, to_date, when, trim

df_silver = (df
  .filter(col("OrderStatus") != "TEST")
  .filter(col("OrderId").isNotNull())
  .withColumn("OrderDate", to_date(col("OrderDateStr"), "yyyy-MM-dd"))
  .withColumn("CustomerName", trim(col("CustomerName")))
  .withColumn("Region",
    when(col("Country").isin("UK", "IE", "DE", "FR"), "EMEA")
    .when(col("Country").isin("US", "CA"), "AMER")
    .otherwise("APAC"))
  .dropDuplicates(["OrderId"])
)

# Write to Silver Lakehouse as Delta (upsert pattern)
from delta.tables import DeltaTable

if spark.catalog.tableExists("silver_orders"):
    DeltaTable.forName(spark, "silver_orders").alias("target") \
      .merge(df_silver.alias("source"), "target.OrderId = source.OrderId") \
      .whenMatchedUpdateAll() \
      .whenNotMatchedInsertAll() \
      .execute()
else:
    df_silver.write.format("delta").saveAsTable("silver_orders")

What are Fabric Data Pipelines?

Fabric Data Pipelines use the same visual designer and JSON format as Azure Data Factory. Key activities:

Activity Purpose
Copy Data Move data between 90+ sources/sinks
Notebook Execute a Fabric Notebook (Spark)
Spark Job Definition Run a packaged PySpark/Scala job
Dataflow Gen2 Run a Power Query Online dataflow
Stored Procedure Execute SQL in Warehouse
If Condition / Switch Conditional control flow
ForEach / Until Iterative control flow
Get Metadata / Validation File/table checks

Tip: ADF pipelines are compatible with Fabric pipelines (same JSON format). The key difference: Fabric pipelines have native OneLake connectivity — no linked service configuration needed for internal Fabric data access.


What is a Dataflow Gen2 and when should you use it vs Spark?

Use Dataflow Gen2 when:

  • Business analyst / maker-level ETL (no Spark knowledge needed)
  • 150+ Power Query connectors not available in pipelines
  • Simple transformations: filter, merge, pivot, custom M columns
  • Small-to-medium datasets

Use Spark Notebooks when:

  • Large-scale data (billions of rows)
  • Complex transformations requiring ML or custom logic
  • Full developer control and unit testability
  • Integration with Python ecosystem (pandas, scikit-learn, PyTorch)

Dataflow Gen2 outputs to:

  • Fabric Lakehouse (Tables or Files)
  • Fabric Data Warehouse
  • Azure SQL, other external databases
  • OneLake directly

What is V-Order and Z-Order optimisation in Fabric Delta tables?

V-Order: a Microsoft-specific write-time optimisation for Delta Parquet files. Sorts and compresses data within Parquet row groups for maximum Power BI Direct Lake read performance. Enabled by default in Fabric.

Z-Order: a data skipping optimisation co-locating related data in the same Parquet files. When filtering on a Z-ordered column, Spark skips entire files that don't match — dramatically reducing I/O.

# Z-Order after data ingestion (run periodically):
spark.sql("""
  OPTIMIZE gold_FactSales
  ZORDER BY (CustomerId, OrderDate)
""")
# Queries filtering by CustomerId or OrderDate now read far fewer files

# V-Order (enabled by default in Fabric):
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
spark.conf.set("spark.microsoft.delta.optimizeWrite.vorder.enabled", "true")

# Compact small files:
spark.sql("OPTIMIZE silver_orders")  # merges small files into ~256MB chunks

# Vacuum old Delta versions (default: 7 days retention):
spark.sql("VACUUM silver_orders RETAIN 168 HOURS")

Key distinction: V-Order = Fabric/Power BI optimisation (Direct Lake performance). Z-Order = Spark/Delta general query optimisation. Know both for architect-level.


5. Security & Governance

What are the workspace roles in Fabric?

Role Capabilities
Admin Full control — manage workspace, members, all items. Can delete workspace.
Member Create, edit, delete items. Share items. Cannot manage workspace settings.
Contributor Create and edit items. Cannot delete others' items or share.
Viewer Read-only — view reports, query SQL Endpoint. Cannot edit.

Warning: Workspace roles are coarse-grained — they apply to ALL items. For fine-grained data access (which rows/columns), use Row-Level Security and Column-Level Security within Lakehouses and Warehouses.


What is OneSecurity and how does it implement Row and Column-Level Security?

-- ROW-LEVEL SECURITY (Warehouse / Lakehouse SQL Endpoint):
-- 1. Create security predicate function
CREATE FUNCTION dbo.fn_region_filter(@Region AS sysname)
  RETURNS TABLE WITH SCHEMABINDING AS
  RETURN SELECT 1 AS result
    WHERE @Region = USER_NAME()
       OR IS_MEMBER('GlobalDataAdmin') = 1;

-- 2. Apply security policy
CREATE SECURITY POLICY RegionFilter
  ADD FILTER PREDICATE dbo.fn_region_filter(Region)
  ON dbo.SalesOrders WITH (STATE = ON);
-- Users only see rows where Region matches their username

-- COLUMN-LEVEL SECURITY:
GRANT SELECT ON dbo.Employees(EmployeeId, Name, Department) TO [HRViewers];
DENY SELECT ON dbo.Employees(Salary, PersonalEmail, NationalId) TO [HRViewers];

-- DYNAMIC DATA MASKING:
ALTER TABLE dbo.Customers
  ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
-- Non-privileged users see: aXXX@XXXX.com instead of actual email

How does Microsoft Purview integrate with Fabric for governance?

Purview Feature Fabric Integration
Data Catalog Auto-scans Lakehouses, Warehouses, Datasets, Reports — discovers schemas and metadata
Data Lineage End-to-end lineage from source → pipeline → table → report
Sensitivity Labels Labels on Fabric items flow downstream to reports and exports
Information Protection Prevent export of highly confidential data
Audit Logs All Fabric workspace and item activity logged

Tip: Data lineage in Purview is especially powerful for Fabric — you can trace a single Power BI KPI back through every transformation step to its source system. This is an architect-level differentiator.


What is Fabric capacity management and how do you handle throttling?

All Fabric workloads consume Capacity Units (CUs) from the assigned capacity.

Throttling tiers (in order of impact):

  1. Background operations throttled first (Spark jobs, pipelines)
  2. Interactive operations throttled second (SQL queries, report loads)
  3. Users see delays/errors if throttling is severe

Management approach:

  1. Monitor: Fabric Capacity Metrics App (Power BI app) — CU consumption per workload, workspace, item
  2. Identify top consumers: find which notebooks, pipelines, or reports consume the most CUs
  3. Workspace isolation: assign heavy workloads (batch pipelines) to a separate capacity from interactive reporting
  4. Schedule off-peak: run heavy Spark jobs during off-peak hours
  5. Right-size: F64 for most enterprise scenarios. Scale up if Capacity Metrics shows consistent throttling.

6. Performance Optimisation

What are the key performance best practices for Fabric Lakehouses?

Delta table optimisation:

# 1. Compact small files (run after incremental loads)
spark.sql("OPTIMIZE tablename")

# 2. Z-Order on high-cardinality filter columns
spark.sql("OPTIMIZE tablename ZORDER BY (CustomerId, OrderDate)")

# 3. Partition large tables by low-cardinality column (e.g., date)
df.write.format("delta") \
  .partitionBy("Year", "Month") \
  .saveAsTable("partitioned_table")

# 4. Vacuum old file versions (keep 7 days for time travel)
spark.sql("VACUUM tablename RETAIN 168 HOURS")

# 5. Enable V-Order for Power BI Direct Lake performance
spark.conf.set("spark.microsoft.delta.optimizeWrite.vorder.enabled", "true")

Notebook performance:

  • Use .select() early to reduce columns processed
  • Filter data as early as possible (predicate pushdown)
  • Cache frequently reused DataFrames: df.cache()
  • Use broadcast() for small lookup tables in joins
  • Avoid collect() on large DataFrames (brings all data to driver)
  • Write Delta with mergeSchema only when needed — adds overhead

What causes Direct Lake fallback to DirectQuery?

Direct Lake falls back to DirectQuery (slower) when:

  1. Delta table not framed — column segments not yet loaded into VertiPaq memory for first access
  2. V-Order not applied — non-V-Order Delta files degrade Direct Lake read performance
  3. Too many small files — hundreds of tiny Parquet files slow framing
  4. Schema changes — recent DDL changes may invalidate the framing cache
  5. Large Delta history — too many uncommitted/vacuumed versions

Fix: Run OPTIMIZE + VACUUM on Gold tables. Ensure V-Order is enabled at write time. Monitor Direct Lake framing status in the Fabric workspace.


7. Scenario-Based Questions

Scenario: Design a modern data platform using Microsoft Fabric for a retail organisation with 50 stores.

Architecture:

  1. Ingestion:

    • POS transaction data → Fabric Pipeline Copy Activity → Bronze Lakehouse (daily batch)
    • Inventory DB (Azure SQL) → Fabric Mirroring → Bronze Lakehouse (near real-time)
    • Web analytics events → Eventstream → KQL Database (real-time)
  2. Medallion layers:

    • Bronze Lakehouse: raw data as-is
    • Silver Lakehouse: cleansed, deduped, joined (Spark notebooks)
    • Gold Lakehouse: star schema — FactSales, DimStore, DimProduct, DimDate
  3. Reporting:

    • Power BI Direct Lake Semantic Model on Gold Lakehouse
    • Store manager dashboards (RLS: each manager sees only their store)
    • Executive KPI reports (no RLS)
  4. Real-time operations:

    • Real-Time Dashboard from KQL Database — live sales by store
    • Data Activator: alert when stock drops below reorder threshold
  5. Data science:

    • Fabric Notebooks: demand forecasting model (Python + Spark)
    • Predictions written back to Gold Lakehouse → visible in Power BI
  6. Governance:

    • Purview sensitivity labels on customer PII tables
    • RLS in Gold Lakehouse (store managers see only their store)
    • Data lineage tracking in Purview
  7. Capacity: F64 — separate workspaces for Bronze/Silver/Gold layers


Scenario: How do you migrate from Azure Synapse Analytics to Microsoft Fabric?

  1. Assessment: inventory all Synapse assets — pipelines, Spark notebooks, SQL scripts, dedicated pool tables. Use Fabric migration assessment tool.
  2. OneLake setup: create Fabric workspace, create Lakehouses matching Synapse storage structure.
  3. Data migration:
    • ADLS Gen2 data → OneLake Shortcut (zero-copy, immediate access — fastest approach)
    • Or: Fabric Pipeline copy from ADLS to OneLake Tables
  4. Pipeline migration: Synapse pipelines → Fabric Pipelines (JSON format compatible). Update linked services to native Fabric connections.
  5. Notebook migration: copy Synapse Spark notebooks into Fabric. Update storage paths from abfss://container@storage.../ to OneLake paths. Most PySpark code runs unchanged.
  6. SQL migration: Synapse Dedicated Pool T-SQL → Fabric Data Warehouse T-SQL. Validate stored procedures, views, and custom functions.
  7. Power BI migration: update Semantic Models to use Direct Lake mode pointing to Fabric Lakehouse/Warehouse instead of Synapse connection.
  8. Parallel run: validate data output matches between Synapse and Fabric for 2–4 weeks before decommissioning.

Scenario: A Gold layer table is slow to query in Power BI Direct Lake. How do you diagnose and fix it?

  1. Check Direct Lake vs DirectQuery fallback: Power BI Desktop → Performance Analyzer → verify queries show "Direct Lake" mode, not "DirectQuery." Fallback indicates framing not complete.

  2. V-Order check: ensure V-Order was applied when writing the Gold table. Re-write with V-Order enabled if missing.

  3. OPTIMIZE the table: run OPTIMIZE gold_FactSales ZORDER BY (CustomerId, OrderDate) to compact small files and improve data skipping.

  4. Check small file count: DESCRIBE DETAIL gold_FactSales — if numFiles is in the hundreds, run OPTIMIZE to merge them.

  5. DAX measure performance: use Performance Analyzer in Power BI Desktop to separate "DAX query" time from "Direct Lake" time. Slow DAX = model issue, not storage issue.

  6. Add aggregation table: for very large facts (billions of rows), create a pre-aggregated summary table in Gold. Point the Semantic Model to the aggregation first.


Scenario: How do you implement data sharing between two business units without duplicating data?

Requirement: Finance needs Sales Gold tables for combined reporting. Data stays in Sales workspace. Zero data copy.

Solution: OneLake Shortcuts

  1. In Finance Workspace → Finance Lakehouse → New Shortcut
  2. Source: Another workspace in OneLake → Sales Gold Lakehouse → Tables/FactSales
  3. FactSales appears in Finance Lakehouse as a shortcut (virtual — no copy)
  4. Finance Spark notebooks, SQL Endpoint, and Power BI Direct Lake all read via the shortcut
  5. Apply RLS to Sales Gold Lakehouse SQL Endpoint — Finance users see only shared records
  6. Finance Power BI Semantic Model spans both Finance tables and Sales shortcuts — single model, zero data duplication

Tip: This is the canonical Fabric cross-workspace data sharing pattern. Shortcuts eliminate inter-team ETL pipelines entirely.


Scenario: How do you implement near real-time analytics on Azure SQL operational data?

Solution: Fabric Mirroring

  1. In Fabric workspace → New → Mirrored database → Azure SQL Database
  2. Connect to Azure SQL (provide connection string and credentials)
  3. Select tables to mirror: Orders, Customers, Products
  4. Fabric automatically starts CDC-based replication
  5. Within minutes, tables appear in OneLake as Delta tables
  6. Ongoing: changes in Azure SQL replicate to OneLake with < 1 minute latency
  7. Build Silver transformations in Spark notebooks reading from mirrored tables
  8. Power BI Direct Lake Semantic Model reads Gold tables for near real-time dashboards

No ETL pipeline to build or maintain. Mirroring handles all change capture automatically.


8. Cheat Sheet — Quick Reference

Fabric Workload Selection Guide

Need to...                                    → Use
Ingest data from 90+ sources                  → Data Pipeline (Copy Activity)
Low-code ETL with 150+ connectors             → Dataflow Gen2
Big data transformation at scale              → Spark Notebook
Query structured data with T-SQL              → Data Warehouse
Store mixed-format data (raw + Delta)         → Lakehouse
Near real-time DB replication into OneLake    → Fabric Mirroring
Ingest streaming events                       → Eventstream
Query time-series at extreme speed            → KQL Database (Eventhouse)
Visualise live streaming data                 → Real-Time Dashboard
Alert when data condition is met              → Data Activator (Reflex)
Build Power BI reports                        → Semantic Model + Reports
Share data without copying                    → OneLake Shortcut

OneLake Access Paths

ADLS Gen2 DFS endpoint:
abfss://{workspaceName}@onelake.dfs.fabric.microsoft.com/{itemName}.Lakehouse/Tables/{tableName}

OneLake REST endpoint:
https://onelake.dfs.fabric.microsoft.com/{workspaceName}/{itemName}.Lakehouse/Tables/{tableName}

In Fabric Notebook (relative path within same Lakehouse):
spark.read.format("delta").load("Tables/tableName")
spark.read.format("delta").load("Files/raw/filename.csv")

Medallion Architecture Quick Reference

Layer     Storage        Quality      Users
Bronze    Lakehouse      Raw          Data Engineers only
Silver    Lakehouse      Cleansed     Data Engineers + Data Scientists
Gold      Lakehouse      Business     Analysts + Power BI + Business Users

Transformation:
Bronze → Silver: Spark Notebooks (clean, dedupe, join)
Silver → Gold:   Spark Notebooks or Dataflow Gen2 (aggregate, model as star schema)
Gold → Reports:  Power BI Direct Lake Semantic Model

Scheduling:
Fabric Pipeline orchestrates Notebook runs
Bronze refresh → trigger Silver → trigger Gold → trigger Semantic Model refresh

Delta Table Maintenance Commands

-- Compact small files
OPTIMIZE tablename

-- Compact + Z-Order on filter columns
OPTIMIZE tablename ZORDER BY (col1, col2)

-- Remove old Delta versions (keep 7 days)
VACUUM tablename RETAIN 168 HOURS

-- View Delta history
DESCRIBE HISTORY tablename

-- Time travel query
SELECT * FROM tablename VERSION AS OF 5
SELECT * FROM tablename TIMESTAMP AS OF '2025-01-15'

-- Table details (file count, size, format)
DESCRIBE DETAIL tablename

Direct Lake vs Import vs DirectQuery

                  Import    DirectQuery    Direct Lake
Performance       ★★★★★    ★★☆☆☆          ★★★★★
Data freshness    ★★☆☆☆    ★★★★★          ★★★★★
Dataset size      Limited   Unlimited      Unlimited
Requires Fabric   No        No             YES
Storage           VertiPaq  None           VertiPaq (framed)
Needs refresh?    Yes       No             No (auto-current)

Top 10 Tips

  1. OneLake = "OneDrive for data" — one tenant-wide lake, all workloads share one copy of data. This single sentence is the most important concept in Fabric.
  2. Direct Lake = Import speed + DirectQuery freshness — the breakthrough that eliminates the historic Power BI trade-off. Know how framing works and what causes DirectQuery fallback.
  3. Lakehouse SQL Endpoint is read-only T-SQL — a Lakehouse auto-generates a SQL endpoint. A Warehouse is full read-write T-SQL. Many candidates confuse these.
  4. V-Order for Power BI, Z-Order for Spark queries — two different optimisations. V-Order is Fabric-specific and write-time. Z-Order is Delta standard and applied post-write.
  5. Medallion = Bronze → Silver → Gold — the universal data engineering pattern in Fabric. Know what happens at each layer and how separate Lakehouses enforce access control per layer.
  6. Shortcuts = zero-copy data sharing — the answer to any "how do you share data without duplicating it" question. Finance → shortcut → Sales Gold is the canonical example.
  7. Mirroring > ETL pipelines for operational DBs — near real-time CDC-based replication into OneLake. No pipeline to build or maintain. For Azure SQL, Cosmos DB, Snowflake.
  8. Fabric is Synapse's successor — know the mapping: Synapse Spark → Fabric Data Engineering, Synapse SQL → Fabric Warehouse, Synapse Pipelines → Fabric Pipelines.
  9. Capacity = shared pool — all workloads in assigned workspaces share CUs. Heavy Spark jobs and interactive Power BI reports compete for the same capacity. Workspace isolation is the mitigation.
  10. Purview for lineage — end-to-end lineage from source DB → pipeline → Silver table → Gold table → Power BI report. This is the governance story that closes enterprise architecture discussions.


Azure Integration Services Complete Guide

 

Azure Integration Services — Complete Guide

Logic Apps · Service Bus · API Management · Event Grid · Integration Patterns · Scenarios · Cheat Sheet


Table of Contents

  1. Azure Integration Services Overview
  2. Azure Logic Apps — Deep Dive
  3. Azure Service Bus — Deep Dive
  4. Azure API Management — Deep Dive
  5. Azure Event Grid
  6. Integration Patterns & Architecture
  7. Scenario-Based Questions
  8. Cheat Sheet — Quick Reference

1. Azure Integration Services Overview

What are Azure Integration Services and what problems do they solve?

Azure Integration Services is a suite of cloud services for connecting applications, data, and processes across cloud and on-premises environments.

Service Purpose
Azure Logic Apps Workflow orchestration — automate processes and integrate systems using a designer-based workflow engine
Azure Service Bus Enterprise message broker — reliable, ordered, durable message queuing and pub/sub
Azure API Management (APIM) API gateway — publish, secure, transform, and monitor APIs
Azure Event Grid Event routing — reactive, event-driven architecture at scale
Azure Event Hubs Big data streaming — high-throughput event ingestion (millions/sec)

Key positioning: Logic Apps = orchestration (do things in sequence). Service Bus = decoupling (reliable async messaging). APIM = API facade (secure and manage). Event Grid = events (react to things that happened). Event Hubs = telemetry streaming.


What is the difference between Logic Apps and Power Automate?

Logic Apps and Power Automate share the same underlying engine and connector library.

Logic Apps Power Automate
Audience Developers, IT, enterprise architects Business users, makers
Hosting Azure subscription Microsoft-managed SaaS
Pricing Pay-per-execution (Consumption) or App Service Plan (Standard) Per user/flow licence
VNET/private endpoints Yes (Standard and Premium) No
Source control / IaC ARM/Bicep templates, workflow JSON Solution packages
B2B EDI Yes (Integration Account) No
Local development Yes (VS Code, Standard tier) No

Tip: Same engine, different audience and infrastructure control. Enterprise integration with VNET, IaC, and B2B = Logic Apps. Business user automation = Power Automate.


What is the difference between Logic Apps Consumption and Standard plans?

Consumption Standard
Infrastructure Shared multi-tenant Dedicated App Service Plan
Pricing Pay per action execution Fixed plan cost
VNET integration No Yes
Private endpoints No Yes
Workflows per resource One Many
Local development No Yes (VS Code)
Stateless workflows No Yes (much faster)
Best for Low-volume, simple, quick deploy Enterprise production, high-volume

What is Azure Event Grid and how does it differ from Service Bus?

Event Grid Service Bus
Model Pub/sub event routing Message broker
Delivery guarantee At-least-once At-least-once with acknowledgement
Ordering Not guaranteed FIFO with sessions
Message retention 24h (default, max 7 days) Up to 14 days
Throughput 10M events/sec Up to 1000 msg/sec (Premium)
Use for Something happened — notify subscribers Message MUST be processed exactly once
Dead letter Yes Yes (DLQ)
Use Event Grid when:
→ Azure resource events (blob created, VM deallocated)
→ High-volume, low-latency event fan-out
→ Fire-and-forget is acceptable
→ Many subscribers need the same event

Use Service Bus when:
→ Message MUST be processed exactly once
→ Order of processing matters (sessions)
→ Consumer may be temporarily offline
→ Transactional messaging required
→ Complex routing with filter rules

2. Azure Logic Apps — Deep Dive

What are the key components of a Logic Apps workflow?

Component Description
Trigger Starts the workflow. Types: polling, push (webhook), recurrence, manual (HTTP)
Actions Steps after trigger. Each is a connector operation.
Connectors Wrappers around APIs. 400+ built-in. Custom connectors via OpenAPI.
Control flow Condition (if/else), Switch, For Each, Until, Scope
Variables Mutable state within a workflow run
Expressions @{body('action')}, @{utcNow()} — same syntax as Power Automate

What is the difference between stateful and stateless workflows in Logic Apps Standard?

Stateful workflow: each step's input/output persisted in Azure Storage. Full run history available. Can pause for external callbacks or approvals. Supports long-running workflows (days/weeks). Higher latency, higher cost.

Stateless workflow: data kept in memory only — not persisted. No run history. Cannot pause/resume. Maximum duration: minutes. Much faster (no storage I/O). Much lower cost. Best for high-volume synchronous processing.

Tip: Use stateless for high-volume, fast API transformations (hundreds per second). Use stateful for long-running processes, human-in-the-loop approvals, and workflows needing audit trails.


How does error handling work in Logic Apps?

Logic Apps uses the same Run After and Scope patterns as Power Automate:

Try-Catch-Finally pattern:

[Try Scope]
  → Main workflow steps

[Catch Scope]  ← Run After: Try scope → Failed
  → Alert via email/Teams
  → Log to Application Insights
  → Access error: @{result('Try_scope')[0]['error']['message']}
  → Access failed action: @{result('Try_scope')[0]['name']}

[Finally Scope]  ← Run After: Try + Catch → all states
  → Cleanup (always runs)

Retry policy per action:
→ None / Fixed / Exponential
→ Count: 1–90, Interval: configurable
→ Auto-retries on HTTP 408, 429, 5xx

What is an Integration Account in Logic Apps?

An Integration Account is an Azure resource providing B2B EDI integration capabilities.

Feature Description
Trading partners Define business partners and their identities
Agreements Message exchange agreements (send/receive settings)
Schemas XML schemas for validating/transforming EDI messages
Maps (XSLT) Transform message formats between partners
Certificates Message signing and encryption
EDI protocols AS2 (secure HTTP), X12 (US EDI), EDIFACT (international EDI)

Tip: Integration Account is the answer to any question about B2B EDI, trading partners, or AS2/X12/EDIFACT in Logic Apps .


How do you implement Logic Apps in a DevOps CI/CD pipeline?

Consumption plan (ARM templates):

# Export workflow as ARM template
# Store in Git
# Deploy via Azure CLI or DevOps ARM task
az deployment group create \
  --resource-group myRG \
  --template-file logicapp.json \
  --parameters @params.dev.json

Standard plan (workflow JSON — like Azure Functions):

# GitHub Actions deployment
- name: Deploy Logic App Standard
  uses: Azure/functions-action@v1
  with:
    app-name: my-logic-app-standard
    package: ./src/logicapp

Environment-specific config:

App Settings per environment (dev/test/prod):
→ Connection strings
→ API endpoints
→ Feature flags

Key Vault references for secrets:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/apikey)

What are managed connectors vs built-in connectors in Logic Apps Standard?

Managed connectors: run in Microsoft's shared cloud infrastructure. Make outbound calls to external services (Salesforce, SAP, ServiceNow). Subject to connector throttling limits. Same as Power Automate connectors.

Built-in connectors (Standard only): run inside the Logic App's own host process. Faster, no throttling limits. Include: HTTP, Service Bus, Event Hubs, Azure Blob, SQL, Dataverse, B2B operations. Use built-in over managed where available for better performance.


3. Azure Service Bus — Deep Dive

What is Azure Service Bus and what are its key components?

Component Description
Namespace Top-level container. Unique hostname: contoso.servicebus.windows.net
Queue Point-to-point. One sender, competing consumers. Each message processed once.
Topic Pub/sub. One publisher, multiple subscriptions each receiving a copy.
Subscription Named receiver on a topic. Has its own queue + filter rules.
Message Body (256KB Standard / 100MB Premium) + system + custom properties
Queue (point-to-point):
Producer → [Queue] → Consumer A (competing)
                   → Consumer B (competing)
→ ONE consumer processes each message

Topic/Subscription (pub/sub):
Publisher → [Topic] → [Sub A: filter Region='EMEA'] → Consumer A
                    → [Sub B: filter Priority='High'] → Consumer B
                    → [Sub C: no filter]              → Consumer C
→ EACH subscription gets its own independent copy

What are Service Bus tiers and which should you use for production?

Tier Queues Topics Max Msg Size VNET Best For
Basic 256KB Dev/test only
Standard 256KB Low-criticality workloads
Premium 100MB Enterprise production

Premium features: dedicated capacity units, geo-disaster recovery, VNET/private endpoints, predictable performance, availability zones.

Warning: Always use Premium for enterprise production — dedicated resources, VNET integration, and predictable latency. Standard has noisy neighbour risk and no network isolation.


What is the Dead Letter Queue (DLQ) and when are messages sent to it?

The DLQ is a sub-queue storing messages that cannot be processed. Every queue and subscription has its own DLQ.

Messages are dead-lettered when:

  1. Max delivery count exceeded — consumer abandons (nacks) message more than MaxDeliveryCount times (default: 10)
  2. TTL expired — message not consumed before Time-To-Live expires (if dead-lettering on expiry enabled)
  3. Subscription filter error — filter expression throws an exception
  4. Consumer explicitly dead-letters — calls deadLetterAsync() for unprocessable messages
DLQ message properties:
DeadLetterReason            → WHY it was dead-lettered
DeadLetterErrorDescription  → Detailed error message
EnqueuedTimeUtc             → When original message was sent
DeliveryCount               → How many times delivery was attempted

DLQ path:
Queue: myqueue/$DeadLetterQueue
Subscription: mytopic/mysubscription/$DeadLetterQueue

Critical: An overflowing DLQ means data loss. Always monitor DLQ counts with Azure Monitor alerts and have a process for reviewing, resubmitting, or archiving dead-lettered messages.


What are Sessions in Service Bus and when do you use them?

Sessions enable FIFO ordered processing of related messages. A session groups messages by SessionId — all messages with the same SessionId are processed in order by the same consumer instance.

Without sessions (no ordering guarantee):
Producer sends: Order-123-Created, Order-123-Paid, Order-123-Shipped
3 competing consumers → may process Shipped before Paid → wrong state

With sessions (SessionId = "Order-123"):
→ All messages with SessionId="Order-123" locked to ONE consumer
→ Processed in order: Created → Paid → Shipped
→ Other sessions (Order-456, Order-789) processed in parallel by other consumers
→ Scale: number of concurrent sessions = throughput

Enable sessions on queue/subscription:
RequiresSession = true (must be set at creation time)

Send with session:
message.SessionId = orderId;

Receive with session:
var session = await receiver.AcceptNextSessionAsync();

Tip: Sessions are the answer to "how do you guarantee message ordering in Service Bus." Without sessions, ordering is not guaranteed even with a single consumer.


What is the difference between peek-lock and receive-and-delete?

Peek-Lock (recommended):

  1. Consumer receives message — it is locked (invisible to others) for lock duration
  2. Consumer processes and calls Complete() → deleted from queue
  3. Or calls Abandon() → released back to queue for retry
  4. Or calls DeadLetter() → moved to DLQ
  5. If consumer crashes — lock expires, message re-queues automatically
  6. Guaranteed at-least-once delivery

Receive-and-Delete:

  1. Message deleted immediately on receive
  2. If consumer crashes after receive but before processing → message is permanently lost
  3. Use only for non-critical, idempotent scenarios (metrics, logging)

Warning: Always use Peek-Lock for business-critical messages. Receive-and-Delete risks data loss if the consumer fails between receiving and completing processing.


What is duplicate detection in Service Bus?

Duplicate detection allows Service Bus to discard messages with a previously seen MessageId within a configurable time window (1 min – 7 days).

// Enable at queue/topic creation:
new CreateQueueOptions("myqueue") {
  RequiresDuplicateDetection = true,
  DuplicateDetectionHistoryTimeWindow = TimeSpan.FromMinutes(10)
};

// Set MessageId on the sender side:
var message = new ServiceBusMessage(body) {
  MessageId = $"{orderId}-{timestamp}"
};

Use when producers may retry sending on network failure — prevents double-processing of the same business event.


4. Azure API Management — Deep Dive

What is Azure API Management and what problem does it solve?

Azure API Management (APIM) is a fully managed API gateway between API consumers (clients) and API backends.

Core capabilities:

Capability Description
Security OAuth 2.0, JWT validation, subscription keys, client certificates, IP filtering
Rate limiting Rate limit and quota per subscription, IP, or custom key
Transformation Modify requests/responses without touching backend code
Versioning Manage multiple API versions, route to different backends
Developer portal Self-service API documentation and subscription management
Caching Cache responses to reduce backend load
Analytics Request logs, metrics, tracing via Azure Monitor + Application Insights

Key value: Decouple API consumers from backends. Backend can change without consumers knowing — APIM handles the translation.


What are APIM policies and what are the most important ones to know?

Policies are XML-based rules applied in four sections: inbound, backend, outbound, on-error.

<policies>
  <inbound>
    <!-- Validate JWT (Entra ID) -->
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401">
      <openid-config url="https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration"/>
      <required-claims>
        <claim name="aud"><value>api://my-api-id</value></claim>
      </required-claims>
    </validate-jwt>

    <!-- Rate limit per subscription: 100 calls/60s -->
    <rate-limit-by-key calls="100" renewal-period="60"
      counter-key="@(context.Subscription.Id)"/>

    <!-- Add internal key to backend request -->
    <set-header name="X-Internal-Key" exists-action="override">
      <value>{{internal-api-key-named-value}}</value>
    </set-header>

    <!-- Route to different backend based on header -->
    <choose>
      <when condition="@(context.Request.Headers.GetValueOrDefault('X-Version','v1') == 'v2')">
        <set-backend-service base-url="https://v2.api.backend.com"/>
      </when>
      <otherwise>
        <set-backend-service base-url="https://v1.api.backend.com"/>
      </otherwise>
    </choose>
  </inbound>

  <outbound>
    <!-- Remove internal header from response -->
    <set-header name="X-Powered-By" exists-action="delete"/>
    <!-- Cache successful responses for 5 minutes -->
    <cache-store duration="300"/>
    <!-- Transform XML response to JSON -->
    <xml-to-json kind="direct" apply="always"/>
  </outbound>

  <on-error>
    <return-response>
      <set-status code="@((int)context.Response.StatusCode)" reason="@(context.Response.StatusReason)"/>
      <set-body>@("Error: " + context.LastError.Message)</set-body>
    </return-response>
  </on-error>
</policies>

What are APIM tiers?

Tier SLA VNET Multi-region Scale Units Best For
Developer None No No 1 Dev/test only
Basic 99.95% No No 2 Small, non-critical
Standard 99.95% No No 4 Medium volume
Premium 99.99% Yes Yes 31 Enterprise production
Consumption 99.95% No No Serverless Very low volume, serverless

Tip: Premium is the only tier with VNET integration and multi-region deployment. Required when backends are in private networks or when global availability is needed.


What are APIM Products, APIs, and Subscriptions?

API: a backend service exposed through APIM
  → Has operations: GET /orders, POST /orders, DELETE /orders/{id}
  → Has policies applied at API or operation level

Product: a bundle of one or more APIs
  → Controls access: who can subscribe
  → Applies shared rate limits and quotas
  → Types: Open (no approval needed) | Protected (subscription required)

Subscription: a consumer's access key to a Product
  → Primary and secondary keys (for key rotation without downtime)
  → Passed in header: Ocp-Apim-Subscription-Key: {key}
  → Can be scoped to: All APIs | Product | Single API

Example:
APIs: Orders, Inventory, Customers, Analytics

Products:
  "Developer Tier" → Orders API only, 10 calls/min, free
  "Standard Tier"  → Orders + Inventory, 100 calls/min
  "Enterprise"     → All APIs, 1000 calls/min, SLA guaranteed

Consumer A subscribes to "Standard Tier":
→ Gets subscription key
→ Can call Orders and Inventory up to 100 calls/min
→ Cannot call Customers or Analytics

How do you implement API versioning in APIM?

Three versioning schemes:

Scheme URL Format Example
URL path /v{version}/resource /v1/orders, /v2/orders
Query string /resource?api-version={ver} /orders?api-version=2024-01-01
Header Api-Version: {version} Header: Api-Version: 2024-01-01

Each version can point to a different backend, have different policies, and be independently documented. A version set groups all versions together in the developer portal.

Tip: Always create a version set when deploying v1. Retrofitting versioning to an existing API with consumers is painful and disruptive.


What are Named Values in APIM and why are they important?

Named Values (formerly Properties) are key-value pairs stored in APIM and referenced in policies using {{name}} syntax.

<!-- Instead of hardcoding: -->
<set-header name="X-API-Key"><value>abc123supersecret</value></set-header>

<!-- Use Named Value: -->
<set-header name="X-API-Key"><value>{{backend-api-key}}</value></set-header>

Types:

  • Plain: static string value
  • Secret: encrypted, not visible after saving
  • Key Vault reference: value retrieved from Azure Key Vault at runtime

Best practice: Always use Named Values (preferably Key Vault-backed) for secrets and environment-specific values in APIM policies. Never hardcode secrets in policy XML.


5. Azure Event Grid

What is Azure Event Grid and what are its key components?

Event Grid is a fully managed event routing service for building reactive, event-driven architectures.

Component Description
Event source What emits events: Azure resources (Blob Storage, Resource Groups, Service Bus) or custom apps
Topic Endpoint where events are sent. System topics (Azure resources) or custom topics
Event subscription Maps a topic to an event handler with optional filter rules
Event handler What processes the event: Azure Functions, Logic Apps, Event Hubs, Service Bus, Webhooks
Azure Blob Storage (event source)
  → BlobCreated event published to System Topic
  → Event Grid routes to:
    Subscription 1 (filter: blobType=image) → Azure Function (resize image)
    Subscription 2 (no filter) → Logic App (archive to cold storage)
    Subscription 3 (filter: container=reports) → Power Automate (notify team)

When should you use Event Grid vs Event Hubs vs Service Bus?

Event Grid:
→ Discrete events (something happened)
→ Azure resource events (blob created, VM stopped)
→ Low volume, reactive architecture
→ Fan-out to many subscribers
→ Events expire after 24h–7 days

Event Hubs:
→ High-throughput streaming (millions/sec)
→ Time-series data, telemetry, logs
→ Replay capability (retention up to 90 days)
→ Big data pipelines (Spark, Stream Analytics)

Service Bus:
→ Reliable transactional messaging
→ Message must be processed exactly once
→ Order matters (sessions)
→ Consumer may be offline
→ Complex routing with business rules

6. Integration Patterns & Architecture

What is the Competing Consumers pattern?

Multiple consumer instances process messages from a single queue concurrently — scaling throughput horizontally. Each message processed by exactly one consumer.

Service Bus Queue with 3 consumers:
Producer → [Queue: 1000 messages]
  Consumer 1 (Azure Function instance) ← picks up messages
  Consumer 2 (Azure Function instance) ← picks up messages
  Consumer 3 (Azure Function instance) ← picks up messages

→ Each message processed by EXACTLY ONE consumer
→ Scale out by adding consumers
→ Azure Functions + Service Bus trigger auto-scales based on queue depth

What is the Saga pattern and how do you implement it?

The Saga pattern manages long-running distributed transactions without a central transaction coordinator. Each step publishes an event; compensating transactions undo completed steps if a later step fails.

Order Processing Saga — Orchestration (Logic App):

Step 1: Reserve Inventory API
  → Success: continue
  → Failure: STOP (nothing to compensate)

Step 2: Charge Payment API
  → Success: continue
  → Failure: call Inventory API to RELEASE reservation (compensate Step 1)

Step 3: Create Shipment API
  → Success: Saga complete
  → Failure: call Payment API to REFUND (compensate Step 2)
           + call Inventory API to RELEASE (compensate Step 1)

Choreography (Service Bus Topics):
  Each service subscribes to its trigger event
  Publishes result event → triggers next service
  Compensating events flow in reverse on failure
  No central orchestrator — fully decoupled

What is the Claim Check pattern?

Offloads large message payloads to external storage and sends only a reference in the Service Bus message.

Problem: Message payload = 5MB → exceeds 256KB Service Bus limit

Solution:
Producer:
  1. Upload full payload to Azure Blob Storage
  2. Get SAS URL (time-limited access token)
  3. Send small message: { "claimCheck": "{sasUrl}", "type": "OrderCreated" }

Consumer:
  1. Receive small message from Service Bus
  2. Download full payload from Blob using claimCheck URL
  3. Process the full payload
  4. Delete the blob after successful processing

How do Logic Apps, Service Bus, and APIM work together in enterprise integration?

External systems / Trading partners / Mobile apps
        ↓ HTTPS
[APIM] ← API Gateway (North-South traffic)
  → Authenticate: validate JWT/OAuth/mTLS
  → Rate limit external callers
  → Route to correct backend version
  → Transform: REST→SOAP, JSON→XML
        ↓
[Logic Apps] ← Orchestration layer
  → Receives HTTP request from APIM
  → Calls multiple backend services (SAP, D365, SQL)
  → Handles retry, error handling, compensation
  → Sends responses back and notifications
        ↓
[Service Bus] ← Async decoupling layer (East-West traffic)
  → Decouples Logic App from slow backend systems
  → Reliable delivery to downstream consumers
  → Topics/subscriptions fan out to multiple consumers
        ↓
Backend services (SAP, Dynamics 365, SQL, Custom APIs)

Design principle:
APIM    = North-South gateway (external ↔ internal boundary)
Service Bus = East-West bus (internal service ↔ service decoupling)
Logic Apps  = Orchestration across both layers

What is the Throttling / Rate Limiting pattern in APIM?

<!-- Rate limit per subscriber: 100 calls per 60 seconds -->
<rate-limit-by-key calls="100" renewal-period="60"
  counter-key="@(context.Subscription.Id)"
  increment-condition="@(context.Response.StatusCode >= 200
    and context.Response.StatusCode < 300)"/>

<!-- Rate limit per IP address -->
<rate-limit-by-key calls="50" renewal-period="60"
  counter-key="@(context.Request.IpAddress)"/>

<!-- Weekly quota (business tier limit) -->
<quota-by-key calls="50000" bandwidth="102400"
  renewal-period="604800"
  counter-key="@(context.Subscription.Id)"/>

<!-- Spike arrest: max 10 calls/second to protect backend -->
<rate-limit calls="10" renewal-period="1"/>

When limit exceeded:

  • Returns HTTP 429 Too Many Requests
  • Include Retry-After header
  • Custom error body via policy

Tip: Implement both rate-limit (short window, protect from spikes) and quota (long window, enforce business tier limits) for complete throttling strategy.


7. Scenario-Based Questions

Scenario: Design a reliable order processing system using Service Bus for 10,000 orders/hour.

  1. Service Bus Premium namespace: dedicated capacity, ~1000 msg/sec throughput, VNET integration
  2. Topic: orders with subscriptions:
    • inventory-sub: filter OrderType = 'Physical'
    • payment-sub: no filter (all orders), sessions enabled (SessionId = OrderId)
    • analytics-sub: no filter (all orders)
  3. Azure Functions consumers with Service Bus trigger: KEDA-based auto-scaling
  4. Dead Letter Queue monitoring: Azure Monitor alert when DLQ count > 0. Logic App notifies ops team.
  5. Duplicate detection: MessageId = OrderId + SubmissionTimestamp — prevents double-processing on producer retry
  6. Geo-Disaster Recovery: paired secondary namespace in secondary region. Failover RTO < 1 minute.
  7. Message TTL: 24h — orders not processed in 24h → DLQ alert for manual review

Scenario: A backend API averages 3 second responses. How do you use APIM to improve consumer experience?

  1. Response caching for stable reference data (product catalogue, lookup tables):
    <cache-lookup vary-by-developer="false">  <vary-by-header>Accept</vary-by-header></cache-lookup><!-- In outbound: --><cache-store duration="300"/>
    
  2. Circuit breaker pattern: on repeated backend failures, return cached last-good response or a meaningful error:
    <retry condition="@(context.Response.StatusCode >= 500)"  count="3" interval="2" first-fast-retry="true"/>
    
  3. Async pattern for operations > 1s:
    • APIM accepts request → sends to Service Bus → returns 202 Accepted + jobId
    • Backend processes async → stores result
    • Consumer polls GET /jobs/{jobId} for status
  4. Mock response for dev/test environments — no backend call
  5. Backend timeout policy: set explicit timeout so slow responses don't exhaust APIM threads
  6. Backend load balancing: configure multiple backend pool members — APIM round-robins or health-checks

Scenario: How do you expose an on-premises SAP API securely to external partners via APIM?

  1. APIM Premium with Internal VNET mode: APIM deployed inside a VNET. SAP reachable via ExpressRoute/VPN into the same VNET.
  2. Application Gateway in front of APIM: AG provides public endpoint, WAF, SSL termination. Forwards to internal APIM only.
  3. Partner authentication: mutual TLS (client certificates) or OAuth 2.0 client credentials. APIM validates certificates against trusted CA store.
  4. Request transformation: APIM policy transforms REST JSON → SOAP for SAP. Partners never see SAP's native SOAP interface.
  5. Rate limiting: per-partner subscription limits prevent any partner overwhelming SAP.
  6. Schema validation: APIM validates request payloads at gateway — bad requests rejected before reaching SAP.
  7. Logging: all partner API calls → Azure Monitor + Application Insights for audit compliance.

Scenario: Design a Logic App that syncs orders from e-commerce to Dynamics 365 every 15 minutes with deduplication.

  1. Trigger: Recurrence — every 15 minutes
  2. Fetch new orders: HTTP GET ?modifiedAfter=@{addMinutes(utcNow(),-15)}
  3. Parse JSON: extract orders array
  4. For Each (concurrency 5): parallel processing of 5 orders at a time
    • Query D365 by external order ID → does it exist?
    • No: create new D365 record
    • Yes: compare modifiedOn → if changed, update
  5. Try-Catch per order: wrap each order in a Try scope. Catch: log failed orderId + error to Azure Table Storage. Continue to next order — don't fail entire run on one bad record.
  6. Summary notification: Teams message after loop: "Sync complete: X created, Y updated, Z failed. See log for details."
  7. Persist last sync timestamp: update a D365 config record with current timestamp for next run's filter query.

Scenario: How do you implement a pub/sub notification system where different teams receive different order events?

Architecture:
Order Service → publishes to Service Bus Topic: "order-events"

Subscriptions with SQL filter rules:
inventory-team-sub:
  Filter: OrderStatus = 'Confirmed' OR OrderStatus = 'Cancelled'
  Action: Set RouteTo = 'inventory-queue'

finance-team-sub:
  Filter: OrderTotal > 1000 AND PaymentStatus = 'Charged'

shipping-team-sub:
  Filter: OrderStatus = 'ReadyToShip' AND DeliveryType = 'Express'

analytics-sub:
  No filter — receives ALL events for reporting

Implementation:
Order service sends with properties:
message.ApplicationProperties["OrderStatus"] = "Confirmed";
message.ApplicationProperties["OrderTotal"] = 1500.00;
message.ApplicationProperties["DeliveryType"] = "Express";

Each team's consumer only receives events matching their filter.
Teams can be added/removed without changing the producer.

8. Cheat Sheet — Quick Reference

Service Selection Guide

Need to...                              → Use
Orchestrate a multi-step process        → Logic Apps
Decouple services reliably              → Service Bus Queue
Fan out events to multiple consumers    → Service Bus Topic OR Event Grid
React to Azure resource events          → Event Grid
Ingest millions of telemetry events/sec → Event Hubs
Secure and manage APIs                  → API Management
Transform request/response format       → APIM policy
Rate limit API callers                  → APIM rate-limit policy
Guarantee message order                 → Service Bus + Sessions
Handle large payloads (>256KB)          → Claim Check pattern + Blob Storage
B2B EDI (AS2, X12, EDIFACT)            → Logic Apps + Integration Account

Service Bus Quick Reference

Namespace tiers: Basic (queues only) | Standard | Premium (enterprise)
Max message size: 256KB (Standard) | 100MB (Premium)
Message retention: up to 14 days
Max delivery count: default 10 (configurable)

Queue (point-to-point):
→ Competing consumers
→ Each message processed once
→ Enable sessions for FIFO ordering

Topic (pub/sub):
→ Multiple subscriptions
→ SQL filter rules per subscription
→ Each subscription gets independent copy

Message receive modes:
Peek-Lock: safe, acknowledged, retryable    ← always use for business data
Receive-Delete: immediate delete, risk loss ← only for non-critical

DLQ: every queue/subscription has one
Monitor: alert when DLQ count > 0
Path: myqueue/$DeadLetterQueue

APIM Policy Reference

<!-- JWT validation -->
<validate-jwt header-name="Authorization" failed-validation-httpcode="401">
  <openid-config url="https://login.microsoftonline.com/{tid}/v2.0/.well-known/openid-configuration"/>
</validate-jwt>

<!-- Rate limit per subscription -->
<rate-limit-by-key calls="100" renewal-period="60"
  counter-key="@(context.Subscription.Id)"/>

<!-- Cache response -->
<cache-store duration="300"/>

<!-- Transform XML to JSON -->
<xml-to-json kind="direct" apply="always"/>

<!-- Set backend URL -->
<set-backend-service base-url="https://api.backend.com"/>

<!-- Add header -->
<set-header name="X-Key" exists-action="override">
  <value>{{named-value}}</value>
</set-header>

<!-- Remove response header -->
<set-header name="X-Powered-By" exists-action="delete"/>

<!-- Mock response -->
<mock-response status-code="200" content-type="application/json"/>

<!-- Return custom error -->
<return-response>
  <set-status code="400"/>
  <set-body>{"error": "Invalid request"}</set-body>
</return-response>

Logic Apps — Connectivity Modes

Consumption plan:
→ Shared infrastructure
→ Pay per action (~$0.000025/action)
→ No VNET
→ One workflow per resource
→ Good for: low-volume, quick start

Standard plan:
→ Dedicated App Service Plan
→ Fixed cost, predictable
→ VNET integration + private endpoints
→ Multiple workflows per resource
→ Stateless workflows (fast, no history)
→ Local development in VS Code
→ Good for: enterprise production

Top 10 Tips

  1. Logic Apps vs Power Automate — same engine, different infrastructure control. Enterprise = Logic Apps (VNET, IaC, B2B). Business users = Power Automate. Never say "they're the same thing."
  2. Standard vs Consumption — Standard is the enterprise choice (VNET, stateless, multi-workflow). Consumption for quick prototypes only. Know this before any architecture question.
  3. Service Bus sessions = FIFO — sessions are the ONLY way to guarantee message ordering. Without them, ordering is not guaranteed even with a single consumer.
  4. Peek-Lock, always — Receive-and-Delete risks message loss on consumer crash. Peek-Lock with Complete/Abandon is the correct pattern for any business-critical message.
  5. DLQ monitoring is non-negotiable — an overflowing DLQ is silent data loss. Azure Monitor alert on DLQ count > 0 is a standard architecture requirement.
  6. APIM Premium for VNET — it's the only tier with private network integration. If backends are on-premises or in a private VNET, you need Premium.
  7. Named Values for secrets in APIM policies — never hardcode API keys or connection strings in policy XML. Named Values (Key Vault-backed) are the correct approach.
  8. Products in APIM — how you bundle APIs and control consumer access tiers. Many candidates know APIs but miss Products as the access control layer.
  9. Integration Account for B2B EDI — AS2, X12, EDIFACT in Logic Apps requires an Integration Account. This is the expected answer for any B2B/trading partner question.
  10. APIM + App Gateway pattern — exposing APIM in Internal VNET mode behind an Application Gateway is the standard enterprise pattern for secure public API exposure with backend network isolation.


Featured Post

SharePoint Classic Blank-Fallback Redirect Page via CEWP

SharePoint Classic — Blank-Fallback Redirect Page via CEWP Query Parameter Routing · jQuery · Content Editor Web Part · Site Assets · wind...

Popular posts