A record label is a retention label with IsRecordLabel = TRUE. The item becomes a record: delete (and, if regulatory, even edit) stops. Bulk goes through File Plan in Records management — not Data lifecycle — because only there you get Excel import, descriptors and disposition review. This is not a sensitivity label. Publishing the label is in retention labels with PowerShell.

Import: File Plan → Import → blank template

Purview portal → Solutions → Records management → File plan → Import → Download a blank template. One row = one label. Validation fails on row+column; fix and upload again. LabelName max 64 characters: letters, numbers, space, hyphen. After save the name is final. Record labels do not always show under Data lifecycle — look in File plan.

Columns in the Excel/CSV

Column Required What it does
LabelName Yes Unique name. Cannot change later. Max 64. a-z A-Z 0-9 space hyphen.
Comment No Admin-only description (max 1024). Users never see this.
Notes No User tooltip in Outlook/SharePoint. Blank = default explanation of retention.
IsRecordLabel If Regulatory TRUE = record (cannot delete / cannot remove label). FALSE = ordinary retention.
RetentionAction With duration Delete | Keep | KeepAndDelete. KeepAndDelete is what you use for disposition review.
RetentionDuration With action Days (7300 ≈ 20 years, 2555 ≈ 7 years) or Unlimited. Max 36525 (100 years).
RetentionType With action CreationAgeInDays | ModificationAgeInDays | TaggedAgeInDays | EventAgeInDays.
ReviewerEmail For review Mail-enabled security group(s), semicolon-separated. Not a Microsoft 365 Group. Starts disposition review when action is KeepAndDelete. Tenant cap: 200 reviewers.
ComplianceTagForNextStage No Replacement label at end of period (daisy-chain). That label must already exist. Forbidden when Regulatory=TRUE.
Regulatory No TRUE = regulatory record (strongest lock). Requires IsRecordLabel=TRUE. Tenant must allow regulatory records first.
IsRecordUnlockedAsDefault No TRUE = record starts unlocked. Requires IsRecordLabel=TRUE. Cannot combine with Regulatory.
EventType If EventAge Existing event type (Get-ComplianceRetentionEventType). Create the event type before import.
ReferenceId No Your file-plan code, e.g. IB-VG-20. Use this in reports. Not a parent/child.
DepartmentName No Function / department descriptor.
Category / SubCategory No File-plan category. Not a parent/child label object — descriptors only.
AuthorityType No Who mandated the period.
CitationName, CitationUrl, CitationJurisdiction No Legal citation (Archiefwet, Woo, tax act).
FlowId / extra review stages — Not in the Excel import. Set afterwards with PowerShell or the portal. CSV is stage 1 only.

Last label first (daisy-chain)

Retention labels have no parent/child like sensitivity labels. What does exist: a replacement label (ComplianceTagForNextStage). Label A keeps a 20-year record, then becomes Label B (permanent archive). Microsoft cannot save A if B does not exist yet. So: create the last label in the chain first, then the one that points at it. Import two files, or PowerShell in that order. Nested sensitivity is the opposite (parent first) — see sensitivity bulk and architecture.

File 1 — last in the chain (import this first)

CSV
LabelName,Comment,Notes,IsRecordLabel,RetentionAction,RetentionDuration,RetentionType,ReviewerEmail,ComplianceTagForNextStage,Regulatory,IsRecordUnlockedAsDefault,EventType,ReferenceId,DepartmentName,Category,SubCategory,AuthorityType,CitationName,CitationUrl,CitationJurisdiction
IB-Vergunning-Blijvend,Eindarchief na review,Blijvend bewaren na 20 jaar als record,TRUE,Keep,Unlimited,TaggedAgeInDays,,,,FALSE,,IB-VG-BL,Vergunningen,Omgevingsdossiers,Eindarchief,Selectielijst,Archiefwet 2026,https://wetten.overheid.nl,NL
FISC-Factuur-7j,Facturen 7 jaar daarna vernietigen,Geen record-slot. Automatisch weg,FALSE,KeepAndDelete,2555,CreationAgeInDays,,,,,FALSE,,FISC-07,Finance,Facturen,Crediteuren,Fiscaal,Fiscale bewaarplicht 7 jaar,,NL

File 2 — labels that point at them

CSV
LabelName,Comment,Notes,IsRecordLabel,RetentionAction,RetentionDuration,RetentionType,ReviewerEmail,ComplianceTagForNextStage,Regulatory,IsRecordUnlockedAsDefault,EventType,ReferenceId,DepartmentName,Category,SubCategory,AuthorityType,CitationName,CitationUrl,CitationJurisdiction
IB-Vergunning-20j,20 jaar record daarna eindarchief,Record vanaf labeldatum. Na 20 jaar naar blijvend,TRUE,KeepAndDelete,7300,TaggedAgeInDays,[email protected],IB-Vergunning-Blijvend,FALSE,FALSE,,IB-VG-20,Vergunningen,Omgevingsdossiers,Actief,Selectielijst,Archiefwet 2026,https://wetten.overheid.nl,NL
IB-Woo-5j,Woo-verzoeken 5 jaar,Start als het verzoek is afgehandeld,TRUE,KeepAndDelete,1825,EventAgeInDays,[email protected],,FALSE,FALSE,Woo request closed,IB-WOO-05,Openbaarheid,Woo,Verzoek,Woo,Wet open overheid,,NL

