Intermediate โฑ 90 min ๐Ÿ“‹ 12 Steps

Configure Communication Compliance, Audit & Data Lifecycle Management

Deploy three critical Microsoft Purview compliance solutions: Communication Compliance to monitor emails, Teams, and third-party chats for policy violations; Audit (Standard & Premium) to track user and admin activities for forensic investigations; and Data Lifecycle Management to automate retention and deletion of content across Microsoft 365.

๐Ÿ“‹ Overview

About This Lab

This lab covers three critical Microsoft Purview compliance solutions. Communication Compliance monitors emails, Microsoft Teams messages, and third-party chat platforms for policy violations such as offensive language, insider trading signals, and regulatory non-compliance. Audit (Standard & Premium) tracks user and admin activities across Microsoft 365 services, providing forensic-grade logs with up to 10 years of retention for regulatory investigations. Data Lifecycle Management automates retention and deletion of content through retention policies, retention labels, adaptive scopes, and disposition reviews. ensuring organisations keep data as long as required and delete it when no longer needed.

๐Ÿข Enterprise Use Case

A financial services firm subject to SEC and FINRA regulations must monitor all broker-dealer communications for compliance violations, including insider trading language, market manipulation signals, and unsuitable investment recommendations. The firm is required to retain all business records. including emails, Teams chats, and trade confirmations. for a minimum of 7 years under SEC Rule 17a-4. During regulatory examinations, the compliance team must produce comprehensive audit trails demonstrating who accessed what data, when, and from where. Without these controls, the firm faces multi-million-dollar fines, suspension of broker-dealer licences, and reputational damage.

๐ŸŽฏ What You Will Learn

  1. Navigate the Microsoft Purview compliance portal and connect via PowerShell
  2. Enable and configure Audit (Standard & Premium) with appropriate retention periods
  3. Search the unified audit log using the portal, KQL queries, and PowerShell
  4. Create Communication Compliance policies from pre-built templates
  5. Configure Communication Compliance for financial regulatory requirements (SEC/FINRA)
  6. Review, investigate, and remediate Communication Compliance alerts
  7. Create organisation-wide and location-specific retention policies
  8. Create retention labels, declare records, and publish label policies
  9. Configure adaptive scopes for targeted retention based on user/group/site attributes
  10. Set up disposition reviews for regulated records requiring approval before deletion
  11. Monitor compliance posture with Activity Explorer, Content Explorer, and reports
  12. Plan ongoing operations and prepare for advanced compliance scenarios

๐Ÿ”‘ Why This Matters

Regulatory fines for communication compliance failures are severe: FINRA issued over $100 million in fines in a single year for supervisory failures related to off-channel communications. SEC Rule 17a-4 mandates immutable retention of broker-dealer records. violations can result in licence revocation. GDPR’s right to erasure (Article 17) requires organisations to delete personal data when no longer needed, creating tension with retention mandates that only a well-designed lifecycle management strategy can resolve. Audit logs are the foundation of every forensic investigation and regulatory examination. without comprehensive, tamper-proof audit data, organisations cannot demonstrate compliance or investigate incidents. Together, these three solutions form the backbone of an enterprise compliance programme.

โš™๏ธ Prerequisites

  • Completed Labs 01–04. sensitivity labels, DLP, Insider Risk, and eDiscovery configured
  • Compliance Administrator role. or Communication Compliance Admin, Records Management, and Audit roles in the Microsoft Purview compliance portal
  • Microsoft 365 E5 licence. or E5 Compliance add-on (required for Audit Premium and Communication Compliance)
  • Exchange Online PowerShell module. ExchangeOnlineManagement module installed
  • Security & Compliance PowerShell. access via Connect-IPPSSession
  • Test mailboxes and Microsoft Teams channels. with sample conversations for policy testing
  • SharePoint Online sites. with sample documents for retention policy testing
๐Ÿ’ก Pro Tip: Communication Compliance policies can take up to 24 hours to start capturing content after creation. Plan your lab schedule accordingly. create policies early and review results the next day for the most realistic experience.

Step 1 ยท Navigate to the Purview Compliance Portal

Start by accessing the Microsoft Purview compliance portal and establishing a PowerShell session. You will use both the portal and PowerShell throughout this lab.

Portal Instructions

  1. Open compliance.microsoft.com and sign in with your admin credentials
  2. In the left navigation, verify you can see: Communication compliance, Audit, Data lifecycle management, and Records management
  3. If any sections are missing, confirm your account has the required roles: Compliance Administrator, Communication Compliance Admin, or Records Management role group
  4. Navigate to Audit to verify the unified audit log is enabled for your tenant
  5. Navigate to Communication compliance > Policies to confirm the feature is provisioned

PowerShell: Connect to Compliance Centre

# Install the Exchange Online Management module (if not already installed)
# WHAT: Installs the PowerShell module required for Security & Compliance cmdlets
# -Force: Overwrites any existing version; -AllowClobber: Resolves command name conflicts
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber

# Connect to Security & Compliance PowerShell
# WHY: Establishes a remote session using modern authentication (supports MFA)
# NOTE: Use Connect-IPPSSession, NOT the deprecated Connect-SecurityComplianceCenter
Connect-IPPSSession -UserPrincipalName admin@contoso.com

# Verify connection by listing available compliance cmdlets
# WHAT: Searches for cmdlets containing "Compliance" in the temporary module
# WHY: Confirms the session is active and cmdlets are loaded. If empty, reconnect.
# OUTPUT: List of available compliance commands (New-DlpCompliancePolicy, etc.)
Get-Command -Module tmp_* | Where-Object { $_.Name -like "*Compliance*" } |
  Select-Object Name | Sort-Object Name | Format-Table -AutoSize

# Verify your admin account has the required compliance roles
# WHAT: Lists your role assignments filtered to Compliance, Audit, and Records roles
# WHY: Without proper roles, you won't be able to create policies or access audit data
# OUTPUT: Role name and assignee - confirm you have Compliance Administrator or equivalent
# CONCERN: If no results appear, ask a Global Admin to assign the required roles
Get-ManagementRoleAssignment -RoleAssignee admin@contoso.com |
  Where-Object { $_.Role -like "*Compliance*" -or $_.Role -like "*Audit*" -or $_.Role -like "*Records*" } |
  Format-Table Role, RoleAssignee -AutoSize
