Our marketing team wanted a new intranet site for campaign news, and they wanted it the same way every time: English, Eastern time, the Topic layout and a clean URL. Clicking through Create site in SharePoint works once, but it’s slow and easy to get wrong when you build sites for several departments.
That’s where PnP PowerShell earns its keep. I’ll show you how I create communication sites and team sites with New-PnPSite, using a real site I built in my own Microsoft 365 tenant, plus the classic New-PnPTenantSite cmdlet, bulk creation from a CSV file and fixes for the errors you’ll hit.
Quick answer: Connect with Connect-PnPOnline -Url https://contoso-admin.sharepoint.com -ClientId <your-app-id> -Interactive, then run New-PnPSite -Type CommunicationSite -Title "Marketing" -Url https://contoso.sharepoint.com/sites/Marketing. Use -Type TeamSite -Alias Marketing for a team site with a Microsoft 365 group, or -Type TeamSiteWithoutMicrosoft365Group for a team site without one.
Which type of SharePoint site should you create?
New-PnPSite creates modern sites only, and its -Type parameter decides which kind. Pick the type first, because a few parameters only exist for one type. If you’re unsure which fits, I compare them in detail in the difference between team sites and communication sites.
| -Type value | What you get | Required parameters |
|---|---|---|
| CommunicationSite | A site for publishing news and pages to a wide audience; no Microsoft 365 group | -Title, -Url |
| TeamSite | A team site connected to a new Microsoft 365 group (shared mailbox, calendar, Planner, Teams-ready) | -Title, -Alias |
| TeamSiteWithoutMicrosoft365Group | A modern team site for collaboration without a group (template STS#3) | -Title, -Url |
Prefer the browser for a one-off site? My guide on how to create a SharePoint site covers the Create site wizard.
Before you start: module, connection and permissions
You need PnP PowerShell in PowerShell 7.4 or later and your own Entra ID app registration, because Connect-PnPOnline requires a -ClientId. If you haven’t set that up yet, start with installing PnP PowerShell for SharePoint Online.
I connect to the SharePoint admin center, because the same connection also runs Get-PnPTenantSite to check URLs and confirm the result:
$adminUrl = "https://contoso-admin.sharepoint.com"
$clientId = "00000000-0000-0000-0000-000000000000" # your Entra ID app's client ID
Connect-PnPOnline -Url $adminUrl -ClientId $clientId -Interactive
- Who can create sites: a SharePoint Administrator or Global Administrator always can. Regular users can only if the admin center setting Users can create SharePoint sites is on; Microsoft notes that this setting also covers the PnP cmdlet and the REST API.
- App permissions: the app needs SharePoint
AllSites.FullControl(delegated) orSites.FullControl.All(application). Group-connected team sites also need Microsoft GraphGroup.ReadWrite.All. - Owner: with a delegated sign-in, you become the site owner unless you pass
-Owner(or-Ownersfor team sites). App-only connections must pass one.
Create a communication site with New-PnPSite
Here’s the script I ran to create the Contoso Marketing Demo site. It checks that the URL is free first, then creates the site with US English (LCID 1033), Eastern time and the Topic design:

New-PnPSite returns the new site’s URL, and in my tenant that took 4 seconds. A few notes on the parameters:
- -SiteDesign takes Topic, Showcase or Blank, the same three designs you see in the browser. It works only for communication sites.
- -SiteDesignId applies your own site design by its GUID instead, and it works for every type. Custom designs come from a site script you’ve registered; see creating a custom site template in SharePoint Online.
- -Lcid sets the site language, and you can’t change it later. 1033 is English (United States).
- -TimeZone takes a named value such as
UTCMINUS0500_EASTERN_TIME_US_AND_CANADA; press Tab after the parameter to cycle through them. - -Wait makes the cmdlet wait until SharePoint has fully provisioned the site. I skip it for a single site and use it in scripts that immediately add lists or pages.