English
Notion
Reads and feeds your Notion pages and databases: entries, properties, Markdown content, comments and attachments.
The Notion node reads and feeds your Notion pages and databases: it queries and creates database entries, updates their properties, reads or writes page content as Markdown, appends blocks, comments, and moves files in both directions between a page and the run's attachments.
It works with a Notion integration token stored once in Connections. See Notion to create the connection. A Notion token sees nothing until a page or database is shared with it: in Notion, open the page or database, then the ··· menu, Connections, and add your integration.
To react to Notion without polling yourself, use the Notion entry changed trigger or the Notion — event trigger.
In Notion, a database is a container holding one or more data sources, and the data source carries the columns. The editor therefore asks for the Database (the one you see in Notion, or its URL), then the Data source; most databases have only one. Page identifiers can be typed as an id or pasted as a Notion URL.
At a glance
- Type:
notion.api· version 1 - Category: Data
- 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: Notion
- Inputs:
main - Outputs:
main
Connection
This node needs a Notion connection.
Parameters
connection
Notion connection — The Notion connection to use. Create it once in Connections; its key never appears in the workflow.
- Type: Connection (
credential) - Required: Yes
- Default:
""(empty)
resource
Resource
- Type: One choice (
options) - Required: Yes
- Default:
dataSource - Options:
dataSource— Database: Read, filter and feed the entries of a database.page— Page: Create, read, update a page — and its content as Markdown.block— Block: Append content at the bottom of a page, or read what it holds.comment— Comment: Comment a page to notify someone, or read the thread back.file— File: Upload an attachment (from the email or added by a step) and attach it to a page, or fetch a page’s files as attachments.user— User: The workspace members, and the connection’s own account.search— Search: Search by title across everything that is shared.
dataSourceOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
query - Options:
query— Query entries: With a filter and a sort — the most used operation.changes— Entries created or edited since…: The polling shape: put a “Schedule” trigger upstream and hand it the previous run time.createEntry— Create an entry: One row of the database, with its typed properties.getSchema— Read the schema: The source properties, their type and their options.list— List databases: Everything shared with the connection.
- Shown when:
resourceisdataSource
pageOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
create - Options:
create— Create a pageget— Get a page: Its properties — not its content, which reads as Markdown.update— Update the properties: Only the properties you fill in change.archive— Move to trash / restoregetMarkdown— Read the content as Markdown: The whole page in one call, ready for an AI node.updateMarkdown— Write content as Markdown
- Shown when:
resourceispage
blockOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
append - Options:
append— Append blockschildren— List blocks
- Shown when:
resourceisblock
commentOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
create - Options:
create— Create a commentlist— List comments
- Shown when:
resourceiscomment
fileOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
upload - Options:
upload— Upload the attachments: Those of the email and the files added by an earlier step, filtered as everywhere else.download— Fetch a page’s files as attachments: Fetches the files into the run’s attachments: a “Compose an email” can then attach them by their position.
- Shown when:
resourceisfile
userOperation
Operation
- Type: One choice (
options) - Required: Yes
- Default:
list - Options:
list— List peopleme— Read the connection account
- Shown when:
resourceisuser
parentType
Create the page…
- Type: One choice (
options) - Required: Yes
- Default:
dataSource - Options:
dataSource— Inside a databasepage— Under a page
- Shown when:
resourceispageandpageOperationis one ofcreate
database
Database — The one you see in Notion. You can also paste its URL.
- Type: Remote resource (
resourceLocator) - Required: No
- Ways to choose: pick from a list, type an ID, paste a URL (
notion.database) - Listed with the connection in:
connection - Shown when: (
resourceisdataSourceanddataSourceOperationis one ofquery,changes,createEntry,getSchema) or (resourceispageandpageOperationiscreateandparentTypeisdataSource)
dataSource
Data source — The schema belongs to the source, not to the database. Most databases only have one.
- Type: Remote resource (
resourceLocator) - Required: No
- Ways to choose: pick from a list, type an ID (
notion.dataSource) - Listed inside:
database - Listed with the connection in:
connection - Shown when: (
resourceisdataSourceanddataSourceOperationis one ofquery,changes,createEntry,getSchema) or (resourceispageandpageOperationiscreateandparentTypeisdataSource)
page
Page — The page id or URL. A database entry is a page: {{ data.notion.pageId }} works here.
- Type: Remote resource (
resourceLocator) - Required: No
- Ways to choose: pick from a list, type an ID, paste a URL (
notion.page) - Listed with the connection in:
connection - Shown when: (
resourceispageandpageOperationis one ofget,update,archive,getMarkdown,updateMarkdown) or (resourceispageandpageOperationiscreateandparentTypeispage) orresourceisblockorresourceiscommentorresourceisfile
title
Title — The page title. In a database it fills the “title” column, whatever its name.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 2000 characters at most
- Shown when: (
resourceispageandpageOperationis one ofcreate) or (resourceisdataSourceanddataSourceOperationis one ofcreateEntry) - Expressions:
{{ }}accepted
properties
Properties — The property name, and its value. Conversion follows the type declared in Notion: an ISO date, a comma-separated list, “yes” for a checkbox. An empty value clears the property; computed columns are ignored.
- Type: Key / value pairs (
keyValue) - Required: No
- Shown when: (
resourceispageandpageOperationis one ofcreate,update) or (resourceisdataSourceanddataSourceOperationis one ofcreateEntry) - Expressions:
{{ }}accepted
markdown
Content (Markdown) — Notion turns Markdown into blocks itself: the safest way to write an email body, which almost always exceeds the 2,000 characters of a text fragment.
- Type: Long text (
text) - Required: No
- Default:
""(empty) - 100000 characters at most
- Shown when: (
resourceispageandpageOperationis one ofcreate,updateMarkdown) or (resourceisdataSourceanddataSourceOperationis one ofcreateEntry) - Expressions:
{{ }}accepted
markdownMode
How to write
- Type: One choice (
options) - Required: No
- Default:
append - Options:
append— Append at the end: Nothing is erased — the default, and what a log wants.replace— Replace the whole content: Destructive: the previous content is gone.
- Shown when:
resourceispageandpageOperationis one ofupdateMarkdown
inTrash
Move to trash — Unchecked, the page is restored from the trash.
- Type: Yes / no (
boolean) - Required: No
- Default:
true - Shown when:
resourceispageandpageOperationis one ofarchive
filterProperty
Filter on property — Left empty, every entry is returned.
- Type: Remote resource (
resourceLocator) - Required: No
- Ways to choose: pick from a list, type an ID (
notion.property) - Listed inside:
dataSource - Listed with the connection in:
connection - Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery
filterCondition
Condition
- Type: One choice (
options) - Required: No
- Default:
equals - Options:
equals— equalsdoes_not_equal— does not equalcontains— containsdoes_not_contain— does not containstarts_with— starts withis_empty— is emptyis_not_empty— is not emptyon_or_after— on or after (date)on_or_before— on or before (date)greater_than— greater than (number)less_than— less than (number)
- Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery
filterValue
Value
- Type: Text (
string) - Required: No
- Default:
""(empty) - 2000 characters at most
- Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery - Expressions:
{{ }}accepted
filterJson
Advanced filter (JSON) — A full Notion filter (and / or, at most two nesting levels). When filled, it replaces the simple filter above.
- Type: Long text (
text) - Required: No
- Default:
""(empty) - 8000 characters at most
- Example:
{"property":"Status","status":{"does_not_equal":"Closed"}} - Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery - Expressions:
{{ }}accepted
sortProperty
Sort on property — Empty: Notion sorts by last edited time, most recent first.
- Type: Remote resource (
resourceLocator) - Required: No
- Ways to choose: pick from a list, type an ID (
notion.property) - Listed inside:
dataSource - Listed with the connection in:
connection - Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery
sortDirection
Sort direction
- Type: One choice (
options) - Required: No
- Default:
ascending - Options:
ascending— Ascendingdescending— Descending
- Shown when:
resourceisdataSourceanddataSourceOperationis one ofquery
since
Since — An ISO 8601 instant (2026-09-22T07:00:00Z). Put a “Schedule” trigger upstream and pass {{ data.schedule.plannedFor }}: each run only brings what changed since the previous one.
- Type: Text (
string) - Required: Yes
- Default:
""(empty) - 40 characters at most
- Example:
{{ data.schedule.plannedFor }} - Shown when:
resourceisdataSourceanddataSourceOperationis one ofchanges - Expressions:
{{ }}accepted
changeType
What counts as a change
- Type: One choice (
options) - Required: No
- Default:
any - Options:
any— Created or editedcreated— New entries onlyedited— Edited entries only
- Shown when:
resourceisdataSourceanddataSourceOperationis one ofchanges
blockText
Text — An empty line separates two blocks. Each block is split at 2,000 characters, Notion’s limit.
- Type: Long text (
text) - Required: No
- Default:
""(empty) - 100000 characters at most
- Shown when:
resourceisblockandblockOperationis one ofappend - Expressions:
{{ }}accepted
blockType
Block type
- Type: One choice (
options) - Required: No
- Default:
paragraph - Options:
paragraph— Paragraphheading_1— Heading 1heading_2— Heading 2heading_3— Heading 3bulleted_list_item— Bulleted itemnumbered_list_item— Numbered itemto_do— To-doquote— Quotecallout— Calloutcode— Code
- Shown when:
resourceisblockandblockOperationis one ofappend
blockPosition
Where to put them
- Type: One choice (
options) - Required: No
- Default:
end - Options:
end— At the end of the pagestart— At the start of the page
- Shown when:
resourceisblockandblockOperationis one ofappend
commentText
Comment — Inline Markdown: bold, italics, links. No blocks — a comment is not a page.
- Type: Long text (
text) - Required: No
- Default:
""(empty) - 10000 characters at most
- Shown when:
resourceiscommentandcommentOperationis one ofcreate - Expressions:
{{ }}accepted
discussionId
Reply to the thread — An existing discussion id. Empty: the comment opens a new thread on the page.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 100 characters at most
- Shown when:
resourceiscommentandcommentOperationis one ofcreate - Expressions:
{{ }}accepted
displayName
Sign the comment — The name shown next to the comment. Empty: the integration name.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 100 characters at most
- Shown when:
resourceiscommentandcommentOperationis one ofcreate - Expressions:
{{ }}accepted
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 withimage/*.byName— By file name: By name pattern:*.pdf,invoice-*.
- Shown when:
resourceisfileandfileOperationis one ofupload
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:
resourceisfileandfileOperationis one ofupload - 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:
resourceisfileandfileOperationis one ofupload - Expressions:
{{ }}accepted
fileTarget
Location
- Type: One choice (
options) - Required: No
- Default:
block - Options:
block— The page content: Upload: one file block per attachment, at the bottom of the page. Fetch: the page’s file, PDF and image blocks.property— A “Files” property: For a database entry with a files column.
- Shown when:
resourceisfile
filesProperty
Property name — The “Files & media” column of the database. On upload, files already there are replaced.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 200 characters at most
- Example:
Attachments - Shown when:
resourceisfileandfileTargetisproperty - Expressions:
{{ }}accepted
maxDownloadMb
Maximum size per file (MB)
- Type: Number (
number) - Required: No
- Default:
10 - Whole number, from 1 to 10
- Shown when:
resourceisfileandfileOperationis one ofdownload
searchQuery
Search for — Search matches titles only. To search inside a database, prefer “Query entries”: the global index lags slightly behind.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 500 characters at most
- Shown when:
resourceissearch - Expressions:
{{ }}accepted
searchObject
Look for
- Type: One choice (
options) - Required: No
- Default:
page - Options:
page— Pagesdata_source— Databasesany— Both
- Shown when:
resourceissearch
limit
Maximum count — A database query cannot exceed 10000 results anyway: past that, split by date range.
- Type: Number (
number) - Required: No
- Default:
50 - Whole number, from 1 to 500
- Shown when: (
resourceisdataSourceanddataSourceOperationis one ofquery,changes,list) or (resourceisblockandblockOperationis one ofchildren) or (resourceiscommentandcommentOperationis one oflist) or (resourceisuseranduserOperationislist) orresourceissearch
Outputs
main— Taken once the Notion operation has succeeded. An error answer from Notion fails the step instead.
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>.pageId }}—string. The id of the page concerned: the first entry or result found (Query entries, Entries created or edited since, Search), the page created, read or written. A database entry is a page, so this id fits every Page parameter. Empty in a test run for a creation.{{ data.<step>.url }}—string. Create an entry, Create a page, Get a page, Update the properties: the Notion link of the page.{{ data.<step>.page }}—{ id, url, title, properties, createdTime, lastEditedTime, inTrash, dataSourceId }. Create an entry, Create a page, Get a page, Update the properties: the page.propertiesholds each property as a plain value (seeentries).{{ data.<step>.entries }}—array of { id, url, title, properties, createdTime, lastEditedTime, inTrash, dataSourceId }. Query entries and Entries created or edited since: the entries found.propertiesis keyed by property name, each value simplified: text for title, text, select and status; a number; true/false for a checkbox; comma-separated names for a multi-select;start..endorstartfor a date; comma-separated ids for people and relations; comma-separated URLs for files.{{ data.<step>.found }}—boolean. Query entries, Entries created or edited since, Search: true when at least one item was found.{{ data.<step>.count }}—number. The number of items returned or written: entries, databases, properties, blocks appended or listed, comments, people, results.{{ data.<step>.truncated }}—boolean. On list operations: true when more items existed than Maximum count allowed. On Read the content as Markdown: true when Notion itself cut the page (very long pages).{{ data.<step>.cursor }}—string. Entries created or edited since only: the last edit time of the last entry returned, or Since when nothing was found. Pass it as Since on the next run when the workflow keeps its own position.{{ data.<step>.refusedProperties }}—array of string. Create an entry, Create a page in a database, Update the properties: the properties that were not written (unknown name, computed column, unreadable number, ortitlewhen the database has no title column).{{ data.<step>.truncatedChars }}—number. Create an entry, Create a page, Update the properties: the number of characters cut from text values beyond Notion's limit (100 fragments of 2,000 characters per value). 0 in the normal case.{{ data.<step>.created }}—boolean. Create an entry and Create a page: true when the page was created, false in a test run.{{ data.<step>.parentPageId }}—string. Create a page under a page only: the id of the parent page.{{ data.<step>.updatedProperties }}—array of string. Update the properties only: the names of the properties written.{{ data.<step>.properties }}—object or array. Get a page: the page properties as plain values, keyed by name. Read the schema: an array of{ name, type, writable }, one per property of the data source.{{ data.<step>.dataSourceId }}—string. Read the schema only: the id of the data source read.{{ data.<step>.databaseId }}—string. Read the schema only: the id of the database that holds the data source.{{ data.<step>.title }}—string. Read the schema only: the title of the data source.{{ data.<step>.databases }}—array of { dataSourceId, databaseId, title, url }. List databases only: the data sources shared with the connection, most recently edited first.{{ data.<step>.inTrash }}—boolean. Move to trash / restore only: true when the page was moved to the trash, false when it was restored.{{ data.<step>.markdown }}—string. Read the content as Markdown only: the whole page content as Markdown.{{ data.<step>.unreadableBlocks }}—number. Read the content as Markdown only: the number of blocks Notion could not convert.{{ data.<step>.length }}—number. Read the content as Markdown and Write content as Markdown: the number of characters read or written.{{ data.<step>.mode }}—string. Write content as Markdown only:appendorreplace.{{ data.<step>.appended }}—number. Append blocks only: the number of blocks sent.{{ data.<step>.skippedBlocks }}—number. Append blocks only: the number of paragraphs left out beyond the 100 blocks of one call.{{ data.<step>.blocks }}—array of { id, type, text, hasChildren }. List blocks only: the top-level blocks of the page, with their plain text.{{ data.<step>.text }}—string. List blocks only: the text of the listed blocks, one per line.{{ data.<step>.commentId }}—string. Create a comment only: the id of the comment, empty in a test run.{{ data.<step>.discussionId }}—string. Create a comment only: the id of the discussion the comment belongs to.{{ data.<step>.comments }}—array of { id, discussionId, createdTime, authorId, text }. List comments only: the comments of the page.{{ data.<step>.files }}—array. Upload the attachments: the files selected, as{ filename, size, origin, addedByNodeId? }(originisemailoradded). Fetch a page's files: the files fetched, as{ name, source, mime, size, attachmentPosition, deduplicated }, wheresourceisproperty:<name>orblock:<id>.{{ data.<step>.uploaded }}—number. Upload the attachments only: the number of files actually uploaded to Notion (0 in a test run).{{ data.<step>.attached }}—number. Upload the attachments only: the number of files attached to the page (0 in a test run).{{ data.<step>.skipped }}—array. Upload the attachments: the names of the files over 20 MiB, left out. Fetch a page's files: the files beyond the tenth, as{ name, url, source, reason }.{{ data.<step>.target }}—string. File operations only:block(page content) orproperty(a Files property).{{ data.<step>.positions }}—array of number. Fetch a page's files only: the positions of the fetched files in the run's attachments, ready for a Compose step.{{ data.<step>.botId }}—string. Read the connection account only: the id of the integration's bot user.{{ data.<step>.name }}—string. Read the connection account only: the name of the integration.{{ data.<step>.workspace }}—string. Read the connection account only: the name of the workspace.{{ data.<step>.maxFileBytes }}—number. Read the connection account only: the largest file the workspace accepts, in bytes (0 when Notion does not say).{{ data.<step>.users }}—array of { id, name, email }. List people only: the people of the workspace (bots are left out).{{ data.<step>.results }}—array of { id, object, title, url, lastEditedTime }. Search only: the pages or databases whose title matches, most recently edited first.{{ data.<step>.simulated }}—boolean. true when a write was described rather than performed (test run). Reads, including the searches and queries Notion handles as POST requests, are never simulated.{{ data.<step>.summary }}—string. A one-line summary in the member's language, for example 'Entry “Dupont — lease” created.' (withsummaryKeyandsummaryParams).
Operations
The node first asks for a Resource (resource), then for the operation of that resource.
Database (resource: dataSource, operation in dataSourceOperation)
- Query entries (
query, the default). Reads the schema of the data source, then queries its entries (POST /v1/data_sources/{id}/query), up to Maximum count (limit, 1 to 500, default 50). Simple filter: Filter on property (filterProperty), Condition (filterCondition) and Value (filterValue); the filter family follows the property type. Advanced filter (JSON) (filterJson), when filled, replaces the simple filter. Sort on property (sortProperty) and Sort direction (sortDirection); without a sort property, the most recently edited entries come first. Publishesentries,count,found,pageId,truncated. - Entries created or edited since… (
changes). Returns the entries whose last edit time (or creation time with New entries only) is after Since (since, an ISO 8601 instant), oldest first. What counts as a change (changeType):any,createdoredited(edited leaves out entries never edited since their creation). Publishesentries,count,found,cursor,truncated. - Create an entry (
createEntry). Reads the schema, converts Title (title) and Properties (properties) to the declared types, then creates the page in the data source (POST /v1/pages). Content (Markdown) (markdown) fills the page body. Publishespage,pageId,url,refusedProperties,truncatedChars,created. - Read the schema (
getSchema). Reads the properties of the data source with their type. PublishesdataSourceId,databaseId,title,properties,count. - List databases (
list). Lists the data sources shared with the connection (POST /v1/search). Publishesdatabases,count,truncated.
Page (resource: page, operation in pageOperation)
- Create a page (
create, the default). With Create the page… (parentType) set to Inside a database, it behaves exactly as Create an entry. Set to Under a page, it creates a sub-page of Page (page) with Title and Content (Markdown), and also publishesparentPageId. - Get a page (
get). Reads the properties of Page, not its content. Publishespage,pageId,url,properties. - Update the properties (
update). Reads the page and the schema of its data source, then writes the Properties given (PATCH /v1/pages/{id}); the others are left unchanged. Publishespage,pageId,url,updatedProperties,refusedProperties,truncatedChars. - Move to trash / restore (
archive). With Move to trash (inTrash, on by default) the page goes to the trash; unchecked, it is restored. PublishespageId,inTrash. - Read the content as Markdown (
getMarkdown). Returns the whole page as Markdown in one call, ready for an AI node. PublishespageId,markdown,truncated,unreadableBlocks,length. - Write content as Markdown (
updateMarkdown). Writes Content (Markdown) with How to write (markdownMode): Append at the end (the default) or Replace the whole content. Replacing never deletes the sub-pages and databases the page contains. PublishespageId,mode,length.
Block (resource: block, operation in blockOperation)
- Append blocks (
append, the default). Turns Text (blockText) into blocks of Block type (blockType), an empty line separating two blocks, and adds them At the end of the page or At the start of the page (blockPosition). At most 100 blocks per call. PublishespageId,appended,skippedBlocks. - List blocks (
children). Lists the top-level blocks of Page with their text. PublishespageId,blocks,count,text,truncated.
Comment (resource: comment, operation in commentOperation)
- Create a comment (
create, the default). Posts Comment (commentText, inline Markdown) on Page, or in the existing discussion given in Reply to the thread (discussionId). Sign the comment (displayName) sets the name shown next to it. PublishespageId,commentId,discussionId. - List comments (
list). Lists the comments of Page. PublishespageId,comments,count,truncated.
File (resource: file, operation in fileOperation)
- Upload the attachments (
upload, the default). Selects files of the run with Attachments to use (selection: all, the first one, by file typemime, by file namenamePattern), uploads each one to Notion (POST /v1/file_uploads, then…/send), then attaches them according to Location (fileTarget): one file block per file at the bottom of the page (The page content), or in a “Files” property whose name is in Property name (filesProperty), where the files already there are replaced. PublishespageId,files,uploaded,attached,skipped,target. - Fetch a page's files as attachments (
download). Finds the files of the page, in its file, PDF, image, video and audio blocks (The page content) or in its Files properties (A “Files” property; all of them when Property name is empty), downloads up to 10 of them, each up to Maximum size per file (MB) (maxDownloadMb), and adds them to the run's attachments. PublishespageId,target,files,positions,count,skipped.
User (resource: user, operation in userOperation)
- List people (
list, the default). Lists the people of the workspace. Publishesusers,count,truncated. - Read the connection account (
me). Reads the integration's own account. PublishesbotId,name,workspace,maxFileBytes.
Search (resource: search)
Searches Search for (searchQuery) in the titles of everything shared with the connection, among Look for (searchObject): pages, databases or both. Publishes results, count, found, pageId, truncated.
Every operation also publishes simulated and summary.
Example
Requests sent by clients must become entries of a "Requests" database. An Extract step named "Extract request" declares the fields client, case_ref and deadline (a date). The Notion node is named "Notion entry", so its data lives under notion_entry:
text
resource dataSource
dataSourceOperation createEntry
database (URL mode) https://www.notion.so/acme/Requests-1a2b3c…
dataSource (list mode) Requests
title {{ data.extract_request.client }} — {{ email.subject }}
properties Reference → {{ data.extract_request.case_ref }}
Deadline → {{ data.extract_request.deadline }}
Status → New
Sender → {{ email.from.email }}
markdown {{ email.bodyText }}Each value is converted according to the column type in Notion: Deadline is a date column and receives 2026-11-15, Status is a status column and receives the option named New, Sender is an email column. If a column name is misspelled, the entry is still created and the name appears in refusedProperties. The step data reads:
json
{
"page": {
"id": "2f1c9a4e-0b7d-4c55-9e3a-8d1f6b2a7c90",
"url": "https://www.notion.so/Dupont-New-request-2f1c9a4e0b7d4c559e3a8d1f6b2a7c90",
"title": "Dupont — New request",
"properties": { "Reference": "2026-0412", "Deadline": "2026-11-15", "Status": "New", "Sender": "marie@example.com" },
"createdTime": "2026-10-04T08:12:00.000Z",
"lastEditedTime": "2026-10-04T08:12:00.000Z",
"inTrash": false,
"dataSourceId": "7e3d…"
},
"pageId": "2f1c9a4e-0b7d-4c55-9e3a-8d1f6b2a7c90",
"url": "https://www.notion.so/Dupont-New-request-2f1c9a4e0b7d4c559e3a8d1f6b2a7c90",
"refusedProperties": [],
"truncatedChars": 0,
"created": true,
"simulated": false
}A Compose step can send the link {{ data.notion_entry.url }} to the team, and a later Notion node can comment the entry with Page set to {{ data.notion_entry.pageId }}.
Tips
- Share before you use.
integration.not_foundon an id that looks right almost always means the page or database is not shared with the connection. The error message says so; add the connection from the ··· menu of the page, under Connections. A Search or List databases that returns nothing has the same cause. - Property values. Values are converted according to the declared type: a date as ISO (
2026-11-15, or2026-11-15..2026-11-20for a range), a number with a dot or a comma, a list as comma-separated names,yes,true,1orouifor a checkbox, user ids for people, page ids or URLs for relations, URLs for files. An empty value clears the property. Computed columns (formula, rollup, created time, unique id…) are never written and are listed inrefusedProperties. - Long text. A text property holds at most 100 fragments of 2,000 characters; beyond that, the cut characters are counted in
truncatedChars. For an email body, prefer Content (Markdown), which Notion turns into blocks itself. - Property names in expressions. Expressions only reach keys made of letters, digits,
_and$. A property namedDue datecannot be read with{{ data.<step>.page.properties.Due date }}: name the properties you read without spaces or accents, or read the wholepropertiesobject. - Polling. Put a Schedule trigger before Entries created or edited since… and pass
{{ data.schedule.plannedFor }}as Since: each run only brings what changed since the previous one. To keep your own position instead, storecursorin a table and pass it back. - Query limit. A database query cannot return more than 10,000 results in Notion, whatever Maximum count says; past that, split by date range. The global Search matches titles only and its index lags slightly behind: inside one database, prefer Query entries.
- Upload size. Files over 10 MiB (the server's limit per uploaded file, below Notion's 20 MiB) are left out before anything is sent to Notion, and listed in
skipped. If no attachment matches the selection, the step fails withnode_nothing_to_do. - Download size. Maximum size per file (MB) goes from 1 to 10, the server's real limit per downloaded file; a larger file fails the step. Notion's file links are signed and expire after an hour, which is why the node stores the file in the run rather than returning its link.
- Replays. Creating an entry or a page, appending blocks, commenting and uploading are not idempotent: if the engine replays the step after an incident, the page, blocks, comment or files can be created twice. Before creating, a Query entries on a business key followed by a Condition (If) on
foundavoids duplicates. - Test runs. In test runs, every read runs for real, including Query entries, Search and List databases. Creations, updates, trash moves, Markdown writes, block appends, comments and uploads are only described: nothing is written,
simulatedis true, and a created page has no id or link. - Trigger data. In a workflow started by a Notion trigger, the trigger's data lives under
data.notion. Do not name this node "Notion" there: its data would only be reachable through the node id. - Errors.
integration.unauthorized: the token was refused or revoked.integration.rejected: Notion refused the request (for example an invalid advanced filter or a value Notion does not accept for the property).integration.rate_limitedandintegration.unavailableare retried automatically: requests are paced to 180 per minute per connection, and a 409, 429 or 5xx answer gets up to four attempts before the engine retries the step later.node_invalid_param: a required value is empty, or the advanced filter is not valid JSON. See Error handling.