๐Ÿ’ก Pro Tip: Use Connect-IPPSSession rather than the deprecated Connect-SecurityComplianceCenter cmdlet. The IPPS session supports modern authentication and multi-factor authentication (MFA) out of the box.

Step 2 ยท Configure Audit (Standard & Premium)

Microsoft Purview Audit provides two tiers: Audit (Standard) with 180-day log retention, and Audit (Premium) with up to 10 years of retention, high-value event logging, and higher API bandwidth. Enable and configure both for comprehensive forensic coverage.

Enable Unified Audit Log

  1. Navigate to Purview > Audit
  2. If prompted, click Start recording user and admin activity to enable the unified audit log
  3. Verify that audit status shows On. it may take up to 60 minutes to activate
  4. Navigate to Audit retention policies to view default retention settings

Configure Audit Premium Retention

  1. Navigate to Audit > Audit retention policies
  2. Click Create an audit retention policy
  3. Name: Audit-7Year-AllActivities
  4. Description: Retain all audit records for 7 years to meet SEC Rule 17a-4 requirements
  5. Record type: All
  6. Duration: Seven years
  7. Priority: 1 (highest priority. overrides default 180-day retention)
  8. Click Save

PowerShell: Enable & Configure Audit

# Verify unified audit log is enabled in the tenant
# WHAT: Checks whether M365 audit log ingestion is turned on
# OUTPUT: UnifiedAuditLogIngestionEnabled = True means audit is active
# CONCERN: If False, no user or admin activities are being recorded
Get-AdminAuditLogConfig | Select-Object UnifiedAuditLogIngestionEnabled

# Enable unified audit logging if not already active
# WHY: Audit logs are the foundation of security investigations, compliance
#      evidence, and insider risk detection. Without them, you have no visibility.
Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled $true

# Create an Audit Premium retention policy - 7 years for all activities
# WHAT: Extends audit log retention from the default 180 days to 7 years
# WHY: SEC Rule 17a-4 requires financial firms to retain records for 7 years.
#      Standard audit retains only 180 days - insufficient for regulatory compliance.
# -RecordTypes @("All"): Covers ALL audit event types (Exchange, SharePoint, Teams, etc.)
# -Priority 1: Highest priority - overrides the default 180-day retention
# REQUIRES: Microsoft 365 E5 or E5 Compliance licence for affected users
New-UnifiedAuditLogRetentionPolicy -Name "Audit-7Year-AllActivities" `
  -Description "Retain all audit records for 7 years. SEC 17a-4" `
  -RetentionDuration "SevenYears" `
  -RecordTypes @("All") `
  -Priority 1

# Create a targeted retention policy for Exchange events - 10 years
# WHAT: Retains Exchange-specific audit events for 10 years
# WHY: Email is the primary communication channel in financial services;
#      10-year retention covers extended regulatory and litigation requirements
# -RecordTypes: ExchangeAdmin (admin changes), ExchangeItem (mailbox access),
#   ExchangeItemGroup (bulk operations)
New-UnifiedAuditLogRetentionPolicy -Name "Audit-10Year-Exchange" `
  -Description "Retain Exchange audit records for 10 years" `
  -RetentionDuration "TenYears" `
  -RecordTypes @("ExchangeAdmin","ExchangeItem","ExchangeItemGroup") `
  -Priority 2

# Verify all retention policies are configured correctly
# OUTPUT: Policy name, retention duration, and priority order
# EXPECT: Two policies with 7-year and 10-year durations
Get-UnifiedAuditLogRetentionPolicy | Format-Table Name, RetentionDuration, Priority
โš ๏ธ Important: Audit Premium requires a Microsoft 365 E5 or E5 Compliance licence assigned to each user whose activities you want to retain beyond 180 days. Standard audit records older than 180 days are automatically purged.

Step 3 ยท Search the Audit Log

Search audit logs to investigate user activities, admin changes, and security events. Use the portal for interactive searches and PowerShell for automated or large-scale queries.

Portal Search

  1. Navigate to Purview > Audit > Search
  2. Set the date range: Last 7 days
  3. Activities: select File accessed, File downloaded, File shared
  4. Users: leave blank to search all users, or enter a specific UPN
  5. Click Search
  6. Review results. click any row to see full audit record details
  7. Click Export to download results as CSV for offline analysis

KQL Queries for Audit Premium

// Find all file downloads by a specific user in the last 30 days
// WHAT: Tracks every file download by a specific user across cloud apps
// WHY: Detects potential data exfiltration - departing employees or insiders
//      often download large volumes of files before leaving the organisation
// OUTPUT: Timestamp, user name, action type, file name, and source IP address
// CONCERN: Review IPAddress for unusual locations (personal VPN, foreign IPs)
CloudAppEvents
| where Timestamp > ago(30d)
| where AccountObjectId == "user-object-id"
| where ActionType == "FileDownloaded"
| project Timestamp, AccountDisplayName, ActionType, ObjectName, IPAddress

// Detect mass file downloads (potential data exfiltration)
// WHAT: Identifies users who downloaded more than 50 files in a single hour
// WHY: Mass downloads are the #1 indicator of data theft - normal users
//      rarely download 50+ files in one hour. Flag for immediate investigation.
// THRESHOLD: >50 downloads/hour is suspicious; adjust based on your baseline
// OUTPUT: User name, time window, and download count (sorted by highest first)
CloudAppEvents
| where Timestamp > ago(7d)
| where ActionType == "FileDownloaded"
| summarize DownloadCount = count() by AccountDisplayName, bin(Timestamp, 1h)
| where DownloadCount > 50
| order by DownloadCount desc

// Track admin role changes in Azure AD / Entra ID
// WHAT: Detects when admin roles are added or removed from user accounts
// WHY: Unauthorised role assignment is a key persistence technique - attackers
//      grant themselves Global Admin to maintain access. Internal governance
//      also requires tracking all privilege changes.
// OUTPUT: Timestamp, who made the change, what role was added/removed
// CONCERN: Any unexpected role additions outside change management should be investigated
CloudAppEvents
| where Timestamp > ago(30d)
| where ActionType in ("Add member to role.", "Remove member from role.")
| project Timestamp, AccountDisplayName, ActionType, ObjectName

PowerShell: Search-UnifiedAuditLog

