SharePoint Best Practices: Complete Document Management Guide for 2025
SharePoint is Microsoft's powerful document management and collaboration platform, but many organizations struggle to implement it effectively. This comprehensive guide provides proven best practices to help you build a well-organized, efficient SharePoint environment that drives productivity and collaboration.
What You'll Learn
- SharePoint architecture and site structure design
- Document library organization and metadata
- Permission management and security
- Version control and retention policies
- Search optimization and findability
- Integration with Teams and Microsoft 365
- Workflow automation with Power Automate
- Migration strategies and governance
Understanding SharePoint Architecture
SharePoint Hierarchy
Tenant (Organization)
│
├── Hub Sites (Marketing, Sales, HR, Engineering)
│ │
│ ├── Team Sites (Marketing Campaigns, Product Marketing)
│ │ │
│ │ ├── Document Libraries
│ │ │ ├── Folders (use sparingly!)
│ │ │ └── Files with Metadata
│ │ │
│ │ ├── Lists
│ │ ├── Pages
│ │ └── Site Permissions
│ │
│ └── Communication Sites (Company News, Resources)
│
└── Personal Sites (OneDrive for Business)
Site Types Explained
Hub Sites: Central navigation and branding for related sites
Purpose: Connect related team sites
Example: Marketing Hub → connects all marketing team sites
Features: Shared navigation, unified search, common branding
Team Sites: Collaboration spaces for teams/projects
Purpose: Day-to-day team collaboration
Example: Project Alpha team workspace
Features: Document libraries, lists, Microsoft Teams integration
When to use: Active projects, department workspaces
Communication Sites: One-to-many information sharing
Purpose: Broadcasting information
Example: Company intranet, HR policies, IT resources
Features: Modern pages, news posts, hero web parts
When to use: Announcements, knowledge bases, resources
Best Practice #1: Plan Your Site Architecture
Site Structure Strategy
❌ Bad Structure (Flat, disorganized):
All Team Sites at root level:
- Marketing-2023
- Marketing-2024
- Sales-Q1
- Sales-Q2
- HR-Policies
- HR-Recruiting
- Engineering-ProjectA
- Engineering-ProjectB
(Hard to navigate, no organization)
✅ Good Structure (Hierarchical, organized):
Hub Sites organize related content:
Marketing Hub
├── Marketing Team Site
│ ├── Campaigns 2024
│ ├── Campaigns 2025
│ └── Brand Assets
├── Product Marketing Site
└── Marketing Resources (Communication Site)
Sales Hub
├── Sales Team Site
├── Sales Enablement Site
└── Customer Case Studies (Communication Site)
HR Hub
├── HR Team Site
├── Recruiting Site
└── Employee Resources (Communication Site)
Planning Checklist
Before Creating Sites:
- Define site purpose and audience
- Identify site owner and members
- Plan document organization strategy
- Determine permission requirements
- Consider lifecycle and archival needs
- Plan integration with Teams (if needed)
- Define metadata and content types
- Establish naming conventions
Naming Conventions:
✅ Good Names:
- Marketing-Campaigns-2025
- Engineering-Project-Apollo
- HR-Employee-Handbook
- Sales-Proposals-Active
❌ Bad Names:
- Stuff
- Files
- New Site (2)
- John's Workspace
Best Practice #2: Optimize Document Libraries
Use Metadata Instead of Folders
❌ Traditional Folder Structure (Hard to scale):
Documents
├── 2023
│ ├── Q1
│ │ ├── Client A
│ │ ├── Client B
│ │ └── Client C
│ ├── Q2
│ └── Q3
├── 2024
└── 2025
└── Q1
├── Proposals
├── Contracts
└── Reports
Problems with Deep Folders:
- ❌ Documents can only be in one location
- ❌ Hard to find documents across categories
- ❌ Difficult to create views and reports
- ❌ Users must know exact folder path
- ❌ Limits search and filtering capabilities
✅ Flat Structure with Metadata (Flexible and powerful):
Documents Library
├── Project-Apollo-Proposal-2025-Draft.docx
│ Metadata: Client=Acme, Year=2025, DocType=Proposal, Status=Draft
├── Project-Beta-Contract-2025-Final.pdf
│ Metadata: Client=TechCo, Year=2025, DocType=Contract, Status=Final
└── Monthly-Report-January-2025.xlsx
Metadata: Month=January, Year=2025, DocType=Report, Status=Published
Benefits of Metadata:
- ✅ Documents can have multiple attributes
- ✅ Easy filtering and grouping
- ✅ Create multiple views of same data
- ✅ Powerful search capabilities
- ✅ Automatic organization with rules
Creating Effective Metadata Columns
Essential Column Types:
1. Choice Columns (Predefined options):
Column: Document Type
Choices:
- Proposal
- Contract
- Report
- Presentation
- Policy
- Invoice
Settings:
☑ Enforce unique values: No
☑ Require this column: Yes
☐ Allow multiple selections: No
2. Managed Metadata (Enterprise taxonomy):
Column: Department
Term Set: Organization Structure
├── Marketing
│ ├── Digital Marketing
│ ├── Product Marketing
│ └── Brand
├── Sales
│ ├── Inside Sales
│ └── Field Sales
└── Engineering
├── Frontend
├── Backend
└── DevOps
3. Person/Group Columns:
Column: Document Owner
Type: Person or Group
Settings:
☑ Allow multiple selections: No
☑ Include user presence: Yes
Selection type: People only
4. Date Columns:
Column: Review Date
Type: Date and Time
Format: Date only
Default value: Today + 30 days
Example Metadata Schema
Marketing Campaign Documents:
Required Columns:
- Title (Single line text)
- Campaign Name (Choice)
- Content Type (Choice: Video, Image, Copy, Strategy Doc)
- Status (Choice: Draft, Review, Approved, Published)
- Campaign Owner (Person)
- Launch Date (Date)
Optional Columns:
- Target Audience (Managed Metadata)
- Budget Category (Choice)
- Related Products (Lookup)
- Keywords (Multiple lines of text)
Implementation:
# PowerShell: Add metadata columns
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/marketing"
# Add Choice column
Add-PnPField -DisplayName "Status" -InternalName "Status" -Type Choice `
-Choices @("Draft","Review","Approved","Published") -Required
# Add Person column
Add-PnPField -DisplayName "Campaign Owner" -InternalName "CampaignOwner" `
-Type User -Required
# Add Date column
Add-PnPField -DisplayName "Launch Date" -InternalName "LaunchDate" `
-Type DateTime -Required
Best Practice #3: Create Custom Views
View Types and Use Cases
1. Standard Views (Most common):
View Name: Active Proposals
Purpose: Show all proposals in progress
Filters:
- Document Type = "Proposal"
- Status = "Draft" OR "Review"
Columns:
- Title
- Client Name
- Proposal Owner
- Created Date
- Status
Sort: Modified (descending)
Group by: Status
2. Calendar Views:
View Name: Document Review Calendar
Purpose: Track upcoming review dates
Source: Review Date column
Display: Month view
Color coding: By Status
3. Grouped Views:
View Name: Documents by Department
Purpose: Organize by department
Group by: Department (expanded by default)
Then by: Document Type
Sort: Modified Date (descending)
Show: 50 items per group
4. Personal Views:
View Name: My Documents (Personal View)
Purpose: Show only my documents
Filter: Created By = [Me]
Columns: Title, Modified, Status
Set as: Personal default view
Creating Views - Step by Step
Via SharePoint UI:
1. Go to Document Library
2. Click "All Documents" dropdown → Create new view
3. Choose view type (Standard, Calendar, etc.)
4. Configure settings:
Columns:
☑ Title
☑ Modified
☑ Modified By
☑ Status
☑ Document Owner
Filter:
Status is equal to "Active"
AND Modified By is equal to [Me]
Sort:
First: Modified (descending)
Group By:
First: Status
☑ Expanded by default
5. Save as: "My Active Documents"
Via PowerShell (for bulk deployment):
# Create custom view
$viewFields = @("LinkTitle","Modified","Editor","Status","DocOwner")
$query = "<Where><Eq><FieldRef Name='Status'/><Value Type='Choice'>Active</Value></Eq></Where>"
Add-PnPView -List "Documents" -Title "Active Documents Only" `
-Fields $viewFields -Query $query -SetAsDefault
Best Practice #4: Implement Smart Permissions
Permission Levels Explained
Built-in Permission Levels:
| Level | Can Read | Can Edit | Can Delete | Can Manage | Use Case |
|---|---|---|---|---|---|
| Full Control | ✅ | ✅ | ✅ | ✅ | Site owners only |
| Edit | ✅ | ✅ | ✅ | ❌ | Team members |
| Contribute | ✅ | ✅ | Own only | ❌ | Most users |
| Read | ✅ | ❌ | ❌ | ❌ | View-only users |
| View Only | ✅ | ❌ | ❌ | ❌ | Can't download |
Permission Strategy
✅ Best Practices:
1. Use SharePoint Groups (not individual users):
Good:
- Marketing Team Members (Group)
- Marketing Managers (Group)
- Executive Leadership (Group)
Bad:
- john.doe@company.com (Individual)
- jane.smith@company.com (Individual)
2. Inherit Permissions When Possible:
Site Permissions (Top Level)
├── Document Library (Inherit from Site)
├── Folder: Public Docs (Inherit from Library)
└── Folder: Confidential (Break inheritance - restricted)
3. Create Custom Permission Levels (if needed):
Custom Level: "Reviewer"
Based on: Read
Add permissions:
☑ View application pages
☑ Browse user information
☑ Use remote interfaces
☑ Add/Remove personal web parts
Remove permissions:
☐ Create alerts
☐ View usage data
Setting Up Permissions
Site-Level Permissions:
1. Site Settings → Site Permissions
2. Grant Permissions → Add users/groups
Marketing Team Site:
┌─────────────────────────────────────────┐
│ Owners: Marketing-Managers │
│ Access: Full Control │
├─────────────────────────────────────────┤
│ Members: Marketing-Team │
│ Access: Edit │
├─────────────────────────────────────────┤
│ Visitors: All-Company │
│ Access: Read │
└─────────────────────────────────────────┘
Library-Level Permissions:
When to break inheritance:
✅ Confidential documents
✅ Executive-only content
✅ Draft documents (before publication)
✅ Client-specific folders
How to break:
1. Library Settings → Permissions
2. Stop Inheriting Permissions
3. Remove unnecessary groups
4. Add specific users/groups
Item-Level Permissions (use sparingly):
⚠️ Only for exceptional cases:
- Individual sensitive documents
- Temporary access restrictions
- Specific client documents
Warning: Too many unique permissions = performance issues
Permission Audit
Regular Security Review:
# PowerShell: Audit permissions
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/marketing"
# Get all unique permissions
Get-PnPList | ForEach-Object {
$list = $_
Get-PnPListItem -List $list -PageSize 1000 | Where-Object {
$_.HasUniqueRoleAssignments
} | ForEach-Object {
[PSCustomObject]@{
List = $list.Title
Item = $_.FieldValues.FileLeafRef
UniquePermissions = $true
}
}
} | Export-Csv "UniquePermissions.csv"
Permissions Best Practices Checklist:
- Use groups instead of individual users
- Inherit permissions whenever possible
- Limit Full Control to 2-3 site owners
- Document permission structure
- Audit permissions quarterly
- Remove inactive users monthly
- Use external sharing carefully
- Enable access requests for self-service
Best Practice #5: Enable Version Control
Version History Benefits
Why Version Control Matters:
- ✅ Track changes over time
- ✅ Restore previous versions
- ✅ See who made what changes
- ✅ Prevent accidental data loss
- ✅ Audit trail for compliance
- ✅ Compare document versions
Configuring Version Settings
Recommended Settings:
For Document Libraries:
Library Settings → Versioning Settings
Document Version History:
● Create major and minor (draft) versions
Major versions: 500
Minor versions: 50
Rationale: Major = published, Minor = drafts
Example: v1.0, v1.1, v1.2, v2.0
Draft Item Security:
● Only users who can edit items
(Hides drafts from readers)
Require Content Approval:
☑ Yes (for published libraries)
☐ No (for team workspaces)
Require Check Out:
☑ Yes (prevents overwriting)
☐ No (for casual collaboration)
For Different Scenarios:
Active Project Documents:
Major versions: 100
Minor versions: 20
Require check out: Yes
Content approval: No
Published Marketing Materials:
Major versions: 50
Minor versions: 10
Require check out: Yes
Content approval: Yes
Meeting Notes/Casual Docs:
Major versions only: 10
Require check out: No
Content approval: No
Using Version History
Viewing Version History:
1. Click "..." on document → Version History
2. See all versions:
Version Modified Modified By Size Comments
─────────────────────────────────────────────────────────────────
2.0 (Cur) 10/25/2025 3:45 PM John Smith 1.2 MB Final version
1.2 10/25/2025 2:30 PM John Smith 1.2 MB Updated images
1.1 10/24/2025 4:15 PM Jane Doe 1.1 MB Added section 3
1.0 10/24/2025 9:00 AM John Smith 950 KB Initial draft
Restoring Previous Versions:
1. Version History → Click version timestamp
2. Options:
- View: Open version (read-only)
- Restore: Make this version current
- Delete: Remove this version
Comparing Versions (Word/Excel):
1. Open document in desktop app
2. File → Info → Version History
3. Select two versions → Compare
4. See highlighted changes
Version Control Automation
PowerShell: Bulk configure versioning:
# Apply version settings to all libraries
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/marketing"
Get-PnPList | Where-Object {$_.BaseTemplate -eq 101} | ForEach-Object {
Set-PnPList -Identity $_.Title `
-EnableVersioning $true `
-MajorVersions 500 `
-MinorVersions 50 `
-EnableMinorVersions $true `
-DraftVersionVisibility Author
Write-Host "Configured versioning for: $($_.Title)"
}
Best Practice #6: Optimize for Search
Making Content Findable
Search Ranking Factors:
- Relevance: Title and content matches
- Freshness: Recently modified content
- Authority: Popular documents (views, downloads)
- Metadata: Rich, accurate metadata
Search Optimization Techniques
1. Use Descriptive Titles:
❌ Bad Titles:
- "Document1.docx"
- "Final Final Version 2.docx"
- "Untitled.xlsx"
✅ Good Titles:
- "Q4-2025-Marketing-Budget-Proposal.docx"
- "Employee-Handbook-2025-Edition.pdf"
- "Project-Alpha-Timeline-January-2025.xlsx"
2. Add Rich Metadata:
Document: Product Launch Plan
Metadata:
- Title: Product Launch Plan - SuperWidget Pro
- Description: Comprehensive launch strategy including
timeline, budget, and marketing activities
- Keywords: product launch, marketing, SuperWidget, Q1 2025
- Department: Marketing
- Owner: Jane Smith
- Status: Approved
3. Create Managed Properties (for advanced search):
# Make custom column searchable
$site = Get-PnPSite
$columns = Get-PnPField -List "Documents"
# Enable search for custom columns
Set-PnPField -List "Documents" -Identity "CampaignName" `
-Values @{Indexed=$true}
4. Use Content Types:
Content Type: Marketing Campaign
Inherits from: Document
Columns:
- Campaign Name
- Launch Date
- Budget
- Target Audience
- Campaign Manager
Benefits:
✅ Consistent metadata across libraries
✅ Searchable by content type
✅ Custom templates
✅ Retention policies by type
Search Best Practices
User Training:
Basic Search:
"marketing budget" → Searches all content
Advanced Search Operators:
title:"budget" → In title only
author:"John Smith" → By specific author
filetype:pdf → Only PDFs
modified>=2025-01-01 → By date
size>10MB → By file size
path:"https://site/library" → In specific location
Search Center Configuration:
1. Create Search Center site
2. Add result sources:
- All Documents
- Recent Documents (< 30 days)
- My Documents
- By Department
3. Configure refiners:
- File Type
- Modified Date
- Author
- Department
- Document Type
4. Create promoted results:
"vacation policy" → Employee Handbook
"expense report" → Finance Forms
Best Practice #7: Implement Retention and Lifecycle
Retention Policy Basics
Why Retention Policies:
- ✅ Compliance with regulations (GDPR, SOX, HIPAA)
- ✅ Reduce storage costs
- ✅ Automatic cleanup of old content
- ✅ Legal hold capabilities
- ✅ Consistent data management
Creating Retention Policies
Common Retention Scenarios:
1. Email and Documents (7-year retention):
Policy: Email and Document Retention
Scope: All sites, mailboxes
Duration: 7 years from creation
Action: Delete automatically
Exceptions: Legal hold overrides
2. Financial Records (10-year retention):
Policy: Financial Records
Scope: Finance site, tagged documents
Duration: 10 years from fiscal year end
Action: Retain, then review
Retention labels: Invoice, Contract, Tax Document
3. Project Documents (3-year retention):
Policy: Project Archives
Scope: Project sites
Duration: 3 years after project completion
Action: Archive to cold storage, then delete
Trigger: Project status = "Completed"
Setting Up Retention
Via Microsoft 365 Compliance Center:
1. Compliance Center → Data lifecycle management → Retention policies
2. Create Retention Policy:
Name: Document Retention - 7 Years
Locations:
☑ SharePoint sites: All sites
☑ OneDrive accounts: All accounts
☐ Microsoft 365 Groups: None
☐ Exchange: (separate policy)
Settings:
● Retain items for: 7 years
● Start period: When created
● At end of period: Delete automatically
☑ Apply policy
Retention Labels (for specific documents):
Label: Confidential - 10 Year Hold
Settings:
- Retain for 10 years
- Delete automatically after
- Classify as: Confidential
- Can be applied: Manually or automatically
Auto-apply conditions:
- Content contains: SSN, Credit Card
- Or: Title contains "Contract"
- In: All SharePoint sites
Lifecycle Management Workflow
Automated Document Lifecycle:
Creation → Active Use → Review → Archive → Delete
(Day 0) (0-2 years) (2 years) (3-7 yrs) (7 years)
Power Automate Flow:
┌─────────────────────────────────────────┐
│ Trigger: Document modified date > 2 yrs │
├─────────────────────────────────────────┤
│ Action 1: Notify document owner │
│ "Document needs review: [Title]" │
├─────────────────────────────────────────┤
│ Action 2: Wait for response (30 days) │
├─────────────────────────────────────────┤
│ Condition: If no response │
│ Yes: Move to Archive library │
│ No: Update "Review Date" + 1 year │
└─────────────────────────────────────────┘
Implementation:
# PowerShell: Apply retention labels
Connect-IPPSSession
# Create retention label
New-RetentionComplianceTag -Name "7-Year-Retention" `
-RetentionAction Delete `
-RetentionDuration 2555 `
-Comment "Standard 7-year retention"
# Auto-apply to library
New-RetentionComplianceRule -Name "Apply-7Year" `
-Policy "Document-Retention" `
-ContentMatchQuery "ContentType:Document" `
-RetentionComplianceTag "7-Year-Retention"
Best Practice #8: Integrate with Microsoft Teams
Teams + SharePoint Integration
How They Work Together:
Microsoft Teams SharePoint
───────────────── ─────────────
📁 Files Tab ←────→ Document Library
💬 Conversations (Team Site)
📅 Calendar
👥 Members
🔧 Apps
Every Team = SharePoint Site:
- Teams automatically creates SharePoint site
- Files tab = SharePoint document library
- Channels = Folders in library (or separate libraries)
Optimization Strategies
1. Structure Team Channels Properly:
✅ Good Structure:
Marketing Team
├── General (default channel)
│ └── Files: General documents
├── Campaigns
│ └── Files: Campaign materials
├── Brand Assets
│ └── Files: Logos, templates
└── Meeting Notes
└── Files: Meeting agendas/notes
Each channel = Organized content area
2. Use Separate Libraries for Major Workstreams:
Instead of: All files in "Documents" with subfolders
Do this: Multiple libraries for different purposes
Team Site Libraries:
├── Campaign Documents (Library)
│ Metadata: Campaign, Status, Owner
├── Brand Assets (Library)
│ Metadata: Asset Type, Usage Rights
├── Meeting Notes (Library)
│ Metadata: Meeting Date, Attendees
└── Templates (Library)
Metadata: Template Type, Version
3. Add SharePoint as Teams Tab:
1. In Teams channel → + Add a tab
2. Select "SharePoint"
3. Choose: Document Library or Page
4. Configure display options
Result: Direct access to SharePoint library in Teams
No need to switch between apps
4. Sync Files for Offline Access:
In Teams Files tab:
1. Click "Open in SharePoint"
2. Click "Sync" button
3. Files appear in File Explorer/Finder
4. Edit offline, auto-sync when online
Path:
~/OneDrive - Company/Marketing Team - General/
Teams + SharePoint Best Practices
Do:
- ✅ Use channel names that reflect content
- ✅ Pin important documents in Teams
- ✅ Use @mentions to notify colleagues
- ✅ Enable version history
- ✅ Set up document approval workflows
Don't:
- ❌ Create too many channels (max 10-15)
- ❌ Use nested folders in Teams files
- ❌ Store sensitive data without proper permissions
- ❌ Forget to archive inactive teams
- ❌ Bypass SharePoint features (metadata, views)
Best Practice #9: Automate with Power Automate
Common SharePoint Workflows
1. Document Approval Workflow:
Trigger: New file added to "Drafts" library
├─────────────────────────────────────────┐
│ Check: File type = .docx, .pdf, .xlsx │
├─────────────────────────────────────────┤
│ Action 1: Send approval request │
│ To: Manager (from metadata) │
│ Include: Document link, Summary │
├─────────────────────────────────────────┤
│ Wait for approval response │
├─────────────────────────────────────────┤
│ If Approved: │
│ - Move to "Published" library │
│ - Update Status = "Approved" │
│ - Notify document owner │
│ │
│ If Rejected: │
│ - Update Status = "Needs Revision" │
│ - Add rejection comments to file │
│ - Notify document owner │
└─────────────────────────────────────────┘
Implementation:
Power Automate Flow:
1. Trigger: "When a file is created" (SharePoint)
Site: https://contoso.sharepoint.com/sites/marketing
Library: Drafts
2. Condition: Check file extension
FileName endsWith .docx
OR FileName endsWith .pdf
3. Start approval:
Assigned to: DocumentOwner (dynamic)
Title: "Please approve: " + FileName
4. Condition: Approval outcome
If Approved = "Approve":
- Copy file to Published library
- Update metadata: Status = "Approved"
- Send email to owner
Else:
- Update metadata: Status = "Rejected"
- Send email with comments
2. New Employee Onboarding:
Trigger: New item in "New Hires" list
├─────────────────────────────────────────┐
│ Action 1: Create personal folder │
│ In: Employee Documents library │
│ Name: [First Name] [Last Name] │
├─────────────────────────────────────────┤
│ Action 2: Set permissions │
│ - Employee: Full Control │
│ - Manager: Edit │
│ - HR: Read │
├─────────────────────────────────────────┤
│ Action 3: Copy templates │
│ From: HR Templates library │
│ - Welcome Guide │
│ - Benefits Enrollment │
│ - Equipment Checklist │
├─────────────────────────────────────────┤
│ Action 4: Send welcome email │
│ To: Employee │
│ Include: Site link, Getting started │
├─────────────────────────────────────────┤
│ Action 5: Create Teams notification │
│ To: HR Team channel │
│ Message: "New hire onboarding initiated"│
└─────────────────────────────────────────┘
3. Expired Document Notification:
Trigger: Scheduled (daily at 9 AM)
├─────────────────────────────────────────┐
│ Action 1: Get items from library │
│ Filter: Review Date <= Today │
│ AND Status != "Archived" │
├─────────────────────────────────────────┤
│ Action 2: For each expired document │
│ ├─ Send email to document owner │
│ │ Subject: "Document review required" │
│ │ Body: Document details + link │
│ │ │
│ ├─ Update Status = "Review Needed" │
│ │ │
│ └─ Set Review Date = Today + 7 days │
└─────────────────────────────────────────┘
4. File Organization Automation:
Trigger: File uploaded to "Intake" library
├─────────────────────────────────────────┐
│ Action 1: Analyze file name │
│ Extract: Date, Client, Doc Type │
│ Example: "Acme-Contract-2025-01-15.pdf" │
├─────────────────────────────────────────┤
│ Action 2: Apply metadata │
│ - Client Name: "Acme" │
│ - Document Type: "Contract" │
│ - Date: 2025-01-15 │
├─────────────────────────────────────────┤
│ Action 3: Move to correct library │
│ Based on Document Type: │
│ - Contract → Legal library │
│ - Invoice → Finance library │
│ - Report → Reports library │
├─────────────────────────────────────────┤
│ Action 4: Notify relevant team │
│ Teams message to department channel │
└─────────────────────────────────────────┘
Power Automate Best Practices
Do:
- ✅ Test flows with sample data first
- ✅ Use descriptive flow names
- ✅ Add error handling (try-catch)
- ✅ Monitor flow run history
- ✅ Document complex logic
- ✅ Use variables for readability
Don't:
- ❌ Create loops without exit conditions
- ❌ Process 1000s of items in one run
- ❌ Hardcode email addresses (use dynamic)
- ❌ Ignore flow failures
- ❌ Grant excessive permissions
Best Practice #10: Governance and Maintenance
SharePoint Governance Framework
Key Components:
1. Naming Conventions:
Sites: [Department]-[Purpose]-[Year]
Example: Marketing-Campaigns-2025
Libraries: [Content Type]-[Plural]
Example: Campaign-Documents, Brand-Assets
Columns: [Description]-[Type]
Example: Client-Name, Review-Date
2. Site Provisioning Process:
Request → Approval → Creation → Training
│ │ │ │
├─ Form ├─ IT ├─ Auto └─ Owner
│ filled │ reviews │ template trained
│ │ │
└─ Business└─ Meets └─ Includes
need policy - Permissions
- Metadata
- Workflows
3. Lifecycle Management:
Creation → Active → Inactive → Archive → Delete
(Day 0) (< 1yr) (1-2 yrs) (2-5 yrs) (5+ yrs)
Triggers:
- No activity for 6 months = Inactive
- Inactive for 1 year = Archive
- Archive for 3 years = Delete (if allowed)
Governance Policies Document
Essential Policies:
Storage Quotas:
Tier 1 - Standard Teams: 100 GB
Tier 2 - Department Sites: 500 GB
Tier 3 - Enterprise Sites: 1 TB
Tier 4 - Special Request: Custom
Review quarterly, adjust as needed
External Sharing:
Policy: External sharing allowed with restrictions
Allowed:
✅ Anyone links: Disabled
✅ Specific people: Allowed (with expiration)
✅ Company wide: Allowed
✅ Expiration: 30 days default
Not Allowed:
❌ Public/anonymous sharing
❌ Sharing without expiration (exceptions require approval)
❌ Editing rights to external users (read-only default)
Content Types:
Required content types for all sites:
1. Document (default)
2. Template
3. Policy
4. Form
Custom content types require:
- Business justification
- Metadata schema
- Retention requirements
- Approval from IT
Site Creation:
Self-Service: Enabled for Team Sites
Process:
1. User requests via form
2. Manager approval (automatic)
3. IT notification (FYI only)
4. Site auto-created from template
5. Owner receives training materials
Restrictions:
- Maximum 3 sites per user
- Must include business justification
- Must identify 2-3 site owners
- Review site usage after 6 months
Monitoring and Reporting
Key Metrics to Track:
1. Storage Usage:
# PowerShell: Storage report
Connect-SPOService -Url https://contoso-admin.sharepoint.com
Get-SPOSite -Limit All | Select-Object `
Title, Url, Owner,
@{Name="Storage(GB)";Expression={[math]::Round($_.StorageUsageCurrent/1024,2)}},
@{Name="Quota(GB)";Expression={[math]::Round($_.StorageQuota/1024,2)}},
LastContentModifiedDate |
Sort-Object "Storage(GB)" -Descending |
Export-Csv "StorageReport.csv"
2. Inactive Sites:
# Sites with no activity in 180 days
$inactiveDays = 180
$cutoffDate = (Get-Date).AddDays(-$inactiveDays)
Get-SPOSite -Limit All | Where-Object {
$_.LastContentModifiedDate -lt $cutoffDate
} | Select-Object Title, Url, Owner, LastContentModifiedDate |
Export-Csv "InactiveSites.csv"
3. Permission Audits:
# Sites with unique permissions
Get-SPOSite -Limit All | ForEach-Object {
$site = $_
Connect-PnPOnline -Url $site.Url
Get-PnPList | Where-Object {
$_.HasUniqueRoleAssignments
} | Select-Object @{N="Site";E={$site.Title}}, Title, ItemCount
} | Export-Csv "UniquePermissions.csv"
4. External Sharing Report:
# External sharing links
Get-SPOSite -Limit All | ForEach-Object {
Get-SPOSiteFileSharing -Site $_.Url
} | Where-Object {
$_.ShareLevel -eq "External"
} | Export-Csv "ExternalSharing.csv"
Quarterly Maintenance Tasks
Checklist:
□ Review storage usage
- Identify sites exceeding quota
- Clean up large files/old versions
□ Audit inactive sites
- Contact site owners
- Archive or delete if appropriate
□ Permission review
- Remove inactive users
- Verify external sharing
- Check unique permissions
□ Content review
- Apply retention labels
- Archive old projects
- Update metadata schemas
□ User training
- New features announcement
- Best practices reminder
- Office hours for questions
□ Policy review
- Update governance docs
- Adjust quotas if needed
- Review compliance requirements
Migration Best Practices
Migrating to SharePoint
From File Shares:
Planning:
1. Inventory current structure
2. Map to SharePoint architecture
3. Design metadata schema
4. Plan permissions
Tools:
- SharePoint Migration Tool (SPMT) - Free, Microsoft
- Sharegate - Commercial, feature-rich
- AvePoint - Enterprise-grade
Process:
1. Create target sites/libraries
2. Configure metadata columns
3. Run pilot migration (10% of data)
4. Test and validate
5. Migrate in batches
6. Verify and cut over
7. Decommission file shares
From Other SharePoint (Classic to Modern):
Migration Approach:
1. Site by site migration
2. Modernize pages during migration
3. Update custom solutions
4. Retrain users on modern UI
Tools:
- SharePoint Page Transformation
- PnP Modernization Scanner
- Manual recreation for complex customizations
Migration Checklist:
Pre-Migration:
□ Audit source content
□ Clean up unnecessary files
□ Document custom solutions
□ Design target structure
□ Create metadata schema
□ Plan permissions mapping
□ Identify pilot users
□ Schedule migration windows
During Migration:
□ Migrate in batches
□ Validate each batch
□ Monitor errors
□ Document issues
□ Communicate progress
□ Provide user support
Post-Migration:
□ Verify all content migrated
□ Test functionality
□ Update links
□ Train users
□ Monitor adoption
□ Decommission source
□ Celebrate success! 🎉
Common Mistakes to Avoid
Top 10 SharePoint Mistakes
1. Deep Folder Hierarchies:
❌ Documents/2024/Q1/Marketing/Campaigns/Digital/Social/Facebook/Images
✅ Use metadata instead of folders
2. Too Many Unique Permissions:
❌ Unique permissions on 100s of items
✅ Inherit permissions, use groups
Impact: Performance degradation, management nightmare
3. No Metadata Strategy:
❌ Using default "Title" column only
✅ Rich metadata for filtering and search
4. Ignoring Version History:
❌ Version history disabled
✅ Enable versioning (500 major, 50 minor)
Result: Lost work, no audit trail
5. Poor Naming Conventions:
❌ "New Site 1", "Documents Copy"
✅ "Marketing-Campaigns-2025"
6. No Governance:
❌ Anyone can create sites without standards
✅ Documented policies and provisioning process
7. Treating SharePoint Like File Shares:
❌ Just moving files, not using features
✅ Leverage metadata, views, workflows
8. Not Training Users:
❌ "Figure it out yourself"
✅ Training sessions, documentation, support
9. Over-Customization:
❌ Heavy custom code, complex solutions
✅ Use out-of-box features, Power Automate
Maintenance cost: High vs. Low
10. No Maintenance Plan:
❌ Set it and forget it
✅ Quarterly reviews, cleanup, optimization
Conclusion
SharePoint is a powerful platform when implemented correctly. Following these best practices will help you:
✅ Organize content effectively with metadata over folders ✅ Enable findability with optimized search ✅ Secure information with proper permissions ✅ Ensure compliance with retention policies ✅ Drive adoption with Teams integration ✅ Automate workflows with Power Automate ✅ Maintain quality with governance
Key Takeaways:
- Plan before building - Architecture matters
- Metadata over folders - Flexibility and power
- Inherit permissions - Performance and simplicity
- Enable versioning - Never lose work
- Integrate with Teams - Where users already work
- Automate repetitive tasks - Save time
- Govern continuously - Prevent sprawl
- Train your users - Drive adoption
- Monitor and maintain - Keep it healthy
- Start simple, grow - Don't over-engineer
Next Steps
- Assess your current SharePoint - Identify issues
- Create governance plan - Document policies
- Train site owners - Empower your team
- Implement best practices - Start with quick wins
- Monitor and iterate - Continuous improvement
Related Articles:
- Microsoft 365 Security Best Practices
- Microsoft Teams Collaboration Guide
- Microsoft 365 Migration Guide
- Google Workspace vs Microsoft 365
Need Help? Contact Pupam for SharePoint consulting:
- Architecture design and migration
- Governance framework development
- User training and adoption
- Ongoing optimization and support
- Schedule a Free Consultation
Last Updated: October 25, 2025