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)
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,,NLFile 2 — labels that point at them
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,,NLIB-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.
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, ComplianceTagForNextStageDisposition 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)
- File plan → label → Disposition review → Add a stage.
- Each stage: a different mail-enabled security group (information management first, then legal).
- 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.
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# 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 14Keep 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 →