Skip to content

SharePoint ​

Files, tags and shares documents in a SharePoint site, and keeps its lists up to date.

The SharePoint node works on the team sites of a Microsoft 365 organization: it files, finds, moves, shares and tags documents in a document library, creates folders (including whole trees copied from a template folder), and keeps SharePoint lists up to date. It is one node with a resource (resource) and, for each resource, an action; the fields shown depend on that choice.

It needs the SharePoint access of a Microsoft account, shown as the SharePoint capability in Connections. See Microsoft. This access usually requires a Microsoft 365 administrator to grant consent once for the whole organization; until then, members see a "Need admin approval" screen when connecting. The node acts with the rights of the member running the workflow, on the sites that member can already reach.

For the member's own OneDrive, use Upload to OneDrive and its sibling nodes. For an Excel workbook stored in a library, use the Excel node.

At a glance ​

  • Type: sharepoint.api · version 1
  • Category: Actions
  • Kind: Step — one stage of a run
  • Effect: Writes outside (external_write) — writes outside Mankomail; described instead of performed during a test run
  • Needs a carrier email: No
  • Connection: Microsoft (capability sharepoint)
  • Inputs: main
  • Outputs: main

Connection ​

This node needs a Microsoft connection with the sharepoint capability granted.

Parameters ​

credential ​

Microsoft account — The account whose SharePoint rights are borrowed. Connect it from Connections — this authorization usually needs a Microsoft 365 administrator to approve it once for the whole organization.

  • Type: Connection (credential)
  • Required: No
  • Default: "" (empty)

resource ​

What to act on

  • Type: One choice (options)
  • Required: Yes
  • Default: file
  • Options:
    • site — Site: Find a team site, or list its subsites.
    • library — Library: The document libraries of a site.
    • file — File: Upload, search, file, share, tag a document.
    • folder — Folder: Create a folder — or a whole tree, by copying a template.
    • list — List: The lists of a site and their columns.
    • listItem — List item: The rows of a list: a register of deadlines, matters, parties.

siteOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: site.search
  • Options:
    • site.search — Search sites: Searches by name. It is the only discovery available: Microsoft does not let an account list every site.
    • site.get — Get a site: By its identifier, or from a URL pasted from the browser.
    • site.subsites — List subsites: The child sites of a site.
  • Shown when: resource is site

libraryOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: library.list
  • Options:
    • library.list — List libraries: The document libraries of the site. System libraries stay hidden.
  • Shown when: resource is library

fileOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: file.upload
  • Options:
    • file.list — List a folder: The contents of a folder — the completeness check of a client folder.
    • file.search — Search: Searches names, metadata and document contents.
    • file.get — Get a document: The details of a document identified by its id.
    • file.download — Fetch the contents: The file is dropped into the run’s attachments (a “Compose an email” can attach it by its position), plus a link valid for one hour and the text when it is readable.
    • file.upload — Upload an attachment: The attachments (from the email or added by a step) — or some text — into a library folder, under the name you choose.
    • file.move — Move or rename: Within the same library: Microsoft does not move across libraries.
    • file.copy — Copy: Copies a document. Beware: a copy keeps neither columns nor permissions.
    • file.delete — Move to the recycle bin: Nothing is destroyed: the document goes to the site recycle bin.
    • file.share — Create a sharing link: A revocable link to paste into an email — rather than sending 200 MB of attachments.
    • file.metadata_get — Read the columns: The SharePoint columns of the document: "Client", "Matter", "Document type".
    • file.metadata_set — Write the columns: Fills in the document columns. Columns you do not name are left alone.
  • Shown when: resource is file

folderOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: folder.create
  • Options:
    • folder.create — Create a folder: Creates the folder unless it exists — a retry creates no duplicate.
    • folder.from_template — Create from a template: Copies a template folder, subfolders included, and waits for the copy to finish before continuing.
  • Shown when: resource is folder

listOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: list.list
  • Options:
    • list.list — List the lists: The site lists, without the SharePoint plumbing.
    • list.columns — List the columns: The columns of a list, with their internal name — the one you must write.
  • Shown when: resource is list

rowOperation ​

