{
  "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",
  "tags": [
    "automation",
    "n8n",
    "production-ready",
    "excellent",
    "optimized"
  ],
  "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,
  "pinData": {},
  "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": {
    "bdfa7388-f9b3-4145-90de-2e58138e14bf": {
      "main": [
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-e029e24c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-278155ac",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-046183d2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-81c4853c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-0e97dc89",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-efdc15c9",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-4e70038a",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-bdfa7388-f9b3-4145-90de-2e58138e14bf-98919cd3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cc6e16a7-db46-42fe-837a-59ce635c906c": {
      "main": [
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-d7c9c6dc",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-d1323100",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-3f109f24",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-866b639a",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-3f38d590",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-72c17a40",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-0d9a1fac",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-cc6e16a7-db46-42fe-837a-59ce635c906c-d0a91252",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "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."
}