AutomationFlowsSlack & Telegram › Track Play Store App Rankings with Serpapi, Baserow & Slack Alerts

Track Play Store App Rankings with Serpapi, Baserow & Slack Alerts

ByArunava @arunava on n8n.io

ASO teams tracking daily keyword positions Growth & marketing standups that want quick rank visibility Lightweight historical logging without a full BI stack Runs on a schedule (e.g., weekly) Queries SerpApi for each keyword’s Play Store ranking Saves results to Baserow: Current…

Cron / scheduled trigger★★★★☆ complexity18 nodesSlackBaserowHTTP Request
Slack & Telegram Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8036 — we link there as the canonical source.

This workflow follows the HTTP Request → Slack recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "j4Cj4lJiSvXIpi0a",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Play Store App Rank Tracker",
  "tags": [
    {
      "id": "h1n9pM94D2GUxQBw",
      "name": "ASO",
      "createdAt": "2025-06-11T00:48:24.857Z",
      "updatedAt": "2025-06-11T00:48:24.857Z"
    }
  ],
  "nodes": [
    {
      "id": "00b0346e-297b-43fe-9188-bef36a79a78e",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        -20
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "fd981cd3-2cf8-4cb0-8dc8-21cd4bfd02a9",
      "name": "Keep Context",
      "type": "n8n-nodes-base.set",
      "position": [
        820,
        -20
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6b225b26-5317-4e55-bd41-12d904ad0136",
              "name": "id",
              "type": "number",
              "value": "={{ $json.id }}"
            },
            {
              "id": "4c31a5bf-38e2-4ca2-a0ef-268198d34532",
              "name": "Keywords",
              "type": "string",
              "value": "={{ $json.Keywords }}"
            },
            {
              "id": "81a8b6cc-dae3-4c45-b07d-cb4a36719798",
              "name": "currentRank",
              "type": "string",
              "value": "={{ $json.currentRank }}"
            },
            {
              "id": "16205c3d-7996-4bc3-a4c7-ba92ea7dbedd",
              "name": "Previous Rank",
              "type": "string",
              "value": "={{ $json[\"Previous Rank\"] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8e1be6a7-9d76-4f43-bda6-574b122636cb",
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1020,
        260
      ],
      "parameters": {
        "text": "\ud83d\ude80 RPSC App Rankings Just Updated!\nSee how we're performing \ud83d\udc49 https://baserow.io/public/grid/mjkYq2wWb6vIE3MsB1RannZgclvdHKacNE3zEVrC5Bo",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "url",
          "value": "https://app.slack.com/client/T053HKKDY12/C08AGRQ9GBF"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "814a072d-c55a-4a6b-829e-89c097e64544",
      "name": "Sticky Note33",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        -120
      ],
      "parameters": {
        "color": 3,
        "width": 260,
        "height": 260,
        "content": "## Check for Rank Updates"
      },
      "typeVersion": 1
    },
    {
      "id": "b701b1c1-924d-4431-9973-acb8f4a0c67c",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -120
      ],
      "parameters": {
        "width": 260,
        "height": 260,
        "content": "## Fetch Keywords from Baserow"
      },
      "typeVersion": 1
    },
    {
      "id": "95b54bce-e074-4047-ab26-ddd237de4072",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        -120
      ],
      "parameters": {
        "color": 4,
        "width": 260,
        "height": 260,
        "content": "## Prepare Search Queries"
      },
      "typeVersion": 1
    },
    {
      "id": "e4255c27-4548-4563-96a6-b7d97183c106",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        760,
        -120
      ],
      "parameters": {
        "color": 5,
        "height": 260,
        "content": "## Store Row Context"
      },
      "typeVersion": 1
    },
    {
      "id": "baccdae4-f782-40b1-998c-52bf4c2397ad",
      "name": "Sticky Note19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1020,
        -120
      ],
      "parameters": {
        "color": 6,
        "width": 260,
        "height": 260,
        "content": "## Search Play Store via SerpApi"
      },
      "typeVersion": 1
    },
    {
      "id": "e98fb372-7174-4d9a-a98e-4ae3995ad4d9",
      "name": "Sticky Note34",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 260,
        "content": "## Merge Results + Context"
      },
      "typeVersion": 1
    },
    {
      "id": "954bf90b-e556-4915-9249-621ab3b41215",
      "name": "Sticky Note35",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        160
      ],
      "parameters": {
        "color": 6,
        "width": 260,
        "height": 260,
        "content": "## Extract App Rank"
      },
      "typeVersion": 1
    },
    {
      "id": "ec466f86-8b3c-43b9-91f2-20a1776551f2",
      "name": "Sticky Note36",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        160
      ],
      "parameters": {
        "color": 3,
        "width": 340,
        "height": 260,
        "content": "## Update Rank in Baserow"
      },
      "typeVersion": 1
    },
    {
      "id": "bf1b3de5-22f8-4d45-bc2f-b887b6314466",
      "name": "Sticky Note37",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        840,
        160
      ],
      "parameters": {
        "color": 2,
        "width": 440,
        "height": 260,
        "content": "## Send Slack Alert"
      },
      "typeVersion": 1
    },
    {
      "id": "e091fa90-ce43-4200-80ff-6118c3c9bcfc",
      "name": "Update Rank in Baserow",
      "type": "n8n-nodes-base.baserow",
      "position": [
        600,
        260
      ],
      "parameters": {
        "rowId": "={{ $json.id }}",
        "tableId": 568021,
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": 4563204,
              "fieldValue": "={{ $json.currentRank }}"
            },
            {
              "fieldId": 4563209,
              "fieldValue": "={{ $json.previousRank }}"
            }
          ]
        },
        "operation": "update",
        "databaseId": 239215
      },
      "credentials": {
        "baserowApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3be3cc0b-46ac-4a7a-83b6-01eea70d34c3",
      "name": "Fetch Keywords from Baserow",
      "type": "n8n-nodes-base.baserow",
      "position": [
        260,
        -20
      ],
      "parameters": {
        "tableId": 568021,
        "returnAll": true,
        "databaseId": 239215,
        "additionalOptions": {}
      },
      "credentials": {
        "baserowApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e8bf6a9e-8f3b-42be-95b4-a991cf41ec9d",
      "name": "Prepare Search Queries",
      "type": "n8n-nodes-base.code",
      "position": [
        560,
        -20
      ],
      "parameters": {
        "jsCode": "const apiKey = \"{api_key}\";\nconst packageId = \"practice.test.daily.testline\";\n\nreturn items.map(item => {\n  const keyword = item.json[\"Keywords\"];\n  const id = item.json.id;\n  const currentRank = item.json[\"Current Rank\"];\n\n  const serpapiUrl = `https://serpapi.com/search.json?engine=google_play&q=${encodeURIComponent(keyword)}&gl=in&hl=en&store=apps&api_key=YOUR_TOKEN_HERE\n\n  return {\n    json: {\n      ...item.json,          // important: keep all Baserow fields\n      id,                   // row ID for update\n      currentRank,          // existing rank for history\n      packageId,            // fixed app package\n      serpapi_url: serpapiUrl\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "812076cb-d038-46f5-ad3b-fa73a7c2ba7f",
      "name": "Search PlayStore via SerpAPI",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1100,
        -20
      ],
      "parameters": {
        "url": "https://serpapi.com/search.json",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "engine",
              "value": "google_play"
            },
            {
              "name": "q",
              "value": "={{ $json.Keywords }}"
            },
            {
              "name": "api_key"
            },
            {
              "name": "gl",
              "value": "in"
            },
            {
              "name": "hl",
              "value": "en"
            },
            {
              "name": "store",
              "value": "apps"
            }
          ]
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "cc33dcd6-2898-488e-86e5-9ca627171e2a",
      "name": "Merge Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        0,
        260
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "d8bb2f41-a9f6-4199-8132-9ea779f80fa5",
      "name": "Get App Rank",
      "type": "n8n-nodes-base.code",
      "position": [
        280,
        260
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const appId = \"{app_package_name}\";\nconst results = $json[\"organic_results\"] || [];\n\nlet rank = null;\nlet position = 1;\n\nfor (const block of results) {\n  if (!block.items) continue;\n\n  for (const app of block.items) {\n    if (app.product_id === appId) {\n      rank = position;\n      break;\n    }\n    position++;\n  }\n\n  if (rank !== null) break;\n}\n\nif (rank === null) rank = 0;\n\nreturn {\n  json: {\n    id: $json.id,  // will now work \u2705\n    keyword: $json.Keywords,\n    currentRank: rank,\n    previousRank: $json.currentRank || null\n  }\n};\n"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "015ae8b9-6800-4506-8864-f269a64bf319",
  "connections": {
    "Merge Data": {
      "main": [
        [
          {
            "node": "Get App Rank",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get App Rank": {
      "main": [
        [
          {
            "node": "Update Rank in Baserow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep Context": {
      "main": [
        [
          {
            "node": "Search PlayStore via SerpAPI",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Fetch Keywords from Baserow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Search Queries": {
      "main": [
        [
          {
            "node": "Keep Context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Rank in Baserow": {
      "main": [
        [
          {
            "node": "Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Keywords from Baserow": {
      "main": [
        [
          {
            "node": "Prepare Search Queries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search PlayStore via SerpAPI": {
      "main": [
        [
          {
            "node": "Merge Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

ASO teams tracking daily keyword positions Growth & marketing standups that want quick rank visibility Lightweight historical logging without a full BI stack Runs on a schedule (e.g., weekly) Queries SerpApi for each keyword’s Play Store ranking Saves results to Baserow: Current…

Source: https://n8n.io/workflows/8036/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This workflow is an automated employee time tracking and reporting system that monitors weekly work hours via TMetric, then delivers personalized summaries directly to each team member on Slack. It co

HTTP Request, Item Lists, Data Table +1
Slack & Telegram

Import Productboard Notes Companies And Features Into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.

HTTP Request, Snowflake, Slack
Slack & Telegram

Import Productboard Notes, Companies and Features into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.

HTTP Request, Snowflake, Slack
Slack & Telegram

This workflow imports Productboard data into Snowflake, automating data extraction, mapping, and updates for features, companies, and notes. It supports scheduled weekly updates, data cleansing, and S

HTTP Request, Snowflake, Slack
Slack & Telegram

This workflow streamlines the entire inventory replenishment process by leveraging AI for demand forecasting and intelligent logic for supplier selection. It aggregates data from multiple sources—POS

HTTP Request, MySQL, Slack