Action

  • Type: One choice (options)
  • Required: Yes
  • Default: row.upsert
  • Options:
    • row.list — List rows: The rows of a list, filtered if needed.
    • row.get — Get a row: One row by its id.
    • row.create — Create a row: Adds a row. Without a key column, a retry of the step would add a second one: prefer “Create or update”.
    • row.update — Update a row: Changes the named columns of a row known by its id.
    • row.upsert — Create or update: Matches on a key column value: a reminder updates the row instead of adding a second one.
    • row.delete — Delete a row: Removes a row from the list.
  • Shown when: resource is listItem

site ​

Site — Pick from the list (the sites you follow), paste a site URL, or its identifier. Left empty: the organization root site.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID, paste a URL (sharepoint.site)
  • Listed with the connection in: credential
  • Shown when: resource is not site or siteOperation is not site.search

library ​

Document library — The site library where the documents live. "Documents" is the one every new site has.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.library)
  • Listed inside: site
  • Listed with the connection in: credential
  • Shown when: resource is file or resource is folder

folder ​

Folder — Left empty: the library root. For a deep subfolder, paste its id — for instance the one returned by a "Create a folder" step.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.folder)
  • Listed inside: library
  • Listed with the connection in: credential
  • Shown when: (resource is file and fileOperation is one of file.list, file.search, file.upload) or resource is folder

item ​

Document id — The id returned by an earlier step: {{ data.api_1.items.0.id }}.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 512 characters at most
  • Example: {{ data.api_1.items.0.id }}
  • Shown when: resource is file and fileOperation is one of file.get, file.download, file.move, file.copy, file.delete, file.share, file.metadata_get, file.metadata_set
  • Expressions: {{ }} accepted

targetFolder ​

Destination folder — Where to put the document. Left empty when renaming: the document stays where it is.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.folder)
  • Listed inside: library
  • Listed with the connection in: credential
  • Shown when: resource is file and fileOperation is one of file.move, file.copy

template ​

Template folder — The template folder to copy, subfolders included. ⚠️ A copy keeps neither columns nor permissions: the new folder inherits those of its destination.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.folder)
  • Listed inside: library
  • Listed with the connection in: credential
  • Shown when: resource is folder and folderOperation is one of folder.from_template

name ​