# Search for all file access events in the last 7 days
# WHAT: Queries the unified audit log for file-related activities across M365
# -Operations: Filters to file access, download, and preview events only
# WHY: Monitors who is accessing documents - critical for insider risk detection
#      and regulatory compliance investigations
# OUTPUT: Date, user (UPN), and operation type for each file access event
# USE: Run daily to establish baseline file access patterns for your organisation
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-7) `
  -EndDate (Get-Date) `
  -Operations "FileAccessed","FileDownloaded","FilePreviewed" `
  -ResultSize 100 |
  Select-Object CreationDate, UserIds, Operations |
  Format-Table -AutoSize

# Search for admin role assignments in Azure AD / Entra ID
# WHAT: Finds all events where a user was added to an admin role in the last 30 days
# WHY: Unauthorised role assignments are a high-severity security event
# -RecordType AzureActiveDirectory: Limits to Entra ID / Azure AD events
# Pipeline: Parses the JSON AuditData to extract the target user and assigned role
# OUTPUT: Date, who made the change, target user, and the role assigned
# CONCERN: Any role assignment outside of change management processes needs investigation
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) `
  -EndDate (Get-Date) `
  -RecordType AzureActiveDirectory `
  -Operations "Add member to role." `
  -ResultSize 50 |
  ForEach-Object {
    $auditData = $_.AuditData | ConvertFrom-Json
    [PSCustomObject]@{
      Date     = $_.CreationDate
      User     = $_.UserIds
      Target   = $auditData.ObjectId
      Role     = $auditData.ModifiedProperties | Where-Object { $_.Name -eq "Role.DisplayName" } | Select-Object -ExpandProperty NewValue
    }
  } | Format-Table -AutoSize

# Export large result sets with paging for comprehensive audit reports
# WHAT: Uses session-based paging to retrieve ALL SharePoint file operation audit records
# WHY: Single calls return max 5,000 records. Paging ensures you capture every event
#      for complete audit coverage (required for regulatory compliance reporting).
# -SessionCommand ReturnLargeSet: Enables server-side paging across multiple batches
# -SessionId: Must be consistent across all calls in the same paging session
# OUTPUT: CSV file containing all SharePoint file operations over the last 90 days
# NOTE: This loop continues until no more records are returned
$results = @()
$sessionId = [Guid]::NewGuid().ToString()
do {
  $batch = Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-90) `
    -EndDate (Get-Date) `
    -RecordType SharePointFileOperation `
    -SessionId $sessionId `
    -SessionCommand ReturnLargeSet `
    -ResultSize 5000
  $results += $batch
} while ($batch.Count -gt 0)

$results | Export-Csv -Path "AuditLog-90Days.csv" -NoTypeInformation
Write-Host "Exported $($results.Count) audit records"
๐Ÿ’ก Pro Tip: Use the -SessionCommand ReturnLargeSet parameter with a consistent -SessionId to page through large result sets. Without paging, Search-UnifiedAuditLog returns a maximum of 5,000 records per call.

Step 4 ยท Create a Communication Compliance Policy

Communication Compliance policies monitor emails, Teams messages, and third-party chat platforms for content that violates organisational policies. Start with pre-built templates, then create custom policies for your specific requirements.

Create a Policy from Template: Regulatory Compliance

  1. Navigate to Purview > Communication compliance > Policies
  2. Click Create policy > select Detect regulatory compliance template
  3. Name: CC-RegulatoryCompliance-BrokerDealers
  4. Supervised users: select the Broker-Dealers distribution group (or specific users)
  5. Reviewers: add the compliance team members who will review flagged communications
  6. Locations: enable Exchange email, Microsoft Teams, and Third-party sources (if configured)
  7. The template automatically includes built-in classifiers for financial regulatory language
  8. Click Create policy

Create a Custom Policy: Offensive Language Detection

  1. Click Create policy > select Detect inappropriate text template
  2. Name: CC-InappropriateContent-AllEmployees
  3. Supervised users: All users
  4. Reviewers: HR compliance team
  5. Locations: Exchange email and Microsoft Teams
  6. The template uses built-in classifiers: Threat, Harassment, Discrimination, Profanity
  7. Set review percentage: 100% of flagged messages (for initial deployment)
  8. Click Create policy

PowerShell: Create Communication Compliance Policy

# Create a supervisory review policy for broker-dealer communications
# WHAT: Deploys a Communication Compliance policy to monitor regulated users
# WHY: FINRA Rule 3110 mandates supervisory review of broker-dealer communications
#      to detect market manipulation, insider trading, and unsuitable recommendations
# -Reviewers: Compliance officers who will triage flagged communications
New-SupervisoryReviewPolicyV2 -Name "CC-RegulatoryCompliance-BrokerDealers" `
  -Reviewers "compliance-reviewer1@contoso.com","compliance-reviewer2@contoso.com" `
  -Comment "Monitor broker-dealer communications for regulatory compliance"

