{ "kind": "open-flow-workflow", "version": 1, "name": "Matomo Repeat Visits SEO Report", "content": { "modelVersion": 14, "document": { "bindings": {}, "graph": { "nodes": { "n_d3341b9b412f6156": { "name": "Run report now", "kind": "start", "inputDefs": [] }, "n_5682f5ea42c61152": { "name": "Weekly on Sunday at 00:00 UTC", "kind": "cron", "cronTimes": [ { "type": "cron", "expression": "0 0 * * 0", "timezone": "UTC" } ] }, "n_1559f0822ac1ff01": { "inputs": { "url": { "kind": "value", "value": "https://YOUR_MATOMO_HOST/index.php" }, "query.module": { "kind": "value", "value": "API" }, "query.method": { "kind": "value", "value": "Live.getLastVisitsDetails" }, "query.idSite": { "kind": "value", "value": "YOUR_SITE_ID" }, "query.period": { "kind": "value", "value": "range" }, "query.date": { "kind": "value", "value": "last30" }, "query.format": { "kind": "value", "value": "JSON" }, "query.segment": { "kind": "value", "value": "visitCount>3" }, "query.filter_limit": { "kind": "value", "value": "100" }, "query.showColumns": { "kind": "value", "value": "actionDetails,visitIp,visitorId,visitCount" }, "header.Content-Type": { "kind": "value", "value": "application/x-www-form-urlencoded" }, "body": { "kind": "value", "value": "token_auth=YOUR_URL_ENCODED_TOKEN" } }, "name": "Read recent Matomo visits", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "url" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.module" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.method" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.idSite" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.period" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.date" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.format" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.segment" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.filter_limit" }, { "jsonSchema": { "anyOf": [ { "type": [ "string", "number", "boolean" ] }, { "type": "array", "items": { "type": [ "string", "number", "boolean" ] } } ] }, "nullable": true, "handle": "query.showColumns" }, { "jsonSchema": { "type": "string" }, "nullable": true, "handle": "header.Content-Type" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "body" } ], "outputs": [ { "jsonSchema": {}, "nullable": true, "handle": "body" }, { "jsonSchema": { "type": "integer" }, "nullable": false, "handle": "statusCode" }, { "jsonSchema": { "type": "object", "additionalProperties": { "type": "string" } }, "nullable": false, "handle": "headers" } ], "name": "Read recent Matomo visits", "executor": { "method": "POST", "query": { "mode": "fields", "names": [ "module", "method", "idSite", "period", "date", "format", "segment", "filter_limit", "showColumns" ] }, "headers": { "mode": "fields", "names": [ "Content-Type" ] }, "bodyFormat": "text", "authentication": { "type": "none" }, "responseFormat": "json", "statusPolicy": "success", "kind": "http-request" } } }, "n_7f9a4b35a0710ae9": { "inputs": { "body": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_1559f0822ac1ff01", "output": "body" } ] } }, "name": "Prepare visitor analysis", "kind": "task", "task": { "inputs": [ { "jsonSchema": {}, "nullable": true, "handle": "body" } ], "outputs": [ { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "hasVisits" }, { "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "role": { "type": "string", "enum": [ "system", "user", "assistant", "tool", "developer" ], "description": "The role of the message sender." }, "content": { "anyOf": [ { "type": "string", "description": "Plain text message content." }, { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "Multimodal or structured message content blocks." } ], "description": "Message content." }, "name": { "type": "string", "description": "An optional name for the sender of the message." }, "tool_call_id": { "type": "string", "description": "The tool call ID corresponding to the tool message." } }, "required": [ "role", "content" ], "additionalProperties": true, "description": "A message in a chat completion request." }, "description": "An ordered list of conversation messages." }, "nullable": false, "handle": "messages" } ], "name": "Prepare visitor analysis", "moduleId": "n_639140b4d507bcb3", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_3c4b528db32cbc50": { "inputs": {}, "name": "Any visits?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "yes", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_7f9a4b35a0710ae9", "output": "hasVisits" } }, "operator": "isTrue" } ] } ] } ] }, "n_0da1f1221417de46": { "inputs": { "model": { "kind": "value", "value": "YOUR_OPENROUTER_MODEL_ID" }, "messages": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7f9a4b35a0710ae9", "output": "messages" } ] } }, "name": "Analyze visitor paths", "kind": "task", "task": { "inputs": [ { "description": "The model ID to use.", "jsonSchema": { "type": "string", "description": "The model ID to use." }, "nullable": false, "handle": "model" }, { "description": "An ordered list of conversation messages.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "role": { "type": "string", "enum": [ "system", "user", "assistant", "tool", "developer" ], "description": "The role of the message sender." }, "content": { "anyOf": [ { "type": "string", "description": "Plain text message content." }, { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "Multimodal or structured message content blocks." } ], "description": "Message content." }, "name": { "type": "string", "description": "An optional name for the sender of the message." }, "tool_call_id": { "type": "string", "description": "The tool call ID corresponding to the tool message." } }, "required": [ "role", "content" ], "additionalProperties": true, "description": "A message in a chat completion request." }, "description": "An ordered list of conversation messages." }, "nullable": false, "handle": "messages" }, { "description": "The number of choices you wish to generate.", "jsonSchema": { "type": "integer", "minimum": 1, "description": "The number of choices you wish to generate." }, "nullable": true, "handle": "n", "value": null }, { "description": "Generation stops when encountering these sequences.", "jsonSchema": { "anyOf": [ { "type": "string", "description": "Single stop sequence." }, { "type": "array", "items": { "type": "string", "description": "A stop sequence." }, "description": "Multiple stop sequences." } ], "description": "Generation stops when encountering these sequences." }, "nullable": true, "handle": "stop", "value": null }, { "description": "The end user's unique identifier.", "jsonSchema": { "type": "string", "description": "The end user's unique identifier." }, "nullable": true, "handle": "user", "value": null }, { "description": "nucleus sampling parameters.", "jsonSchema": { "type": "number", "minimum": 0, "maximum": 1, "description": "nucleus sampling parameters." }, "nullable": true, "handle": "top_p", "value": null }, { "description": "Whether to request a streaming response. Currently connector action only supports false or omitted.", "jsonSchema": { "type": "boolean", "description": "Whether to request a streaming response. Currently connector action only supports false or omitted." }, "nullable": true, "handle": "stream", "value": null }, { "description": "A list of legacy functions that will be converted to tools at execution time.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the function tool." }, "description": { "type": "string", "description": "Function tool description." }, "parameters": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "JSON Schema parameter definitions for function tools." } }, "required": [ "name" ], "additionalProperties": true, "description": "OpenAI style function tool definition." }, "description": "A list of legacy functions that will be converted to tools at execution time." }, "nullable": true, "handle": "functions", "value": null }, { "description": "Legacy function calling strategies are converted to tool_choice at execution time.", "jsonSchema": { "anyOf": [ { "type": "string", "enum": [ "none", "auto" ], "description": "Legacy function calling strategy." }, { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the function to be forced to be called." } }, "required": [ "name" ], "additionalProperties": true, "description": "Legacy function calls select objects." } ], "description": "Legacy function calling strategies are converted to tool_choice at execution time." }, "nullable": true, "handle": "function_call", "value": null }, { "description": "Adjusts the bias map for the specified token sampling probability.", "jsonSchema": { "type": "object", "additionalProperties": { "type": "number", "description": "The offset value for this token." }, "description": "Adjusts the bias map for the specified token sampling probability." }, "nullable": true, "handle": "logit_bias", "value": null }, { "description": "The maximum number of output tokens.", "jsonSchema": { "type": "integer", "minimum": 1, "description": "The maximum number of output tokens." }, "nullable": true, "handle": "max_tokens", "value": null }, { "description": "New max output token field, taking precedence over max_tokens.", "jsonSchema": { "type": "integer", "minimum": 1, "description": "New max output token field, taking precedence over max_tokens." }, "nullable": true, "handle": "max_completion_tokens", "value": null }, { "description": "Sampling temperature.", "jsonSchema": { "type": "number", "minimum": 0, "maximum": 2, "description": "Sampling temperature." }, "nullable": true, "handle": "temperature", "value": null }, { "description": "There are penalties.", "jsonSchema": { "type": "number", "minimum": -2, "maximum": 2, "description": "There are penalties." }, "nullable": true, "handle": "presence_penalty", "value": null }, { "description": "Frequency penalty.", "jsonSchema": { "type": "number", "minimum": -2, "maximum": 2, "description": "Frequency penalty." }, "nullable": true, "handle": "frequency_penalty", "value": null }, { "description": "Whether to return token level probabilities.", "jsonSchema": { "type": "boolean", "description": "Whether to return token level probabilities." }, "nullable": true, "handle": "logprobs", "value": null }, { "description": "Returns the number of top logprobs.", "jsonSchema": { "type": "integer", "minimum": 0, "maximum": 20, "description": "Returns the number of top logprobs." }, "nullable": true, "handle": "top_logprobs", "value": null }, { "description": "A list of tools that can be called by the model.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "type": { "const": "function", "description": "Tool type, must be function." }, "function": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the function tool." }, "description": { "type": "string", "description": "Function tool description." }, "parameters": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "JSON Schema parameter definitions for function tools." } }, "required": [ "name" ], "additionalProperties": true, "description": "Function tool definition." } }, "required": [ "type", "function" ], "additionalProperties": true, "description": "OpenAI style tool definition." }, "description": "A list of tools that can be called by the model." }, "nullable": true, "handle": "tools", "value": null }, { "description": "Model how to select tools.", "jsonSchema": { "anyOf": [ { "type": "string", "enum": [ "none", "auto", "required" ], "description": "Predefined tool selection strategies." }, { "type": "object", "properties": { "type": { "const": "function", "description": "Tool selection type, must be function." }, "function": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the function facility to be forced to be called." } }, "required": [ "name" ], "additionalProperties": true, "description": "The function tool that is forced to be selected." } }, "required": [ "type", "function" ], "additionalProperties": true, "description": "Forces the configuration of the specified function tool to be called." } ], "description": "Model how to select tools." }, "nullable": true, "handle": "tool_choice", "value": null }, { "description": "Structured output format configuration.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Structured output format configuration." }, "nullable": true, "handle": "response_format", "value": null }, { "description": "List of modalities to request output from.", "jsonSchema": { "type": "array", "items": { "type": "string", "description": "An output modal." }, "description": "List of modalities to request output from." }, "nullable": true, "handle": "modalities", "value": null }, { "description": "A list of candidate models if the main model fails.", "jsonSchema": { "type": "array", "items": { "type": "string", "description": "A candidate fallback model ID." }, "description": "A list of candidate models if the main model fails." }, "nullable": true, "handle": "models", "value": null }, { "description": "Request additional metadata.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Request additional metadata." }, "nullable": true, "handle": "metadata", "value": null }, { "description": "provider routing preference configuration.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "provider routing preference configuration." }, "nullable": true, "handle": "provider", "value": null }, { "description": "Plugin configuration to enable.", "jsonSchema": { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "Plugin configuration to enable." }, "nullable": true, "handle": "plugins", "value": null }, { "description": "Service level.", "jsonSchema": { "type": "string", "description": "Service level." }, "nullable": true, "handle": "service_tier", "value": null }, { "description": "Session ID used for association requests.", "jsonSchema": { "type": "string", "description": "Session ID used for association requests." }, "nullable": true, "handle": "session_id", "value": null }, { "description": "Whether to allow parallel tool calls.", "jsonSchema": { "type": "boolean", "description": "Whether to allow parallel tool calls." }, "nullable": true, "handle": "parallel_tool_calls", "value": null }, { "description": "Additional options for streaming responses.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Additional options for streaming responses." }, "nullable": true, "handle": "stream_options", "value": null }, { "description": "Inference model configuration.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Inference model configuration." }, "nullable": true, "handle": "reasoning", "value": null } ], "outputs": [ { "description": "OpenRouter chat completion response.", "jsonSchema": { "type": "object", "properties": { "id": { "type": "string", "description": "Chat completion result ID." }, "object": { "type": "string", "description": "Return object type." }, "created": { "type": "integer", "description": "Unix timestamp of the time the result was created." }, "model": { "type": "string", "description": "The model ID used in this response." }, "choices": { "type": "array", "items": { "type": "object", "properties": { "index": { "type": "integer", "description": "The position of this choice in the result array." }, "message": { "type": "object", "properties": { "role": { "type": "string", "description": "Returns the role of the message." }, "content": { "anyOf": [ { "anyOf": [ { "type": "string", "description": "Text message content." }, { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "List of structured content blocks." } ], "description": "The content of the returned message." }, { "type": "null" } ], "description": "The content of the returned message." }, "tool_calls": { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "A list of tools called by the model request." }, "refusal": { "type": [ "string", "null" ], "description": "Description text returned when the model refuses to answer." } }, "required": [ "role" ], "additionalProperties": true, "description": "The message corresponding to this choice." }, "finish_reason": { "type": [ "string", "null" ], "description": "The reason why the model stopped outputting." }, "logprobs": { "type": [ "object", "null" ], "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Optional token-level probability information." } }, "required": [ "index", "message", "finish_reason" ], "additionalProperties": true, "description": "A choice in chat completion." }, "description": "The list of candidate results returned by the model." }, "usage": { "type": "object", "properties": { "prompt_tokens": { "type": "integer", "description": "Enter the number of tokens." }, "completion_tokens": { "type": "integer", "description": "Output the number of tokens." }, "total_tokens": { "type": "integer", "description": "Total number of tokens." }, "prompt_tokens_details": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Enter token segmentation information." }, "completion_tokens_details": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Output token breakdown information." } }, "required": [ "prompt_tokens", "completion_tokens", "total_tokens" ], "additionalProperties": true, "description": "The token usage of this response." } }, "required": [ "id", "object", "created", "model", "choices" ], "additionalProperties": true, "description": "OpenRouter chat completion response." }, "nullable": false, "handle": "output" } ], "name": "Analyze visitor paths", "executor": { "kind": "connector", "action": "openrouter.create_chat_completion", "outputMode": "value" } } }, "n_bb78a469e8720b5a": { "inputs": { "completion": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_0da1f1221417de46", "output": "output" } ] }, "blog": { "kind": "value", "value": "YOUR_BLOG_NAME" } }, "name": "Prepare report row", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "properties": { "id": { "type": "string", "description": "Chat completion result ID." }, "object": { "type": "string", "description": "Return object type." }, "created": { "type": "integer", "description": "Unix timestamp of the time the result was created." }, "model": { "type": "string", "description": "The model ID used in this response." }, "choices": { "type": "array", "items": { "type": "object", "properties": { "index": { "type": "integer", "description": "The position of this choice in the result array." }, "message": { "type": "object", "properties": { "role": { "type": "string", "description": "Returns the role of the message." }, "content": { "anyOf": [ { "anyOf": [ { "type": "string", "description": "Text message content." }, { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "List of structured content blocks." } ], "description": "The content of the returned message." }, { "type": "null" } ], "description": "The content of the returned message." }, "tool_calls": { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "A JSON object allowing any additional fields." }, "description": "A list of tools called by the model request." }, "refusal": { "type": [ "string", "null" ], "description": "Description text returned when the model refuses to answer." } }, "required": [ "role" ], "additionalProperties": true, "description": "The message corresponding to this choice." }, "finish_reason": { "type": [ "string", "null" ], "description": "The reason why the model stopped outputting." }, "logprobs": { "type": [ "object", "null" ], "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Optional token-level probability information." } }, "required": [ "index", "message", "finish_reason" ], "additionalProperties": true, "description": "A choice in chat completion." }, "description": "The list of candidate results returned by the model." }, "usage": { "type": "object", "properties": { "prompt_tokens": { "type": "integer", "description": "Enter the number of tokens." }, "completion_tokens": { "type": "integer", "description": "Output the number of tokens." }, "total_tokens": { "type": "integer", "description": "Total number of tokens." }, "prompt_tokens_details": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Enter token segmentation information." }, "completion_tokens_details": { "type": "object", "additionalProperties": { "description": "The original value corresponding to the field." }, "description": "Output token breakdown information." } }, "required": [ "prompt_tokens", "completion_tokens", "total_tokens" ], "additionalProperties": true, "description": "The token usage of this response." } }, "required": [ "id", "object", "created", "model", "choices" ], "additionalProperties": true, "description": "OpenRouter chat completion response." }, "nullable": false, "handle": "completion" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "blog" } ], "outputs": [ { "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A Baserow row payload keyed by field name or field ID." }, "nullable": false, "handle": "row" } ], "name": "Prepare report row", "moduleId": "n_2dbea89b85b6f2a5", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_f3f534de36b739c7": { "inputs": { "tableId": { "kind": "unset" }, "userFieldNames": { "kind": "value", "value": true }, "row": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_bb78a469e8720b5a", "output": "row" } ] } }, "name": "Save report to Baserow", "kind": "task", "task": { "inputs": [ { "description": "The Baserow table ID.", "jsonSchema": { "type": "integer", "exclusiveMinimum": 0, "description": "The Baserow table ID." }, "nullable": true, "handle": "tableId", "value": null }, { "description": "Whether Baserow should use user-facing field names instead of field IDs.", "jsonSchema": { "type": "boolean", "description": "Whether Baserow should use user-facing field names instead of field IDs." }, "nullable": true, "handle": "userFieldNames", "value": null }, { "description": "A Baserow row payload keyed by field name or field ID.", "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A Baserow row payload keyed by field name or field ID." }, "nullable": false, "handle": "row" } ], "outputs": [ { "description": "The created Baserow row.", "jsonSchema": { "type": "object", "properties": { "id": { "type": "integer", "description": "The Baserow row ID." } }, "required": [ "id" ], "additionalProperties": true, "description": "The created Baserow row." }, "nullable": false, "handle": "row" } ], "name": "Save report to Baserow", "executor": { "kind": "connector", "action": "baserow.create_table_row" } } } }, "edges": [ { "source": "n_d3341b9b412f6156", "target": "n_1559f0822ac1ff01" }, { "source": "n_5682f5ea42c61152", "target": "n_1559f0822ac1ff01" }, { "source": "n_1559f0822ac1ff01", "target": "n_7f9a4b35a0710ae9" }, { "source": "n_7f9a4b35a0710ae9", "target": "n_3c4b528db32cbc50" }, { "source": "n_3c4b528db32cbc50", "target": "n_0da1f1221417de46", "sourceHandle": "yes" }, { "source": "n_0da1f1221417de46", "target": "n_bb78a469e8720b5a" }, { "source": "n_bb78a469e8720b5a", "target": "n_f3f534de36b739c7" } ] } }, "modules": { "n_639140b4d507bcb3": { "name": "Prepare visitor analysis", "imports": [], "source": "export default function matomoPrompt({body}){\n if(!Array.isArray(body))throw Error('Matomo did not return a visit list');if(body.length>100)throw Error('Matomo exceeded the 100-visit limit');if(!body.length)return {hasVisits:false,messages:[]};\n const lines=body.map(v=>{if(typeof v?.visitorId!=='string'||!v.visitorId||!Number.isFinite(Number(v.visitCount))||!Array.isArray(v.actionDetails))throw Error('Invalid Matomo visit');const actions=v.actionDetails.map(a=>{if(!a||typeof a!=='object'||Array.isArray(a))throw Error('Invalid Matomo action');return ` - Page ${a.pageviewPosition??'not provided'}: ${a.pageTitle??'not provided'}\\n URL: ${a.url??'not provided'}\\n Time Spent: ${a.timeSpentPretty??'not provided'}`}).join('\\n');return `- Visitor (ID: ${v.visitorId}):\\n Visit Count: ${v.visitCount}\\n${actions}`}).join('\\n\\n');\n const content=`You are an SEO expert. Please analyze this visitor data:\\n\\n${lines}\\n\\nPlease provide insights on:\\n1. Common visitor paths\\n2. Popular pages\\n3. User engagement patterns\\n4. Recommendations for improvement`;return {hasVisits:true,messages:[{role:'user',content}]};\n}\n" }, "n_2dbea89b85b6f2a5": { "name": "Prepare report row", "imports": [], "source": "export default function reportRow({completion,blog}){if(typeof blog!=='string'||!blog.trim()||blog==='YOUR_BLOG_NAME')throw Error('Configure the blog name');const text=completion?.choices?.[0]?.message?.content;if(typeof text!=='string'||!text.trim())throw Error('OpenRouter returned no report text');if(completion.choices[0].finish_reason==='length')throw Error('OpenRouter report was truncated');return {row:{Date:new Date().toISOString().slice(0,10),Note:text,Blog:blog}};}\n" } } }, "presentation": { "designer": { "version": 1, "flow": { "direction": "vertical" } } } }