Name — Accepts {{ }} expressions. Characters SharePoint rejects (: / \ * ? " < > |) are replaced with a dash, and the step says so.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 255 characters at most
  • Example: {{ data.extract_1.seller }} – {{ data.extract_1.property }}
  • Shown when: (resource is folder and folderOperation is one of folder.create, folder.from_template) or (resource is file and fileOperation is one of file.move, file.copy)
  • Expressions: {{ }} accepted

source ​

What to upload

  • Type: One choice (options)
  • Required: Yes
  • Default: attachment
  • Options:
    • attachment — The attachments: Those of the email and the files added by an earlier step, uploaded as-is — the "file the deed" case.
    • text — Some text: Content you write: a report, a summary, a CSV.
  • Shown when: resource is file and fileOperation is one of file.upload

selection ​

Attachments to use

  • Type: One choice (options)
  • Required: Yes
  • Default: all
  • Options:
    • all — All attachments: Those of the triggering email, then the files added by earlier steps (a fetched deed, a signed PDF), in that order.
    • first — The first one only: The first attachment, when only one matters.
    • byMime — By file type: By MIME type: application/pdf, or a whole family with image/*.
    • byName — By file name: By name pattern: *.pdf, invoice-*.
  • Shown when: (resource is file and fileOperation is one of file.upload) and source is attachment

mime ​

File type — Exact MIME type (application/pdf) or a whole family (image/*). Left empty, no attachment is kept.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 200 characters at most
  • Example: application/pdf
  • Shown when: (resource is file and fileOperation is one of file.upload) and source is attachment and selection is byMime
  • Expressions: {{ }} accepted

namePattern ​

File name — Simple pattern: * matches anything, ? one character (*.pdf, invoice-*). Case is ignored.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 200 characters at most
  • Example: *.pdf
  • Shown when: (resource is file and fileOperation is one of file.upload) and source is attachment and selection is byName
  • Expressions: {{ }} accepted

text ​

Content — The file content. Accepts {{ }} expressions: {{ data.summarize_1.summary }}, {{ email.subject }}.

  • Type: Long text (text)
  • Required: No
  • Default: "" (empty)
  • 200000 characters at most
  • Shown when: (resource is file and fileOperation is one of file.upload) and source is text
  • Expressions: {{ }} accepted

fileName ​

Uploaded file name — Extension included. Left empty with attachments, each keeps its own name; filled in, it only applies when a single attachment matches. This is where the "NAME – PROPERTY – PARTNER.pdf" pattern lives.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 255 characters at most
  • Example: {{ data.extract_1.name }} – {{ data.extract_1.property }} – {{ data.extract_1.partner }}.pdf
  • Shown when: resource is file and fileOperation is one of file.upload
  • Expressions: {{ }} accepted

onConflict ​

If the name already exists

  • Type: One choice (options)
  • Required: Yes
  • Default: rename
  • Options:
    • rename — Keep both: SharePoint numbers the new one (deed 1.pdf). Nothing is lost.
    • skip — Do nothing: The file already there is returned as-is, never overwritten.
    • replace — Replace: The content overwrites the existing file — its version history keeps it.
  • Shown when: resource is file and fileOperation is one of file.upload

linkType ​

What the link allows

  • Type: One choice (options)
  • Required: Yes
  • Default: view
  • Options:
    • view — View: Read only.
    • edit — Edit: Read and write. Keep it for internal recipients.
  • Shown when: resource is file and fileOperation is one of file.share

linkScope ​

Who can open it

  • Type: One choice (options)
  • Required: Yes
  • Default: organization
  • Options:
    • organization — People in the organization: The default, and the only one most organizations allow.
    • users — People who already have access: Widens nothing: the link only works for those who already had access.
    • anonymous — Anyone with the link: ⚠️ Almost always forbidden by an organization sharing policy.
  • Shown when: resource is file and fileOperation is one of file.share

linkExpiresAt ​

Expires on — ISO 8601 date (2026-12-31T23:59:59Z). Left empty: the link does not expire, unless the organization enforces one.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 64 characters at most
  • Example: 2026-12-31T23:59:59Z
  • Shown when: resource is file and fileOperation is one of file.share
  • Expressions: {{ }} accepted

list ​

List — The register to work with: "Deadlines", "Parties", "Matters".

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.list)
  • Listed inside: site
  • Listed with the connection in: credential
  • Shown when: (resource is list and listOperation is one of list.columns) or resource is listItem

columns ​

Columns to write — 🔴 The key is the column internal name, not its label: "Follow-up date" is called Follow_x002d_up_x0020_date. The "List the columns" action gives it to you. Only simple types are guaranteed: text, number, yes/no, date, choice, currency.

  • Type: Key / value pairs (keyValue)
  • Required: No
  • Default: []
  • Shown when: (resource is file and fileOperation is one of file.metadata_set) or (resource is listItem and rowOperation is one of row.create, row.update, row.upsert)
  • Expressions: {{ }} accepted

columnNames ​

Columns to read — Internal names separated by commas. Left empty: every column SharePoint returns.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 1000 characters at most
  • Example: Client,MatterNumber
  • Shown when: resource is file and fileOperation is one of file.metadata_get
  • Expressions: {{ }} accepted

rowId ​

Row id — The one returned by an earlier step: {{ data.item.id }}.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 128 characters at most
  • Example: {{ data.item.id }}
  • Shown when: resource is listItem and rowOperation is one of row.get, row.update, row.delete
  • Expressions: {{ }} accepted

keyColumn ​

Matching column — The column that identifies the row — "Matter number". ⚠️ SharePoint can only filter on one column at a time, and it must be indexed in the list settings.

  • Type: Remote resource (resourceLocator)
  • Required: No
  • Default: {"mode":"id","value":""}
  • Ways to choose: pick from a list, type an ID (sharepoint.column)
  • Listed inside: list
  • Listed with the connection in: credential
  • Shown when: resource is listItem and rowOperation is one of row.upsert

keyValue ​

Value to match — Accepts {{ }} expressions: {{ data.extract_1.matter }}. It decides between creating and updating.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 500 characters at most
  • Example: {{ data.extract_1.matter }}
  • Shown when: resource is listItem and rowOperation is one of row.upsert
  • Expressions: {{ }} accepted

filter ​

Filter — An OData filter on one column: fields/MatterNumber eq '2026-0412'. Allowed operators: eq ne lt gt le ge startswith. ⚠️ One column at a time, and it must be indexed.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 500 characters at most
  • Example: fields/MatterNumber eq '{{ data.extract_1.matter }}'
  • Shown when: resource is listItem and rowOperation is one of row.list
  • Expressions: {{ }} accepted

allowUnindexed ​

Allow unindexed columns — Unticked by default, on purpose: Microsoft itself names this option "may fail randomly". A step that fails one time in five is worse than one that always fails. The right answer is to index the column in SharePoint.

  • Type: Yes / no (boolean)
  • Required: No
  • Default: false
  • Shown when: resource is listItem and rowOperation is one of row.list, row.upsert

query ​

Search — The text to search. On documents it also covers the contents, not just the name.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 500 characters at most
  • Example: agreement 2026
  • Shown when: (resource is site and siteOperation is one of site.search) or (resource is file and fileOperation is one of file.search)
  • Expressions: {{ }} accepted

foldersOnly ​

Folders only — Useful to walk a tree rather than list documents.

  • Type: Yes / no (boolean)
  • Required: No
  • Default: false
  • Shown when: resource is file and fileOperation is one of file.list

limit ​

Maximum results — A step should not load a whole register: past this, filter upstream.

  • Type: Number (number)
  • Required: No
  • Default: 50
  • Whole number, from 1 to 500
  • Shown when: (resource is site and siteOperation is one of site.search, site.subsites) or (resource is file and fileOperation is one of file.list, file.search) or (resource is listItem and rowOperation is one of row.list)

maxDownloadMb ​

Maximum size (MB) — Past this, the file is not dropped into the attachments — the link is still returned.

  • Type: Number (number)
  • Required: No
  • Default: 10
  • Whole number, from 1 to 25
  • Shown when: resource is file and fileOperation is one of file.download

Outputs ​

  • main

Data produced ​

What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).

  • {{ data.<step>.sites }} — array of { id, name, displayName, webUrl, description? }. site.search, site.subsites: the sites found. id is the three-part site id ({hostname},{guid},{guid}), usable in the Site field (id mode).
  • {{ data.<step>.site }} — object { id, name, displayName, webUrl, description? }. site.get: the site.
  • {{ data.<step>.libraries }} — array of { id, name, webUrl, driveType }. library.list: the document libraries of the site. id is the library id (usable in the Document library field, id mode); driveType is documentLibrary for a SharePoint library.
  • {{ data.<step>.items }} — array of { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. file.list, file.search, file.upload: the documents and folders. id is the item id to pass to Document id in a later step, parentId the parent folder id (empty for the library root), driveId the library id, mime is inode/directory for a folder.
  • {{ data.<step>.items.0.id }} — string. The id of the first item, the usual value for Document id in the next SharePoint step.
  • {{ data.<step>.names }} — array of string. file.list: the names of the items listed, handy for a completeness check.
  • {{ data.<step>.item }} — object { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. file.get, file.download, file.move, file.copy: the document (after the move, or the new copy).
  • {{ data.<step>.downloadUrl }} — string. file.download: a pre-authorized download URL, valid for about one hour, that needs no sign-in. Not a sharing link.
  • {{ data.<step>.text }} — string. file.download: the file text, for text-like files (text, JSON, XML, CSV) of 4 MB or less, cut at 20,000 characters. Absent otherwise.
  • {{ data.<step>.truncated }} — boolean. file.download: true when text was cut. row.list: true when the limit was reached and more rows remained.
  • {{ data.<step>.attachmentPosition }} — number. file.download: the position of the file added to the run's attachments, to attach it in a Compose step. Absent when the file was not added (see skippedReason).
  • {{ data.<step>.deduplicated }} — boolean. file.download: present with attachmentPosition; true when the same file was already among the run's attachments and was not added twice.
  • {{ data.<step>.skippedReason }} — string. file.download: why the file was not added to the attachments: too_large (over Maximum size) or not_writable (the run cannot receive files).
  • {{ data.<step>.reused }} — array of string. file.upload: the names of the files a replay found already uploaded by an earlier attempt — the same shape as OneDrive.
  • {{ data.<step>.skipped }} — array of string. file.upload: the names of the files left in place because the name was taken and If the name already exists is Do nothing.
  • {{ data.<step>.sanitized }} — array of string. file.upload: the final names of the files whose requested name contained characters SharePoint rejects and was corrected.
  • {{ data.<step>.attachments }} — array of { position, filename, mime, size, origin, addedByNodeId?, integration? }. file.upload with the attachments as source: where each uploaded attachment comes from (origin: email or added).
  • {{ data.<step>.deleted }} — boolean. file.delete, row.delete: true when the item was removed by this step, false when it was already gone (a replay, not an error).
  • {{ data.<step>.url }} — string. file.share: the sharing link, to paste into an email. Empty in a test run.
  • {{ data.<step>.created }} — boolean. file.share: false when SharePoint returned an existing link. folder.create, folder.from_template: false when a folder with that name already existed. row.create: always true; row.update: always false; row.upsert: true when the row was created, false when it was updated.
  • {{ data.<step>.fields }} — object. file.metadata_get, file.metadata_set: the document's column values, keyed by internal column name (for metadata_set, as SharePoint returns them after the write).
  • {{ data.<step>.folder }} — object { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. folder.create, folder.from_template: the folder created or found. Its id goes into the Folder field of the next step (id mode).
  • {{ data.<step>.lists }} — array of { id, listId, name, displayName, template, webUrl }. list.list: the lists of the site. id is the composite id {siteId}|{listId} that the List field expects; template is genericList, documentLibrary, events…
  • {{ data.<step>.columns }} — array of { name, displayName, type, readOnly, required }. list.columns: the columns of the list. name is the internal name to use in Columns to write, Matching column and Filter; displayName is the label users see.
  • {{ data.<step>.rows }} — array of { id, webUrl, fields, createdAt?, updatedAt? }. row.list: the rows. fields holds the values keyed by internal column name.
  • {{ data.<step>.row }} — object { id, webUrl, fields, createdAt?, updatedAt? }. row.get, row.create, row.update, row.upsert: the row. After an update, fields holds the values SharePoint returns and webUrl may be empty.
  • {{ data.<step>.count }} — number. Operations that return a list: the number of entries.
  • {{ data.<step>.summary }} — string. A readable sentence describing what the step did.
  • {{ data.<step>.simulated }} — boolean. true when the step ran in a test run and the write was only described — the same field as on the Google and Outlook nodes. Always false for a read.

Sites and libraries ​

Choose resource: site and set siteOperation, or resource: library and set libraryOperation.

ValueFields usedData produced
site.searchquery, limitsites, count
site.getsitesite
site.subsitessite, limitsites, count
library.listsitelibraries, count
  • site.search searches sites by name. With an empty query it returns the sites the member follows plus the organization root site: Microsoft does not let an account list every site.
  • The Site field accepts a site picked from the list, a site id, or a pasted URL such as https://contoso.sharepoint.com/sites/Litigation (or /teams/<name>). Left empty, it means the organization root site. A OneDrive URL (/personal/<account>) designates that OneDrive. Another URL on a valid host (a library of the root site, a sharing link) is read as the root site of its host; a URL whose host cannot be read fails with microsoft.rejected rather than silently targeting the root site.
  • library.list hides system libraries. Every new site has a library named Documents.

Files ​

Choose resource: file and set fileOperation. Every file action needs the Document library (library), picked after the site.

ValueFields usedData produced
file.listfolder, foldersOnly, limititems, count, names
file.searchfolder, query, limititems, count
file.getitemitem
file.downloaditem, maxDownloadMbitem, downloadUrl, text, truncated, attachmentPosition, deduplicated, skippedReason
file.uploadfolder, source, selection / mime / namePattern or text, fileName, onConflictitems, count, reused, skipped, sanitized, attachments
file.moveitem, targetFolder, nameitem
file.copyitem, targetFolder, nameitem
file.deleteitemdeleted
file.shareitem, linkType, linkScope, linkExpiresAturl, created
file.metadata_getitem, columnNamesfields
file.metadata_setitem, columnsfields
  • Document id (item) is the id returned by an earlier step, typically {{ data.<step>.items.0.id }}. It is required for every action that targets an existing document (node_invalid_param otherwise).
  • Folder (folder) is the folder to list, search or upload into; left empty, the library root. Pick it from the list or paste a folder id, for instance the one returned by a Folder action.
  • file.list returns the direct contents of the folder; Folders only keeps subfolders. file.search looks in names, metadata and contents; with an empty query it lists the folder.
  • file.download adds the file to the run's attachments, so that a later Compose step can attach it by attachmentPosition. Files larger than Maximum size (1 to 25 MB, 10 by default) are not added (skippedReason: too_large), but downloadUrl is still returned. Text-like files of 4 MB or less also come back as text.
  • file.upload takes the attachments of the run (those of the email and those added by earlier steps, at most 20) or a text you write. File name applies only when a single attachment matches; with Some text it is required, and the file type follows its extension. If the name already exists: Keep both (rename, SharePoint numbers the new file), Do nothing (skip, the existing file is returned untouched) or Replace (replace, the version history keeps the old content). 100 MB per file at most.
  • file.move moves and/or renames within the same library: leave Destination folder empty to only rename, or Name empty to only move. With both empty the step fails with microsoft.rejected.
  • file.copy copies a document and waits for the copy to finish. A copy keeps neither the columns nor the permissions of the original.
  • file.delete moves the document to the site recycle bin; nothing is destroyed for good.
  • file.share creates a revocable link. What the link allows: View (view, default) or Edit (edit). Who can open it: People in the organization (organization, default), People who already have access (users) or Anyone with the link (anonymous, usually forbidden by the organization's sharing policy). Expires on takes an ISO 8601 date; left empty, the link does not expire unless the organization enforces it.
  • file.metadata_get reads the document's SharePoint columns; Columns to read takes internal names separated by commas (empty: all). file.metadata_set writes the columns listed in Columns to write and leaves the others untouched.

Folders ​

Choose resource: folder and set folderOperation. Both actions need the Document library; Folder is the parent (empty: the library root).

ValueFields usedData produced
folder.createfolder, namefolder, created
folder.from_templatetemplate, folder, namefolder, created
  • folder.create creates the folder unless a folder with that name already exists in the parent, in which case it returns it with created: false.
  • folder.from_template copies a template folder, subfolders included, under the given name, and waits for the copy to finish (up to one minute) before the workflow continues, so the next step can upload into it. If a folder with that name already exists in the parent, nothing is copied and it is returned with created: false. The copy keeps neither columns nor permissions: the new folder inherits those of its destination. Template folder is required (node_invalid_param otherwise).

Lists and rows ​

Choose resource: list and set listOperation, or resource: listItem and set rowOperation. The List field (list) is picked after the site; its id is the composite {siteId}|{listId} (the id returned by list.list). A bare list id is refused with microsoft.rejected.

ValueFields usedData produced
list.listsitelists, count
list.columnslistcolumns, count
row.listlist, filter, allowUnindexed, limitrows, count, truncated
row.getlist, rowIdrow
row.createlist, columnsrow, created
row.updatelist, rowId, columnsrow, created
row.upsertlist, keyColumn, keyValue, columns, allowUnindexedrow, created
row.deletelist, rowIddeleted
  • Internal column names. In Columns to write, the key is the column's internal name, not its label: a column created as "Next step date" is called Next_x0020_step_x0020_date, and keeps that name even if it is renamed later. Run list.columns once to read them (columns[].name). Only simple types are guaranteed: text, number, yes/no, date, choice, currency.
  • list.list hides SharePoint's hidden lists, and list.columns its hidden columns.
  • row.list accepts an OData Filter on one column: fields/MatterNumber eq '2026-0412', with the operators eq ne lt gt le ge startswith. SharePoint filters on one indexed column at a time.
  • row.upsert looks for a row whose Matching column equals Value to match: found, it updates the columns given; not found, it creates the row with those columns plus the matching column set to the value. The matching column must be indexed in the list settings.
  • row.update and file.metadata_set merge: columns you do not name keep their value.
  • row.delete removes a row; deleted is false if it was already gone.

Example ​

A new property sale arrives by email. The workflow creates the client folder from the firm's template, files the deed, shares it, and records the matter in the Matters list. An Extract step named Extract reads seller, property and matter.

Step Matter folder:

resource: folder
folderOperation: folder.from_template
site: (url mode) https://contoso.sharepoint.com/sites/Conveyancing
library: (list mode) Documents
template: (list mode) _Template matter
folder: (list mode) Matters 2026
name: {{ data.extract.seller }} – {{ data.extract.property }}

Step File deed:

resource: file
fileOperation: file.upload
library: (list mode) Documents
folder: (id mode) {{ data.matter_folder.folder.id }}
source: attachment
selection: byMime
mime: application/pdf
fileName: Deed – {{ data.extract.seller }}.pdf
onConflict: replace

Its data:

json
{
  "items": [
    {
      "id": "01ABCD…",
      "name": "Deed – Smith.pdf",
      "mime": "application/pdf",
      "size": 391022,
      "webUrl": "https://contoso.sharepoint.com/sites/Conveyancing/Documents/Matters%202026/…",
      "isFolder": false,
      "parentId": "01FOLD…",
      "driveId": "b!Xy…"
    }
  ],
  "count": 1,
  "reused": [],
  "skipped": [],
  "sanitized": [],
  "attachments": [
    { "position": 1, "filename": "scan_0412.pdf", "mime": "application/pdf", "size": 391022, "origin": "email" }
  ]
}

Step Share deed: resource: file, fileOperation: file.share, item: {{ data.file_deed.items.0.id }}, linkType: view, linkScope: organization. A Compose step then quotes {{ data.share_deed.url }}.

Step Record matter:

resource: listItem
rowOperation: row.upsert
list: (list mode) Matters
keyColumn: (list mode) MatterNumber
keyValue: {{ data.extract.matter }}
columns:
  Title: {{ data.extract.seller }} – {{ data.extract.property }}
  Status: Open

The first time, created is true; a later email about the same matter updates the same row with created: false.

Tips ​

  • Replays. Reads and these writes can be replayed safely: folder.create and folder.from_template (match on the name), file.upload with Replace or Do nothing (match on the name) and with Keep both (a hidden mark finds the file again, listed in reused; some tenants refuse the mark, and there a replay in Keep both mode can add a numbered copy), file.move, file.metadata_set, file.share (SharePoint returns the existing link), file.delete and row.delete (deleted: false when already gone), row.update, and row.upsert. row.create and file.copy are not: a replay creates a second row or a second copy. Prefer row.upsert for registers.
  • Names. In Name and Uploaded file name, the characters SharePoint rejects (: / \ * ? " < > |) are replaced with a dash, and leading or trailing spaces and trailing dots are removed. For uploads, the corrected names are listed in sanitized. A name that is empty once corrected fails with microsoft.rejected.
  • Unindexed columns. SharePoint refuses a filter on a column that is not indexed. The step then fails with microsoft.rejected and a message telling you to index the column in the list settings. Allow unindexed columns sends Microsoft's "may fail randomly" header instead; it is off by default because a step that fails one time in five is worse than one that always fails.
  • Locked files. A document open for editing by someone else gives microsoft.locked, which is retried automatically until it is released.
  • Template copy timeout. If a template copy does not finish within one minute, the step fails with microsoft.rejected. Replay it once the copy is done on SharePoint's side: the name check finds the folder.
  • Missing fields. No Document library gives microsoft.rejected ("a SharePoint document library is required"). An action missing its Document id, List, Row id or Columns to write fails with node_invalid_param, naming the field.
  • Test runs. In test runs every read runs for real (sites, libraries, lists, rows, file listing, search, metadata and file.download). Writes are only described: items and folders come back with an id starting with simulated: and an empty webUrl, file.share returns an empty url, rows come back with the id simulated:row, and row.upsert always reports created: true.
  • Errors. credential.capability_missing: SharePoint is not connected for the member running the workflow. microsoft.access_denied: the member lacks rights on the site, or the consent was withdrawn. microsoft.not_found: the site, library, folder, document or list does not exist. microsoft.storage_full: the site is full (permanent). microsoft.conflict: the item changed since it was read. microsoft.locked and microsoft.unavailable are retried automatically. See Error handling.