How to Test Notion Webhooks
Set up Notion webhook listeners for database page events and capture real API payloads before your integration goes live.
TL;DR: Get a free URL from requex.me, create a Notion integration at developers.notion.com, add a webhook listener pointing to your Requex URL, and add or update a database page. The event payload appears in Requex — no server deployment required.
Notion Webhooks — What You Need to Know
Notion's webhook feature is managed through the Notion Developer Portal (developers.notion.com). You create an integration, add a webhook listener to it, and Notion sends events to your endpoint whenever pages or databases change — as long as the integration has been connected to those pages.
Note: Notion's Webhooks API was released in beta. The setup flow and available event types may evolve. Always check the official Notion developer docs for the current event catalog.
What Events Notion Sends
| Event | Trigger | Use Case |
|---|---|---|
page.created | A new page is created in a connected workspace | CRM sync, task creation in external tools |
page.updated | Page properties or parent changed | Status sync, downstream automation triggers |
page.content_updated | Page body content changed | Document version tracking, notifications |
database.created | A new database is created (beta) | Workspace provisioning, auditing |
Step 1 — Generate a Requex Endpoint
Open requex.me and copy your unique URL:
https://requex.me/hook/a1b2c3d4-e5f6-7890-abcd-ef1234567890
Keep the Requex tab open so you can see requests arrive in real time.
Step 2 — Configure Notion Webhook
- Go to developers.notion.com and sign in with your Notion account.
- Click My integrations and either create a new integration or open an existing one.
- Inside your integration, look for the Webhooks section (may be listed as "Webhook listeners" or under a Configuration tab).
- Click Add webhook or New listener and paste your Requex URL into the endpoint URL field.
- Select the event types you want to receive. Start with
page.createdandpage.updatedfor the most common use cases. - Save the webhook. Notion may send a verification request — Requex handles this automatically with a 200 response.
- Connect the integration to a Notion page or database: in Notion, open the page, click the three-dot menu → Add connections → select your integration. Notion will only send events for pages the integration has access to.
Step 3 — Trigger a Test Event
In a database connected to your integration, click New to create a row. Notion fires the page.created event. Switch back to Requex — the payload should appear within a few seconds.
To test page.updated, change a property value on the row — for example, switch a status field from "Not started" to "In progress". Notion fires one event for the property change.
Step 4 — Inspect the Payload
In Requex, click the incoming request. A Notion webhook payload looks like:
{
"id": "evt_01abc123def456",
"type": "page.created",
"created_time": "2026-04-05T12:00:00.000Z",
"workspace_id": "wsp_abc123",
"workspace_name": "My Workspace",
"subscription_id": "sub_xyz789",
"integration_id": "int_def456",
"data": {
"object": "event",
"id": "evt_01abc123def456",
"type": "page.created",
"entity": {
"id": "page_abc123",
"type": "page"
},
"parent": {
"id": "db_xyz789",
"type": "database"
},
"authors": [
{ "id": "user_abc", "type": "person" }
],
"timestamp": "2026-04-05T12:00:00.000Z"
}
}Notice that the payload contains the page ID and parent database ID, but not the full page content. To retrieve the page properties, call the Notion API: GET /v1/pages/{entity.id}. This is a common pattern in Notion integrations — the webhook notifies you, then you fetch the full object.
Handling Notion Webhooks in Your Integration
Here is a basic Node.js handler that processes Notion webhook events:
const express = require('express');
const { Client } = require('@notionhq/client');
const notion = new Client({ auth: process.env.NOTION_TOKEN });
const app = express();
app.post('/webhooks/notion', express.json(), async (req, res) => {
// Respond 200 immediately to prevent Notion from retrying
res.sendStatus(200);
const { type, data } = req.body;
const pageId = data?.entity?.id;
if (!pageId) return;
try {
if (type === 'page.created' || type === 'page.updated') {
// Fetch the full page from the Notion API
const page = await notion.pages.retrieve({ page_id: pageId });
const title = page.properties?.Name?.title?.[0]?.plain_text ?? 'Untitled';
console.log(`Page ${type}: "${title}" (${pageId})`);
// Sync to your database, send a Slack message, etc.
}
} catch (err) {
console.error('Failed to fetch Notion page:', err.message);
}
});Common Issues
| Problem | Cause | Fix |
|---|---|---|
| No events arriving for changes to a page | Integration not connected to that page | Open the page in Notion → three-dot menu → Add connections → select your integration |
| Events arrive but fetching the page returns 404 | Integration doesn't have read access to the page | Re-share the page with the integration; check integration capabilities include "Read content" |
| Duplicate events for one change | Multiple event types subscribed; page and content events fire separately | Deduplicate by id field or filter to only the event types your integration needs |
Test Notion Webhooks Free
Capture real Notion database page events and inspect every field. No signup required.
Open Requex →Related guides
Start Testing Webhooks Now
Generate your unique URL and test webhooks instantly. Free, no signup.
Open Webhook Tester →