# Create the supervisory review rule for the policy
# WHAT: Defines which communications to monitor and at what sampling rate
# -SamplingRate 100: Reviews 100% of matching messages (required for regulatory compliance)
# -Condition: Captures messages sent to or from the broker-dealers distribution group
# WHY: 100% sampling ensures no regulated communication is missed during audits
New-SupervisoryReviewRule -Name "CC-RegCompliance-Rule" `
  -Policy "CC-RegulatoryCompliance-BrokerDealers" `
  -SamplingRate 100 `
  -Condition "(SentTo -eq 'broker-dealers@contoso.com') -or (From -eq 'broker-dealers@contoso.com')"

# Create a policy for inappropriate content using trainable classifiers
# WHAT: Monitors all employee communications for threatening, harassing, or
#       discriminatory content using Microsoft's built-in AI classifiers
# WHY: Protects the organisation from workplace harassment liability and
#      creates a safer communication environment
New-SupervisoryReviewPolicyV2 -Name "CC-InappropriateContent-AllEmployees" `
  -Reviewers "hr-compliance@contoso.com" `
  -Comment "Detect threatening, harassing, or discriminatory content"

# Verify all Communication Compliance policies are created and active
# OUTPUT: Policy name, enabled status, and description
Get-SupervisoryReviewPolicyV2 | Format-Table Name, IsEnabled, Comment
๐Ÿ’ก Pro Tip: Start with a small pilot group of supervised users and 100% review rate. Once you understand the volume and quality of flags, expand to larger groups and adjust the sampling rate to a manageable level (e.g., 25–50%).

Step 5 ยท Configure Communication Compliance for Financial Regulations

Financial services firms are subject to SEC Rule 17a-4 (record retention), FINRA Rule 3110 (supervisory review), and FINRA Rule 3120 (supervisory control system). Configure Communication Compliance to address these specific requirements.

Create a Keyword Dictionary for Financial Violations

  1. Navigate to Data classification > Classifiers > Sensitive info types
  2. Click Create sensitive info type
  3. Name: Financial-Insider-Trading-Keywords
  4. Add keyword dictionary with terms such as:
    • guaranteed returns, can’t lose money, sure thing, inside information
    • off the books, don’t tell compliance, delete this message
    • material non-public, MNPI, front-running, cherry-picking
    • this stock is about to explode, buy before the announcement
  5. Set confidence level: Medium (75%)
  6. Click Create

Create a FINRA 3110 Supervisory Review Policy

  1. Navigate to Communication compliance > Create policy
  2. Select Custom policy
  3. Name: CC-FINRA3110-SupervisoryReview
  4. Supervised users: all registered representatives and broker-dealers
  5. Direction: Inbound, Outbound, and Internal
  6. Add conditions:
    • Contains sensitive info type: Financial-Insider-Trading-Keywords
    • Uses trainable classifier: Regulatory collusion
    • Uses trainable classifier: Stock manipulation
  7. Review percentage: 100%
  8. Click Create policy

PowerShell: Configure Financial Compliance Policy

# Create keyword dictionary for insider trading signals
# WHAT: Defines a list of terms that indicate potential regulatory violations
# WHY: Financial regulators require firms to detect and investigate communications
#      containing language suggestive of insider trading or market manipulation
# Terms include: solicitation of non-public info, evidence destruction, front-running
$keywords = @(
  "guaranteed returns", "can't lose money", "sure thing",
  "inside information", "don't tell compliance", "delete this message",
  "material non-public", "MNPI", "front-running", "cherry-picking",
  "buy before the announcement", "off the books", "this stock is about to explode"
)

# Create a custom sensitive information type using the keyword dictionary
# WHAT: Converts the keyword array into a DLP-compatible keyword dictionary
# WHY: This SIT can be used in both Communication Compliance and DLP policies
#      to detect insider trading language across email, Teams, and SharePoint
# OUTPUT: A reusable keyword dictionary SIT named "Financial-Insider-Trading-Keywords"
$keywordString = $keywords -join ","
New-DlpKeywordDictionary -Name "Financial-Insider-Trading-Keywords" `
  -Description "Keywords indicating potential insider trading or market manipulation" `
  -FileData ([System.Text.Encoding]::UTF8.GetBytes($keywordString))

# Create the FINRA 3110 supervisory review policy
# WHAT: Creates a Communication Compliance policy specifically for FINRA Rule 3110
# WHY: FINRA 3110 requires broker-dealers to have a supervisory system that reviews
#      communications for compliance violations. This policy provides that system.
# -Reviewers: Senior compliance staff who have authority to escalate violations
New-SupervisoryReviewPolicyV2 -Name "CC-FINRA3110-SupervisoryReview" `
  -Reviewers "chief-compliance-officer@contoso.com","sr-compliance-analyst@contoso.com" `
  -Comment "FINRA Rule 3110 supervisory review of broker-dealer communications"

# Create a rule with keyword conditions for the FINRA policy
# WHAT: Flags communications containing any of the insider trading keywords
# -SamplingRate 100: Monitors 100% of matching messages (no statistical sampling)
# WHY: Regulatory compliance requires demonstrating comprehensive surveillance;
#      sampling is insufficient for SEC/FINRA supervisory obligations
New-SupervisoryReviewRule -Name "FINRA3110-KeywordDetection" `
  -Policy "CC-FINRA3110-SupervisoryReview" `
  -SamplingRate 100 `
  -Condition "(ContentContainsWords -eq 'guaranteed returns,inside information,material non-public,front-running,cherry-picking,MNPI')"

# Verify the FINRA policy is active and correctly configured
# OUTPUT: Policy name, whether it's enabled, assigned reviewers, and description
# CONCERN: If IsEnabled is False, the policy was created but is not monitoring yet
Get-SupervisoryReviewPolicyV2 -Identity "CC-FINRA3110-SupervisoryReview" |
  Format-List Name, IsEnabled, Reviewers, Comment
โš ๏ธ Important: Work closely with your legal and compliance teams to define keyword dictionaries. Overly broad keywords generate excessive false positives; overly narrow keywords miss genuine violations. Regularly review and refine keyword lists based on alert outcomes.

Step 6 ยท Review & Investigate Communication Compliance Alerts

When Communication Compliance policies flag content, reviewers must triage, investigate, and take remediation actions. Establish a consistent workflow for alert review.

Alert Triage Workflow

  1. Navigate to Communication compliance > Alerts
  2. Review the alert dashboard: filter by policy, severity, and status
  3. Click an alert to view the flagged message in full context (including the conversation thread)
  4. Review the message source: email, Teams chat, or Teams channel
  5. Check the matched condition: which keyword, classifier, or SIT triggered the alert
  6. View the supervised user’s communication history for patterns of behaviour

Remediation Actions

  1. Resolve. mark as reviewed with no further action (false positive or minor issue)
  2. Notify the user. send a notification reminding the user of communication policies
  3. Escalate to another reviewer. forward to a senior compliance officer or legal team
  4. Tag as. classify the alert (e.g., “Potential insider trading”, “Harassment”, “False positive”)
  5. Create a case. escalate to eDiscovery for a formal investigation
  6. Remove the message from Teams. delete the flagged Teams message (requires appropriate permissions)

PowerShell: Review Compliance Policy Status

# List all Communication Compliance policies and their status
# WHAT: Shows every supervisory review policy with its enabled state and reviewers
# OUTPUT: Policy name, IsEnabled (True/False), and assigned reviewer email addresses
# WHY: Confirms all policies are active and properly staffed with reviewers
Get-SupervisoryReviewPolicyV2 |
  Format-Table Name, IsEnabled, @{N="Reviewers";E={$_.Reviewers -join ", "}}

