{"id":"qmmXKcpJOCm9qaCk","meta":{"instanceId":"workflow-83adbb52","versionId":"1.0.0","createdAt":"2025-09-29T07:07:43.865811","updatedAt":"2025-09-29T07:07:43.865870","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"name":"SERPBear analytics template","nodes":[{"id":"2ad0eb40-6628-4c6b-bc15-7081e7712f1a","name":"When clicking ‘Test workflow’","type":"n8n-nodes-base.manualTrigger","position":[260,380],"parameters":{},"typeVersion":1,"notes":"This manualTrigger node performs automated tasks as part of the workflow."},{"id":"5a3c9ad8-a562-4bb0-bb11-c325552d8101","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[260,160],"parameters":{"rule":{"interval":[{"field":"weeks"}]}},"typeVersion":1.2,"notes":"This scheduleTrigger node performs automated tasks as part of the workflow."},{"id":"bdfa7388-f9b3-4145-90de-2e58138e14bf","name":"Get data from SerpBear","type":"n8n-nodes-base.httpRequest","position":[580,260],"parameters":{"url":"{{ $env.API_BASE_URL }}","options":{},"sendQuery":true,"authentication":"{{ $credentials.genericCredentialType }}","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"domain","value":"rumjahn.com"}]}},"credentials":{"httpHeaderAuth":{"id":"3fshHb4fyI5XfLyq","name":"Header Auth account 6"}},"executeOnce":false,"typeVersion":4.2,"alwaysOutputData":false,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"c169f4e3-ab60-4b46-9f49-cf27a13dd7c6","name":"Parse data from SerpBear","type":"n8n-nodes-base.code","position":[820,260],"parameters":{"jsCode":"const keywords = items[0].json.keywords;\nconst today = new Date().toISOString().split('T')[0];\n\n// Create summary for each keyword\nconst keywordSummaries = keywords.map(kw => {\n  const position = kw.position || 0;\n  const lastWeekPositions = Object.values(kw.history || {}).slice(-7);\n  const avgPosition = lastWeekPositions.reduce((a, b) => a + b, 0) / lastWeekPositions.length;\n  \n  return {\n    keyword: kw.keyword,\n    currentPosition: position,\n    averagePosition: Math.round(avgPosition * 10) / 10,\n    trend: position < avgPosition ? 'improving' : position > avgPosition ? 'declining' : 'stable',\n    url: kw.url || 'not ranking'\n  };\n});\n\n// Create the prompt\nconst prompt = `Here's the SEO ranking data for rumjahn.com as of ${today}:\n\n${keywordSummaries.map(kw => `\nKeyword: \"${kw.keyword}\"\nCurrent Position: ${kw.currentPosition}\n7-Day Average: ${kw.averagePosition}\nTrend: ${kw.trend}\nRanking URL: ${kw.url}\n`).join('\\n')}\n\nPlease analyze this data and provide:\n1. Key observations about ranking performance\n2. Keywords showing the most improvement\n3. Keywords needing attention\n4. Suggested actions for improvement`;\n\nreturn {\n  prompt\n};"},"typeVersion":2,"notes":"This code node performs automated tasks as part of the workflow."},{"id":"cc6e16a7-db46-42fe-837a-59ce635c906c","name":"Send data to A.I. for analysis","type":"n8n-nodes-base.httpRequest","position":[1060,260],"parameters":{"url":"{{ $env.API_BASE_URL }}","method":"POST","options":{},"jsonBody":"={\n  \"model\": \"meta-llama/llama-3.1-70b-instruct:free\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"You are an SEO expert. This is keyword data for my site. Can you summarize the data into a table and then give me some suggestions:{{ encodeURIComponent($json.prompt)}}\" \n    }\n  ]\n}","sendBody":true,"specifyBody":"json","authentication":"{{ $credentials.genericCredentialType }}","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"WY7UkF14ksPKq3S8","name":"Header Auth account 2"}},"typeVersion":4.2,"alwaysOutputData":false,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"a623f06c-1dfe-4d04-a7fd-fed7049a7588","name":"Save data to Baserow","type":"n8n-nodes-base.baserow","position":[1340,260],"parameters":{"tableId":644,"fieldsUi":{"fieldValues":[{"fieldId":6264,"fieldValue":"={{ DateTime.now().toFormat('yyyy-MM-dd') }}"},{"fieldId":6265,"fieldValue":"={{ $json.choices[0].message.content }}"},{"fieldId":6266,"fieldValue":"Rumjahn"}]},"operation":"create","databaseId":121},"credentials":{"baserowApi":{"id":"8w0zXhycIfCAgja3","name":"Baserow account"}},"typeVersion":1,"notes":"This baserow node performs automated tasks as part of the workflow."},{"id":"e8048faf-bbed-4e48-b273-d1a50a767e76","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[220,-360],"parameters":{"color":5,"width":614.709677419355,"height":208.51612903225802,"content":"## Send Matomo analytics to A.I. and save results to baserow\n\nThis workflow will check the Google keywords for your site and it's rank.\n\n[💡 You can read more about this workflow here]({{ $env.WEBHOOK_URL }}"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"1a18e685-79db-423f-992a-5e0d4ddeb672","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[520,-80],"parameters":{"width":214.75050403225822,"height":531.7318548387107,"content":"## Get SERPBear Data\n \n1. Enter your SerpBear API keys and URL. You need to find your website ID which is probably 1.\n2. Navigate to Administration > Personal > Security > Auth tokens within your Matomo dashboard. Click on Create new token and provide a purpose for reference."},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"99895baf-75d0-4af2-87de-5b8951186e78","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[980,-60],"parameters":{"color":3,"width":225.99936321742769,"height":508.95792207792226,"content":"## Send data to A.I.\n\nFill in your Openrouter A.I. credentials. Use Header Auth.\n- Username: Authorization\n- Password: Bearer {insert your API key}\n\nRemember to add a space after bearer. Also, feel free to modify the prompt to A.1."},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"07d03511-98b0-4f4a-8e68-96ca177fb246","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1240,-40],"parameters":{"color":6,"width":331.32883116883124,"height":474.88,"content":"## Send data to Baserow\n\nCreate a table first with the following columns:\n- Date\n- Note\n- Blog\n\nEnter the name of your website under \"Blog\" field."},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."}],"active":false,"settings":{"executionOrder":"v1","saveManualExecutions":true,"callerPolicy":"workflowsFromSameOwner","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3,"retryDelay":1000},"versionId":"8b7e7da7-1965-4ca4-8e15-889eda819723","connections":{"Get data from SerpBear":{"main":[[],[],[],[],[],[],[],[],[]]},"Send data to A.I. for analysis":{"main":[[],[],[],[],[],[],[],[],[]]}},"description":"Automated workflow: SERPBear analytics template. This workflow integrates 7 different services: stickyNote, httpRequest, code, scheduleTrigger, stopAndError. It contains 14 nodes and follows best practices for error handling and security.","notes":"Excellent quality workflow: SERPBear analytics template. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}