The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "n8nCal \u00b7 /reminders",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "n8ncal/reminders",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-700,
0
],
"id": "a67f0284-937b-49af-bc68-9553b575e919",
"name": "Webhook \u00b7 /reminders"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "auth",
"leftValue": "={{ $json.headers['x-n8ncal-token'] }}",
"rightValue": "={{ $env.N8NCAL_TOKEN }}",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-480,
0
],
"id": "d2addedb-c16d-4a4d-a3ca-155f310e8131",
"name": "Auth check"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={\n \"error\": \"unauthorized\"\n}",
"options": {
"responseCode": 401
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
-260,
200
],
"id": "9fb97591-0e08-4c3c-b6a9-94006ed46e5a",
"name": "Respond 401"
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || {};\nconst validStatus = ['pending', 'fired', 'done', 'cancelled'];\nconst status = validStatus.includes(body.status) ? body.status : 'pending';\nconst tenant = body.tenant_id || 'default';\nconst limit = Math.min(Math.max(parseInt(body.limit) || 50, 1), 200);\n\nreturn [{ json: { status, tenant_id: tenant, limit } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-260,
0
],
"id": "cbfbc3ce-2d0c-420d-9fd2-cedb259d02fa",
"name": "Parse filters"
},
{
"parameters": {
"operation": "getAll",
"tableId": "n8ncal_reminders",
"returnAll": false,
"limit": "={{ $json.limit }}",
"filters": {
"conditions": [
{
"keyName": "status",
"condition": "eq",
"keyValue": "={{ $json.status }}"
},
{
"keyName": "tenant_id",
"condition": "eq",
"keyValue": "={{ $json.tenant_id }}"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
-40,
0
],
"id": "1de60a01-afb3-43d5-b6d6-80678edaffef",
"name": "Supabase \u00b7 select",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Compact + sort. Frontend formats due_at with user's timezone.\nconst rows = items.map(i => i.json);\nrows.sort((a, b) => new Date(a.due_at) - new Date(b.due_at));\n\nreturn rows.map(r => ({\n json: {\n id: r.id,\n text: r.text,\n due_at: r.due_at,\n priority: r.priority,\n source: r.source,\n status: r.status,\n notify_channel: r.notify_channel,\n created_at: r.created_at\n }\n}));"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
180,
0
],
"id": "46039fa9-c3ed-4902-889f-62a1f71769f5",
"name": "Compact & sort"
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"destinationFieldName": "reminders",
"options": {}
},
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
400,
0
],
"id": "f7cd0261-1bc4-4142-92a5-e8dd7902bd6a",
"name": "Roll up"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "rs",
"name": "reminders",
"value": "={{ $json.reminders }}",
"type": "array"
},
{
"id": "ts",
"name": "ts",
"value": "={{ $now.toISO() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
620,
0
],
"id": "8d97a3e2-86af-4877-9d2f-604f4739a9d5",
"name": "Shape response"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
840,
0
],
"id": "02ede653-6f9d-44d9-b6d4-8a63ca22f13a",
"name": "Respond"
}
],
"connections": {
"Webhook \u00b7 /reminders": {
"main": [
[
{
"node": "Auth check",
"type": "main",
"index": 0
}
]
]
},
"Auth check": {
"main": [
[
{
"node": "Parse filters",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond 401",
"type": "main",
"index": 0
}
]
]
},
"Parse filters": {
"main": [
[
{
"node": "Supabase \u00b7 select",
"type": "main",
"index": 0
}
]
]
},
"Supabase \u00b7 select": {
"main": [
[
{
"node": "Compact & sort",
"type": "main",
"index": 0
}
]
]
},
"Compact & sort": {
"main": [
[
{
"node": "Roll up",
"type": "main",
"index": 0
}
]
]
},
"Roll up": {
"main": [
[
{
"node": "Shape response",
"type": "main",
"index": 0
}
]
]
},
"Shape response": {
"main": [
[
{
"node": "Respond",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"tags": [
{
"name": "n8nCal"
}
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
supabaseApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
n8nCal · /reminders. Uses supabase. Webhook trigger; 9 nodes.
Source: https://github.com/dasecure/n8ncal/blob/dd9a67e052fb7ba52c03770283ea1a95f0595fc2/workflows/09-reminders.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
webhook - simulador PDV (fluxo). Uses supabase. Webhook trigger; 55 nodes.
This workflow automates raw materials inventory management for businesses, eliminating manual stock updates, delayed material issue approvals, and missed low stock alerts. It ensures real-time stock t
Backend Erick. Uses supabase, n8n-nodes-evolution-api. Webhook trigger; 36 nodes.
2. Refresh Pipedrive tokens. Uses stopAndError, stickyNote, supabase, httpRequest. Webhook trigger; 29 nodes.
This workflow provides an OAuth 2.0 auth token refresh process for better control. Developers can utilize it as an alternative to n8n's built-in OAuth flow to achieve improved control and visibility.