# Get policy report summary for the last 30 days
# WHAT: Retrieves Communication Compliance activity metrics grouped by policy
# OUTPUT: Policy name and the number of flagged communications
# USE: Track alert volume trends - sudden spikes may indicate a real compliance issue;
#      gradual increases may mean the policy needs tuning to reduce false positives
Get-SupervisoryReviewReport -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date) |
  Group-Object PolicyName |
  Select-Object Name, Count |
  Format-Table -AutoSize

# Export flagged items for offline review and documentation
# WHAT: Exports all CC alert data from the past 7 days to CSV
# OUTPUT: Date, policy that triggered, message subject, sender, assigned reviewer,
#         and the action taken (Resolved, Escalated, Pending)
# WHY: Provides auditable evidence of supervisory review for FINRA examinations
Get-SupervisoryReviewReport -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) |
  Select-Object Date, PolicyName, MessageSubject, Sender, Reviewer, ReviewAction |
  Export-Csv -Path "CC-AlertReport-7Days.csv" -NoTypeInformation
๐Ÿ’ก Pro Tip: Establish an SLA for alert review. FINRA expects supervisory reviews to be completed “promptly”, which most firms interpret as within 48–72 hours. Assign dedicated reviewers and monitor their queue sizes to prevent backlogs.

Step 7 ยท Create Retention Policies for Data Lifecycle Management

Retention policies automate the retention and deletion of content across Microsoft 365. Create organisation-wide policies for baseline retention and location-specific policies for targeted compliance requirements.

Create an Organisation-Wide Retention Policy

  1. Navigate to Purview > Data lifecycle management > Microsoft 365
  2. Click New retention policy
  3. Name: Retention-OrgWide-3Years
  4. Description: Retain all content for 3 years, then delete
  5. Locations: enable Exchange email, SharePoint sites, OneDrive accounts, Microsoft 365 Groups, Teams channel messages, Teams chats
  6. Retention settings: Retain items for 3 years from when items were created
  7. After the retention period: Delete items automatically
  8. Click Submit

Create a Location-Specific Retention Policy (7-Year Financial Records)

  1. Click New retention policy
  2. Name: Retention-Finance-7Years
  3. Locations: enable Exchange email. include only the Finance distribution group
  4. Add SharePoint sites. include only the Finance Team site
  5. Retention settings: Retain items for 7 years from when items were last modified
  6. After the retention period: Do nothing (content stays until manually deleted or another policy applies)
  7. Click Submit

PowerShell: Create Retention Policies

# Create organisation-wide retention policy (3 years retain, then delete)
# WHAT: Applies a baseline retention policy across all major M365 workloads
# WHY: Ensures no business content is deleted before 3 years - the minimum
#      retention period for most regulatory and legal hold requirements
# LOCATIONS: Covers Exchange, SharePoint, OneDrive, M365 Groups, Teams channels and chats
# NOTE: This is a BASELINE; location-specific policies with longer retention override this
New-RetentionCompliancePolicy -Name "Retention-OrgWide-3Years" `
  -ExchangeLocation All `
  -SharePointLocation All `
  -OneDriveLocation All `
  -ModernGroupLocation All `
  -TeamsChannelLocation All `
  -TeamsChatLocation All `
  -Comment "Organisation-wide 3-year retention baseline"

# Create the retention rule - 3 years from creation date, then auto-delete
# -RetentionDuration 1095: 3 years in days (365 x 3)
# -RetentionComplianceAction Delete: Permanently deletes content after retention expires
# -ExpirationDateOption CreatedDate: Retention clock starts from when the item was created
New-RetentionComplianceRule -Name "Retention-OrgWide-3Years-Rule" `
  -Policy "Retention-OrgWide-3Years" `
  -RetentionDuration 1095 `
  -RetentionComplianceAction Delete `
  -ExpirationDateOption CreatedDate

# Create finance-specific retention policy (7 years retain, no auto-delete)
# WHAT: Extends retention to 7 years for the Finance department only
# WHY: SEC Rule 17a-4 requires financial records to be retained for 7 years;
#      this policy overrides the 3-year baseline for finance content
# -ExchangeLocation: Targets only the finance group mailbox
# -SharePointLocation: Targets only the Finance SharePoint site
New-RetentionCompliancePolicy -Name "Retention-Finance-7Years" `
  -ExchangeLocation "finance-group@contoso.com" `
  -SharePointLocation "https://contoso.sharepoint.com/sites/Finance" `
  -Comment "7-year retention for financial records. SEC 17a-4"

# Create the retention rule - 7 years from last modification, retain only (no auto-delete)
# -RetentionDuration 2555: 7 years in days (365 x 7)
# -RetentionComplianceAction Keep: Retains content but does NOT auto-delete when period expires
# -ExpirationDateOption ModificationAgeInDays: Clock starts from last modification date
# WHY: "Keep" without delete lets admins manually review and decide on deletion
New-RetentionComplianceRule -Name "Retention-Finance-7Years-Rule" `
  -Policy "Retention-Finance-7Years" `
  -RetentionDuration 2555 `
  -RetentionComplianceAction Keep `
  -ExpirationDateOption ModificationAgeInDays

# Verify all retention policies are configured correctly
# OUTPUT: Policy names, enabled status, mode, and covered locations
Get-RetentionCompliancePolicy | Format-Table Name, Enabled, Mode, ExchangeLocation
# OUTPUT: Rule names, retention duration in days, and action (Keep/Delete)
Get-RetentionComplianceRule | Format-Table Name, RetentionDuration, RetentionComplianceAction
๐Ÿ’ก Pro Tip: When both a retention policy and a deletion policy apply to the same content, retention always wins. This is the principle of retention over deletion in Microsoft 365. An item won’t be permanently deleted until all applicable retention periods have expired.

Step 8 ยท Create Retention Labels & Label Policies

Retention labels provide item-level retention control. Unlike retention policies (which apply broadly), labels are applied to individual items. either manually by users or automatically based on conditions. Labels can also declare items as records, making them immutable.

Create Retention Labels

  1. Navigate to Data lifecycle management > Labels
  2. Click Create a label
  3. Label 1. Business Record. 7 Years:
    • Retain for 7 years from when the label is applied
    • After the retention period: trigger a Disposition review
    • Mark items as a Record (prevents editing and deletion)
  4. Label 2. Regulatory Record. 10 Years:
    • Retain for 10 years from when the label is applied
    • After the retention period: trigger a Disposition review
    • Mark items as a Regulatory record (cannot be unlabelled. immutable)
  5. Label 3. Delete After 1 Year:
    • Retain for 1 year from creation date
    • After the retention period: Delete automatically
    • Do not mark as record

Publish Labels via Label Policy

  1. Navigate to Data lifecycle management > Label policies
  2. Click Publish labels
  3. Select the three labels created above
  4. Publish to: All locations (Exchange, SharePoint, OneDrive, M365 Groups)
  5. Name the policy: LabelPolicy-BusinessRecords
  6. Click Submit. labels become available to users within 7 days

Auto-Apply a Retention Label

  1. Navigate to Data lifecycle management > Label policies > Auto-apply a label
  2. Select label: Business Record. 7 Years
  3. Condition: content contains sensitive info type U.S. Financial Data
  4. Locations: Exchange email and SharePoint sites
  5. Name: AutoLabel-FinancialRecords
  6. Click Submit

PowerShell: Create Retention Labels & Policies

# Create retention label: Business Record (7 years, with disposition review)
# WHAT: Creates a retention label that users can manually apply to declare business records
# -RetentionAction Keep: Retains content for the specified duration
# -RetentionDuration 2555: 7 years in days
# -RetentionType TaggedAgeInDays: Retention starts when the label is APPLIED (not created)
# -ReviewerEmail: Designated reviewer for disposition review when retention expires
# -IsRecordLabel $true: Marks items as RECORDS - prevents editing and deletion
# WHY: Records cannot be modified or deleted by users until the retention period expires,
#      providing legal defensibility for regulatory compliance
New-ComplianceTag -Name "Business Record. 7 Years" `
  -RetentionAction Keep `
  -RetentionDuration 2555 `
  -RetentionType TaggedAgeInDays `
  -ReviewerEmail "records-manager@contoso.com" `
  -IsRecordLabel $true `
  -Comment "7-year business record with disposition review"

# Create retention label: Regulatory Record (10 years, IMMUTABLE)
# WHAT: Creates an immutable regulatory record label - the strongest record type
# -Regulatory: Makes this a REGULATORY record - once applied, NOBODY can remove the label,
#   delete the item, or modify its content until the 10-year retention period expires
# WARNING: This is irreversible. Test thoroughly before deploying in production.
# WHY: SEC Rule 17a-4 and MiFID II require certain records to be stored in
#      non-rewritable, non-erasable (WORM) format
New-ComplianceTag -Name "Regulatory Record. 10 Years" `
  -RetentionAction Keep `
  -RetentionDuration 3650 `
  -RetentionType TaggedAgeInDays `
  -ReviewerEmail "chief-compliance-officer@contoso.com" `
  -IsRecordLabel $true `
  -Regulatory `
  -Comment "10-year regulatory record. immutable"

# Create retention label: Auto-delete after 1 year (not a record)
# WHAT: Creates a non-record label that auto-deletes content after 1 year
# -RetentionAction Delete: Permanently removes content when retention expires
# -RetentionType CreationAgeInDays: Retention starts from the item's creation date
# USE: Apply to transient content like meeting notes or draft documents
New-ComplianceTag -Name "Delete After 1 Year" `
  -RetentionAction Delete `
  -RetentionDuration 365 `
  -RetentionType CreationAgeInDays `
  -Comment "Auto-delete after 1 year"

# Publish labels to users via a label policy
# WHAT: Makes the retention labels available for manual application in Office apps
# -PublishComplianceTag: Lists the labels to publish to users
# NOTE: Published labels appear in SharePoint, OneDrive, and Exchange within 7 days
New-RetentionCompliancePolicy -Name "LabelPolicy-BusinessRecords" `
  -ExchangeLocation All `
  -SharePointLocation All `
  -OneDriveLocation All `
  -ModernGroupLocation All `
  -PublishComplianceTag "Business Record. 7 Years","Regulatory Record. 10 Years","Delete After 1 Year"

# Create an auto-apply label policy for financial content
# WHAT: Automatically applies the "Business Record. 7 Years" label to content
#       containing U.S. Financial Data (credit cards, bank accounts, etc.)
# WHY: Auto-labeling ensures records are declared without relying on user action
New-RetentionCompliancePolicy -Name "AutoLabel-FinancialRecords" `
  -ExchangeLocation All `
  -SharePointLocation All `
  -PublishComplianceTag "Business Record. 7 Years"

# Define the auto-apply rule with SIT condition
# -ContentContainsSensitiveInformation: Triggers when U.S. Financial Data is detected
#   at high confidence with at least 1 instance
New-RetentionComplianceRule -Name "AutoLabel-FinancialRecords-Rule" `
  -Policy "AutoLabel-FinancialRecords" `
  -ContentContainsSensitiveInformation @{
    Name = "U.S. Financial Data";
    minCount = 1;
    confidencelevel = "High"
  } `
  -PublishComplianceTag "Business Record. 7 Years"

# Verify all retention labels are created correctly
# OUTPUT: Label name, action (Keep/Delete), duration in days, and record status
Get-ComplianceTag | Format-Table Name, RetentionAction, RetentionDuration, IsRecordLabel
โš ๏ธ Important: Regulatory records cannot be unlabelled once applied. Use this label type only for content that is legally mandated to be immutable (e.g., SEC 17a-4 records). For most scenarios, standard records provide sufficient protection.

Step 9 ยท Configure Adaptive Scopes for Targeted Retention

Adaptive scopes dynamically target retention policies based on user, group, or site attributes in Azure AD / Entra ID. Instead of manually adding users to a policy, adaptive scopes automatically include/exclude based on properties like department, country, or job title.

Create an Adaptive Scope

  1. Navigate to Data lifecycle management > Adaptive scopes
  2. Click Create scope
  3. Scope type: Users
  4. Name: AdaptiveScope-Finance-Users
  5. Add attribute: Department equals Finance
  6. Add attribute: Country equals United States (optional. for targeted regional compliance)
  7. Click Submit. the scope dynamically evaluates every 24 hours

Create a Second Adaptive Scope for SharePoint Sites

  1. Click Create scope
  2. Scope type: SharePoint sites
  3. Name: AdaptiveScope-Finance-Sites
  4. Add attribute: Site name contains Finance
  5. Click Submit