IB-Vergunning-20j points at IB-Vergunning-Blijvend. Importing both at once fails on NextStage if the validator reads top-down and the replacement is not there yet. IB-Woo-5j has no NextStage: after review the item is destroyed.

PowerShell
Connect-IPPSSession -UserPrincipalName [email protected]

# 1. LAST label in the chain first — nothing points at it yet.
New-ComplianceTag -Name "IB-Vergunning-Blijvend" `
  -IsRecordLabel $true -RetentionAction Keep -RetentionDuration Unlimited `
  -RetentionType TaggedAgeInDays -Notes "Permanent archive after review"

# 2. THEN the label that points at it (ComplianceTagForNextStage must already exist).
New-ComplianceTag -Name "IB-Vergunning-20j" `
  -IsRecordLabel $true -RetentionAction KeepAndDelete -RetentionDuration 7300 `
  -RetentionType TaggedAgeInDays `
  -ReviewerEmail "[email protected]" `
  -ComplianceTagForNextStage "IB-Vergunning-Blijvend" `
  -Notes "20 year record, then permanent archive"

Get-ComplianceTag | Where-Object { $_.Name -like "IB-Vergunning*" } |
  Format-Table Name, IsRecordLabel, RetentionAction, ComplianceTagForNextStage

Disposition review on the label

Set RetentionAction = KeepAndDelete and put a mail-enabled security group in ReviewerEmail. Microsoft 365 Groups do not work. Up to five review stages in the portal after import (CSV is stage 1 only). Optional auto-approval 7–365 days (default 14) so the queue does not grow. Records admins must sit in the group from Records Management settings to see everything. Turn audit on at least a day before. After approval, permanent delete takes up to 15 days. Review only what really needs a keep-or-destroy decision; the rest auto-delete or a replacement label. Max 200 reviewers per tenant. Read in bulk: Disposition review with PowerShell.

Extra stages after import (portal)

  1. File plan → label → Disposition review → Add a stage.
  2. Each stage: a different mail-enabled security group (information management first, then legal).
  3. Auto-approval per stage, or none. Automatic Stage Approval stops the queue from stalling.

Power Automate on the label

CSV has no FlowId. Create the flow first (Default environment, otherwise PowerShell only). Trigger: When an item reaches the end of its retention period (premium Microsoft 365 compliance connector). Then a new label with “Run a Power Automate flow”, or Set-ComplianceTag -FlowId on an existing label. Regulatory records: no flow. The flow can start up to 7 days after retention ends. See also first flow and error handling.

Flow
Trigger: When an item reaches the end of its retention period
  (Microsoft 365 compliance connector — premium)
  Typical outputs: ItemId, ItemUrl, SiteUrl, LibraryName, FileName,
                   LabelName, LabelId, RetentionEndDate, Workload

Compose: Site URL, Library, File name, Item unique Id, Existing label Id
Condition: File still exists?
  Yes → Get file metadata (SharePoint)
       → Create item in list "IM-afvoer"
            Title, Path, Label, Site, Expiry, Owner, Workload
       → Send email to records mailbox (link to item + list)
       → Optional: Relabel item / Move file to the archive site
  No  → Terminate (Failed) + log
PowerShell
# Flow ID = the GUID between /flows/ and /details/ in the Power Automate URL.
# GUI can only pick a flow in the Default environment.
Set-ComplianceTag -Identity "IB-Vergunning-20j" `
  -FlowId "dc1234b5-000a-1aaa-aaa1-b111aa1a11da"

# Extra review stages and auto-approval are not in the Excel import.
# Mail-enabled security groups, not Microsoft 365 Groups. Max 200 reviewers per tenant.
Set-ComplianceTag -Identity "IB-Vergunning-20j" `
  -ReviewerEmail "[email protected]" `
  -AutoApprovalPeriod 14

Keep the File Plan small

Label count, event types and reviews explode if every dossier subtype gets its own row. Bundle: one permits label, not “Permit-building”, “Permit-public-space”, “Permit-terrace”. Event-based only where the clock really starts on an event (Woo closed, project closed). The rest: CreationAgeInDays or TaggedAgeInDays. Disposition review is expensive — see the PowerShell guide.

Then publish with a label policy. File Plan import only creates the label; without a policy nobody sees it in SharePoint. Auto-apply on a whole site: one retention label, not 40. That is in retention labels with PowerShell.

Frequent errors and how to fix them

These are the messages people type into search when the module will not start. The exact wording is here so this page can be found.

ComplianceTagForNextStage / replacement label not found
Daisy-chain: create the last label first, then the one that points at it. Nested sensitivity is the opposite (parent first).
A parameter cannot be found that matches parameter name 'TargetLabelId'
Get-ReviewItems wants ImmutableId, not the name. Get-ComplianceTag | Select ImmutableId. Mailbox Import Export role is often missing.
Flow not listed on the retention label
Flow is not in the Default environment, or the premium connector has no licence. Attach with Set-ComplianceTag -FlowId.
ReviewerEmail / invalid recipient
Disposition review needs a mail-enabled security group, not a Microsoft 365 Group and not a guest. Max 200 reviewers per tenant.
EnableMIPLabels is False / Groups and sites options missing
Container labels: set EnableMIPLabels to True via Microsoft Graph (directory setting) before you publish Groups and sites.
ParentId / label not found (New-Label nested)
Sensitivity: parent first, child second. Retention daisy-chain is the opposite (last first).

Questions about this, or need help setting it up? We are happy to think along.

Message on LinkedIn →