Portal Community
Polling-based trigger: Notion does not natively push webhooks for new database records. This trigger polls the database using database/query internally, comparing new created_time values against the cursor stored from the last poll. The minimum polling resolution is determined by your workflow's polling interval setting.

When to Use

Configuration

Authentication

FieldRequiredDescription
AuthenticationMethodRequired"ApiToken" or "OAuth2".
ApiTokenRequiredNotion Internal Integration Token starting with secret_.
ClientIdOAuth2OAuth2 client ID.
ClientSecretOAuth2OAuth2 client secret.
AccessTokenOAuth2OAuth2 access token.

Trigger Fields

FieldRequiredDescription
DatabaseRequiredUUID of the database to monitor for new pages.
PollingIntervalOptionalCron expression for the polling schedule. Example: "*/5 * * * *" (every 5 minutes). Default: every minute.
Polling latency: This trigger checks the database on a schedule — it is not real-time. With a 1-minute polling interval, a new page may not trigger the workflow for up to 60 seconds after it appears in Notion. Reduce the interval for time-sensitive use cases, but note that more frequent polling consumes more API quota against the 3 req/s limit.

Sample Configuration

{
  "resource": "trigger",
  "operation": "pageAdded",
  "AuthenticationMethod": "ApiToken",
  "ApiToken": "{{ $credentials.notionApiToken }}",
  "Database": "{{ $vars.submissionsDatabaseId }}",
  "PollingInterval": "*/2 * * * *"
}

Validation Errors

Error CodeCause
NOTION_VALIDATION_FAILEDDatabase field is empty or not a valid UUID.
NOTION_PERMISSION_DENIEDIntegration not shared with the target database.
NOTION_NOT_FOUNDDatabase UUID does not exist.
NOTION_UNAUTHORIZEDAPI token is invalid.
NOTION_RATE_LIMITEDPolling too frequently or database is large. Increase the polling interval.

Output

Trigger Output (per new page)

FieldTypeDescription
idstringUUID of the new page.
urlstringNotion URL for the new page.
created_timestringISO 8601 timestamp when the page was created.
last_edited_timestringISO 8601 timestamp of last edit at trigger time.
propertiesobjectAll property values of the new page in Notion property object format.
parentobjectParent database reference containing database_id.

Error Port

On poll failure the error port receives errorCode, message, and httpStatus. Wire to a notification node to alert on persistent authentication or permission failures.

Sample Output

{
  "id": "e5f6a7b8-c9d0-1234-efab-345678901234",
  "url": "https://www.notion.so/e5f6a7b8c9d01234efab345678901234",
  "created_time": "2024-06-11T10:45:00.000Z",
  "last_edited_time": "2024-06-11T10:45:00.000Z",
  "properties": {
    "Name": {
      "type": "title",
      "title": [{ "plain_text": "New Support Request: Login Issue" }]
    },
    "Status": {
      "type": "select",
      "select": { "name": "Open" }
    },
    "Email": {
      "type": "email",
      "email": "customer@example.com"
    },
    "Priority": {
      "type": "select",
      "select": { "name": "High" }
    }
  },
  "parent": {
    "type": "database_id",
    "database_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}

Expression Reference

ExpressionTypeUse
{{ $trigger.id }}stringNew page UUID — pass to page/update or block/appendChildren
{{ $trigger.properties.Name.title[0].plain_text }}stringExtract page title for notifications
{{ $trigger.properties.Status.select.name }}stringRead initial status for workflow routing
{{ $trigger.created_time }}stringLog or display the record creation time
{{ $trigger.url }}stringInclude in notification messages as a direct link

Node Policies & GuardRails

PolicyDetail
Polling is not real-timeMinimum latency equals the polling interval. For latency-sensitive workflows, set the interval to 1 minute (the minimum). For non-urgent processing (e.g., end-of-day batch), use a longer interval to conserve API quota.
Each new page = one executionThe trigger fires one workflow execution per new page found in a single poll. If 10 new pages appear between polls, 10 executions start in parallel. Design downstream logic to handle parallel executions safely.
Cursor persistenceThe trigger stores the last-seen page cursor between polls. If the workflow is restarted or redeployed, new pages created during the downtime will be detected on the first poll after restart.
Rate limit awarenessEach poll uses one API call. At 1-minute intervals, this is 60 calls/hour — well within limits for a single integration. At 30-second intervals with a large database, watch for rate limiting.
Credentials in Credentials ManagerAlways use {{ $credentials.notionApiToken }} — never hard-code the token.

Workflow Examples

Example 1 — New Support Ticket Routing

When a support request is added to the Notion support database, route it by priority to the appropriate Slack channel.

// Trigger: trigger/pageAdded (Support Requests DB)
// Step 1: IfCondition
// Condition: {{ $trigger.properties.Priority.select.name }} === "High"
// True: Slack #p1-support channel
// False: Slack #general-support channel

// Slack message:
{
  "text": "New support ticket: {{ $trigger.properties.Name.title[0].plain_text }}\nEmail: {{ $trigger.properties.Email.email }}\n{{ $trigger.url }}"
}

Example 2 — New Employee Onboarding Kickoff

Trigger an onboarding workflow when HR adds a new employee record to the Notion HR database.

// Trigger: trigger/pageAdded (HR Employees DB)
// Step 1: user/getMany — build manager lookup map
// Step 2: EmailSmtp — welcome email to new employee
// Step 3: Jira issue/create — provision access request ticket
// Step 4: page/update — set Status to "Onboarding In Progress"

Example 3 — Notion-to-CRM Sync on New Record

Each new CRM contact added to Notion is synced to an external CRM system after deduplication.

// Trigger: trigger/pageAdded (Contacts DB)
// Step 1: HttpRequest — check if email already exists in CRM
// Step 2: IfCondition — exists in CRM?
// False: HttpRequest POST → create contact in CRM
//        page/update → set NotionSynced = true
// True: log duplicate and stop