Apply Adaptive Scope to a Retention Policy

  1. Navigate to Data lifecycle management > Retention policies
  2. Click New retention policy
  3. Name: Retention-AdaptiveScope-Finance
  4. Choose Adaptive scope type
  5. Select scope: AdaptiveScope-Finance-Users for Exchange and OneDrive
  6. Select scope: AdaptiveScope-Finance-Sites for SharePoint
  7. Retention: 7 years, then Do nothing
  8. Click Submit

PowerShell: Create Adaptive Scopes

# Create an adaptive scope targeting Finance department users in the US
# WHAT: Defines a dynamic user group based on Azure AD / Entra ID attributes
# -ScopeType User: Targets individual user mailboxes and OneDrive accounts
# -RawQuery: Filters to users where Department=Finance AND Country=United States
# WHY: Adaptive scopes re-evaluate every 24 hours - new Finance hires are
#      automatically included without manual policy updates
New-AdaptiveScope -Name "AdaptiveScope-Finance-Users" `
  -ScopeType User `
  -RawQuery "(Department -eq 'Finance') -and (Country -eq 'United States')" `
  -Comment "Dynamic scope for Finance department users in the US"

# Create an adaptive scope targeting Finance SharePoint sites
# WHAT: Dynamically targets SharePoint sites whose name contains "Finance"
# -ScopeType Site: Applies to SharePoint Online site collections
# WHY: New Finance sites are automatically covered without updating policies manually
New-AdaptiveScope -Name "AdaptiveScope-Finance-Sites" `
  -ScopeType Site `
  -RawQuery "(SiteName -like '*Finance*')" `
  -Comment "Dynamic scope for Finance SharePoint sites"

# Create a retention policy using the adaptive scopes
# WHAT: Applies 7-year retention to all content within the adaptive scope
# WHY: Combines dynamic user and site targeting with the 7-year SEC requirement
# NOTE: When an employee transfers out of Finance, they're automatically removed
#       from this policy's scope at the next 24-hour evaluation cycle
New-RetentionCompliancePolicy -Name "Retention-AdaptiveScope-Finance" `
  -AdaptiveScopeLocation "AdaptiveScope-Finance-Users","AdaptiveScope-Finance-Sites" `
  -Comment "7-year retention for Finance using adaptive scopes"

# Create the retention rule for the adaptive scope policy
# -RetentionDuration 2555: 7 years in days
# -RetentionComplianceAction Keep: Retain without auto-deleting
# -ExpirationDateOption ModificationAgeInDays: Clock starts from last modification
New-RetentionComplianceRule -Name "Retention-AdaptiveScope-Finance-Rule" `
  -Policy "Retention-AdaptiveScope-Finance" `
  -RetentionDuration 2555 `
  -RetentionComplianceAction Keep `
  -ExpirationDateOption ModificationAgeInDays

# Verify adaptive scopes were created with the correct queries
# OUTPUT: Scope name, type (User/Site), and the raw query used for targeting
Get-AdaptiveScope | Format-Table Name, ScopeType, RawQuery
๐Ÿ’ก Pro Tip: Adaptive scopes re-evaluate every 24 hours. When a new employee joins the Finance department, they are automatically added to the retention policy within a day. no manual intervention required. This eliminates the risk of missing new hires in your compliance policies.

Step 10 ยท Set Up Disposition Reviews

Disposition reviews require a human reviewer to approve the deletion of content when a retention period expires. This is critical for regulated records where premature deletion could result in compliance violations.

Configure Disposition Review

  1. The disposition review was configured when you created the Business Record. 7 Years label in Step 8
  2. Navigate to Records management > Disposition
  3. After the retention period expires on labelled items, they appear here for review
  4. Review each item and select an action:
    • Approve disposal. permanently delete the item
    • Extend retention. keep the item for an additional period (e.g., 1 more year)
    • Relabel. apply a different retention label (e.g., upgrade to a 10-year label)
  5. All disposition decisions are logged in the audit log for compliance evidence

Configure Multi-Stage Disposition

  1. Edit the Regulatory Record. 10 Years label
  2. Under disposition settings, click Add a stage
  3. Stage 1: Records Manager reviews and approves
  4. Stage 2: Chief Compliance Officer gives final approval
  5. Both stages must approve before the item is permanently deleted
  6. Click Save

PowerShell: Verify Disposition Configuration

# Verify which retention labels have disposition review configured
# WHAT: Lists labels that require human approval before content is deleted
# WHERE-OBJECT: Filters to labels with a reviewer email assigned
# OUTPUT: Label name, retention duration, reviewer email, and record status
# WHY: Confirms disposition reviewers are assigned - unassigned labels will
#      leave content in limbo when retention expires
Get-ComplianceTag | Where-Object { $_.ReviewerEmail -ne $null } |
  Format-Table Name, RetentionDuration, ReviewerEmail, IsRecordLabel

# Check detailed configuration of a specific label with disposition
# OUTPUT: Full property list including retention action, duration, type,
#         reviewer email, and whether it's a record label
Get-ComplianceTag -Identity "Business Record. 7 Years" |
  Format-List Name, RetentionAction, RetentionDuration, RetentionType, ReviewerEmail, IsRecordLabel

