SPSync vs PnP PowerShell and custom scripts

A PnP PowerShell export that began as a one-off and now runs nightly: what the script has to own, and how to retire it without losing the report.

Choose SPSync when a nightly export script has become something people depend on; choose PnP PowerShell for one-off exports, migrations and tenant-specific logic you are happy to own.

Documentation reviewed

Where PnP PowerShell fits

Where it breaks

Feature by feature

FeatureSPSyncPnP PowerShell and custom scripts
SharePoint Online supportCore productYes, via 700+ cmdlets for Microsoft 365
On-prem SharePoint supportOn the roadmapYes, PnP PowerShell also targets on-prem SharePoint
DestinationsRelational, warehouse, lake and search/vector destinations: 20 destination engines (30+ named targets such as Azure SQL, MariaDB and Supabase), including SQL Server, Postgres, BigQuery, Databricks, ClickHouse, Parquet, Iceberg, pgvector and Azure AI Search; see /destinations/Whatever you write the script to target
Lookup normalisationLookups become joinable key columns automaticallyYou build this yourself
Multi-value columnsChild tablesYou build this yourself
DeletesSoft delete by default, hard delete with the command-line toolYou build delete detection yourself
Delta syncEvery few minutes by default, plus a reconcile, weekly by defaultYou build delta queries and a scheduler yourself
Schema evolutionNew columns appear automatically; on SQL Server, PostgreSQL, MySQL, ClickHouse, Oracle, SQLite and DuckDB retyped columns get a _v2 columnYou handle schema drift in your script
Hosted optionSPSync in your AzureNone; you host wherever the script runs
Desktop appmacOS and WindowsNot applicable; it is a PowerShell module
CLI / CIBuilt-in CLIIt is a script; CI is whatever you wire up
Per-site least-privilege permissionsDelegated sign-in or app-only with Sites.Selected, bring-your-own-appYou register your own Entra ID app and scope its permissions
Pricing modelLicensed per installation and per target family, on annual terms, with Standard Support included; no public price list, quoted after a callFree; your cost is engineering time

A finance analyst needed last month’s purchase orders out of a SharePoint list, so someone in IT wrote a PnP PowerShell script that exported them into a SQL table. It ran once, then it ran every night, and now the month-end report reads that table. The person who wrote the script has moved to another team, and the script has not been opened since.

Where a script is the right tool

PnP PowerShell is the right tool for a one-off export, a migration that runs once, or logic so specific to your tenant that no packaged product would cover it. Our PnP PowerShell to SQL Server script is a working starting point, with the sign-in setup PnP needs today. It is free, it runs on Windows, macOS and Linux, its cmdlets cover SharePoint and much of Microsoft 365, and an active community keeps it current. If you need an answer today and you are happy to own it, a script is often the fastest way there.

The script that became infrastructure

The trouble starts when the script keeps running. Reading a list once is easy. Keeping a database in step with that list, correctly, every night, for years, means the script now owns:

None of that is exotic. All of it needs building, testing and maintaining, and it tends to live in one person’s head. If your script is Python rather than PowerShell, a SharePoint list into Postgres or SQL Server with Python shows the delta paging, Retry-After and delete handling in full, and what is left over.

What SPSync takes off your hands

Paging, throttling, delta sync, delete tracking and schema evolution are built in. Lookups arrive as key columns you can join on and multi-value columns as child tables, with no flattened strings for a downstream step to parse. The point to switch is usually when an export has turned into a scheduled job that people depend on.

Retiring the script

  1. Read what the script does today: which lists and columns, and how it detects changes and deletes.
  2. Sign in to SharePoint in SPSync and choose the lists the script exports.
  3. Choose a destination database. The initial full load and the delta syncs after it replace the script’s read logic.
  4. Compare the tables with the script’s output. Any custom transformation the script did moves into a view on the destination.
  5. Remove the scheduled task or CI job that ran the script.

If you liked scripting it

The command-line tool is the closest match to what you had: one YAML config, run from cron, CI or a server, reviewed like any other code. Teams that prefer a UI use the desktop app on macOS and Windows. If your nightly export is an SSIS package rather than a script, SPSync vs SSIS covers the same ground for Integration Services. SPSync in your Azure, a managed application for your own subscription, is deployed with you on a call while the Marketplace listing is prepared. Once deployed there is nothing to install.

SPSync as a PnP PowerShell alternative for SharePoint lists

SPSync takes over the parts a long-lived script had to own: paging, throttling, change detection, deletes and column changes. Its command-line tool keeps the habits of the script, one YAML file run from cron or CI, and any custom logic moves into views on the destination.

Other alternatives

Frequently asked questions

Is PnP PowerShell supported by Microsoft?

The PnP PowerShell site states that the module has no SLA and no direct Microsoft support, and help comes from the open-source community (checked 2026-10-16). Every SPSync licence includes Standard Support.

Can I still script SPSync?

Yes. The spsync command-line tool runs from cron, a CI job or a server and reads one YAML config, which you can review in a pull request like any other code.

Where do the custom transformations from my script go?

Move them into views on the destination database. SPSync writes each list as SharePoint holds it, so a view that renames, filters or combines columns keeps the logic visible to anyone who reads SQL.

Desktop, Azure or command line

All three editions run the same engine, write the same tables and use the same licence key, so the choice comes down to who looks after the sync.

Desktop app

For macOS and Windows. Sign in with Microsoft, tick the lists, choose a database and sync from your own machine on the schedule you set. Delegated sign-in needs no admin unless your tenant requires admin consent for apps.

In your Azure

SPSync in your Azure, a managed application for your own subscription, is deployed with you on a call while the Marketplace listing is prepared. Once deployed it is always on, so the sync keeps running with every laptop closed.

Command line

Every replication is a YAML file you can review and commit. Run it from a server, a container or a CI pipeline, and re-run it safely any time.

Book a call

Book a call to talk through your use case, see further walkthroughs or demos, and set up a trial in your own environment.