backup: ARR Bridge Dashboard [2026-11-05]

This commit is contained in:
moonside committed 2026-11-05 05:01:17 +00:00
1 parent cfcfb14c0b
commit 142dfd1a51
1 file changed
+145 -144
@@ -2,19 +2,14 @@
"id": "IoB5hSnp2Y9zN6ex",
"name": "ARR Bridge Dashboard",
"active": true,
"activeVersionId": "7cce3bfd-1ef3-4bc7-bdc6-23943eabca20",
"activeVersionId": "80616114-fa44-4a1b-9179-dea2447c9e2a",
"createdAt": "2026-10-30T16:11:09.869Z",
"updatedAt": "2026-10-30T16:50:10.497Z",
"updatedAt": "2026-11-04T15:48:08.595Z",
"isArchived": false,
"versionId": "7cce3bfd-1ef3-4bc7-bdc6-23943eabca20",
"versionId": "80616114-fa44-4a1b-9179-dea2447c9e2a",
"triggerCount": 1,
"nodes": [
{
"parameters": {
"content": "## ARR Bridge Dashboard\nFeed for arr-bridge-dashboard.html.\n- GET ?token=… returns the latest saved snapshot of the Customer Cube `toN8N` tab (summary + customer detail) as JSON.\n- The snapshot lives in `arr_bridge_cache` and is written by the **ARR Bridge Loader** workflow. Until the loader has run once the webhook answers 'No snapshot saved yet'.\nThe token is checked in 'Check token' and must match arr-bridge-dashboard.config.js.",
"height": 180,
"width": 420
},
"id": "9d950c9d-55c3-43d7-a44d-5be37f678311",
"name": "Note",
"type": "n8n-nodes-base.stickyNote",
@@ -22,16 +17,14 @@
"position": [
592,
-288
]
],
"parameters": {
"content": "## ARR Bridge Dashboard\nFeed for arr-bridge-dashboard.html.\n- GET ?token=… returns the latest saved snapshot of the Customer Cube `toN8N` tab (summary + customer detail) as JSON.\n- The snapshot lives in `arr_bridge_cache` and is written by the **ARR Bridge Loader** workflow. Until the loader has run once the webhook answers 'No snapshot saved yet'.\nThe token is checked in 'Check token' and must match arr-bridge-dashboard.config.js.",
"width": 420,
"height": 180
}
},
{
"parameters": {
"path": "arr-bridge",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"id": "808d87e6-5dff-4148-9129-578aa22db3d5",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
@@ -40,9 +33,24 @@
368,
32
],
"parameters": {
"path": "arr-bridge",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"webhookId": "arr-bridge"
},
{
"id": "a1c099b6-e79e-4eeb-9d39-539b2f28dc64",
"name": "Check token",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
592,
32
],
"parameters": {
"conditions": {
"options": {
@@ -65,47 +73,9 @@
"combinator": "and"
},
"options": {}
},
"id": "a1c099b6-e79e-4eeb-9d39-539b2f28dc64",
"name": "Check token",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
592,
32
]
}
},
{
"parameters": {
"respondWith": "text",
"responseBody": "Unauthorized",
"options": {
"responseCode": 401,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
},
"id": "b9f5d26f-7089-4213-b694-8e39432726aa",
"name": "Respond Denied",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
592,
304
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "CREATE TABLE IF NOT EXISTS arr_bridge_cache (id text PRIMARY KEY, fetched_at timestamptz NOT NULL DEFAULT now(), payload jsonb NOT NULL)",
"options": {}
},
"id": "f7562b1b-989f-424a-8334-c71d8a271509",
"name": "Ensure cache table",
"type": "n8n-nodes-base.postgres",
@@ -114,20 +84,20 @@
832,
32
],
"alwaysOutputData": true,
"parameters": {
"operation": "executeQuery",
"query": "CREATE TABLE IF NOT EXISTS arr_bridge_cache (id text PRIMARY KEY, fetched_at timestamptz NOT NULL DEFAULT now(), payload jsonb NOT NULL)",
"options": {}
},
"credentials": {
"postgres": {
"id": "NoPrLWbqySMMmIaI",
"name": "Postgres n8n-quickbooks"
}
}
},
"alwaysOutputData": true
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT payload || jsonb_build_object('cache', jsonb_build_object('hit', true, 'age_s', EXTRACT(EPOCH FROM (now() - fetched_at))::int, 'fetched_at', fetched_at)) AS body\nFROM arr_bridge_cache\nWHERE id = 'toN8N'",
"options": {}
},
"id": "aa8b8078-72dd-4d31-b328-5085fc2ee86e",
"name": "Postgres Snapshot",
"type": "n8n-nodes-base.postgres",
@@ -136,15 +106,28 @@
1072,
32
],
"alwaysOutputData": true,
"parameters": {
"operation": "executeQuery",
"query": "SELECT payload || jsonb_build_object('cache', jsonb_build_object('hit', true, 'age_s', EXTRACT(EPOCH FROM (now() - fetched_at))::int, 'fetched_at', fetched_at)) AS body\nFROM arr_bridge_cache\nWHERE id = 'toN8N'",
"options": {}
},
"credentials": {
"postgres": {
"id": "NoPrLWbqySMMmIaI",
"name": "Postgres n8n-quickbooks"
}
}
},
"alwaysOutputData": true
},
{
"id": "bc5dac15-1ce0-47ab-aa12-bdab7bd3333d",
"name": "Respond Snapshot",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
1312,
32
],
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.body || { ok: false, error: 'No snapshot saved yet. Run the ARR Bridge Loader once.' }) }}",
@@ -162,15 +145,32 @@
]
}
}
},
"id": "bc5dac15-1ce0-47ab-aa12-bdab7bd3333d",
"name": "Respond Snapshot",
}
},
{
"id": "b9f5d26f-7089-4213-b694-8e39432726aa",
"name": "Respond Denied",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
1312,
32
]
592,
304
],
"parameters": {
"respondWith": "text",
"responseBody": "Unauthorized",
"options": {
"responseCode": 401,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
}
}
],
"connections": {
@@ -229,7 +229,8 @@
"nodeGroups": [],
"settings": {
"executionOrder": "v1",
"binaryMode": "separate"
"binaryMode": "separate",
"errorWorkflow": "tJSgL4iy63ys2NCA"
},
"staticData": null,
"pinData": {},
@@ -245,15 +246,10 @@
}
],
"activeVersion": {
"versionId": "7cce3bfd-1ef3-4bc7-bdc6-23943eabca20",
"versionId": "80616114-fa44-4a1b-9179-dea2447c9e2a",
"workflowId": "IoB5hSnp2Y9zN6ex",
"nodes": [
{
"parameters": {
"content": "## ARR Bridge Dashboard\nFeed for arr-bridge-dashboard.html.\n- GET ?token=… returns the latest saved snapshot of the Customer Cube `toN8N` tab (summary + customer detail) as JSON.\n- The snapshot lives in `arr_bridge_cache` and is written by the **ARR Bridge Loader** workflow. Until the loader has run once the webhook answers 'No snapshot saved yet'.\nThe token is checked in 'Check token' and must match arr-bridge-dashboard.config.js.",
"height": 180,
"width": 420
},
"id": "9d950c9d-55c3-43d7-a44d-5be37f678311",
"name": "Note",
"type": "n8n-nodes-base.stickyNote",
@@ -261,16 +257,14 @@
"position": [
592,
-288
]
],
"parameters": {
"content": "## ARR Bridge Dashboard\nFeed for arr-bridge-dashboard.html.\n- GET ?token=… returns the latest saved snapshot of the Customer Cube `toN8N` tab (summary + customer detail) as JSON.\n- The snapshot lives in `arr_bridge_cache` and is written by the **ARR Bridge Loader** workflow. Until the loader has run once the webhook answers 'No snapshot saved yet'.\nThe token is checked in 'Check token' and must match arr-bridge-dashboard.config.js.",
"width": 420,
"height": 180
}
},
{
"parameters": {
"path": "arr-bridge",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"id": "808d87e6-5dff-4148-9129-578aa22db3d5",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
@@ -279,9 +273,24 @@
368,
32
],
"parameters": {
"path": "arr-bridge",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"webhookId": "arr-bridge"
},
{
"id": "a1c099b6-e79e-4eeb-9d39-539b2f28dc64",
"name": "Check token",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
592,
32
],
"parameters": {
"conditions": {
"options": {
@@ -304,47 +313,9 @@
"combinator": "and"
},
"options": {}
},
"id": "a1c099b6-e79e-4eeb-9d39-539b2f28dc64",
"name": "Check token",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
592,
32
]
}
},
{
"parameters": {
"respondWith": "text",
"responseBody": "Unauthorized",
"options": {
"responseCode": 401,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
},
"id": "b9f5d26f-7089-4213-b694-8e39432726aa",
"name": "Respond Denied",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
592,
304
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "CREATE TABLE IF NOT EXISTS arr_bridge_cache (id text PRIMARY KEY, fetched_at timestamptz NOT NULL DEFAULT now(), payload jsonb NOT NULL)",
"options": {}
},
"id": "f7562b1b-989f-424a-8334-c71d8a271509",
"name": "Ensure cache table",
"type": "n8n-nodes-base.postgres",
@@ -353,20 +324,20 @@
832,
32
],
"alwaysOutputData": true,
"parameters": {
"operation": "executeQuery",
"query": "CREATE TABLE IF NOT EXISTS arr_bridge_cache (id text PRIMARY KEY, fetched_at timestamptz NOT NULL DEFAULT now(), payload jsonb NOT NULL)",
"options": {}
},
"credentials": {
"postgres": {
"id": "NoPrLWbqySMMmIaI",
"name": "Postgres n8n-quickbooks"
}
}
},
"alwaysOutputData": true
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT payload || jsonb_build_object('cache', jsonb_build_object('hit', true, 'age_s', EXTRACT(EPOCH FROM (now() - fetched_at))::int, 'fetched_at', fetched_at)) AS body\nFROM arr_bridge_cache\nWHERE id = 'toN8N'",
"options": {}
},
"id": "aa8b8078-72dd-4d31-b328-5085fc2ee86e",
"name": "Postgres Snapshot",
"type": "n8n-nodes-base.postgres",
@@ -375,15 +346,28 @@
1072,
32
],
"alwaysOutputData": true,
"parameters": {
"operation": "executeQuery",
"query": "SELECT payload || jsonb_build_object('cache', jsonb_build_object('hit', true, 'age_s', EXTRACT(EPOCH FROM (now() - fetched_at))::int, 'fetched_at', fetched_at)) AS body\nFROM arr_bridge_cache\nWHERE id = 'toN8N'",
"options": {}
},
"credentials": {
"postgres": {
"id": "NoPrLWbqySMMmIaI",
"name": "Postgres n8n-quickbooks"
}
}
},
"alwaysOutputData": true
},
{
"id": "bc5dac15-1ce0-47ab-aa12-bdab7bd3333d",
"name": "Respond Snapshot",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
1312,
32
],
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.body || { ok: false, error: 'No snapshot saved yet. Run the ARR Bridge Loader once.' }) }}",
@@ -401,15 +385,32 @@
]
}
}
},
"id": "bc5dac15-1ce0-47ab-aa12-bdab7bd3333d",
"name": "Respond Snapshot",
}
},
{
"id": "b9f5d26f-7089-4213-b694-8e39432726aa",
"name": "Respond Denied",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
1312,
32
]
592,
304
],
"parameters": {
"respondWith": "text",
"responseBody": "Unauthorized",
"options": {
"responseCode": 401,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
}
}
],
"connections": {
@@ -466,11 +467,11 @@
}
},
"nodeGroups": [],
"authors": "Michael Nolan",
"name": "Version 7cce3bfd",
"description": "",
"authors": "Michael Nolan (with n8n Assistant)",
"name": null,
"description": null,
"autosaved": false,
"createdAt": "2026-10-30T16:19:17.498Z",
"updatedAt": "2026-10-30T16:19:18.625Z"
"createdAt": "2026-11-04T15:48:08.600Z",
"updatedAt": "2026-11-04T15:48:08.600Z"
}
}