{ "nodes": [ { "name": "On clicking 'execute'", "type": "n8n-nodes-base.manualTrigger", "position": [ 200, 470 ], "parameters": {}, "typeVersion": 1, "id": "node-54ba8f7e" }, { "name": "HTTP Request", "type": "n8n-nodes-base.httpRequest", "position": [ 600, 470 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": {}, "queryParametersUi": { "parameter": [ { "name": "hapikey", "value": "" }, { "name": "limit", "value": "100" } ] } }, "typeVersion": 1, "id": "node-4962624b" }, { "name": "NoOp", "type": "n8n-nodes-base.noOp", "position": [ 800, 470 ], "parameters": {}, "typeVersion": 1, "id": "node-3abbf3c2" }, { "name": "Wait", "type": "n8n-nodes-base.function", "position": [ 1000, 470 ], "parameters": { "functionCode": "return new Promise((resolve, reject) => {\n setTimeout(() => { resolve([{ json: {} }]) }, 5000);\n })\n" }, "typeVersion": 1, "id": "node-30d0e54a" }, { "name": "Config URL", "type": "n8n-nodes-base.function", "position": [ 400, 470 ], "parameters": { "functionCode": "\nlet next = 'https://api.hubapi.com/crm/v3/objects/contacts'\n\nif (items[0].json.next) {\n next = items[0].json.next\n}\n\nreturn [\n {\n json: {\n next : next\n }\n }\n]" }, "typeVersion": 1, "id": "node-bd8e5aba" }, { "name": "Check if pagination?", "type": "n8n-nodes-base.if", "position": [ 1250, 470 ], "parameters": { "conditions": { "string": [], "boolean": [ { "value1": "={{$node[\"HTTP Request\"].json[\"paging\"] ? true : false}}", "value2": true } ] } }, "typeVersion": 1, "id": "node-e04cba72" }, { "name": "Set next URL", "type": "n8n-nodes-base.set", "position": [ 890, 210 ], "parameters": { "values": { "string": [ { "name": "next", "value": "={{$node[\"HTTP Request\"].json[\"paging\"][\"next\"][\"link\"]}}" } ] }, "options": {}, "keepOnlySet": true }, "executeOnce": true, "typeVersion": 1, "id": "node-7becf9ef" }, { "name": "Combine all data", "type": "n8n-nodes-base.function", "position": [ 1500, 560 ], "parameters": { "functionCode": "const allData = []\n\nlet counter = 0;\ndo {\n try {\n const items = $items(\"HTTP Request\", 0, counter).map(item => item.json.results);\n \n const aja = items[0].map(item => {\n return { json: item }\n }) \n \n allData.push.apply(allData, aja);\n //allData.push($items(\"Increment\", 0, counter));\n } catch (error) {\n return allData; \n }\n\n counter++;\n} while(true);\n\n" }, "typeVersion": 1, "id": "node-595a335c" }, { "id": "error-6ec0d0b5", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "connections": {}, "name": "Production Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3 }, "meta": { "instanceId": "workflow-4ce5740c", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:48.574719", "updatedAt": "2025-09-29T07:07:48.574736", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "description": "Production-ready workflow: Production Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }