Microsoft Fabric currently supports the SharePoint Online List connector only as a source, so implement the write in a scheduled Fabric notebook by calling Microsoft Graph with app-only authentication, JSON batches, and incremental upserts rather than deleting and re-creating the entire list.^1^
Native Fabric options
There is no documented SharePoint Online List destination for:
- Dataflow Gen2
- Pipeline Copy activity
- Copy job
The connector matrix marks each of these as source/-, meaning source-only.^1^
SharePoint Online File (Preview) is a different connector. It can write files into a document library, but it cannot populate list items.^2^ Shortcuts likewise do not provide a transactional SharePoint-list sink.
Recommended architecture
Use this Fabric pipeline:
- Build the Gold Delta table.
- Run a notebook that reads only the columns required by SharePoint.
- Compare rows by a stable business key stored in a dedicated SharePoint column.
- Classify records as:
- Create
- Update
- Delete, only if destination rows must exactly mirror the Gold table
- Unchanged
- Submit creates, updates, and deletes through Microsoft Graph JSON batching.
- Persist the run status, failed keys, Graph item IDs, and optionally eTags in a Fabric control table.
- Retry only failed operations.
Graph exposes stable v1.0 operations for creating, updating, and deleting list items.^3^^4^^5^
Typical request paths are:
POST /sites/{site-id}/lists/{list-id}/items
PATCH /sites/{site-id}/lists/{list-id}/items/{item-id}/fields
DELETE /sites/{site-id}/lists/{list-id}/items/{item-id}
For updates and deletes, retain the SharePoint item ID. Use if-match with the stored eTag when concurrent edits must not be overwritten; an eTag mismatch returns 412 Precondition Failed.^4^
Authentication and permissions
For unattended execution, register a Microsoft Entra application and use application authentication.
Prefer resource-scoped access:
- Grant the application
Sites.Selected.
- Grant admin consent.
- Explicitly assign the application write access to the target SharePoint site.
Sites.Selected alone does not grant access to any site; a separate site-level assignment is required.^6^
Store credentials in Azure Key Vault, not in notebook source. Fabric’s notebookutils.credentials.getSecret retrieves Key Vault secrets at runtime, and long-running jobs must refresh expiring tokens.^7^
Batch-write blueprint
Graph JSON batches accept at most 20 individual requests. A batch HTTP response can be 200 while individual operations failed, so inspect every inner response.^8^
This abbreviated notebook helper assumes token has already been acquired securely:
import requests
def send_create_batch(token, site_id, list_id, rows):
requests_body = [{
"id": str(i),
"method": "POST",
"url": f"/sites/{site_id}/lists/{list_id}/items",
"headers": {"Content-Type": "application/json"},
"body": {"fields": row}
} for i, row in enumerate(rows, 1)]
response = requests.post(
"https://graph.microsoft.com/v1.0/$batch",
headers={"Authorization": f"Bearer {token}",
"Content-Type": "application/json"},
json={"requests": requests_body},
timeout=120
)
response.raise_for_status()
return response.json()["responses"]
Call it with chunks of no more than 20 rows. Use equivalent PATCH and DELETE entries for updates and removals. Map using SharePoint internal column names, and normalize Spark timestamps, decimals, nulls, lookup values, and person fields before constructing fields.
Batching reduces network round trips; it does not bypass SharePoint throttling. Each inner request is evaluated separately. For inner responses with 429, retry only those requests after the supplied Retry-After interval; batched requests are not automatically retried by Graph SDK retry handlers.^9^
Also handle SharePoint 503 responses, reduce concurrency, avoid traffic spikes, and honor both Retry-After and RateLimit headers.^10^
For 500–3,000 rows:
- Avoid full delete/reload unless list item IDs and history are intentionally disposable.
- Hash the writable Gold columns and update only changed rows.
- Limit concurrent batches rather than launching Spark executors that write independently.
- Make retries idempotent by querying or recording the business key before retrying creates.
- Write failures to a Delta control table and fail the pipeline only after bounded retries.
- Schedule large replacement runs outside peak usage periods where possible.
An Azure Logic App is reasonable when centralized connector management is required, but it is not necessary here. A Fabric notebook keeps transformation, orchestration, audit state, and Graph synchronization in the existing Fabric pipeline while eliminating the CSV and Power Automate stages.
References
- SharePoint Online List connector overview
- Configure SharePoint Online File in a copy activity (Preview)
- Create a new item in a list
- Update listItem
- Delete an item from a list
- Understanding Resource Specific Consent for Microsoft Graph and SharePoint Online
- NotebookUtils credentials utilities for Fabric
- Combine multiple HTTP requests using JSON batching
- Microsoft Graph throttling guidance
- Avoid getting throttled or blocked in SharePoint Online