When to Use
- Email routing from page property: A page's
Assignee property contains a Notion user ID. Call user/get to resolve the ID to an email address, then use the email to send a targeted notification via EmailSmtp.
- Bot detection in workflows: Check
type === "person" before routing assignment notifications. Skip bot users to avoid sending notifications to integration accounts.
- @mention content generation: Retrieve a user's name to construct an @mention string in a block body created by
block/appendChildren, attributing work items to specific team members.
- Assignee name display: Enrich a workflow notification or report with the human-readable name of a Notion user, rather than displaying a raw UUID string to end users.
Configuration
Authentication
| Field | Required | Description |
AuthenticationMethod | Required | "ApiToken" or "OAuth2". |
ApiToken | Required | Notion Internal Integration Token starting with secret_. |
ClientId | OAuth2 | OAuth2 client ID. |
ClientSecret | OAuth2 | OAuth2 client secret. |
AccessToken | OAuth2 | OAuth2 access token. |
Operation Fields
| Field | Required | Description |
User | Required | Notion user UUID. Typically obtained from a people property value on a page: properties.Assignee.people[0].id. |
Sample Configuration
{
"resource": "user",
"operation": "get",
"AuthenticationMethod": "ApiToken",
"ApiToken": "{{ $credentials.notionApiToken }}",
"User": "{{ $json.assigneeUserId }}"
}
Validation Errors
| Error Code | Cause |
NOTION_VALIDATION_FAILED | User field is empty or not a valid UUID. |
NOTION_NOT_FOUND | No user exists with the given UUID in the workspace. |
NOTION_UNAUTHORIZED | API token is invalid or does not have user read access. |
NOTION_RATE_LIMITED | Rate limit exceeded. |
Output
Success Port
| Field | Type | Description |
id | string | User UUID. |
name | string | Display name of the user. |
email | string | Email address. Only returned for type: "person" users with an active account. May be null for guest users. |
avatarUrl | string | URL to the user's profile image. May be null if no avatar is set. |
type | string | "person" for human users; "bot" for integration accounts. |
Error Port
On failure the error port receives errorCode, message, and httpStatus. Handle NOTION_NOT_FOUND when user IDs come from page properties that may reference deactivated accounts.
Sample Output
{
"id": "a1b2c3d4-1111-2222-3333-e5f678901234",
"name": "Sarah Chen",
"email": "sarah.chen@acmecorp.com",
"avatarUrl": "https://s3.us-west-2.amazonaws.com/secure.notion-static.com/avatars/abc123.jpg",
"type": "person"
}
Expression Reference
| Expression | Type | Use |
{{ $output.getUser.email }} | string | Route notifications — use as EmailSmtp recipient |
{{ $output.getUser.name }} | string | Include display name in message body |
{{ $output.getUser.type }} | string | Filter: only notify if type === "person" |
{{ $output.getUser.avatarUrl }} | string | Display avatar in a rich UI notification |
{{ $output.getUser.id }} | string | Use as assignee filter in database/query people filter |
Node Policies & GuardRails
| Policy | Detail |
| Check type before routing | Always verify type === "person" before using the email field for notifications. Bot users do not have email addresses, and attempting to email a bot ID results in a null value. |
| Email may be null for guests | Notion guests (users invited to specific pages without full workspace access) may not expose an email address via the API. Use null-coalescing in expressions: {{ $output.getUser.email ?? "noemail@placeholder.com" }}. |
| User IDs from page properties | Obtain user IDs from a page's people property: properties.Assignee.people[0].id. Use an IfCondition to check people.length > 0 before passing the ID to user/get. |
| Credentials in Credentials Manager | Always use {{ $credentials.notionApiToken }} — never hard-code the token. |
| Cache user lookups in long workflows | If the same user ID appears multiple times across a loop, cache the resolved name/email in a workflow variable after the first lookup to avoid redundant API calls. |
Workflow Examples
Example 1 — Email Notification to Page Assignee
When a task is assigned (trigger fires), fetch the assignee's email and send them a notification.
// Step 1: trigger/pageAdded or trigger/pageUpdated
// Step 2: page/get { "Page": "{{ $trigger.pageId }}", "Simplify": false }
// Step 3: IfCondition — people array not empty
// Step 4: user/get
{
"User": "{{ $output.getPage.properties.Assignee.people[0].id }}"
}
// Step 5: EmailSmtp
{
"To": "{{ $output.getUser.email }}",
"Subject": "Task Assigned: {{ $output.getPage.properties.Name.title[0].plain_text }}",
"Body": "You have been assigned a new task. View it here: {{ $output.getPage.url }}"
}
Example 2 — Bot Filter Before Notification
Query tasks and notify only human assignees, skipping bot accounts.
// Step 1: database/query (filter by assignee people)
// Step 2: Loop over results
// Step 3 per item: user/get with assignee user ID
// Step 4: IfCondition — type === "person"
// True: send Slack or email notification
// False: skip (bot account)
Example 3 — Enrich Report with Assignee Name
Build a weekly task report that maps user IDs to human-readable names.
// Step 1: database/query (all open tasks)
// Step 2: Loop over results
// Step 3 per item: user/get for assignee
// Step 4: Build report row: title + assignee name + due date
// Step 5: Assemble all rows into report body
// Step 6: EmailSmtp weekly digest to manager