database/createPage
Create a new row (page) in a Notion database with property values matching the database schema. Supports title, select, date, people, and other property types. Optionally include content blocks and a page icon at creation time.
When to Use
- Task creation from Jira webhook: When a Jira issue is created, create a corresponding row in a Notion sprint tracking database — mapping issue key, summary, assignee, and priority to Notion properties.
- CRM record on signup: When a new user signs up via a BizFirst Form or external webhook, create a customer record row in a Notion CRM database with name, email, signup date, and initial status.
- Support ticket logging: Route incoming support requests to a Notion support database as new rows. Include the ticket title, severity, and source in database properties for team visibility.
- Meeting notes from calendar: When a calendar event ends, create a meeting notes page in a database with the meeting title, date, and attendees pre-populated as properties.
- Product catalog updates: When an inventory system triggers a new product, create a database row with product name, SKU, category, and launch date mapped to Notion properties.
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 |
|---|---|---|
Database | Required | Target database UUID. The new page is created as a row in this database. |
Title | Optional | Shorthand for the title property. Sets the page's primary title text. Equivalent to setting Properties.Name.title. |
Properties | Optional | Object mapping database property names to property value objects. Must match the database schema. See property format examples below. |
Blocks | Optional | Array of block objects to add as page body content at creation time. |
Icon | Optional | Emoji character (e.g., "🚀") or external image URL to use as the page icon. |
Property type matching: Each property in
Properties must use the correct Notion property type key (select, date, people, etc.) matching the database schema. A type mismatch results in NOTION_CONFLICT. Use database/get to inspect the schema before building the properties object.
Sample Configuration
{
"resource": "database",
"operation": "createPage",
"AuthenticationMethod": "ApiToken",
"ApiToken": "{{ $credentials.notionApiToken }}",
"Database": "{{ $vars.taskDatabaseId }}",
"Properties": {
"Name": {
"title": [{ "text": { "content": "{{ $json.taskTitle }}" } }]
},
"Status": {
"select": { "name": "Backlog" }
},
"Due": {
"date": { "start": "{{ $json.dueDate }}" }
},
"Priority": {
"select": { "name": "{{ $json.priority }}" }
}
},
"Icon": "📋"
}
Validation Errors
| Error Code | Cause |
|---|---|
NOTION_VALIDATION_FAILED | Database field is empty or not a valid UUID. |
NOTION_CONFLICT | A property in Properties uses the wrong type key, or a select option name does not exist in the schema. |
NOTION_INVALID_REQUEST | Property structure is malformed — for example, title is not an array, or date.start is not a valid ISO 8601 date string. |
NOTION_PERMISSION_DENIED | Integration not shared with the target database. |
NOTION_NOT_FOUND | Database UUID does not exist. |
NOTION_RATE_LIMITED | Rate limit exceeded. In bulk-create loops, add a Delay node (400 ms) between iterations. |
Output
Success Port
| Field | Type | Description |
|---|---|---|
id | string | UUID of the newly created page. Store this for subsequent updates or block appends. |
url | string | Direct URL to the new page in Notion. |
created_time | string | ISO 8601 creation timestamp. |
properties | object | Full property values of the created page as returned by the API. |
parent | object | Parent reference — contains database_id equal to the Database input. |
Error Port
On failure the error port receives errorCode, message, and httpStatus. In bulk import loops, wire the error port to a logging node and continue the loop rather than aborting all remaining rows.
Sample Output
{
"id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"url": "https://www.notion.so/f6a7b8c9d0e12345fabc456789012345",
"created_time": "2024-06-11T10:22:00.000Z",
"properties": {
"Name": {
"type": "title",
"title": [{ "plain_text": "Build login page" }]
},
"Status": {
"type": "select",
"select": { "name": "Backlog" }
},
"Due": {
"type": "date",
"date": { "start": "2024-06-15" }
}
},
"parent": {
"type": "database_id",
"database_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Expression Reference
| Expression | Type | Use |
|---|---|---|
{{ $output.createDatabasePage.id }} | string | Store page ID for block/appendChildren or page/update calls |
{{ $output.createDatabasePage.url }} | string | Include in confirmation notification to the requester |
{{ $output.createDatabasePage.created_time }} | string | Log creation timestamp for audit trail |
{{ $output.createDatabasePage.properties.Name.title[0].plain_text }} | string | Echo back the title in a confirmation message |
Node Policies & GuardRails
| Policy | Detail |
|---|---|
| Inspect schema first | Before building the Properties object, call database/get to confirm property names and types. This is especially important for select properties where option names must exist in the schema. |
| Select options must pre-exist | When setting a select property, the option name must already exist in the database schema. Creating new options via the API requires a prior schema update — the create page operation does not auto-create options. |
| Store the returned ID | The id in the output is the only way to reference the new page in subsequent API calls. Store it in a workflow variable immediately after creation. |
| Rate limit in bulk loops | Creating many pages in a loop triggers rate limiting at 3 req/s. Add a Delay node (400 ms minimum) between iterations and handle errors with continue-on-error logic. |
| Credentials in Credentials Manager | Always use {{ $credentials.notionApiToken }} — never hard-code the token. |
| Idempotency | The Notion API has no built-in idempotency for page creation. Duplicate entries will be created on retry. Implement deduplication by querying for an existing record (e.g., matching on an external ID property) before creating. |
Workflow Examples
Example 1 — Create Notion Task from Jira Issue
A Jira webhook fires when a new issue is created. Map the Jira fields to Notion properties and create a mirrored row in the sprint tracking database.
// Step 1: WebhookTrigger (Jira issue created)
// Step 2: database/createPage
{
"Database": "{{ $vars.notionSprintDbId }}",
"Properties": {
"Name": { "title": [{ "text": { "content": "{{ $json.issue.fields.summary }}" } }] },
"Status": { "select": { "name": "Backlog" } },
"Priority": { "select": { "name": "{{ $json.issue.fields.priority.name }}" } },
"JiraKey": { "rich_text": [{ "text": { "content": "{{ $json.issue.key }}" } }] }
}
}
// Step 3: Log created page ID to Jira issue as a comment link
Example 2 — CRM Row on New Signup
BizFirst Form submission triggers a new customer record in the Notion CRM database.
// Step 1: FormTrigger
// Step 2: database/createPage
{
"Database": "{{ $vars.crmDbId }}",
"Properties": {
"Name": { "title": [{ "text": { "content": "{{ $json.fullName }}" } }] },
"Email": { "email": "{{ $json.email }}" },
"SignupDate": { "date": { "start": "{{ $now | date: 'YYYY-MM-DD' }}" } },
"Status": { "select": { "name": "New Lead" } }
},
"Icon": "👤"
}
Example 3 — Bulk Import with Error Tolerance
Import a list of records from a CSV. Log failures without stopping the import.
// Step 1: Read CSV data
// Step 2: Loop over rows
// Step 3 per row: database/createPage (error port → logging node, continue loop)
// Step 4: After loop — post import summary: total / success / failed counts