# Monitor audit log for disposition actions taken by reviewers
# WHAT: Searches for disposition-related events in the last 90 days
# -Operations: DispositionReviewCompleted (review finished),
#   DispositionApproved (deletion approved), DispositionExtended (retention extended)
# WHY: Provides auditable evidence that disposition reviews are being performed
#      and records the decision made for each item
# OUTPUT: Date, reviewer who made the decision, and the action taken
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) `
  -EndDate (Get-Date) `
  -Operations "DispositionReviewCompleted","DispositionApproved","DispositionExtended" `
  -ResultSize 100 |
  Select-Object CreationDate, UserIds, Operations |
  Format-Table -AutoSize
๐Ÿ’ก Pro Tip: Set up email notifications for disposition reviewers so they are alerted when items are pending review. Unattended disposition queues can create compliance risk if retention-expired records are neither approved for deletion nor extended.

Step 11 ยท Monitor & Report on Compliance

Use Microsoft Purview’s built-in monitoring tools to track compliance posture across Communication Compliance, Audit, and Data Lifecycle Management.

Key Dashboards to Review

  1. Activity Explorer. real-time view of labelling, retention, and DLP activities across the tenant
  2. Content Explorer. browse content classified by sensitive info types and retention labels
  3. Communication Compliance dashboard. alert volumes, resolution rates, and reviewer performance
  4. Audit search. investigate specific events and generate audit trail reports
  5. Data lifecycle management reports. label application trends, retention policy coverage, disposition status
  6. Compliance Manager. overall compliance score and improvement actions across all Purview solutions

PowerShell: Generate Compliance Reports

# COMPREHENSIVE COMPLIANCE STATUS REPORT
# WHAT: Generates a multi-section report covering all compliance solutions deployed

# Report Section 1: All retention policies and their current status
# OUTPUT: Policy name, enabled state, mode (Enable/Test), and scoped locations
# WHY: Confirms all retention policies are active and covering the intended locations
Get-RetentionCompliancePolicy |
  Select-Object Name, Enabled, Mode, ExchangeLocation, SharePointLocation, TeamsChannelLocation |
  Format-Table -AutoSize

# Report Section 2: All retention labels and their properties
# OUTPUT: Label name, action (Keep/Delete), duration in days, record status, regulatory flag
# WHY: Provides a complete inventory of all retention labels for audit documentation
Get-ComplianceTag |
  Select-Object Name, RetentionAction, RetentionDuration, IsRecordLabel, @{N="Regulatory";E={$_.Regulatory}} |
  Format-Table -AutoSize

# Report Section 3: Communication Compliance policies and reviewers
# OUTPUT: Policy name, enabled status, and assigned reviewers
# WHY: Demonstrates supervisory review coverage for regulatory examinations
Get-SupervisoryReviewPolicyV2 |
  Select-Object Name, IsEnabled, @{N="Reviewers";E={$_.Reviewers -join ", "}} |
  Format-Table -AutoSize

# Report Section 4: Audit retention policies
# OUTPUT: Policy name, retention duration (180 days to 10 years), and priority
# WHY: Proves audit log retention meets regulatory requirements (e.g., 7-year SEC 17a-4)
Get-UnifiedAuditLogRetentionPolicy |
  Select-Object Name, RetentionDuration, Priority, RecordTypes |
  Format-Table -AutoSize

# Report Section 5: Most frequent audit operations in the last 7 days
# WHAT: Groups audit events by operation type and shows the top 20
# WHY: Identifies the most common activities - useful for baseline analysis
# OUTPUT: Operation name and count (e.g., FileAccessed: 12,345)
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-7) `
  -EndDate (Get-Date) `
  -ResultSize 5000 |
  Group-Object Operations |
  Sort-Object Count -Descending |
  Select-Object -First 20 Name, Count |
  Format-Table -AutoSize

# Generate a summary report object and export to CSV
# WHAT: Creates a single-row summary with key compliance metrics
# OUTPUT: Date, total counts of retention policies, labels, CC policies, and audit policies
# USE: Share this summary in monthly compliance review meetings
$report = [PSCustomObject]@{
  Date                = Get-Date -Format "yyyy-MM-dd"
  RetentionPolicies   = (Get-RetentionCompliancePolicy | Measure-Object).Count
  RetentionLabels     = (Get-ComplianceTag | Measure-Object).Count
  CCPolicies          = (Get-SupervisoryReviewPolicyV2 | Measure-Object).Count
  AuditRetention      = (Get-UnifiedAuditLogRetentionPolicy | Measure-Object).Count
}
$report | Export-Csv -Path "ComplianceStatusReport.csv" -NoTypeInformation
$report | Format-List
๐Ÿ’ก Pro Tip: Schedule a monthly compliance review meeting with stakeholders. Present key metrics: Communication Compliance alert volume and resolution rate, retention label adoption percentage, audit log coverage, and disposition review backlog. Use these metrics to justify budget for additional compliance resources.

Step 12 ยท Clean Up & Next Steps

Review your deployment across all three compliance solutions and plan ongoing operations.

What You Accomplished

  1. Audit (Standard & Premium). unified audit log enabled with 7-year and 10-year retention policies
  2. Audit log search. portal, KQL, and PowerShell search techniques mastered
  3. Communication Compliance. regulatory compliance and inappropriate content policies deployed
  4. FINRA 3110 supervisory review. keyword dictionaries and trainable classifiers configured
  5. Alert triage workflow. review, investigate, and remediation process established
  6. Retention policies. organisation-wide baseline and location-specific policies created
  7. Retention labels. business records, regulatory records, and auto-delete labels published
  8. Adaptive scopes. dynamic, attribute-based retention targeting configured
  9. Disposition reviews. single-stage and multi-stage approval workflows for regulated records
  10. Compliance monitoring. dashboards and automated reporting established

Next Steps

  • Next Lab: Deploy Records Management, Information Barriers & Compliance Manager
  • Configure third-party data connectors for Bloomberg, Reuters, and Slack to bring external communications into Communication Compliance
  • Implement Optical Character Recognition (OCR) in Communication Compliance to scan images for policy violations
  • Deploy file plan descriptors in Records Management for enterprise-grade record classification
  • Create event-based retention triggers for contract expiration and employee departure scenarios
  • Integrate audit data with Microsoft Sentinel for security-focused analysis and automated response
  • Build Power BI dashboards using exported audit and compliance data for executive reporting
๐Ÿ’ก Pro Tip: The three solutions in this lab. Communication Compliance, Audit, and Data Lifecycle Management. form a compliance triad. Audit provides the evidence trail, Communication Compliance provides supervisory oversight, and Data Lifecycle Management ensures records are kept exactly as long as needed. Together, they satisfy the majority of regulatory requirements across financial services, healthcare, and government sectors.

๐Ÿ“š Documentation Resources

ResourceDescription
Communication compliance overviewMonitor communications for policy violations across email, Teams, and third-party platforms
Create communication compliance policiesStep-by-step guide to creating and managing Communication Compliance policies
Audit solutions in Microsoft PurviewOverview of Audit (Standard) and Audit (Premium) capabilities
Audit (Premium)High-value events, long-term retention, and higher API bandwidth for forensic investigations
Data lifecycle managementAutomate retention and deletion of content across Microsoft 365
Retention policies and retention labelsComprehensive reference for retention policies, labels, and records management
Regulatory recordsImmutable record management for SEC 17a-4 and similar regulations
Disposition of contentConfigure and manage disposition reviews for retained records
โ† Previous Lab Next Lab โ†’